@better-fullstack/types 2.6.2 → 2.6.4
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/{defaults-CZeSVSu8.d.mts → defaults-B8xnKlp6.d.mts} +2 -2
- package/dist/defaults-B8xnKlp6.d.mts.map +1 -0
- package/dist/{defaults-DTS30ICD.mjs → defaults-nq08Mnf5.mjs} +2 -1
- package/dist/defaults-nq08Mnf5.mjs.map +1 -0
- package/dist/defaults.d.mts +3 -3
- package/dist/defaults.mjs +1 -1
- package/dist/index.d.mts +31 -31
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +15 -6
- package/dist/index.mjs.map +1 -1
- package/dist/json-schema.d.mts +370 -322
- package/dist/json-schema.d.mts.map +1 -1
- package/dist/json-schema.mjs +1 -1
- package/dist/{schemas-82xJXQrZ.d.mts → schemas-CgldOz7b.d.mts} +682 -633
- package/dist/schemas-CgldOz7b.d.mts.map +1 -0
- package/dist/{schemas-cgmdgudQ.mjs → schemas-CywxHrK2.mjs} +8 -2
- package/dist/schemas-CywxHrK2.mjs.map +1 -0
- package/dist/schemas.d.mts +2 -2
- package/dist/schemas.mjs +2 -2
- package/dist/{stack-graph-Oj-P0cij.mjs → stack-graph-B1N4281Q.mjs} +4 -2
- package/dist/stack-graph-B1N4281Q.mjs.map +1 -0
- package/dist/{stack-graph-DG53F1Q2.d.mts → stack-graph-C5tnlzLw.d.mts} +2 -2
- package/dist/{stack-graph-DG53F1Q2.d.mts.map → stack-graph-C5tnlzLw.d.mts.map} +1 -1
- package/dist/stack-graph.d.mts +3 -3
- package/dist/stack-graph.mjs +2 -2
- package/dist/{stack-translation-49iba9M5.mjs → stack-translation-DYhRy_yT.mjs} +54 -8
- package/dist/stack-translation-DYhRy_yT.mjs.map +1 -0
- package/dist/{stack-translation-0OwfhcBf.d.mts → stack-translation-vg1Nwe1o.d.mts} +7 -5
- package/dist/stack-translation-vg1Nwe1o.d.mts.map +1 -0
- package/dist/stack-translation.d.mts +4 -4
- package/dist/stack-translation.mjs +3 -3
- package/dist/{telemetry-C9qQ80l9.mjs → telemetry-C3RfYkCK.mjs} +6 -4
- package/dist/telemetry-C3RfYkCK.mjs.map +1 -0
- package/dist/{telemetry-CUtrUTe9.d.mts → telemetry-D4mP-fTC.d.mts} +3 -3
- package/dist/telemetry-D4mP-fTC.d.mts.map +1 -0
- package/dist/telemetry.d.mts +1 -1
- package/dist/telemetry.mjs +4 -4
- package/dist/{types-CfEIdtDo.d.mts → types-BvyHjJEI.d.mts} +4 -3
- package/dist/types-BvyHjJEI.d.mts.map +1 -0
- package/dist/types.d.mts +3 -3
- package/package.json +2 -2
- package/dist/defaults-CZeSVSu8.d.mts.map +0 -1
- package/dist/defaults-DTS30ICD.mjs.map +0 -1
- package/dist/schemas-82xJXQrZ.d.mts.map +0 -1
- package/dist/schemas-cgmdgudQ.mjs.map +0 -1
- package/dist/stack-graph-Oj-P0cij.mjs.map +0 -1
- package/dist/stack-translation-0OwfhcBf.d.mts.map +0 -1
- package/dist/stack-translation-49iba9M5.mjs.map +0 -1
- package/dist/telemetry-C9qQ80l9.mjs.map +0 -1
- package/dist/telemetry-CUtrUTe9.d.mts.map +0 -1
- package/dist/types-CfEIdtDo.d.mts.map +0 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["CLI_FLAG_GROUP_DEFINITIONS: readonly CliFlagGroupDefinition[]","errors: string[]","afterPart","matches: MatchedPart[]","replacements: StackPartReplacement[]","ownerChanges: StackPartOwnerChange[]","evidenceChanges: StackPartEvidenceChange[]"],"sources":["../src/catalog/cli-flags.ts","../src/platform/local-dev.ts","../src/catalog/registry.ts","../src/stack/update-support.ts","../src/stack/stack-comparison.ts"],"sourcesContent":["import { createCliDefaultProjectConfigBase } from \"@/config/defaults\";\nimport {\n getCategoryCliValues,\n type OptionCategory,\n type OptionCategoryEcosystem,\n} from \"@/catalog/option-metadata\";\nimport {\n DIRECTORY_CONFLICT_VALUES,\n ECOSYSTEM_VALUES,\n PROJECT_SHAPE_VALUES,\n TEMPLATE_VALUES,\n} from \"@/config/schemas\";\n\ntype CliDefaultConfig = ReturnType<typeof createCliDefaultProjectConfigBase>;\ntype CliConfigKey = keyof CliDefaultConfig;\n\n/**\n * How a CLI flag's accepted values are derived. Every source resolves against\n * the shared option metadata / schema value lists in this package so the CLI\n * reference table never drifts from the real generator surface.\n */\nexport type CliFlagValueSource =\n | { readonly kind: \"category\"; readonly category: OptionCategory }\n | { readonly kind: \"categories\"; readonly categories: readonly OptionCategory[] }\n | { readonly kind: \"literal\"; readonly values: readonly string[] }\n | { readonly kind: \"boolean\" }\n | { readonly kind: \"freeform\"; readonly hint: string };\n\nexport type CliFlagDefinition = {\n /** Canonical flag name without the leading dashes, e.g. `frontend`. */\n readonly flag: string;\n readonly summary: string;\n readonly source: CliFlagValueSource;\n /** Project-config field the default value is read from, when applicable. */\n readonly configKey?: CliConfigKey;\n /** Overrides the config-derived default when the config default is ecosystem-dependent. */\n readonly defaultLiteral?: string;\n /** Whether the flag accepts multiple space-separated values. */\n readonly multiple?: boolean;\n};\n\nexport type CliFlagGroupDefinition = {\n readonly id: string;\n readonly title: string;\n readonly description: string;\n readonly ecosystem?: OptionCategoryEcosystem;\n readonly flags: readonly CliFlagDefinition[];\n};\n\nexport type ResolvedCliFlag = {\n /** Flag rendered with the leading dashes, e.g. `--frontend`. */\n readonly flag: string;\n readonly summary: string;\n readonly values: readonly string[];\n readonly valueHint: string | null;\n readonly defaultValue: string | null;\n readonly multiple: boolean;\n};\n\nexport type ResolvedCliFlagGroup = {\n readonly id: string;\n readonly title: string;\n readonly description: string;\n readonly ecosystem?: OptionCategoryEcosystem;\n readonly flags: readonly ResolvedCliFlag[];\n};\n\nexport const CLI_FLAG_GROUP_DEFINITIONS: readonly CliFlagGroupDefinition[] = [\n {\n id: \"common\",\n title: \"Common flags\",\n description: \"Flags that apply to every ecosystem and control workflow behavior.\",\n flags: [\n {\n flag: \"ecosystem\",\n summary: \"Language/runtime ecosystem to scaffold.\",\n source: { kind: \"literal\", values: ECOSYSTEM_VALUES },\n configKey: \"ecosystem\",\n },\n {\n flag: \"template\",\n summary: \"Start from a curated stack preset instead of individual flags.\",\n source: { kind: \"literal\", values: TEMPLATE_VALUES },\n },\n {\n flag: \"shape\",\n summary:\n \"Start from a project shape. Asks which language or platform, then only the prompts that shape needs.\",\n source: { kind: \"literal\", values: PROJECT_SHAPE_VALUES },\n },\n {\n flag: \"part\",\n summary: \"Add a multi-ecosystem stack part. Repeat once per part.\",\n source: { kind: \"freeform\", hint: \"role:ecosystem:tool (e.g. frontend:typescript:next)\" },\n },\n {\n flag: \"examples\",\n summary: \"Optional example features to include.\",\n source: { kind: \"category\", category: \"examples\" },\n configKey: \"examples\",\n multiple: true,\n },\n {\n flag: \"ai-docs\",\n summary: \"Agent instruction files to generate.\",\n source: { kind: \"category\", category: \"aiDocs\" },\n configKey: \"aiDocs\",\n multiple: true,\n },\n {\n flag: \"package-manager\",\n summary: \"Package manager for the generated workspace.\",\n source: { kind: \"category\", category: \"packageManager\" },\n configKey: \"packageManager\",\n },\n {\n flag: \"workspace-shape\",\n summary: \"Monorepo or single-app workspace layout.\",\n source: { kind: \"category\", category: \"workspaceShape\" },\n configKey: \"workspaceShape\",\n },\n {\n flag: \"version-channel\",\n summary: \"Dependency version channel.\",\n source: { kind: \"category\", category: \"versionChannel\" },\n configKey: \"versionChannel\",\n },\n {\n flag: \"web-deploy\",\n summary: \"Deployment target config for the web app.\",\n source: { kind: \"category\", category: \"webDeploy\" },\n configKey: \"webDeploy\",\n },\n {\n flag: \"server-deploy\",\n summary: \"Deployment target config for the server.\",\n source: { kind: \"category\", category: \"serverDeploy\" },\n configKey: \"serverDeploy\",\n },\n {\n flag: \"directory-conflict\",\n summary: \"Strategy when the target directory already exists.\",\n source: { kind: \"literal\", values: DIRECTORY_CONFLICT_VALUES },\n },\n {\n flag: \"install\",\n summary: \"Install dependencies after scaffolding.\",\n source: { kind: \"boolean\" },\n configKey: \"install\",\n },\n {\n flag: \"git\",\n summary: \"Initialize a Git repository.\",\n source: { kind: \"boolean\" },\n configKey: \"git\",\n },\n {\n flag: \"dry-run\",\n summary: \"Preview generated files without writing them.\",\n source: { kind: \"freeform\", hint: \"boolean flag\" },\n },\n {\n flag: \"verify\",\n summary: \"Run generated checks after scaffolding where supported.\",\n source: { kind: \"freeform\", hint: \"boolean flag\" },\n },\n {\n flag: \"yes\",\n summary: \"Accept defaults. Conflicts with core stack flags.\",\n source: { kind: \"freeform\", hint: \"boolean flag\" },\n },\n {\n flag: \"yolo\",\n summary: \"Skip safety confirmations where supported.\",\n source: { kind: \"freeform\", hint: \"boolean flag\" },\n },\n {\n flag: \"verbose\",\n summary: \"Print detailed scaffold output.\",\n source: { kind: \"freeform\", hint: \"boolean flag\" },\n },\n {\n flag: \"disable-analytics\",\n summary: \"Opt out of anonymous CLI analytics.\",\n source: { kind: \"freeform\", hint: \"boolean flag\" },\n },\n ],\n },\n {\n id: \"typescript-stack\",\n title: \"TypeScript stack\",\n description: \"Core stack flags for `--ecosystem typescript`.\",\n ecosystem: \"typescript\",\n flags: [\n {\n flag: \"frontend\",\n summary: \"Web frontend framework(s).\",\n source: { kind: \"category\", category: \"webFrontend\" },\n configKey: \"frontend\",\n multiple: true,\n },\n {\n flag: \"backend\",\n summary: \"Backend framework. `self` pairs with fullstack frontends.\",\n source: { kind: \"category\", category: \"backend\" },\n configKey: \"backend\",\n },\n {\n flag: \"runtime\",\n summary: \"Server runtime.\",\n source: { kind: \"category\", category: \"runtime\" },\n configKey: \"runtime\",\n },\n {\n flag: \"database\",\n summary: \"Database engine.\",\n source: { kind: \"category\", category: \"database\" },\n configKey: \"database\",\n },\n {\n flag: \"orm\",\n summary: \"ORM / query layer.\",\n source: { kind: \"category\", category: \"orm\" },\n configKey: \"orm\",\n },\n {\n flag: \"db-setup\",\n summary: \"Hosted database provider setup.\",\n source: { kind: \"category\", category: \"dbSetup\" },\n configKey: \"dbSetup\",\n },\n {\n flag: \"auth\",\n summary: \"Authentication provider.\",\n source: { kind: \"category\", category: \"auth\" },\n configKey: \"auth\",\n },\n {\n flag: \"api\",\n summary: \"API layer. tRPC is React-oriented.\",\n source: { kind: \"category\", category: \"api\" },\n configKey: \"api\",\n },\n {\n flag: \"astro-integration\",\n summary: \"Astro UI framework integration (Astro frontends).\",\n source: { kind: \"category\", category: \"astroIntegration\" },\n configKey: \"astroIntegration\",\n },\n {\n flag: \"manual-db\",\n summary: \"Skip provider-specific database setup prompts.\",\n source: { kind: \"freeform\", hint: \"boolean flag\" },\n },\n ],\n },\n {\n id: \"typescript-services\",\n title: \"TypeScript services\",\n description: \"Optional service integrations for TypeScript stacks.\",\n ecosystem: \"typescript\",\n flags: [\n {\n flag: \"ai\",\n summary: \"AI SDK / agent framework.\",\n source: { kind: \"category\", category: \"ai\" },\n configKey: \"ai\",\n },\n {\n flag: \"payments\",\n summary: \"Payments provider.\",\n source: { kind: \"category\", category: \"payments\" },\n configKey: \"payments\",\n },\n {\n flag: \"email\",\n summary: \"Email provider.\",\n source: { kind: \"category\", category: \"email\" },\n configKey: \"email\",\n },\n {\n flag: \"realtime\",\n summary: \"Realtime transport.\",\n source: { kind: \"category\", category: \"realtime\" },\n configKey: \"realtime\",\n },\n {\n flag: \"job-queue\",\n summary: \"Background job / queue system.\",\n source: { kind: \"category\", category: \"jobQueue\" },\n configKey: \"jobQueue\",\n },\n {\n flag: \"cms\",\n summary: \"Content management system.\",\n source: { kind: \"category\", category: \"cms\" },\n configKey: \"cms\",\n },\n {\n flag: \"caching\",\n summary: \"Cache layer.\",\n source: { kind: \"category\", category: \"caching\" },\n configKey: \"caching\",\n },\n {\n flag: \"search\",\n summary: \"Search engine.\",\n source: { kind: \"category\", category: \"search\" },\n configKey: \"search\",\n },\n {\n flag: \"file-storage\",\n summary: \"Object storage provider.\",\n source: { kind: \"category\", category: \"fileStorage\" },\n configKey: \"fileStorage\",\n },\n {\n flag: \"file-upload\",\n summary: \"File upload helper.\",\n source: { kind: \"category\", category: \"fileUpload\" },\n configKey: \"fileUpload\",\n },\n {\n flag: \"analytics\",\n summary: \"Web analytics provider.\",\n source: { kind: \"category\", category: \"analytics\" },\n configKey: \"analytics\",\n },\n {\n flag: \"feature-flags\",\n summary: \"Feature flag platform.\",\n source: { kind: \"category\", category: \"featureFlags\" },\n configKey: \"featureFlags\",\n },\n {\n flag: \"integrations\",\n summary: \"Third-party integrations SDK.\",\n source: { kind: \"category\", category: \"integrations\" },\n configKey: \"integrations\",\n },\n {\n flag: \"ecommerce\",\n summary: \"E-commerce platform SDK.\",\n source: { kind: \"category\", category: \"ecommerce\" },\n configKey: \"ecommerce\",\n },\n {\n flag: \"vector-db\",\n summary: \"Vector database.\",\n source: { kind: \"category\", category: \"vectorDb\" },\n configKey: \"vectorDb\",\n },\n {\n flag: \"rate-limit\",\n summary: \"Rate limiting helper.\",\n source: { kind: \"category\", category: \"rateLimit\" },\n configKey: \"rateLimit\",\n },\n {\n flag: \"bot-protection\",\n summary: \"Bot and CAPTCHA verification provider.\",\n source: { kind: \"category\", category: \"botProtection\" },\n configKey: \"botProtection\",\n },\n {\n flag: \"i18n\",\n summary: \"Internationalization library.\",\n source: { kind: \"category\", category: \"i18n\" },\n configKey: \"i18n\",\n },\n {\n flag: \"effect\",\n summary: \"Effect capability level.\",\n source: { kind: \"category\", category: \"effect\" },\n configKey: \"effect\",\n },\n {\n flag: \"logging\",\n summary: \"Logging library.\",\n source: { kind: \"category\", category: \"logging\" },\n configKey: \"logging\",\n },\n {\n flag: \"observability\",\n summary: \"Observability provider.\",\n source: { kind: \"category\", category: \"observability\" },\n configKey: \"observability\",\n },\n ],\n },\n {\n id: \"typescript-ui\",\n title: \"TypeScript UI and app behavior\",\n description: \"Frontend styling, state, forms, validation, and testing flags.\",\n ecosystem: \"typescript\",\n flags: [\n {\n flag: \"css-framework\",\n summary: \"CSS framework.\",\n source: { kind: \"category\", category: \"cssFramework\" },\n configKey: \"cssFramework\",\n },\n {\n flag: \"ui-library\",\n summary: \"Component library.\",\n source: { kind: \"category\", category: \"uiLibrary\" },\n configKey: \"uiLibrary\",\n },\n {\n flag: \"state-management\",\n summary: \"Client state manager.\",\n source: { kind: \"category\", category: \"stateManagement\" },\n configKey: \"stateManagement\",\n },\n {\n flag: \"forms\",\n summary: \"Form library.\",\n source: { kind: \"category\", category: \"forms\" },\n configKey: \"forms\",\n },\n {\n flag: \"validation\",\n summary: \"Schema validation library.\",\n source: { kind: \"category\", category: \"validation\" },\n configKey: \"validation\",\n },\n {\n flag: \"testing\",\n summary: \"Testing setup.\",\n source: { kind: \"category\", category: \"testing\" },\n configKey: \"testing\",\n },\n {\n flag: \"animation\",\n summary: \"Animation library.\",\n source: { kind: \"category\", category: \"animation\" },\n configKey: \"animation\",\n },\n ],\n },\n {\n id: \"shadcn\",\n title: \"shadcn/ui flags\",\n description: \"Only apply when `--ui-library shadcn-ui` is selected.\",\n ecosystem: \"typescript\",\n flags: [\n {\n flag: \"shadcn-base\",\n summary: \"shadcn primitive base.\",\n source: { kind: \"category\", category: \"shadcnBase\" },\n configKey: \"shadcnBase\",\n },\n {\n flag: \"shadcn-style\",\n summary: \"shadcn style preset.\",\n source: { kind: \"category\", category: \"shadcnStyle\" },\n configKey: \"shadcnStyle\",\n },\n {\n flag: \"shadcn-icon-library\",\n summary: \"Icon library.\",\n source: { kind: \"category\", category: \"shadcnIconLibrary\" },\n configKey: \"shadcnIconLibrary\",\n },\n {\n flag: \"shadcn-color-theme\",\n summary: \"Color theme.\",\n source: { kind: \"category\", category: \"shadcnColorTheme\" },\n configKey: \"shadcnColorTheme\",\n },\n {\n flag: \"shadcn-base-color\",\n summary: \"Base neutral color.\",\n source: { kind: \"category\", category: \"shadcnBaseColor\" },\n configKey: \"shadcnBaseColor\",\n },\n {\n flag: \"shadcn-font\",\n summary: \"Default font.\",\n source: { kind: \"category\", category: \"shadcnFont\" },\n configKey: \"shadcnFont\",\n },\n {\n flag: \"shadcn-radius\",\n summary: \"Corner radius scale.\",\n source: { kind: \"category\", category: \"shadcnRadius\" },\n configKey: \"shadcnRadius\",\n },\n ],\n },\n {\n id: \"react-native\",\n title: \"React Native flags\",\n description: \"Flags for `--ecosystem react-native`.\",\n ecosystem: \"react-native\",\n flags: [\n {\n flag: \"frontend\",\n summary: \"Expo native frontend styling.\",\n source: { kind: \"category\", category: \"nativeFrontend\" },\n defaultLiteral: \"native-bare\",\n multiple: true,\n },\n {\n flag: \"mobile-navigation\",\n summary: \"Navigation library.\",\n source: { kind: \"category\", category: \"mobileNavigation\" },\n configKey: \"mobileNavigation\",\n },\n {\n flag: \"mobile-ui\",\n summary: \"Mobile UI kit.\",\n source: { kind: \"category\", category: \"mobileUI\" },\n configKey: \"mobileUI\",\n },\n {\n flag: \"mobile-storage\",\n summary: \"On-device storage.\",\n source: { kind: \"category\", category: \"mobileStorage\" },\n configKey: \"mobileStorage\",\n },\n {\n flag: \"mobile-testing\",\n summary: \"Mobile testing setup.\",\n source: { kind: \"category\", category: \"mobileTesting\" },\n configKey: \"mobileTesting\",\n },\n {\n flag: \"mobile-push\",\n summary: \"Push notifications.\",\n source: { kind: \"category\", category: \"mobilePush\" },\n configKey: \"mobilePush\",\n },\n {\n flag: \"mobile-ota\",\n summary: \"Over-the-air updates.\",\n source: { kind: \"category\", category: \"mobileOTA\" },\n configKey: \"mobileOTA\",\n },\n {\n flag: \"mobile-deep-linking\",\n summary: \"Deep linking.\",\n source: { kind: \"category\", category: \"mobileDeepLinking\" },\n configKey: \"mobileDeepLinking\",\n },\n {\n flag: \"mobile-libraries\",\n summary: \"Optional Expo modules.\",\n source: { kind: \"category\", category: \"mobileLibraries\" },\n configKey: \"mobileLibraries\",\n multiple: true,\n },\n {\n flag: \"kotlin-mobile\",\n summary: \"Kotlin mobile app.\",\n source: { kind: \"category\", category: \"kotlinMobile\" },\n configKey: \"kotlinMobile\",\n },\n {\n flag: \"kotlin-mobile-libraries\",\n summary: \"Optional Kotlin mobile libraries.\",\n source: { kind: \"category\", category: \"kotlinMobileLibraries\" },\n configKey: \"kotlinMobileLibraries\",\n multiple: true,\n },\n {\n flag: \"swift-mobile\",\n summary: \"Swift mobile app.\",\n source: { kind: \"category\", category: \"swiftMobile\" },\n configKey: \"swiftMobile\",\n },\n {\n flag: \"dart-mobile\",\n summary: \"Flutter / Dart mobile app.\",\n source: { kind: \"category\", category: \"dartMobile\" },\n configKey: \"dartMobile\",\n },\n ],\n },\n {\n id: \"rust\",\n title: \"Rust flags\",\n description: \"Flags for `--ecosystem rust`.\",\n ecosystem: \"rust\",\n flags: [\n {\n flag: \"rust-web-framework\",\n summary: \"Rust web framework.\",\n source: { kind: \"category\", category: \"rustWebFramework\" },\n configKey: \"rustWebFramework\",\n },\n {\n flag: \"rust-frontend\",\n summary: \"WASM frontend.\",\n source: { kind: \"category\", category: \"rustFrontend\" },\n configKey: \"rustFrontend\",\n },\n {\n flag: \"rust-orm\",\n summary: \"Rust ORM / database.\",\n source: { kind: \"category\", category: \"rustOrm\" },\n configKey: \"rustOrm\",\n },\n {\n flag: \"rust-api\",\n summary: \"Rust API layer.\",\n source: { kind: \"category\", category: \"rustApi\" },\n configKey: \"rustApi\",\n },\n {\n flag: \"rust-cli\",\n summary: \"Rust CLI tooling.\",\n source: { kind: \"category\", category: \"rustCli\" },\n configKey: \"rustCli\",\n },\n {\n flag: \"rust-libraries\",\n summary: \"Rust core libraries.\",\n source: { kind: \"category\", category: \"rustLibraries\" },\n configKey: \"rustLibraries\",\n multiple: true,\n },\n {\n flag: \"rust-logging\",\n summary: \"Rust logging.\",\n source: { kind: \"category\", category: \"rustLogging\" },\n configKey: \"rustLogging\",\n },\n {\n flag: \"rust-error-handling\",\n summary: \"Rust error handling.\",\n source: { kind: \"category\", category: \"rustErrorHandling\" },\n configKey: \"rustErrorHandling\",\n },\n {\n flag: \"rust-caching\",\n summary: \"Rust caching.\",\n source: { kind: \"category\", category: \"rustCaching\" },\n configKey: \"rustCaching\",\n },\n {\n flag: \"rust-auth\",\n summary: \"Rust auth.\",\n source: { kind: \"category\", category: \"rustAuth\" },\n configKey: \"rustAuth\",\n },\n {\n flag: \"rust-realtime\",\n summary: \"Rust realtime.\",\n source: { kind: \"category\", category: \"rustRealtime\" },\n configKey: \"rustRealtime\",\n },\n {\n flag: \"rust-message-queue\",\n summary: \"Rust message queue.\",\n source: { kind: \"category\", category: \"rustMessageQueue\" },\n configKey: \"rustMessageQueue\",\n },\n {\n flag: \"rust-observability\",\n summary: \"Rust observability.\",\n source: { kind: \"category\", category: \"rustObservability\" },\n configKey: \"rustObservability\",\n },\n {\n flag: \"rust-templating\",\n summary: \"Rust templating.\",\n source: { kind: \"category\", category: \"rustTemplating\" },\n configKey: \"rustTemplating\",\n },\n ],\n },\n {\n id: \"python\",\n title: \"Python flags\",\n description: \"Flags for `--ecosystem python`.\",\n ecosystem: \"python\",\n flags: [\n {\n flag: \"python-web-framework\",\n summary: \"Python web framework.\",\n source: { kind: \"category\", category: \"pythonWebFramework\" },\n configKey: \"pythonWebFramework\",\n },\n {\n flag: \"python-orm\",\n summary: \"Python ORM / database.\",\n source: { kind: \"category\", category: \"pythonOrm\" },\n configKey: \"pythonOrm\",\n },\n {\n flag: \"python-validation\",\n summary: \"Validation library.\",\n source: { kind: \"category\", category: \"pythonValidation\" },\n configKey: \"pythonValidation\",\n },\n {\n flag: \"python-ai\",\n summary: \"Python AI / ML libraries.\",\n source: { kind: \"category\", category: \"pythonAi\" },\n configKey: \"pythonAi\",\n multiple: true,\n },\n {\n flag: \"python-auth\",\n summary: \"Python auth.\",\n source: { kind: \"category\", category: \"pythonAuth\" },\n configKey: \"pythonAuth\",\n },\n {\n flag: \"python-api\",\n summary: \"Python API framework.\",\n source: { kind: \"category\", category: \"pythonApi\" },\n configKey: \"pythonApi\",\n },\n {\n flag: \"python-task-queue\",\n summary: \"Python task queue.\",\n source: { kind: \"category\", category: \"pythonTaskQueue\" },\n configKey: \"pythonTaskQueue\",\n },\n {\n flag: \"python-graphql\",\n summary: \"Python GraphQL.\",\n source: { kind: \"category\", category: \"pythonGraphql\" },\n configKey: \"pythonGraphql\",\n },\n {\n flag: \"python-quality\",\n summary: \"Python code quality tool.\",\n source: { kind: \"category\", category: \"pythonQuality\" },\n configKey: \"pythonQuality\",\n },\n {\n flag: \"python-testing\",\n summary: \"Python testing libraries.\",\n source: { kind: \"category\", category: \"pythonTesting\" },\n configKey: \"pythonTesting\",\n multiple: true,\n },\n {\n flag: \"python-caching\",\n summary: \"Python caching.\",\n source: { kind: \"category\", category: \"pythonCaching\" },\n configKey: \"pythonCaching\",\n },\n {\n flag: \"python-realtime\",\n summary: \"Python realtime.\",\n source: { kind: \"category\", category: \"pythonRealtime\" },\n configKey: \"pythonRealtime\",\n },\n {\n flag: \"python-observability\",\n summary: \"Python observability.\",\n source: { kind: \"category\", category: \"pythonObservability\" },\n configKey: \"pythonObservability\",\n },\n {\n flag: \"python-cli\",\n summary: \"Python CLI tooling.\",\n source: { kind: \"category\", category: \"pythonCli\" },\n configKey: \"pythonCli\",\n multiple: true,\n },\n {\n flag: \"python-cloud-sdk\",\n summary: \"Python cloud SDK.\",\n source: { kind: \"category\", category: \"pythonCloudSdk\" },\n configKey: \"pythonCloudSdk\",\n },\n {\n flag: \"python-http-client\",\n summary: \"Python HTTP client.\",\n source: { kind: \"category\", category: \"pythonHttpClient\" },\n configKey: \"pythonHttpClient\",\n },\n {\n flag: \"python-data\",\n summary: \"Python data and scientific libraries.\",\n source: { kind: \"category\", category: \"pythonData\" },\n configKey: \"pythonData\",\n multiple: true,\n },\n {\n flag: \"python-media\",\n summary: \"Python media library.\",\n source: { kind: \"category\", category: \"pythonMedia\" },\n configKey: \"pythonMedia\",\n },\n {\n flag: \"python-server\",\n summary: \"Python production server.\",\n source: { kind: \"category\", category: \"pythonServer\" },\n configKey: \"pythonServer\",\n },\n {\n flag: \"python-package-manager\",\n summary: \"Python package manager.\",\n source: { kind: \"category\", category: \"pythonPackageManager\" },\n configKey: \"pythonPackageManager\",\n },\n {\n flag: \"python-message-queue\",\n summary: \"Python message queue client.\",\n source: { kind: \"category\", category: \"pythonMessageQueue\" },\n configKey: \"pythonMessageQueue\",\n },\n ],\n },\n {\n id: \"go\",\n title: \"Go flags\",\n description: \"Flags for `--ecosystem go`. Global `--auth` also applies.\",\n ecosystem: \"go\",\n flags: [\n {\n flag: \"go-web-framework\",\n summary: \"Go web framework.\",\n source: { kind: \"category\", category: \"goWebFramework\" },\n configKey: \"goWebFramework\",\n },\n {\n flag: \"go-orm\",\n summary: \"Go ORM / database.\",\n source: { kind: \"category\", category: \"goOrm\" },\n configKey: \"goOrm\",\n },\n {\n flag: \"go-api\",\n summary: \"Go API layer.\",\n source: { kind: \"category\", category: \"goApi\" },\n configKey: \"goApi\",\n },\n {\n flag: \"go-cli\",\n summary: \"Go CLI tooling.\",\n source: { kind: \"category\", category: \"goCli\" },\n configKey: \"goCli\",\n },\n {\n flag: \"go-logging\",\n summary: \"Go logging.\",\n source: { kind: \"category\", category: \"goLogging\" },\n configKey: \"goLogging\",\n },\n {\n flag: \"go-auth\",\n summary: \"Go-native auth helpers.\",\n source: { kind: \"category\", category: \"goAuth\" },\n configKey: \"goAuth\",\n },\n {\n flag: \"go-testing\",\n summary: \"Go testing libraries.\",\n source: { kind: \"category\", category: \"goTesting\" },\n configKey: \"goTesting\",\n multiple: true,\n },\n {\n flag: \"go-realtime\",\n summary: \"Go realtime.\",\n source: { kind: \"category\", category: \"goRealtime\" },\n configKey: \"goRealtime\",\n },\n {\n flag: \"go-message-queue\",\n summary: \"Go message queue.\",\n source: { kind: \"category\", category: \"goMessageQueue\" },\n configKey: \"goMessageQueue\",\n },\n {\n flag: \"go-caching\",\n summary: \"Go caching.\",\n source: { kind: \"category\", category: \"goCaching\" },\n configKey: \"goCaching\",\n },\n {\n flag: \"go-config\",\n summary: \"Go config loader.\",\n source: { kind: \"category\", category: \"goConfig\" },\n configKey: \"goConfig\",\n },\n {\n flag: \"go-observability\",\n summary: \"Go observability.\",\n source: { kind: \"category\", category: \"goObservability\" },\n configKey: \"goObservability\",\n },\n {\n flag: \"go-validation\",\n summary: \"Go validation.\",\n source: { kind: \"category\", category: \"goValidation\" },\n configKey: \"goValidation\",\n },\n {\n flag: \"go-quality\",\n summary: \"Go code quality.\",\n source: { kind: \"category\", category: \"goQuality\" },\n configKey: \"goQuality\",\n },\n {\n flag: \"go-migrations\",\n summary: \"Go database migrations.\",\n source: { kind: \"category\", category: \"goMigrations\" },\n configKey: \"goMigrations\",\n },\n {\n flag: \"go-templating\",\n summary: \"Go templating.\",\n source: { kind: \"category\", category: \"goTemplating\" },\n configKey: \"goTemplating\",\n },\n {\n flag: \"go-proto-tooling\",\n summary: \"Go protobuf tooling.\",\n source: { kind: \"category\", category: \"goProtoTooling\" },\n configKey: \"goProtoTooling\",\n },\n {\n flag: \"go-di\",\n summary: \"Go dependency injection.\",\n source: { kind: \"category\", category: \"goDI\" },\n configKey: \"goDI\",\n },\n ],\n },\n {\n id: \"java\",\n title: \"Java flags\",\n description: \"Flags for `--ecosystem java`.\",\n ecosystem: \"java\",\n flags: [\n {\n flag: \"java-web-framework\",\n summary: \"Java web framework.\",\n source: { kind: \"category\", category: \"javaWebFramework\" },\n configKey: \"javaWebFramework\",\n },\n {\n flag: \"java-language\",\n summary: \"JVM language (java or kotlin).\",\n source: { kind: \"category\", category: \"javaLanguage\" },\n configKey: \"javaLanguage\",\n },\n {\n flag: \"java-build-tool\",\n summary: \"Build tool.\",\n source: { kind: \"category\", category: \"javaBuildTool\" },\n configKey: \"javaBuildTool\",\n },\n {\n flag: \"java-orm\",\n summary: \"Java ORM / database.\",\n source: { kind: \"category\", category: \"javaOrm\" },\n configKey: \"javaOrm\",\n },\n {\n flag: \"java-auth\",\n summary: \"Java auth.\",\n source: { kind: \"category\", category: \"javaAuth\" },\n configKey: \"javaAuth\",\n },\n {\n flag: \"java-api\",\n summary: \"Java API layer.\",\n source: { kind: \"category\", category: \"javaApi\" },\n configKey: \"javaApi\",\n },\n {\n flag: \"java-logging\",\n summary: \"Java logging.\",\n source: { kind: \"category\", category: \"javaLogging\" },\n configKey: \"javaLogging\",\n },\n {\n flag: \"java-libraries\",\n summary: \"Java libraries.\",\n source: { kind: \"category\", category: \"javaLibraries\" },\n configKey: \"javaLibraries\",\n multiple: true,\n },\n {\n flag: \"java-testing-libraries\",\n summary: \"Java testing libraries.\",\n source: { kind: \"category\", category: \"javaTestingLibraries\" },\n configKey: \"javaTestingLibraries\",\n multiple: true,\n },\n ],\n },\n {\n id: \"dotnet\",\n title: \".NET flags\",\n description: \"Flags for `--ecosystem dotnet`.\",\n ecosystem: \"dotnet\",\n flags: [\n {\n flag: \"dotnet-frontend\",\n summary: \".NET frontend.\",\n source: { kind: \"category\", category: \"dotnetFrontend\" },\n configKey: \"dotnetFrontend\",\n },\n {\n flag: \"dotnet-web-framework\",\n summary: \".NET web framework.\",\n source: { kind: \"category\", category: \"dotnetWebFramework\" },\n configKey: \"dotnetWebFramework\",\n },\n {\n flag: \"dotnet-orm\",\n summary: \".NET data access.\",\n source: { kind: \"category\", category: \"dotnetOrm\" },\n configKey: \"dotnetOrm\",\n },\n {\n flag: \"dotnet-auth\",\n summary: \".NET auth.\",\n source: { kind: \"category\", category: \"dotnetAuth\" },\n configKey: \"dotnetAuth\",\n },\n {\n flag: \"dotnet-api\",\n summary: \".NET API style.\",\n source: { kind: \"category\", category: \"dotnetApi\" },\n configKey: \"dotnetApi\",\n },\n {\n flag: \"dotnet-testing\",\n summary: \".NET testing libraries.\",\n source: { kind: \"category\", category: \"dotnetTesting\" },\n configKey: \"dotnetTesting\",\n multiple: true,\n },\n {\n flag: \"dotnet-job-queue\",\n summary: \".NET background jobs.\",\n source: { kind: \"category\", category: \"dotnetJobQueue\" },\n configKey: \"dotnetJobQueue\",\n },\n {\n flag: \"dotnet-realtime\",\n summary: \".NET realtime.\",\n source: { kind: \"category\", category: \"dotnetRealtime\" },\n configKey: \"dotnetRealtime\",\n },\n {\n flag: \"dotnet-observability\",\n summary: \".NET observability.\",\n source: { kind: \"category\", category: \"dotnetObservability\" },\n configKey: \"dotnetObservability\",\n multiple: true,\n },\n {\n flag: \"dotnet-validation\",\n summary: \".NET validation.\",\n source: { kind: \"category\", category: \"dotnetValidation\" },\n configKey: \"dotnetValidation\",\n },\n {\n flag: \"dotnet-caching\",\n summary: \".NET caching.\",\n source: { kind: \"category\", category: \"dotnetCaching\" },\n configKey: \"dotnetCaching\",\n },\n {\n flag: \"dotnet-deploy\",\n summary: \".NET deploy target.\",\n source: { kind: \"category\", category: \"dotnetDeploy\" },\n configKey: \"dotnetDeploy\",\n },\n {\n flag: \"dotnet-libraries\",\n summary: \"Optional .NET libraries.\",\n source: { kind: \"category\", category: \"dotnetLibraries\" },\n configKey: \"dotnetLibraries\",\n multiple: true,\n },\n ],\n },\n {\n id: \"elixir\",\n title: \"Elixir flags\",\n description: \"Flags for `--ecosystem elixir`.\",\n ecosystem: \"elixir\",\n flags: [\n {\n flag: \"elixir-web-framework\",\n summary: \"Elixir web framework.\",\n source: { kind: \"category\", category: \"elixirWebFramework\" },\n configKey: \"elixirWebFramework\",\n },\n {\n flag: \"elixir-orm\",\n summary: \"Elixir ORM / database.\",\n source: { kind: \"category\", category: \"elixirOrm\" },\n configKey: \"elixirOrm\",\n },\n {\n flag: \"elixir-auth\",\n summary: \"Elixir auth.\",\n source: { kind: \"category\", category: \"elixirAuth\" },\n configKey: \"elixirAuth\",\n },\n {\n flag: \"elixir-api\",\n summary: \"Elixir API layer.\",\n source: { kind: \"category\", category: \"elixirApi\" },\n configKey: \"elixirApi\",\n },\n {\n flag: \"elixir-realtime\",\n summary: \"Elixir realtime.\",\n source: { kind: \"category\", category: \"elixirRealtime\" },\n configKey: \"elixirRealtime\",\n },\n {\n flag: \"elixir-jobs\",\n summary: \"Elixir jobs.\",\n source: { kind: \"category\", category: \"elixirJobs\" },\n configKey: \"elixirJobs\",\n },\n {\n flag: \"elixir-validation\",\n summary: \"Elixir validation.\",\n source: { kind: \"category\", category: \"elixirValidation\" },\n configKey: \"elixirValidation\",\n },\n {\n flag: \"elixir-http\",\n summary: \"Elixir HTTP client.\",\n source: { kind: \"category\", category: \"elixirHttp\" },\n configKey: \"elixirHttp\",\n },\n {\n flag: \"elixir-json\",\n summary: \"Elixir JSON library.\",\n source: { kind: \"category\", category: \"elixirJson\" },\n configKey: \"elixirJson\",\n },\n {\n flag: \"elixir-email\",\n summary: \"Elixir email.\",\n source: { kind: \"category\", category: \"elixirEmail\" },\n configKey: \"elixirEmail\",\n },\n {\n flag: \"elixir-caching\",\n summary: \"Elixir caching.\",\n source: { kind: \"category\", category: \"elixirCaching\" },\n configKey: \"elixirCaching\",\n },\n {\n flag: \"elixir-observability\",\n summary: \"Elixir observability.\",\n source: { kind: \"category\", category: \"elixirObservability\" },\n configKey: \"elixirObservability\",\n },\n {\n flag: \"elixir-testing\",\n summary: \"Elixir testing.\",\n source: { kind: \"category\", category: \"elixirTesting\" },\n configKey: \"elixirTesting\",\n },\n {\n flag: \"elixir-quality\",\n summary: \"Elixir code quality.\",\n source: { kind: \"category\", category: \"elixirQuality\" },\n configKey: \"elixirQuality\",\n },\n {\n flag: \"elixir-i18n\",\n summary: \"Elixir internationalization.\",\n source: { kind: \"category\", category: \"elixirI18n\" },\n configKey: \"elixirI18n\",\n },\n {\n flag: \"elixir-http-server\",\n summary: \"Elixir HTTP server.\",\n source: { kind: \"category\", category: \"elixirHttpServer\" },\n configKey: \"elixirHttpServer\",\n },\n {\n flag: \"elixir-application-framework\",\n summary: \"Elixir application framework.\",\n source: { kind: \"category\", category: \"elixirApplicationFramework\" },\n configKey: \"elixirApplicationFramework\",\n },\n {\n flag: \"elixir-documentation\",\n summary: \"Elixir documentation.\",\n source: { kind: \"category\", category: \"elixirDocumentation\" },\n configKey: \"elixirDocumentation\",\n },\n {\n flag: \"elixir-clustering\",\n summary: \"Elixir clustering.\",\n source: { kind: \"category\", category: \"elixirClustering\" },\n configKey: \"elixirClustering\",\n },\n {\n flag: \"elixir-deploy\",\n summary: \"Elixir deploy target.\",\n source: { kind: \"category\", category: \"elixirDeploy\" },\n configKey: \"elixirDeploy\",\n },\n {\n flag: \"elixir-libraries\",\n summary: \"Elixir libraries.\",\n source: { kind: \"category\", category: \"elixirLibraries\" },\n configKey: \"elixirLibraries\",\n multiple: true,\n },\n ],\n },\n];\n\nfunction resolveValues(def: CliFlagDefinition): { values: string[]; valueHint: string | null } {\n const source = def.source;\n switch (source.kind) {\n case \"boolean\":\n return { values: [], valueHint: `--${def.flag} / --no-${def.flag}` };\n case \"freeform\":\n return { values: [], valueHint: source.hint };\n case \"literal\":\n return { values: [...source.values], valueHint: null };\n case \"category\":\n case \"categories\": {\n const categories = source.kind === \"category\" ? [source.category] : source.categories;\n let values = [...new Set(categories.flatMap((category) => getCategoryCliValues(category)))];\n if (def.multiple && !values.includes(\"none\")) values = [...values, \"none\"];\n return { values, valueHint: null };\n }\n }\n}\n\nfunction formatDefault(def: CliFlagDefinition): string | null {\n if (def.defaultLiteral !== undefined) return def.defaultLiteral;\n if (!def.configKey) return null;\n\n const value = createCliDefaultProjectConfigBase()[def.configKey];\n if (Array.isArray(value)) return value.length > 0 ? value.join(\" \") : \"none\";\n if (typeof value === \"boolean\") return value ? `--${def.flag}` : `--no-${def.flag}`;\n if (value === undefined || value === null) return null;\n return String(value);\n}\n\n/**\n * Resolve the declarative flag registry into fully-populated rows (accepted\n * values + defaults) sourced from the shared option metadata and CLI defaults.\n * The docs CLI-flag data module and any tooling should call this rather than\n * hand-maintaining flag tables.\n */\nexport function getCliFlagReference(): ResolvedCliFlagGroup[] {\n return CLI_FLAG_GROUP_DEFINITIONS.map((group) => ({\n id: group.id,\n title: group.title,\n description: group.description,\n ecosystem: group.ecosystem,\n flags: group.flags.map((def) => {\n const { values, valueHint } = resolveValues(def);\n return {\n flag: `--${def.flag}`,\n summary: def.summary,\n values,\n valueHint,\n defaultValue: formatDefault(def),\n multiple: def.multiple ?? false,\n } satisfies ResolvedCliFlag;\n }),\n }));\n}\n","const VITE_WEB_FRONTENDS = new Set([\n \"react-router\",\n \"react-vite\",\n \"tanstack-router\",\n \"vanilla-vite\",\n \"vue\",\n \"svelte\",\n \"solid\",\n \"fresh\",\n]);\nconst ASTRO_WEB_FRONTENDS = new Set([\"astro\"]);\n\nexport function getLocalWebDevPort(frontend: readonly string[]): 3001 | 4321 | 5173 | 8910 {\n // Redwood's web dev server port is fixed in redwood.toml.\n if (frontend.includes(\"redwood\")) {\n return 8910;\n }\n\n if (frontend.some((entry) => VITE_WEB_FRONTENDS.has(entry))) {\n return 5173;\n }\n\n if (frontend.some((entry) => ASTRO_WEB_FRONTENDS.has(entry))) {\n return 4321;\n }\n\n return 3001;\n}\n","import { z } from \"zod\";\n\n/**\n * Capability-pack registry schemas.\n *\n * A capability pack is a self-contained bundle a community author (or a private\n * team) can drop into an existing Better Fullstack project: a `registry.json`\n * manifest that declares the files to write, the dependencies to merge, the env\n * vars to append, and some advisory metadata. The MVP installer resolves packs\n * from a local path or a `file://` URL only; the `https` source kind is\n * reserved but not yet wired.\n */\n\n/** Where a pack was resolved from. MVP wires `local`/`file` only. */\nexport const CapabilityPackSourceKindSchema = z\n .enum([\"local\", \"file\", \"https\"])\n .describe(\"Pack source kind: local path, file:// URL, or (reserved) https URL\");\nexport type CapabilityPackSourceKind = z.infer<typeof CapabilityPackSourceKindSchema>;\n\n/**\n * A single file contributed by a pack. `content` is written verbatim unless\n * `template` is true, in which case it is rendered through the Better Fullstack\n * Handlebars pipeline against the target project's config first.\n */\nexport const CapabilityPackFileSchema = z\n .object({\n path: z\n .string()\n .min(1)\n .describe(\"Project-relative destination path, e.g. apps/server/src/lib/rate-limit.ts\"),\n content: z.string().describe(\"File contents (rendered as a template when template=true)\"),\n template: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Render `content` through the template pipeline before writing\"),\n overwrite: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Overwrite an existing file at `path` instead of skipping it\"),\n })\n .describe(\"A file a capability pack writes into the project\");\nexport type CapabilityPackFile = z.infer<typeof CapabilityPackFileSchema>;\n\n/** An environment variable a pack appends to the project's .env.example. */\nexport const CapabilityPackEnvSchema = z\n .object({\n key: z\n .string()\n .min(1)\n .regex(/^[A-Za-z_][A-Za-z0-9_]*$/, \"Env keys must be valid shell identifiers\")\n .describe(\"Environment variable name, e.g. RATE_LIMIT_REDIS_URL\"),\n value: z\n .string()\n .optional()\n .describe(\"Default value written to .env.example (defaults to empty)\"),\n description: z\n .string()\n .optional()\n .describe(\"Human-readable comment written above the variable\"),\n })\n .describe(\"An environment variable declared by a capability pack\");\nexport type CapabilityPackEnv = z.infer<typeof CapabilityPackEnvSchema>;\n\n/**\n * Dependencies keyed by workspace-relative package.json directory (\".\" for the\n * repo root, \"apps/server\", \"packages/api\", ...) each mapping a dependency name\n * to a literal version string.\n */\nexport const CapabilityPackDependencyMapSchema = z\n .record(z.string(), z.record(z.string(), z.string()))\n .describe('Workspace dir -> { \"dep-name\": \"version\" }');\nexport type CapabilityPackDependencyMap = z.infer<typeof CapabilityPackDependencyMapSchema>;\n\n/** Advisory compatibility metadata (not enforced by the MVP installer). */\nexport const CapabilityPackCompatibilitySchema = z\n .object({\n ecosystems: z\n .array(z.string())\n .optional()\n .describe(\"Ecosystems this pack is intended for (advisory)\"),\n requires: z\n .array(z.string())\n .optional()\n .describe(\"Capability ids the pack expects to already be present (advisory)\"),\n conflicts: z\n .array(z.string())\n .optional()\n .describe(\"Capability ids the pack is known to conflict with (advisory)\"),\n })\n .describe(\"Advisory compatibility metadata for a capability pack\");\nexport type CapabilityPackCompatibility = z.infer<typeof CapabilityPackCompatibilitySchema>;\n\n/** The full `registry.json` manifest for a capability pack. */\nexport const CapabilityPackManifestSchema = z\n .object({\n name: z\n .string()\n .min(1)\n .regex(/^@?[a-z0-9][a-z0-9._@/-]*$/i, \"Pack names must be url/npm-safe\")\n .describe(\"Unique pack identifier, e.g. @acme/rate-limit\"),\n version: z.string().min(1).describe(\"Pack version (semver recommended)\"),\n description: z.string().optional().describe(\"Short human-readable summary\"),\n source: CapabilityPackSourceKindSchema.optional().describe(\"Origin kind (informational)\"),\n files: z\n .array(CapabilityPackFileSchema)\n .default([])\n .describe(\"Files the pack writes into the project\"),\n dependencies: CapabilityPackDependencyMapSchema.optional(),\n devDependencies: CapabilityPackDependencyMapSchema.optional(),\n env: z\n .array(CapabilityPackEnvSchema)\n .default([])\n .describe(\"Env vars appended to the project's .env.example\"),\n addons: z\n .array(z.string())\n .optional()\n .describe(\"Addon ids recorded as metadata (not wired into the addons enum)\"),\n compatibility: CapabilityPackCompatibilitySchema.optional(),\n })\n .describe(\"A community/private capability pack manifest (registry.json)\");\nexport type CapabilityPackManifest = z.infer<typeof CapabilityPackManifestSchema>;\n\n/** A record of one installed pack, persisted in the per-project lockfile. */\nexport const InstalledPackSchema = z\n .object({\n name: z.string().describe(\"Pack identifier\"),\n version: z.string().describe(\"Installed pack version\"),\n source: z.string().describe(\"Resolved source string (local path or file:// URL)\"),\n files: z.array(z.string()).default([]).describe(\"Project-relative paths written by the pack\"),\n installedAt: z.string().describe(\"ISO timestamp of the install\"),\n })\n .describe(\"A capability pack recorded as installed in the project lockfile\");\nexport type InstalledPack = z.infer<typeof InstalledPackSchema>;\n\n/** Current schema version of the per-project registry lockfile. */\nexport const REGISTRY_LOCK_VERSION = 1;\n\n/** The per-project lockfile persisted at `.better-fullstack/registry.json`. */\nexport const RegistryLockSchema = z\n .object({\n version: z.number().int().default(REGISTRY_LOCK_VERSION).describe(\"Lockfile schema version\"),\n packs: z.array(InstalledPackSchema).default([]).describe(\"Installed capability packs\"),\n })\n .describe(\"Per-project registry lockfile (.better-fullstack/registry.json)\");\nexport type RegistryLock = z.infer<typeof RegistryLockSchema>;\n","export const UPDATE_SUPPORT_POLICY_SCHEMA_VERSION = 1 as const;\n\nexport type UpdateSupportPolicyStatus = \"qualification\" | \"active\";\n\nexport type UpdateSupportPolicy = {\n schemaVersion: typeof UPDATE_SUPPORT_POLICY_SCHEMA_VERSION;\n status: UpdateSupportPolicyStatus;\n manifestVersion: \"2\";\n window: {\n kind: \"consecutive-manifest-v2-releases\";\n maximumSourceReleases: number;\n supportedReleases: readonly string[];\n supportedFrom: string | null;\n supportedTo: string | null;\n };\n qualification: {\n requiredConsecutiveReleases: number;\n qualifiedConsecutiveReleases: number;\n };\n outsideWindow: {\n automaticApply: false;\n outcome: \"manual-review-required\";\n lineageClaim: \"unverified\";\n };\n};\n\nexport const UPDATE_SUPPORT_POLICY = {\n schemaVersion: UPDATE_SUPPORT_POLICY_SCHEMA_VERSION,\n status: \"qualification\",\n manifestVersion: \"2\",\n window: {\n kind: \"consecutive-manifest-v2-releases\",\n maximumSourceReleases: 2,\n supportedReleases: [],\n supportedFrom: null,\n supportedTo: null,\n },\n qualification: {\n requiredConsecutiveReleases: 2,\n qualifiedConsecutiveReleases: 0,\n },\n outsideWindow: {\n automaticApply: false,\n outcome: \"manual-review-required\",\n lineageClaim: \"unverified\",\n },\n} as const satisfies UpdateSupportPolicy;\n\nexport type UpdateSupportReasonCode =\n | \"same-release\"\n | \"supported-window\"\n | \"policy-invalid\"\n | \"manifest-v2-required\"\n | \"verified-lineage-required\"\n | \"source-version-missing\"\n | \"window-not-qualified\"\n | \"target-outside-policy\"\n | \"source-outside-window\";\n\nexport type UpdateSupportEligibility = {\n schemaVersion: typeof UPDATE_SUPPORT_POLICY_SCHEMA_VERSION;\n policyStatus: UpdateSupportPolicyStatus;\n supportedFrom: string | null;\n supportedTo: string | null;\n sourceVersion: string | null;\n targetVersion: string;\n eligibility: \"same-release\" | \"supported\" | \"manual-review-required\";\n eligible: boolean;\n historicalUpgrade: boolean;\n requiresManualReview: boolean;\n reasonCode: UpdateSupportReasonCode;\n reason: string;\n};\n\nexport type UpdateSupportInput = {\n sourceVersion: string | null;\n targetVersion: string;\n manifestVersion: string | null;\n provenanceVerified: boolean;\n};\n\nconst EXACT_VERSION = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$/;\n\nexport function validateUpdateSupportPolicy(policy: UpdateSupportPolicy): string[] {\n const errors: string[] = [];\n const releases = policy.window.supportedReleases;\n const uniqueReleases = new Set(releases);\n\n if (policy.schemaVersion !== UPDATE_SUPPORT_POLICY_SCHEMA_VERSION) {\n errors.push(\"Unsupported update support policy schema version.\");\n }\n if (policy.manifestVersion !== \"2\") {\n errors.push(\"The supported update window must require manifest v2.\");\n }\n if (\n !Number.isInteger(policy.window.maximumSourceReleases) ||\n policy.window.maximumSourceReleases < 1\n ) {\n errors.push(\"maximumSourceReleases must be a positive integer.\");\n }\n if (uniqueReleases.size !== releases.length) {\n errors.push(\"Supported releases must be unique.\");\n }\n if (releases.some((version) => !EXACT_VERSION.test(version))) {\n errors.push(\"Supported releases must use exact stable semantic versions.\");\n }\n if (releases.length > policy.window.maximumSourceReleases) {\n errors.push(\"The supported release list exceeds maximumSourceReleases.\");\n }\n if (\n policy.qualification.qualifiedConsecutiveReleases !== releases.length ||\n policy.qualification.requiredConsecutiveReleases < 2\n ) {\n errors.push(\"Qualification counts do not match the supported release list.\");\n }\n\n if (policy.status === \"qualification\") {\n if (\n releases.length >= policy.qualification.requiredConsecutiveReleases ||\n policy.window.supportedFrom !== null ||\n policy.window.supportedTo !== null\n ) {\n errors.push(\"A qualification policy cannot advertise a supported historical window.\");\n }\n } else {\n if (releases.length < policy.qualification.requiredConsecutiveReleases) {\n errors.push(\"An active policy requires the declared consecutive release qualification.\");\n }\n if (\n policy.window.supportedFrom !== releases[0] ||\n policy.window.supportedTo !== releases.at(-1)\n ) {\n errors.push(\"Active window bounds must match the ordered supported release list.\");\n }\n }\n\n return errors;\n}\n\nfunction manualReview(\n policy: UpdateSupportPolicy,\n input: UpdateSupportInput,\n reasonCode: Exclude<UpdateSupportReasonCode, \"same-release\" | \"supported-window\">,\n reason: string,\n): UpdateSupportEligibility {\n return {\n schemaVersion: UPDATE_SUPPORT_POLICY_SCHEMA_VERSION,\n policyStatus: policy.status,\n supportedFrom: policy.window.supportedFrom,\n supportedTo: policy.window.supportedTo,\n sourceVersion: input.sourceVersion,\n targetVersion: input.targetVersion,\n eligibility: \"manual-review-required\",\n eligible: false,\n historicalUpgrade: input.sourceVersion !== null && input.sourceVersion !== input.targetVersion,\n requiresManualReview: true,\n reasonCode,\n reason,\n };\n}\n\nexport function evaluateUpdateSupport(\n input: UpdateSupportInput,\n policy: UpdateSupportPolicy = UPDATE_SUPPORT_POLICY,\n): UpdateSupportEligibility {\n const policyErrors = validateUpdateSupportPolicy(policy);\n if (policyErrors.length > 0) {\n return manualReview(policy, input, \"policy-invalid\", policyErrors.join(\" \"));\n }\n if (input.manifestVersion !== policy.manifestVersion) {\n return manualReview(\n policy,\n input,\n \"manifest-v2-required\",\n \"A valid manifest-v2 baseline is required before release compatibility can be evaluated.\",\n );\n }\n if (!input.provenanceVerified) {\n return manualReview(\n policy,\n input,\n \"verified-lineage-required\",\n \"The source generator lineage is unverified, so no historical support claim can be made.\",\n );\n }\n if (!input.sourceVersion) {\n return manualReview(\n policy,\n input,\n \"source-version-missing\",\n \"The verified manifest does not identify an exact source CLI release.\",\n );\n }\n if (input.sourceVersion === input.targetVersion) {\n return {\n schemaVersion: UPDATE_SUPPORT_POLICY_SCHEMA_VERSION,\n policyStatus: policy.status,\n supportedFrom: policy.window.supportedFrom,\n supportedTo: policy.window.supportedTo,\n sourceVersion: input.sourceVersion,\n targetVersion: input.targetVersion,\n eligibility: \"same-release\",\n eligible: true,\n historicalUpgrade: false,\n requiresManualReview: false,\n reasonCode: \"same-release\",\n reason:\n \"The project and update engine use the same exact release. This is current-template reconciliation, not a historical upgrade claim.\",\n };\n }\n if (policy.status !== \"active\") {\n return manualReview(\n policy,\n input,\n \"window-not-qualified\",\n \"Historical updates are not advertised until two consecutive manifest-v2 releases pass the executable qualification matrix.\",\n );\n }\n if (input.targetVersion !== policy.window.supportedTo) {\n return manualReview(\n policy,\n input,\n \"target-outside-policy\",\n \"This CLI release is not the target of the active supported update window.\",\n );\n }\n if (!policy.window.supportedReleases.includes(input.sourceVersion)) {\n return manualReview(\n policy,\n input,\n \"source-outside-window\",\n \"The source release is outside the active supported update window.\",\n );\n }\n\n return {\n schemaVersion: UPDATE_SUPPORT_POLICY_SCHEMA_VERSION,\n policyStatus: policy.status,\n supportedFrom: policy.window.supportedFrom,\n supportedTo: policy.window.supportedTo,\n sourceVersion: input.sourceVersion,\n targetVersion: input.targetVersion,\n eligibility: \"supported\",\n eligible: true,\n historicalUpgrade: true,\n requiresManualReview: false,\n reasonCode: \"supported-window\",\n reason: \"The verified source release is inside the active executable update window.\",\n };\n}\n","import type { StackPart } from \"@/config/types\";\n\nimport { formatStackPartSpec } from \"@/stack/stack-graph\";\n\nexport type StackPartEvidenceSnapshot = {\n level: string;\n maturity?: string;\n freshness?: string;\n};\n\nexport type StackPartComparisonSnapshot = Pick<\n StackPart,\n | \"id\"\n | \"role\"\n | \"ecosystem\"\n | \"toolId\"\n | \"ownerPartId\"\n | \"source\"\n | \"providedByPartId\"\n | \"targetPath\"\n | \"settings\"\n> & {\n spec: string;\n ownerSpec?: string;\n evidence?: StackPartEvidenceSnapshot;\n};\n\nexport type StackPartReplacement = {\n before: StackPartComparisonSnapshot;\n after: StackPartComparisonSnapshot;\n};\n\nexport type StackPartOwnerChange = StackPartReplacement & {\n beforeOwnerId: string | null;\n afterOwnerId: string | null;\n};\n\nexport type StackPartEvidenceChange = StackPartReplacement & {\n beforeEvidence: StackPartEvidenceSnapshot | null;\n afterEvidence: StackPartEvidenceSnapshot | null;\n};\n\nexport type StackGraphComparison = {\n additions: StackPartComparisonSnapshot[];\n removals: StackPartComparisonSnapshot[];\n replacements: StackPartReplacement[];\n ownerChanges: StackPartOwnerChange[];\n evidenceChanges: StackPartEvidenceChange[];\n unchanged: number;\n hasChanges: boolean;\n};\n\nexport type StackGraphComparisonOptions = {\n evidenceForPart?: (part: StackPart) => StackPartEvidenceSnapshot | null | undefined;\n};\n\ntype MatchedPart = { before: StackPart; after: StackPart };\n\nfunction selectedParts(parts: readonly StackPart[]): StackPart[] {\n return parts.filter((part) => part.toolId !== \"none\");\n}\n\nfunction primaryPart(part: StackPart): boolean {\n return !part.ownerPartId;\n}\n\nfunction ownerSpec(part: StackPart, parts: readonly StackPart[]): string | undefined {\n if (!part.ownerPartId) return undefined;\n const owner = parts.find((candidate) => candidate.id === part.ownerPartId);\n return owner ? formatStackPartSpec(owner, parts) : part.ownerPartId;\n}\n\nfunction snapshot(\n part: StackPart,\n parts: readonly StackPart[],\n options: StackGraphComparisonOptions,\n): StackPartComparisonSnapshot {\n const evidence = options.evidenceForPart?.(part) ?? undefined;\n return {\n id: part.id,\n role: part.role,\n ecosystem: part.ecosystem,\n toolId: part.toolId,\n ownerPartId: part.ownerPartId,\n source: part.source,\n providedByPartId: part.providedByPartId,\n targetPath: part.targetPath,\n settings: part.settings,\n spec: formatStackPartSpec(part, parts),\n ownerSpec: ownerSpec(part, parts),\n evidence,\n };\n}\n\nfunction evidenceKey(value: StackPartEvidenceSnapshot | null | undefined): string {\n return JSON.stringify(value ?? null);\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalValue);\n if (!value || typeof value !== \"object\") return value;\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, canonicalValue(entry)]),\n );\n}\n\nfunction persistedPartKey(part: StackPart): string {\n return JSON.stringify(\n canonicalValue({\n id: part.id,\n role: part.role,\n ecosystem: part.ecosystem,\n toolId: part.toolId,\n source: part.source,\n providedByPartId: part.providedByPartId ?? null,\n targetPath: part.targetPath ?? null,\n settings: part.settings ?? null,\n }),\n );\n}\n\nfunction sortSnapshots<T extends StackPartComparisonSnapshot>(values: T[]): T[] {\n return values.sort((left, right) => left.spec.localeCompare(right.spec));\n}\n\nfunction pairByExactId(\n before: readonly StackPart[],\n after: readonly StackPart[],\n matches: MatchedPart[],\n consumedBefore: Set<string>,\n consumedAfter: Set<string>,\n): void {\n const afterById = new Map(after.map((part) => [part.id, part] as const));\n for (const part of before) {\n const candidate = afterById.get(part.id);\n if (!candidate || consumedAfter.has(candidate.id)) continue;\n matches.push({ before: part, after: candidate });\n consumedBefore.add(part.id);\n consumedAfter.add(candidate.id);\n }\n}\n\nfunction pairUniquePrimaryRoles(\n before: readonly StackPart[],\n after: readonly StackPart[],\n matches: MatchedPart[],\n consumedBefore: Set<string>,\n consumedAfter: Set<string>,\n): void {\n const roles = new Set([\n ...before.filter(primaryPart).map((part) => part.role),\n ...after.filter(primaryPart).map((part) => part.role),\n ]);\n\n for (const role of roles) {\n const beforeCandidates = before.filter(\n (part) => primaryPart(part) && part.role === role && !consumedBefore.has(part.id),\n );\n const afterCandidates = after.filter(\n (part) => primaryPart(part) && part.role === role && !consumedAfter.has(part.id),\n );\n if (beforeCandidates.length === 1 && afterCandidates.length === 1) {\n const beforePart = beforeCandidates[0];\n const afterPart = afterCandidates[0];\n if (!beforePart || !afterPart) continue;\n matches.push({ before: beforePart, after: afterPart });\n consumedBefore.add(beforePart.id);\n consumedAfter.add(afterPart.id);\n continue;\n }\n\n for (const beforePart of beforeCandidates) {\n const candidates = afterCandidates.filter(\n (afterPart) =>\n !consumedAfter.has(afterPart.id) &&\n ((beforePart.targetPath && beforePart.targetPath === afterPart.targetPath) ||\n (beforePart.ecosystem === afterPart.ecosystem &&\n beforePart.toolId === afterPart.toolId)),\n );\n if (candidates.length !== 1) continue;\n const afterPart = candidates[0];\n if (!afterPart) continue;\n matches.push({ before: beforePart, after: afterPart });\n consumedBefore.add(beforePart.id);\n consumedAfter.add(afterPart.id);\n }\n }\n}\n\nfunction pairOwnedParts(\n before: readonly StackPart[],\n after: readonly StackPart[],\n matches: MatchedPart[],\n consumedBefore: Set<string>,\n consumedAfter: Set<string>,\n): void {\n const ownerReplacements = new Map(\n matches\n .filter((match) => primaryPart(match.before) && primaryPart(match.after))\n .map((match) => [match.before.id, match.after.id] as const),\n );\n\n const expectedOwner = (part: StackPart) =>\n part.ownerPartId ? (ownerReplacements.get(part.ownerPartId) ?? part.ownerPartId) : undefined;\n\n for (const beforePart of before) {\n if (!beforePart.ownerPartId || consumedBefore.has(beforePart.id)) continue;\n const candidates = after.filter(\n (afterPart) =>\n !consumedAfter.has(afterPart.id) &&\n afterPart.ownerPartId === expectedOwner(beforePart) &&\n afterPart.role === beforePart.role &&\n afterPart.ecosystem === beforePart.ecosystem &&\n afterPart.toolId === beforePart.toolId &&\n afterPart.source === beforePart.source,\n );\n if (candidates.length !== 1) continue;\n const afterPart = candidates[0];\n if (!afterPart) continue;\n matches.push({ before: beforePart, after: afterPart });\n consumedBefore.add(beforePart.id);\n consumedAfter.add(afterPart.id);\n }\n\n const slotKeys = new Set(\n before\n .filter((part) => part.ownerPartId && !consumedBefore.has(part.id))\n .map((part) => `${expectedOwner(part)}:${part.role}:${part.source}`),\n );\n for (const slotKey of slotKeys) {\n const beforeCandidates = before.filter(\n (part) =>\n part.ownerPartId !== undefined &&\n !consumedBefore.has(part.id) &&\n `${expectedOwner(part)}:${part.role}:${part.source}` === slotKey,\n );\n const afterCandidates = after.filter(\n (part) =>\n part.ownerPartId !== undefined &&\n !consumedAfter.has(part.id) &&\n `${part.ownerPartId}:${part.role}:${part.source}` === slotKey,\n );\n if (beforeCandidates.length !== 1 || afterCandidates.length !== 1) continue;\n const beforePart = beforeCandidates[0];\n const afterPart = afterCandidates[0];\n if (!beforePart || !afterPart) continue;\n matches.push({ before: beforePart, after: afterPart });\n consumedBefore.add(beforePart.id);\n consumedAfter.add(afterPart.id);\n }\n}\n\nexport function compareStackGraphs(\n beforeInput: readonly StackPart[],\n afterInput: readonly StackPart[],\n options: StackGraphComparisonOptions = {},\n): StackGraphComparison {\n const before = selectedParts(beforeInput);\n const after = selectedParts(afterInput);\n const matches: MatchedPart[] = [];\n const consumedBefore = new Set<string>();\n const consumedAfter = new Set<string>();\n\n pairByExactId(before, after, matches, consumedBefore, consumedAfter);\n pairUniquePrimaryRoles(before, after, matches, consumedBefore, consumedAfter);\n pairOwnedParts(before, after, matches, consumedBefore, consumedAfter);\n\n const replacements: StackPartReplacement[] = [];\n const ownerChanges: StackPartOwnerChange[] = [];\n const evidenceChanges: StackPartEvidenceChange[] = [];\n let unchanged = 0;\n\n for (const match of matches) {\n const beforeSnapshot = snapshot(match.before, before, options);\n const afterSnapshot = snapshot(match.after, after, options);\n const pair = { before: beforeSnapshot, after: afterSnapshot };\n const replaced = persistedPartKey(match.before) !== persistedPartKey(match.after);\n const ownerChanged = (match.before.ownerPartId ?? null) !== (match.after.ownerPartId ?? null);\n const beforeEvidence = options.evidenceForPart?.(match.before) ?? null;\n const afterEvidence = options.evidenceForPart?.(match.after) ?? null;\n const evidenceChanged = evidenceKey(beforeEvidence) !== evidenceKey(afterEvidence);\n\n if (replaced) replacements.push(pair);\n if (ownerChanged) {\n ownerChanges.push({\n ...pair,\n beforeOwnerId: match.before.ownerPartId ?? null,\n afterOwnerId: match.after.ownerPartId ?? null,\n });\n }\n if (evidenceChanged) {\n evidenceChanges.push({ ...pair, beforeEvidence, afterEvidence });\n }\n if (!replaced && !ownerChanged && !evidenceChanged) unchanged += 1;\n }\n\n const additions = sortSnapshots(\n after\n .filter((part) => !consumedAfter.has(part.id))\n .map((part) => snapshot(part, after, options)),\n );\n const removals = sortSnapshots(\n before\n .filter((part) => !consumedBefore.has(part.id))\n .map((part) => snapshot(part, before, options)),\n );\n replacements.sort((left, right) => left.before.spec.localeCompare(right.before.spec));\n ownerChanges.sort((left, right) => left.before.spec.localeCompare(right.before.spec));\n evidenceChanges.sort((left, right) => left.before.spec.localeCompare(right.before.spec));\n\n return {\n additions,\n removals,\n replacements,\n ownerChanges,\n evidenceChanges,\n unchanged,\n hasChanges:\n additions.length > 0 ||\n removals.length > 0 ||\n replacements.length > 0 ||\n ownerChanges.length > 0 ||\n evidenceChanges.length > 0,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["CLI_FLAG_GROUP_DEFINITIONS: readonly CliFlagGroupDefinition[]","errors: string[]","afterPart","matches: MatchedPart[]","replacements: StackPartReplacement[]","ownerChanges: StackPartOwnerChange[]","evidenceChanges: StackPartEvidenceChange[]"],"sources":["../src/catalog/cli-flags.ts","../src/platform/local-dev.ts","../src/catalog/registry.ts","../src/stack/update-support.ts","../src/stack/stack-comparison.ts"],"sourcesContent":["import { createCliDefaultProjectConfigBase } from \"@/config/defaults\";\nimport {\n getCategoryCliValues,\n type OptionCategory,\n type OptionCategoryEcosystem,\n} from \"@/catalog/option-metadata\";\nimport {\n DIRECTORY_CONFLICT_VALUES,\n ECOSYSTEM_VALUES,\n PROJECT_SHAPE_VALUES,\n TEMPLATE_VALUES,\n} from \"@/config/schemas\";\n\ntype CliDefaultConfig = ReturnType<typeof createCliDefaultProjectConfigBase>;\ntype CliConfigKey = keyof CliDefaultConfig;\n\n/**\n * How a CLI flag's accepted values are derived. Every source resolves against\n * the shared option metadata / schema value lists in this package so the CLI\n * reference table never drifts from the real generator surface.\n */\nexport type CliFlagValueSource =\n | { readonly kind: \"category\"; readonly category: OptionCategory }\n | { readonly kind: \"categories\"; readonly categories: readonly OptionCategory[] }\n | { readonly kind: \"literal\"; readonly values: readonly string[] }\n | { readonly kind: \"boolean\" }\n | { readonly kind: \"freeform\"; readonly hint: string };\n\nexport type CliFlagDefinition = {\n /** Canonical flag name without the leading dashes, e.g. `frontend`. */\n readonly flag: string;\n readonly summary: string;\n readonly source: CliFlagValueSource;\n /** Project-config field the default value is read from, when applicable. */\n readonly configKey?: CliConfigKey;\n /** Overrides the config-derived default when the config default is ecosystem-dependent. */\n readonly defaultLiteral?: string;\n /** Whether the flag accepts multiple space-separated values. */\n readonly multiple?: boolean;\n};\n\nexport type CliFlagGroupDefinition = {\n readonly id: string;\n readonly title: string;\n readonly description: string;\n readonly ecosystem?: OptionCategoryEcosystem;\n readonly flags: readonly CliFlagDefinition[];\n};\n\nexport type ResolvedCliFlag = {\n /** Flag rendered with the leading dashes, e.g. `--frontend`. */\n readonly flag: string;\n readonly summary: string;\n readonly values: readonly string[];\n readonly valueHint: string | null;\n readonly defaultValue: string | null;\n readonly multiple: boolean;\n};\n\nexport type ResolvedCliFlagGroup = {\n readonly id: string;\n readonly title: string;\n readonly description: string;\n readonly ecosystem?: OptionCategoryEcosystem;\n readonly flags: readonly ResolvedCliFlag[];\n};\n\nexport const CLI_FLAG_GROUP_DEFINITIONS: readonly CliFlagGroupDefinition[] = [\n {\n id: \"common\",\n title: \"Common flags\",\n description: \"Flags that apply to every ecosystem and control workflow behavior.\",\n flags: [\n {\n flag: \"ecosystem\",\n summary: \"Language/runtime ecosystem to scaffold.\",\n source: { kind: \"literal\", values: ECOSYSTEM_VALUES },\n configKey: \"ecosystem\",\n },\n {\n flag: \"template\",\n summary: \"Start from a curated stack preset instead of individual flags.\",\n source: { kind: \"literal\", values: TEMPLATE_VALUES },\n },\n {\n flag: \"shape\",\n summary:\n \"Start from a project shape. Asks which language or platform, then only the prompts that shape needs.\",\n source: { kind: \"literal\", values: PROJECT_SHAPE_VALUES },\n },\n {\n flag: \"part\",\n summary: \"Add a multi-ecosystem stack part. Repeat once per part.\",\n source: { kind: \"freeform\", hint: \"role:ecosystem:tool (e.g. frontend:typescript:next)\" },\n },\n {\n flag: \"examples\",\n summary: \"Optional example features to include.\",\n source: { kind: \"category\", category: \"examples\" },\n configKey: \"examples\",\n multiple: true,\n },\n {\n flag: \"ai-docs\",\n summary: \"Agent instruction files to generate.\",\n source: { kind: \"category\", category: \"aiDocs\" },\n configKey: \"aiDocs\",\n multiple: true,\n },\n {\n flag: \"package-manager\",\n summary: \"Package manager for the generated workspace.\",\n source: { kind: \"category\", category: \"packageManager\" },\n configKey: \"packageManager\",\n },\n {\n flag: \"workspace-shape\",\n summary: \"Monorepo or single-app workspace layout.\",\n source: { kind: \"category\", category: \"workspaceShape\" },\n configKey: \"workspaceShape\",\n },\n {\n flag: \"version-channel\",\n summary: \"Dependency version channel.\",\n source: { kind: \"category\", category: \"versionChannel\" },\n configKey: \"versionChannel\",\n },\n {\n flag: \"web-deploy\",\n summary: \"Deployment target config for the web app.\",\n source: { kind: \"category\", category: \"webDeploy\" },\n configKey: \"webDeploy\",\n },\n {\n flag: \"server-deploy\",\n summary: \"Deployment target config for the server.\",\n source: { kind: \"category\", category: \"serverDeploy\" },\n configKey: \"serverDeploy\",\n },\n {\n flag: \"directory-conflict\",\n summary: \"Strategy when the target directory already exists.\",\n source: { kind: \"literal\", values: DIRECTORY_CONFLICT_VALUES },\n },\n {\n flag: \"install\",\n summary: \"Install dependencies after scaffolding.\",\n source: { kind: \"boolean\" },\n configKey: \"install\",\n },\n {\n flag: \"git\",\n summary: \"Initialize a Git repository.\",\n source: { kind: \"boolean\" },\n configKey: \"git\",\n },\n {\n flag: \"dry-run\",\n summary: \"Preview generated files without writing them.\",\n source: { kind: \"freeform\", hint: \"boolean flag\" },\n },\n {\n flag: \"verify\",\n summary: \"Run generated checks after scaffolding where supported.\",\n source: { kind: \"freeform\", hint: \"boolean flag\" },\n },\n {\n flag: \"yes\",\n summary: \"Accept defaults. Conflicts with core stack flags.\",\n source: { kind: \"freeform\", hint: \"boolean flag\" },\n },\n {\n flag: \"yolo\",\n summary: \"Skip safety confirmations where supported.\",\n source: { kind: \"freeform\", hint: \"boolean flag\" },\n },\n {\n flag: \"verbose\",\n summary: \"Print detailed scaffold output.\",\n source: { kind: \"freeform\", hint: \"boolean flag\" },\n },\n {\n flag: \"disable-analytics\",\n summary: \"Opt out of anonymous CLI analytics.\",\n source: { kind: \"freeform\", hint: \"boolean flag\" },\n },\n ],\n },\n {\n id: \"typescript-stack\",\n title: \"TypeScript stack\",\n description: \"Core stack flags for `--ecosystem typescript`.\",\n ecosystem: \"typescript\",\n flags: [\n {\n flag: \"frontend\",\n summary: \"Web frontend framework(s).\",\n source: { kind: \"category\", category: \"webFrontend\" },\n configKey: \"frontend\",\n multiple: true,\n },\n {\n flag: \"backend\",\n summary: \"Backend framework. `self` pairs with fullstack frontends.\",\n source: { kind: \"category\", category: \"backend\" },\n configKey: \"backend\",\n },\n {\n flag: \"runtime\",\n summary: \"Server runtime.\",\n source: { kind: \"category\", category: \"runtime\" },\n configKey: \"runtime\",\n },\n {\n flag: \"database\",\n summary: \"Database engine.\",\n source: { kind: \"category\", category: \"database\" },\n configKey: \"database\",\n },\n {\n flag: \"orm\",\n summary: \"ORM / query layer.\",\n source: { kind: \"category\", category: \"orm\" },\n configKey: \"orm\",\n },\n {\n flag: \"db-setup\",\n summary: \"Hosted database provider setup.\",\n source: { kind: \"category\", category: \"dbSetup\" },\n configKey: \"dbSetup\",\n },\n {\n flag: \"auth\",\n summary: \"Authentication provider.\",\n source: { kind: \"category\", category: \"auth\" },\n configKey: \"auth\",\n },\n {\n flag: \"api\",\n summary: \"API layer. tRPC is React-oriented.\",\n source: { kind: \"category\", category: \"api\" },\n configKey: \"api\",\n },\n {\n flag: \"astro-integration\",\n summary: \"Astro UI framework integration (Astro frontends).\",\n source: { kind: \"category\", category: \"astroIntegration\" },\n configKey: \"astroIntegration\",\n },\n {\n flag: \"manual-db\",\n summary: \"Skip provider-specific database setup prompts.\",\n source: { kind: \"freeform\", hint: \"boolean flag\" },\n },\n ],\n },\n {\n id: \"typescript-services\",\n title: \"TypeScript services\",\n description: \"Optional service integrations for TypeScript stacks.\",\n ecosystem: \"typescript\",\n flags: [\n {\n flag: \"ai\",\n summary: \"AI SDK / agent framework.\",\n source: { kind: \"category\", category: \"ai\" },\n configKey: \"ai\",\n },\n {\n flag: \"payments\",\n summary: \"Payments provider.\",\n source: { kind: \"category\", category: \"payments\" },\n configKey: \"payments\",\n },\n {\n flag: \"email\",\n summary: \"Email provider.\",\n source: { kind: \"category\", category: \"email\" },\n configKey: \"email\",\n },\n {\n flag: \"realtime\",\n summary: \"Realtime transport.\",\n source: { kind: \"category\", category: \"realtime\" },\n configKey: \"realtime\",\n },\n {\n flag: \"job-queue\",\n summary: \"Background job / queue system.\",\n source: { kind: \"category\", category: \"jobQueue\" },\n configKey: \"jobQueue\",\n },\n {\n flag: \"cms\",\n summary: \"Content management system.\",\n source: { kind: \"category\", category: \"cms\" },\n configKey: \"cms\",\n },\n {\n flag: \"caching\",\n summary: \"Cache layer.\",\n source: { kind: \"category\", category: \"caching\" },\n configKey: \"caching\",\n },\n {\n flag: \"search\",\n summary: \"Search engine.\",\n source: { kind: \"category\", category: \"search\" },\n configKey: \"search\",\n },\n {\n flag: \"file-storage\",\n summary: \"Object storage provider.\",\n source: { kind: \"category\", category: \"fileStorage\" },\n configKey: \"fileStorage\",\n },\n {\n flag: \"file-upload\",\n summary: \"File upload helper.\",\n source: { kind: \"category\", category: \"fileUpload\" },\n configKey: \"fileUpload\",\n },\n {\n flag: \"analytics\",\n summary: \"Web analytics provider.\",\n source: { kind: \"category\", category: \"analytics\" },\n configKey: \"analytics\",\n },\n {\n flag: \"web-mcp\",\n summary: \"Experimental browser-native WebMCP tools.\",\n source: { kind: \"category\", category: \"webMcp\" },\n configKey: \"webMcp\",\n },\n {\n flag: \"feature-flags\",\n summary: \"Feature flag platform.\",\n source: { kind: \"category\", category: \"featureFlags\" },\n configKey: \"featureFlags\",\n },\n {\n flag: \"integrations\",\n summary: \"Third-party integrations SDK.\",\n source: { kind: \"category\", category: \"integrations\" },\n configKey: \"integrations\",\n },\n {\n flag: \"ecommerce\",\n summary: \"E-commerce platform SDK.\",\n source: { kind: \"category\", category: \"ecommerce\" },\n configKey: \"ecommerce\",\n },\n {\n flag: \"vector-db\",\n summary: \"Vector database.\",\n source: { kind: \"category\", category: \"vectorDb\" },\n configKey: \"vectorDb\",\n },\n {\n flag: \"rate-limit\",\n summary: \"Rate limiting helper.\",\n source: { kind: \"category\", category: \"rateLimit\" },\n configKey: \"rateLimit\",\n },\n {\n flag: \"bot-protection\",\n summary: \"Bot and CAPTCHA verification provider.\",\n source: { kind: \"category\", category: \"botProtection\" },\n configKey: \"botProtection\",\n },\n {\n flag: \"i18n\",\n summary: \"Internationalization library.\",\n source: { kind: \"category\", category: \"i18n\" },\n configKey: \"i18n\",\n },\n {\n flag: \"effect\",\n summary: \"Effect capability level.\",\n source: { kind: \"category\", category: \"effect\" },\n configKey: \"effect\",\n },\n {\n flag: \"logging\",\n summary: \"Logging library.\",\n source: { kind: \"category\", category: \"logging\" },\n configKey: \"logging\",\n },\n {\n flag: \"observability\",\n summary: \"Observability provider.\",\n source: { kind: \"category\", category: \"observability\" },\n configKey: \"observability\",\n },\n ],\n },\n {\n id: \"typescript-ui\",\n title: \"TypeScript UI and app behavior\",\n description: \"Frontend styling, state, forms, validation, and testing flags.\",\n ecosystem: \"typescript\",\n flags: [\n {\n flag: \"css-framework\",\n summary: \"CSS framework.\",\n source: { kind: \"category\", category: \"cssFramework\" },\n configKey: \"cssFramework\",\n },\n {\n flag: \"ui-library\",\n summary: \"Component library.\",\n source: { kind: \"category\", category: \"uiLibrary\" },\n configKey: \"uiLibrary\",\n },\n {\n flag: \"state-management\",\n summary: \"Client state manager.\",\n source: { kind: \"category\", category: \"stateManagement\" },\n configKey: \"stateManagement\",\n },\n {\n flag: \"forms\",\n summary: \"Form library.\",\n source: { kind: \"category\", category: \"forms\" },\n configKey: \"forms\",\n },\n {\n flag: \"validation\",\n summary: \"Schema validation library.\",\n source: { kind: \"category\", category: \"validation\" },\n configKey: \"validation\",\n },\n {\n flag: \"testing\",\n summary: \"Testing setup.\",\n source: { kind: \"category\", category: \"testing\" },\n configKey: \"testing\",\n },\n {\n flag: \"animation\",\n summary: \"Animation library.\",\n source: { kind: \"category\", category: \"animation\" },\n configKey: \"animation\",\n },\n ],\n },\n {\n id: \"shadcn\",\n title: \"shadcn/ui flags\",\n description: \"Only apply when `--ui-library shadcn-ui` is selected.\",\n ecosystem: \"typescript\",\n flags: [\n {\n flag: \"shadcn-base\",\n summary: \"shadcn primitive base.\",\n source: { kind: \"category\", category: \"shadcnBase\" },\n configKey: \"shadcnBase\",\n },\n {\n flag: \"shadcn-style\",\n summary: \"shadcn style preset.\",\n source: { kind: \"category\", category: \"shadcnStyle\" },\n configKey: \"shadcnStyle\",\n },\n {\n flag: \"shadcn-icon-library\",\n summary: \"Icon library.\",\n source: { kind: \"category\", category: \"shadcnIconLibrary\" },\n configKey: \"shadcnIconLibrary\",\n },\n {\n flag: \"shadcn-color-theme\",\n summary: \"Color theme.\",\n source: { kind: \"category\", category: \"shadcnColorTheme\" },\n configKey: \"shadcnColorTheme\",\n },\n {\n flag: \"shadcn-base-color\",\n summary: \"Base neutral color.\",\n source: { kind: \"category\", category: \"shadcnBaseColor\" },\n configKey: \"shadcnBaseColor\",\n },\n {\n flag: \"shadcn-font\",\n summary: \"Default font.\",\n source: { kind: \"category\", category: \"shadcnFont\" },\n configKey: \"shadcnFont\",\n },\n {\n flag: \"shadcn-radius\",\n summary: \"Corner radius scale.\",\n source: { kind: \"category\", category: \"shadcnRadius\" },\n configKey: \"shadcnRadius\",\n },\n ],\n },\n {\n id: \"react-native\",\n title: \"React Native flags\",\n description: \"Flags for `--ecosystem react-native`.\",\n ecosystem: \"react-native\",\n flags: [\n {\n flag: \"frontend\",\n summary: \"Expo native frontend styling.\",\n source: { kind: \"category\", category: \"nativeFrontend\" },\n defaultLiteral: \"native-bare\",\n multiple: true,\n },\n {\n flag: \"mobile-navigation\",\n summary: \"Navigation library.\",\n source: { kind: \"category\", category: \"mobileNavigation\" },\n configKey: \"mobileNavigation\",\n },\n {\n flag: \"mobile-ui\",\n summary: \"Mobile UI kit.\",\n source: { kind: \"category\", category: \"mobileUI\" },\n configKey: \"mobileUI\",\n },\n {\n flag: \"mobile-storage\",\n summary: \"On-device storage.\",\n source: { kind: \"category\", category: \"mobileStorage\" },\n configKey: \"mobileStorage\",\n },\n {\n flag: \"mobile-testing\",\n summary: \"Mobile testing setup.\",\n source: { kind: \"category\", category: \"mobileTesting\" },\n configKey: \"mobileTesting\",\n },\n {\n flag: \"mobile-push\",\n summary: \"Push notifications.\",\n source: { kind: \"category\", category: \"mobilePush\" },\n configKey: \"mobilePush\",\n },\n {\n flag: \"mobile-ota\",\n summary: \"Over-the-air updates.\",\n source: { kind: \"category\", category: \"mobileOTA\" },\n configKey: \"mobileOTA\",\n },\n {\n flag: \"mobile-deep-linking\",\n summary: \"Deep linking.\",\n source: { kind: \"category\", category: \"mobileDeepLinking\" },\n configKey: \"mobileDeepLinking\",\n },\n {\n flag: \"mobile-libraries\",\n summary: \"Optional Expo modules.\",\n source: { kind: \"category\", category: \"mobileLibraries\" },\n configKey: \"mobileLibraries\",\n multiple: true,\n },\n {\n flag: \"kotlin-mobile\",\n summary: \"Kotlin mobile app.\",\n source: { kind: \"category\", category: \"kotlinMobile\" },\n configKey: \"kotlinMobile\",\n },\n {\n flag: \"kotlin-mobile-libraries\",\n summary: \"Optional Kotlin mobile libraries.\",\n source: { kind: \"category\", category: \"kotlinMobileLibraries\" },\n configKey: \"kotlinMobileLibraries\",\n multiple: true,\n },\n {\n flag: \"swift-mobile\",\n summary: \"Swift mobile app.\",\n source: { kind: \"category\", category: \"swiftMobile\" },\n configKey: \"swiftMobile\",\n },\n {\n flag: \"dart-mobile\",\n summary: \"Flutter / Dart mobile app.\",\n source: { kind: \"category\", category: \"dartMobile\" },\n configKey: \"dartMobile\",\n },\n ],\n },\n {\n id: \"rust\",\n title: \"Rust flags\",\n description: \"Flags for `--ecosystem rust`.\",\n ecosystem: \"rust\",\n flags: [\n {\n flag: \"rust-web-framework\",\n summary: \"Rust web framework.\",\n source: { kind: \"category\", category: \"rustWebFramework\" },\n configKey: \"rustWebFramework\",\n },\n {\n flag: \"rust-frontend\",\n summary: \"WASM frontend.\",\n source: { kind: \"category\", category: \"rustFrontend\" },\n configKey: \"rustFrontend\",\n },\n {\n flag: \"rust-orm\",\n summary: \"Rust ORM / database.\",\n source: { kind: \"category\", category: \"rustOrm\" },\n configKey: \"rustOrm\",\n },\n {\n flag: \"rust-api\",\n summary: \"Rust API layer.\",\n source: { kind: \"category\", category: \"rustApi\" },\n configKey: \"rustApi\",\n },\n {\n flag: \"rust-cli\",\n summary: \"Rust CLI tooling.\",\n source: { kind: \"category\", category: \"rustCli\" },\n configKey: \"rustCli\",\n },\n {\n flag: \"rust-libraries\",\n summary: \"Rust core libraries.\",\n source: { kind: \"category\", category: \"rustLibraries\" },\n configKey: \"rustLibraries\",\n multiple: true,\n },\n {\n flag: \"rust-logging\",\n summary: \"Rust logging.\",\n source: { kind: \"category\", category: \"rustLogging\" },\n configKey: \"rustLogging\",\n },\n {\n flag: \"rust-error-handling\",\n summary: \"Rust error handling.\",\n source: { kind: \"category\", category: \"rustErrorHandling\" },\n configKey: \"rustErrorHandling\",\n },\n {\n flag: \"rust-caching\",\n summary: \"Rust caching.\",\n source: { kind: \"category\", category: \"rustCaching\" },\n configKey: \"rustCaching\",\n },\n {\n flag: \"rust-auth\",\n summary: \"Rust auth.\",\n source: { kind: \"category\", category: \"rustAuth\" },\n configKey: \"rustAuth\",\n },\n {\n flag: \"rust-realtime\",\n summary: \"Rust realtime.\",\n source: { kind: \"category\", category: \"rustRealtime\" },\n configKey: \"rustRealtime\",\n },\n {\n flag: \"rust-message-queue\",\n summary: \"Rust message queue.\",\n source: { kind: \"category\", category: \"rustMessageQueue\" },\n configKey: \"rustMessageQueue\",\n },\n {\n flag: \"rust-observability\",\n summary: \"Rust observability.\",\n source: { kind: \"category\", category: \"rustObservability\" },\n configKey: \"rustObservability\",\n },\n {\n flag: \"rust-templating\",\n summary: \"Rust templating.\",\n source: { kind: \"category\", category: \"rustTemplating\" },\n configKey: \"rustTemplating\",\n },\n ],\n },\n {\n id: \"python\",\n title: \"Python flags\",\n description: \"Flags for `--ecosystem python`.\",\n ecosystem: \"python\",\n flags: [\n {\n flag: \"python-web-framework\",\n summary: \"Python web framework.\",\n source: { kind: \"category\", category: \"pythonWebFramework\" },\n configKey: \"pythonWebFramework\",\n },\n {\n flag: \"python-orm\",\n summary: \"Python ORM / database.\",\n source: { kind: \"category\", category: \"pythonOrm\" },\n configKey: \"pythonOrm\",\n },\n {\n flag: \"python-validation\",\n summary: \"Validation library.\",\n source: { kind: \"category\", category: \"pythonValidation\" },\n configKey: \"pythonValidation\",\n },\n {\n flag: \"python-ai\",\n summary: \"Python AI / ML libraries.\",\n source: { kind: \"category\", category: \"pythonAi\" },\n configKey: \"pythonAi\",\n multiple: true,\n },\n {\n flag: \"python-auth\",\n summary: \"Python auth.\",\n source: { kind: \"category\", category: \"pythonAuth\" },\n configKey: \"pythonAuth\",\n },\n {\n flag: \"python-api\",\n summary: \"Python API framework.\",\n source: { kind: \"category\", category: \"pythonApi\" },\n configKey: \"pythonApi\",\n },\n {\n flag: \"python-task-queue\",\n summary: \"Python task queue.\",\n source: { kind: \"category\", category: \"pythonTaskQueue\" },\n configKey: \"pythonTaskQueue\",\n },\n {\n flag: \"python-graphql\",\n summary: \"Python GraphQL.\",\n source: { kind: \"category\", category: \"pythonGraphql\" },\n configKey: \"pythonGraphql\",\n },\n {\n flag: \"python-quality\",\n summary: \"Python code quality tool.\",\n source: { kind: \"category\", category: \"pythonQuality\" },\n configKey: \"pythonQuality\",\n },\n {\n flag: \"python-testing\",\n summary: \"Python testing libraries.\",\n source: { kind: \"category\", category: \"pythonTesting\" },\n configKey: \"pythonTesting\",\n multiple: true,\n },\n {\n flag: \"python-caching\",\n summary: \"Python caching.\",\n source: { kind: \"category\", category: \"pythonCaching\" },\n configKey: \"pythonCaching\",\n },\n {\n flag: \"python-realtime\",\n summary: \"Python realtime.\",\n source: { kind: \"category\", category: \"pythonRealtime\" },\n configKey: \"pythonRealtime\",\n },\n {\n flag: \"python-observability\",\n summary: \"Python observability.\",\n source: { kind: \"category\", category: \"pythonObservability\" },\n configKey: \"pythonObservability\",\n },\n {\n flag: \"python-cli\",\n summary: \"Python CLI tooling.\",\n source: { kind: \"category\", category: \"pythonCli\" },\n configKey: \"pythonCli\",\n multiple: true,\n },\n {\n flag: \"python-cloud-sdk\",\n summary: \"Python cloud SDK.\",\n source: { kind: \"category\", category: \"pythonCloudSdk\" },\n configKey: \"pythonCloudSdk\",\n },\n {\n flag: \"python-http-client\",\n summary: \"Python HTTP client.\",\n source: { kind: \"category\", category: \"pythonHttpClient\" },\n configKey: \"pythonHttpClient\",\n },\n {\n flag: \"python-data\",\n summary: \"Python data and scientific libraries.\",\n source: { kind: \"category\", category: \"pythonData\" },\n configKey: \"pythonData\",\n multiple: true,\n },\n {\n flag: \"python-media\",\n summary: \"Python media library.\",\n source: { kind: \"category\", category: \"pythonMedia\" },\n configKey: \"pythonMedia\",\n },\n {\n flag: \"python-server\",\n summary: \"Python production server.\",\n source: { kind: \"category\", category: \"pythonServer\" },\n configKey: \"pythonServer\",\n },\n {\n flag: \"python-package-manager\",\n summary: \"Python package manager.\",\n source: { kind: \"category\", category: \"pythonPackageManager\" },\n configKey: \"pythonPackageManager\",\n },\n {\n flag: \"python-message-queue\",\n summary: \"Python message queue client.\",\n source: { kind: \"category\", category: \"pythonMessageQueue\" },\n configKey: \"pythonMessageQueue\",\n },\n ],\n },\n {\n id: \"go\",\n title: \"Go flags\",\n description: \"Flags for `--ecosystem go`. Global `--auth` also applies.\",\n ecosystem: \"go\",\n flags: [\n {\n flag: \"go-web-framework\",\n summary: \"Go web framework.\",\n source: { kind: \"category\", category: \"goWebFramework\" },\n configKey: \"goWebFramework\",\n },\n {\n flag: \"go-orm\",\n summary: \"Go ORM / database.\",\n source: { kind: \"category\", category: \"goOrm\" },\n configKey: \"goOrm\",\n },\n {\n flag: \"go-api\",\n summary: \"Go API layer.\",\n source: { kind: \"category\", category: \"goApi\" },\n configKey: \"goApi\",\n },\n {\n flag: \"go-cli\",\n summary: \"Go CLI tooling.\",\n source: { kind: \"category\", category: \"goCli\" },\n configKey: \"goCli\",\n },\n {\n flag: \"go-logging\",\n summary: \"Go logging.\",\n source: { kind: \"category\", category: \"goLogging\" },\n configKey: \"goLogging\",\n },\n {\n flag: \"go-auth\",\n summary: \"Go-native auth helpers.\",\n source: { kind: \"category\", category: \"goAuth\" },\n configKey: \"goAuth\",\n },\n {\n flag: \"go-testing\",\n summary: \"Go testing libraries.\",\n source: { kind: \"category\", category: \"goTesting\" },\n configKey: \"goTesting\",\n multiple: true,\n },\n {\n flag: \"go-realtime\",\n summary: \"Go realtime.\",\n source: { kind: \"category\", category: \"goRealtime\" },\n configKey: \"goRealtime\",\n },\n {\n flag: \"go-message-queue\",\n summary: \"Go message queue.\",\n source: { kind: \"category\", category: \"goMessageQueue\" },\n configKey: \"goMessageQueue\",\n },\n {\n flag: \"go-caching\",\n summary: \"Go caching.\",\n source: { kind: \"category\", category: \"goCaching\" },\n configKey: \"goCaching\",\n },\n {\n flag: \"go-config\",\n summary: \"Go config loader.\",\n source: { kind: \"category\", category: \"goConfig\" },\n configKey: \"goConfig\",\n },\n {\n flag: \"go-observability\",\n summary: \"Go observability.\",\n source: { kind: \"category\", category: \"goObservability\" },\n configKey: \"goObservability\",\n },\n {\n flag: \"go-validation\",\n summary: \"Go validation.\",\n source: { kind: \"category\", category: \"goValidation\" },\n configKey: \"goValidation\",\n },\n {\n flag: \"go-quality\",\n summary: \"Go code quality.\",\n source: { kind: \"category\", category: \"goQuality\" },\n configKey: \"goQuality\",\n },\n {\n flag: \"go-migrations\",\n summary: \"Go database migrations.\",\n source: { kind: \"category\", category: \"goMigrations\" },\n configKey: \"goMigrations\",\n },\n {\n flag: \"go-templating\",\n summary: \"Go templating.\",\n source: { kind: \"category\", category: \"goTemplating\" },\n configKey: \"goTemplating\",\n },\n {\n flag: \"go-proto-tooling\",\n summary: \"Go protobuf tooling.\",\n source: { kind: \"category\", category: \"goProtoTooling\" },\n configKey: \"goProtoTooling\",\n },\n {\n flag: \"go-di\",\n summary: \"Go dependency injection.\",\n source: { kind: \"category\", category: \"goDI\" },\n configKey: \"goDI\",\n },\n ],\n },\n {\n id: \"java\",\n title: \"Java flags\",\n description: \"Flags for `--ecosystem java`.\",\n ecosystem: \"java\",\n flags: [\n {\n flag: \"java-web-framework\",\n summary: \"Java web framework.\",\n source: { kind: \"category\", category: \"javaWebFramework\" },\n configKey: \"javaWebFramework\",\n },\n {\n flag: \"java-language\",\n summary: \"JVM language (java or kotlin).\",\n source: { kind: \"category\", category: \"javaLanguage\" },\n configKey: \"javaLanguage\",\n },\n {\n flag: \"java-build-tool\",\n summary: \"Build tool.\",\n source: { kind: \"category\", category: \"javaBuildTool\" },\n configKey: \"javaBuildTool\",\n },\n {\n flag: \"java-orm\",\n summary: \"Java ORM / database.\",\n source: { kind: \"category\", category: \"javaOrm\" },\n configKey: \"javaOrm\",\n },\n {\n flag: \"java-auth\",\n summary: \"Java auth.\",\n source: { kind: \"category\", category: \"javaAuth\" },\n configKey: \"javaAuth\",\n },\n {\n flag: \"java-api\",\n summary: \"Java API layer.\",\n source: { kind: \"category\", category: \"javaApi\" },\n configKey: \"javaApi\",\n },\n {\n flag: \"java-logging\",\n summary: \"Java logging.\",\n source: { kind: \"category\", category: \"javaLogging\" },\n configKey: \"javaLogging\",\n },\n {\n flag: \"java-libraries\",\n summary: \"Java libraries.\",\n source: { kind: \"category\", category: \"javaLibraries\" },\n configKey: \"javaLibraries\",\n multiple: true,\n },\n {\n flag: \"java-testing-libraries\",\n summary: \"Java testing libraries.\",\n source: { kind: \"category\", category: \"javaTestingLibraries\" },\n configKey: \"javaTestingLibraries\",\n multiple: true,\n },\n ],\n },\n {\n id: \"dotnet\",\n title: \".NET flags\",\n description: \"Flags for `--ecosystem dotnet`.\",\n ecosystem: \"dotnet\",\n flags: [\n {\n flag: \"dotnet-frontend\",\n summary: \".NET frontend.\",\n source: { kind: \"category\", category: \"dotnetFrontend\" },\n configKey: \"dotnetFrontend\",\n },\n {\n flag: \"dotnet-web-framework\",\n summary: \".NET web framework.\",\n source: { kind: \"category\", category: \"dotnetWebFramework\" },\n configKey: \"dotnetWebFramework\",\n },\n {\n flag: \"dotnet-orm\",\n summary: \".NET data access.\",\n source: { kind: \"category\", category: \"dotnetOrm\" },\n configKey: \"dotnetOrm\",\n },\n {\n flag: \"dotnet-auth\",\n summary: \".NET auth.\",\n source: { kind: \"category\", category: \"dotnetAuth\" },\n configKey: \"dotnetAuth\",\n },\n {\n flag: \"dotnet-api\",\n summary: \".NET API style.\",\n source: { kind: \"category\", category: \"dotnetApi\" },\n configKey: \"dotnetApi\",\n },\n {\n flag: \"dotnet-testing\",\n summary: \".NET testing libraries.\",\n source: { kind: \"category\", category: \"dotnetTesting\" },\n configKey: \"dotnetTesting\",\n multiple: true,\n },\n {\n flag: \"dotnet-job-queue\",\n summary: \".NET background jobs.\",\n source: { kind: \"category\", category: \"dotnetJobQueue\" },\n configKey: \"dotnetJobQueue\",\n },\n {\n flag: \"dotnet-realtime\",\n summary: \".NET realtime.\",\n source: { kind: \"category\", category: \"dotnetRealtime\" },\n configKey: \"dotnetRealtime\",\n },\n {\n flag: \"dotnet-observability\",\n summary: \".NET observability.\",\n source: { kind: \"category\", category: \"dotnetObservability\" },\n configKey: \"dotnetObservability\",\n multiple: true,\n },\n {\n flag: \"dotnet-validation\",\n summary: \".NET validation.\",\n source: { kind: \"category\", category: \"dotnetValidation\" },\n configKey: \"dotnetValidation\",\n },\n {\n flag: \"dotnet-caching\",\n summary: \".NET caching.\",\n source: { kind: \"category\", category: \"dotnetCaching\" },\n configKey: \"dotnetCaching\",\n },\n {\n flag: \"dotnet-deploy\",\n summary: \".NET deploy target.\",\n source: { kind: \"category\", category: \"dotnetDeploy\" },\n configKey: \"dotnetDeploy\",\n },\n {\n flag: \"dotnet-libraries\",\n summary: \"Optional .NET libraries.\",\n source: { kind: \"category\", category: \"dotnetLibraries\" },\n configKey: \"dotnetLibraries\",\n multiple: true,\n },\n ],\n },\n {\n id: \"elixir\",\n title: \"Elixir flags\",\n description: \"Flags for `--ecosystem elixir`.\",\n ecosystem: \"elixir\",\n flags: [\n {\n flag: \"elixir-web-framework\",\n summary: \"Elixir web framework.\",\n source: { kind: \"category\", category: \"elixirWebFramework\" },\n configKey: \"elixirWebFramework\",\n },\n {\n flag: \"elixir-orm\",\n summary: \"Elixir ORM / database.\",\n source: { kind: \"category\", category: \"elixirOrm\" },\n configKey: \"elixirOrm\",\n },\n {\n flag: \"elixir-auth\",\n summary: \"Elixir auth.\",\n source: { kind: \"category\", category: \"elixirAuth\" },\n configKey: \"elixirAuth\",\n },\n {\n flag: \"elixir-api\",\n summary: \"Elixir API layer.\",\n source: { kind: \"category\", category: \"elixirApi\" },\n configKey: \"elixirApi\",\n },\n {\n flag: \"elixir-realtime\",\n summary: \"Elixir realtime.\",\n source: { kind: \"category\", category: \"elixirRealtime\" },\n configKey: \"elixirRealtime\",\n },\n {\n flag: \"elixir-jobs\",\n summary: \"Elixir jobs.\",\n source: { kind: \"category\", category: \"elixirJobs\" },\n configKey: \"elixirJobs\",\n },\n {\n flag: \"elixir-validation\",\n summary: \"Elixir validation.\",\n source: { kind: \"category\", category: \"elixirValidation\" },\n configKey: \"elixirValidation\",\n },\n {\n flag: \"elixir-http\",\n summary: \"Elixir HTTP client.\",\n source: { kind: \"category\", category: \"elixirHttp\" },\n configKey: \"elixirHttp\",\n },\n {\n flag: \"elixir-json\",\n summary: \"Elixir JSON library.\",\n source: { kind: \"category\", category: \"elixirJson\" },\n configKey: \"elixirJson\",\n },\n {\n flag: \"elixir-email\",\n summary: \"Elixir email.\",\n source: { kind: \"category\", category: \"elixirEmail\" },\n configKey: \"elixirEmail\",\n },\n {\n flag: \"elixir-caching\",\n summary: \"Elixir caching.\",\n source: { kind: \"category\", category: \"elixirCaching\" },\n configKey: \"elixirCaching\",\n },\n {\n flag: \"elixir-observability\",\n summary: \"Elixir observability.\",\n source: { kind: \"category\", category: \"elixirObservability\" },\n configKey: \"elixirObservability\",\n },\n {\n flag: \"elixir-testing\",\n summary: \"Elixir testing.\",\n source: { kind: \"category\", category: \"elixirTesting\" },\n configKey: \"elixirTesting\",\n },\n {\n flag: \"elixir-quality\",\n summary: \"Elixir code quality.\",\n source: { kind: \"category\", category: \"elixirQuality\" },\n configKey: \"elixirQuality\",\n },\n {\n flag: \"elixir-i18n\",\n summary: \"Elixir internationalization.\",\n source: { kind: \"category\", category: \"elixirI18n\" },\n configKey: \"elixirI18n\",\n },\n {\n flag: \"elixir-http-server\",\n summary: \"Elixir HTTP server.\",\n source: { kind: \"category\", category: \"elixirHttpServer\" },\n configKey: \"elixirHttpServer\",\n },\n {\n flag: \"elixir-application-framework\",\n summary: \"Elixir application framework.\",\n source: { kind: \"category\", category: \"elixirApplicationFramework\" },\n configKey: \"elixirApplicationFramework\",\n },\n {\n flag: \"elixir-documentation\",\n summary: \"Elixir documentation.\",\n source: { kind: \"category\", category: \"elixirDocumentation\" },\n configKey: \"elixirDocumentation\",\n },\n {\n flag: \"elixir-clustering\",\n summary: \"Elixir clustering.\",\n source: { kind: \"category\", category: \"elixirClustering\" },\n configKey: \"elixirClustering\",\n },\n {\n flag: \"elixir-deploy\",\n summary: \"Elixir deploy target.\",\n source: { kind: \"category\", category: \"elixirDeploy\" },\n configKey: \"elixirDeploy\",\n },\n {\n flag: \"elixir-libraries\",\n summary: \"Elixir libraries.\",\n source: { kind: \"category\", category: \"elixirLibraries\" },\n configKey: \"elixirLibraries\",\n multiple: true,\n },\n ],\n },\n];\n\nfunction resolveValues(def: CliFlagDefinition): { values: string[]; valueHint: string | null } {\n const source = def.source;\n switch (source.kind) {\n case \"boolean\":\n return { values: [], valueHint: `--${def.flag} / --no-${def.flag}` };\n case \"freeform\":\n return { values: [], valueHint: source.hint };\n case \"literal\":\n return { values: [...source.values], valueHint: null };\n case \"category\":\n case \"categories\": {\n const categories = source.kind === \"category\" ? [source.category] : source.categories;\n let values = [...new Set(categories.flatMap((category) => getCategoryCliValues(category)))];\n if (def.multiple && !values.includes(\"none\")) values = [...values, \"none\"];\n return { values, valueHint: null };\n }\n }\n}\n\nfunction formatDefault(def: CliFlagDefinition): string | null {\n if (def.defaultLiteral !== undefined) return def.defaultLiteral;\n if (!def.configKey) return null;\n\n const value = createCliDefaultProjectConfigBase()[def.configKey];\n if (Array.isArray(value)) return value.length > 0 ? value.join(\" \") : \"none\";\n if (typeof value === \"boolean\") return value ? `--${def.flag}` : `--no-${def.flag}`;\n if (value === undefined || value === null) return null;\n return String(value);\n}\n\n/**\n * Resolve the declarative flag registry into fully-populated rows (accepted\n * values + defaults) sourced from the shared option metadata and CLI defaults.\n * The docs CLI-flag data module and any tooling should call this rather than\n * hand-maintaining flag tables.\n */\nexport function getCliFlagReference(): ResolvedCliFlagGroup[] {\n return CLI_FLAG_GROUP_DEFINITIONS.map((group) => ({\n id: group.id,\n title: group.title,\n description: group.description,\n ecosystem: group.ecosystem,\n flags: group.flags.map((def) => {\n const { values, valueHint } = resolveValues(def);\n return {\n flag: `--${def.flag}`,\n summary: def.summary,\n values,\n valueHint,\n defaultValue: formatDefault(def),\n multiple: def.multiple ?? false,\n } satisfies ResolvedCliFlag;\n }),\n }));\n}\n","const VITE_WEB_FRONTENDS = new Set([\n \"react-router\",\n \"react-vite\",\n \"tanstack-router\",\n \"vanilla-vite\",\n \"vue\",\n \"svelte\",\n \"solid\",\n \"fresh\",\n]);\nconst ASTRO_WEB_FRONTENDS = new Set([\"astro\"]);\n\nexport function getLocalWebDevPort(frontend: readonly string[]): 3001 | 4321 | 5173 | 8910 {\n // Redwood's web dev server port is fixed in redwood.toml.\n if (frontend.includes(\"redwood\")) {\n return 8910;\n }\n\n if (frontend.some((entry) => VITE_WEB_FRONTENDS.has(entry))) {\n return 5173;\n }\n\n if (frontend.some((entry) => ASTRO_WEB_FRONTENDS.has(entry))) {\n return 4321;\n }\n\n return 3001;\n}\n","import { z } from \"zod\";\n\n/**\n * Capability-pack registry schemas.\n *\n * A capability pack is a self-contained bundle a community author (or a private\n * team) can drop into an existing Better Fullstack project: a `registry.json`\n * manifest that declares the files to write, the dependencies to merge, the env\n * vars to append, and some advisory metadata. The MVP installer resolves packs\n * from a local path or a `file://` URL only; the `https` source kind is\n * reserved but not yet wired.\n */\n\n/** Where a pack was resolved from. MVP wires `local`/`file` only. */\nexport const CapabilityPackSourceKindSchema = z\n .enum([\"local\", \"file\", \"https\"])\n .describe(\"Pack source kind: local path, file:// URL, or (reserved) https URL\");\nexport type CapabilityPackSourceKind = z.infer<typeof CapabilityPackSourceKindSchema>;\n\n/**\n * A single file contributed by a pack. `content` is written verbatim unless\n * `template` is true, in which case it is rendered through the Better Fullstack\n * Handlebars pipeline against the target project's config first.\n */\nexport const CapabilityPackFileSchema = z\n .object({\n path: z\n .string()\n .min(1)\n .describe(\"Project-relative destination path, e.g. apps/server/src/lib/rate-limit.ts\"),\n content: z.string().describe(\"File contents (rendered as a template when template=true)\"),\n template: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Render `content` through the template pipeline before writing\"),\n overwrite: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Overwrite an existing file at `path` instead of skipping it\"),\n })\n .describe(\"A file a capability pack writes into the project\");\nexport type CapabilityPackFile = z.infer<typeof CapabilityPackFileSchema>;\n\n/** An environment variable a pack appends to the project's .env.example. */\nexport const CapabilityPackEnvSchema = z\n .object({\n key: z\n .string()\n .min(1)\n .regex(/^[A-Za-z_][A-Za-z0-9_]*$/, \"Env keys must be valid shell identifiers\")\n .describe(\"Environment variable name, e.g. RATE_LIMIT_REDIS_URL\"),\n value: z\n .string()\n .optional()\n .describe(\"Default value written to .env.example (defaults to empty)\"),\n description: z\n .string()\n .optional()\n .describe(\"Human-readable comment written above the variable\"),\n })\n .describe(\"An environment variable declared by a capability pack\");\nexport type CapabilityPackEnv = z.infer<typeof CapabilityPackEnvSchema>;\n\n/**\n * Dependencies keyed by workspace-relative package.json directory (\".\" for the\n * repo root, \"apps/server\", \"packages/api\", ...) each mapping a dependency name\n * to a literal version string.\n */\nexport const CapabilityPackDependencyMapSchema = z\n .record(z.string(), z.record(z.string(), z.string()))\n .describe('Workspace dir -> { \"dep-name\": \"version\" }');\nexport type CapabilityPackDependencyMap = z.infer<typeof CapabilityPackDependencyMapSchema>;\n\n/** Advisory compatibility metadata (not enforced by the MVP installer). */\nexport const CapabilityPackCompatibilitySchema = z\n .object({\n ecosystems: z\n .array(z.string())\n .optional()\n .describe(\"Ecosystems this pack is intended for (advisory)\"),\n requires: z\n .array(z.string())\n .optional()\n .describe(\"Capability ids the pack expects to already be present (advisory)\"),\n conflicts: z\n .array(z.string())\n .optional()\n .describe(\"Capability ids the pack is known to conflict with (advisory)\"),\n })\n .describe(\"Advisory compatibility metadata for a capability pack\");\nexport type CapabilityPackCompatibility = z.infer<typeof CapabilityPackCompatibilitySchema>;\n\n/** The full `registry.json` manifest for a capability pack. */\nexport const CapabilityPackManifestSchema = z\n .object({\n name: z\n .string()\n .min(1)\n .regex(/^@?[a-z0-9][a-z0-9._@/-]*$/i, \"Pack names must be url/npm-safe\")\n .describe(\"Unique pack identifier, e.g. @acme/rate-limit\"),\n version: z.string().min(1).describe(\"Pack version (semver recommended)\"),\n description: z.string().optional().describe(\"Short human-readable summary\"),\n source: CapabilityPackSourceKindSchema.optional().describe(\"Origin kind (informational)\"),\n files: z\n .array(CapabilityPackFileSchema)\n .default([])\n .describe(\"Files the pack writes into the project\"),\n dependencies: CapabilityPackDependencyMapSchema.optional(),\n devDependencies: CapabilityPackDependencyMapSchema.optional(),\n env: z\n .array(CapabilityPackEnvSchema)\n .default([])\n .describe(\"Env vars appended to the project's .env.example\"),\n addons: z\n .array(z.string())\n .optional()\n .describe(\"Addon ids recorded as metadata (not wired into the addons enum)\"),\n compatibility: CapabilityPackCompatibilitySchema.optional(),\n })\n .describe(\"A community/private capability pack manifest (registry.json)\");\nexport type CapabilityPackManifest = z.infer<typeof CapabilityPackManifestSchema>;\n\n/** A record of one installed pack, persisted in the per-project lockfile. */\nexport const InstalledPackSchema = z\n .object({\n name: z.string().describe(\"Pack identifier\"),\n version: z.string().describe(\"Installed pack version\"),\n source: z.string().describe(\"Resolved source string (local path or file:// URL)\"),\n files: z.array(z.string()).default([]).describe(\"Project-relative paths written by the pack\"),\n installedAt: z.string().describe(\"ISO timestamp of the install\"),\n })\n .describe(\"A capability pack recorded as installed in the project lockfile\");\nexport type InstalledPack = z.infer<typeof InstalledPackSchema>;\n\n/** Current schema version of the per-project registry lockfile. */\nexport const REGISTRY_LOCK_VERSION = 1;\n\n/** The per-project lockfile persisted at `.better-fullstack/registry.json`. */\nexport const RegistryLockSchema = z\n .object({\n version: z.number().int().default(REGISTRY_LOCK_VERSION).describe(\"Lockfile schema version\"),\n packs: z.array(InstalledPackSchema).default([]).describe(\"Installed capability packs\"),\n })\n .describe(\"Per-project registry lockfile (.better-fullstack/registry.json)\");\nexport type RegistryLock = z.infer<typeof RegistryLockSchema>;\n","export const UPDATE_SUPPORT_POLICY_SCHEMA_VERSION = 1 as const;\n\nexport type UpdateSupportPolicyStatus = \"qualification\" | \"active\";\n\nexport type UpdateSupportPolicy = {\n schemaVersion: typeof UPDATE_SUPPORT_POLICY_SCHEMA_VERSION;\n status: UpdateSupportPolicyStatus;\n manifestVersion: \"2\";\n window: {\n kind: \"consecutive-manifest-v2-releases\";\n maximumSourceReleases: number;\n supportedReleases: readonly string[];\n supportedFrom: string | null;\n supportedTo: string | null;\n };\n qualification: {\n requiredConsecutiveReleases: number;\n qualifiedConsecutiveReleases: number;\n };\n outsideWindow: {\n automaticApply: false;\n outcome: \"manual-review-required\";\n lineageClaim: \"unverified\";\n };\n};\n\nexport const UPDATE_SUPPORT_POLICY = {\n schemaVersion: UPDATE_SUPPORT_POLICY_SCHEMA_VERSION,\n status: \"qualification\",\n manifestVersion: \"2\",\n window: {\n kind: \"consecutive-manifest-v2-releases\",\n maximumSourceReleases: 2,\n supportedReleases: [],\n supportedFrom: null,\n supportedTo: null,\n },\n qualification: {\n requiredConsecutiveReleases: 2,\n qualifiedConsecutiveReleases: 0,\n },\n outsideWindow: {\n automaticApply: false,\n outcome: \"manual-review-required\",\n lineageClaim: \"unverified\",\n },\n} as const satisfies UpdateSupportPolicy;\n\nexport type UpdateSupportReasonCode =\n | \"same-release\"\n | \"supported-window\"\n | \"policy-invalid\"\n | \"manifest-v2-required\"\n | \"verified-lineage-required\"\n | \"source-version-missing\"\n | \"window-not-qualified\"\n | \"target-outside-policy\"\n | \"source-outside-window\";\n\nexport type UpdateSupportEligibility = {\n schemaVersion: typeof UPDATE_SUPPORT_POLICY_SCHEMA_VERSION;\n policyStatus: UpdateSupportPolicyStatus;\n supportedFrom: string | null;\n supportedTo: string | null;\n sourceVersion: string | null;\n targetVersion: string;\n eligibility: \"same-release\" | \"supported\" | \"manual-review-required\";\n eligible: boolean;\n historicalUpgrade: boolean;\n requiresManualReview: boolean;\n reasonCode: UpdateSupportReasonCode;\n reason: string;\n};\n\nexport type UpdateSupportInput = {\n sourceVersion: string | null;\n targetVersion: string;\n manifestVersion: string | null;\n provenanceVerified: boolean;\n};\n\nconst EXACT_VERSION = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$/;\n\nexport function validateUpdateSupportPolicy(policy: UpdateSupportPolicy): string[] {\n const errors: string[] = [];\n const releases = policy.window.supportedReleases;\n const uniqueReleases = new Set(releases);\n\n if (policy.schemaVersion !== UPDATE_SUPPORT_POLICY_SCHEMA_VERSION) {\n errors.push(\"Unsupported update support policy schema version.\");\n }\n if (policy.manifestVersion !== \"2\") {\n errors.push(\"The supported update window must require manifest v2.\");\n }\n if (\n !Number.isInteger(policy.window.maximumSourceReleases) ||\n policy.window.maximumSourceReleases < 1\n ) {\n errors.push(\"maximumSourceReleases must be a positive integer.\");\n }\n if (uniqueReleases.size !== releases.length) {\n errors.push(\"Supported releases must be unique.\");\n }\n if (releases.some((version) => !EXACT_VERSION.test(version))) {\n errors.push(\"Supported releases must use exact stable semantic versions.\");\n }\n if (releases.length > policy.window.maximumSourceReleases) {\n errors.push(\"The supported release list exceeds maximumSourceReleases.\");\n }\n if (\n policy.qualification.qualifiedConsecutiveReleases !== releases.length ||\n policy.qualification.requiredConsecutiveReleases < 2\n ) {\n errors.push(\"Qualification counts do not match the supported release list.\");\n }\n\n if (policy.status === \"qualification\") {\n if (\n releases.length >= policy.qualification.requiredConsecutiveReleases ||\n policy.window.supportedFrom !== null ||\n policy.window.supportedTo !== null\n ) {\n errors.push(\"A qualification policy cannot advertise a supported historical window.\");\n }\n } else {\n if (releases.length < policy.qualification.requiredConsecutiveReleases) {\n errors.push(\"An active policy requires the declared consecutive release qualification.\");\n }\n if (\n policy.window.supportedFrom !== releases[0] ||\n policy.window.supportedTo !== releases.at(-1)\n ) {\n errors.push(\"Active window bounds must match the ordered supported release list.\");\n }\n }\n\n return errors;\n}\n\nfunction manualReview(\n policy: UpdateSupportPolicy,\n input: UpdateSupportInput,\n reasonCode: Exclude<UpdateSupportReasonCode, \"same-release\" | \"supported-window\">,\n reason: string,\n): UpdateSupportEligibility {\n return {\n schemaVersion: UPDATE_SUPPORT_POLICY_SCHEMA_VERSION,\n policyStatus: policy.status,\n supportedFrom: policy.window.supportedFrom,\n supportedTo: policy.window.supportedTo,\n sourceVersion: input.sourceVersion,\n targetVersion: input.targetVersion,\n eligibility: \"manual-review-required\",\n eligible: false,\n historicalUpgrade: input.sourceVersion !== null && input.sourceVersion !== input.targetVersion,\n requiresManualReview: true,\n reasonCode,\n reason,\n };\n}\n\nexport function evaluateUpdateSupport(\n input: UpdateSupportInput,\n policy: UpdateSupportPolicy = UPDATE_SUPPORT_POLICY,\n): UpdateSupportEligibility {\n const policyErrors = validateUpdateSupportPolicy(policy);\n if (policyErrors.length > 0) {\n return manualReview(policy, input, \"policy-invalid\", policyErrors.join(\" \"));\n }\n if (input.manifestVersion !== policy.manifestVersion) {\n return manualReview(\n policy,\n input,\n \"manifest-v2-required\",\n \"A valid manifest-v2 baseline is required before release compatibility can be evaluated.\",\n );\n }\n if (!input.provenanceVerified) {\n return manualReview(\n policy,\n input,\n \"verified-lineage-required\",\n \"The source generator lineage is unverified, so no historical support claim can be made.\",\n );\n }\n if (!input.sourceVersion) {\n return manualReview(\n policy,\n input,\n \"source-version-missing\",\n \"The verified manifest does not identify an exact source CLI release.\",\n );\n }\n if (input.sourceVersion === input.targetVersion) {\n return {\n schemaVersion: UPDATE_SUPPORT_POLICY_SCHEMA_VERSION,\n policyStatus: policy.status,\n supportedFrom: policy.window.supportedFrom,\n supportedTo: policy.window.supportedTo,\n sourceVersion: input.sourceVersion,\n targetVersion: input.targetVersion,\n eligibility: \"same-release\",\n eligible: true,\n historicalUpgrade: false,\n requiresManualReview: false,\n reasonCode: \"same-release\",\n reason:\n \"The project and update engine use the same exact release. This is current-template reconciliation, not a historical upgrade claim.\",\n };\n }\n if (policy.status !== \"active\") {\n return manualReview(\n policy,\n input,\n \"window-not-qualified\",\n \"Historical updates are not advertised until two consecutive manifest-v2 releases pass the executable qualification matrix.\",\n );\n }\n if (input.targetVersion !== policy.window.supportedTo) {\n return manualReview(\n policy,\n input,\n \"target-outside-policy\",\n \"This CLI release is not the target of the active supported update window.\",\n );\n }\n if (!policy.window.supportedReleases.includes(input.sourceVersion)) {\n return manualReview(\n policy,\n input,\n \"source-outside-window\",\n \"The source release is outside the active supported update window.\",\n );\n }\n\n return {\n schemaVersion: UPDATE_SUPPORT_POLICY_SCHEMA_VERSION,\n policyStatus: policy.status,\n supportedFrom: policy.window.supportedFrom,\n supportedTo: policy.window.supportedTo,\n sourceVersion: input.sourceVersion,\n targetVersion: input.targetVersion,\n eligibility: \"supported\",\n eligible: true,\n historicalUpgrade: true,\n requiresManualReview: false,\n reasonCode: \"supported-window\",\n reason: \"The verified source release is inside the active executable update window.\",\n };\n}\n","import type { StackPart } from \"@/config/types\";\n\nimport { formatStackPartSpec } from \"@/stack/stack-graph\";\n\nexport type StackPartEvidenceSnapshot = {\n level: string;\n maturity?: string;\n freshness?: string;\n};\n\nexport type StackPartComparisonSnapshot = Pick<\n StackPart,\n | \"id\"\n | \"role\"\n | \"ecosystem\"\n | \"toolId\"\n | \"ownerPartId\"\n | \"source\"\n | \"providedByPartId\"\n | \"targetPath\"\n | \"settings\"\n> & {\n spec: string;\n ownerSpec?: string;\n evidence?: StackPartEvidenceSnapshot;\n};\n\nexport type StackPartReplacement = {\n before: StackPartComparisonSnapshot;\n after: StackPartComparisonSnapshot;\n};\n\nexport type StackPartOwnerChange = StackPartReplacement & {\n beforeOwnerId: string | null;\n afterOwnerId: string | null;\n};\n\nexport type StackPartEvidenceChange = StackPartReplacement & {\n beforeEvidence: StackPartEvidenceSnapshot | null;\n afterEvidence: StackPartEvidenceSnapshot | null;\n};\n\nexport type StackGraphComparison = {\n additions: StackPartComparisonSnapshot[];\n removals: StackPartComparisonSnapshot[];\n replacements: StackPartReplacement[];\n ownerChanges: StackPartOwnerChange[];\n evidenceChanges: StackPartEvidenceChange[];\n unchanged: number;\n hasChanges: boolean;\n};\n\nexport type StackGraphComparisonOptions = {\n evidenceForPart?: (part: StackPart) => StackPartEvidenceSnapshot | null | undefined;\n};\n\ntype MatchedPart = { before: StackPart; after: StackPart };\n\nfunction selectedParts(parts: readonly StackPart[]): StackPart[] {\n return parts.filter((part) => part.toolId !== \"none\");\n}\n\nfunction primaryPart(part: StackPart): boolean {\n return !part.ownerPartId;\n}\n\nfunction ownerSpec(part: StackPart, parts: readonly StackPart[]): string | undefined {\n if (!part.ownerPartId) return undefined;\n const owner = parts.find((candidate) => candidate.id === part.ownerPartId);\n return owner ? formatStackPartSpec(owner, parts) : part.ownerPartId;\n}\n\nfunction snapshot(\n part: StackPart,\n parts: readonly StackPart[],\n options: StackGraphComparisonOptions,\n): StackPartComparisonSnapshot {\n const evidence = options.evidenceForPart?.(part) ?? undefined;\n return {\n id: part.id,\n role: part.role,\n ecosystem: part.ecosystem,\n toolId: part.toolId,\n ownerPartId: part.ownerPartId,\n source: part.source,\n providedByPartId: part.providedByPartId,\n targetPath: part.targetPath,\n settings: part.settings,\n spec: formatStackPartSpec(part, parts),\n ownerSpec: ownerSpec(part, parts),\n evidence,\n };\n}\n\nfunction evidenceKey(value: StackPartEvidenceSnapshot | null | undefined): string {\n return JSON.stringify(value ?? null);\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalValue);\n if (!value || typeof value !== \"object\") return value;\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, canonicalValue(entry)]),\n );\n}\n\nfunction persistedPartKey(part: StackPart): string {\n return JSON.stringify(\n canonicalValue({\n id: part.id,\n role: part.role,\n ecosystem: part.ecosystem,\n toolId: part.toolId,\n source: part.source,\n providedByPartId: part.providedByPartId ?? null,\n targetPath: part.targetPath ?? null,\n settings: part.settings ?? null,\n }),\n );\n}\n\nfunction sortSnapshots<T extends StackPartComparisonSnapshot>(values: T[]): T[] {\n return values.sort((left, right) => left.spec.localeCompare(right.spec));\n}\n\nfunction pairByExactId(\n before: readonly StackPart[],\n after: readonly StackPart[],\n matches: MatchedPart[],\n consumedBefore: Set<string>,\n consumedAfter: Set<string>,\n): void {\n const afterById = new Map(after.map((part) => [part.id, part] as const));\n for (const part of before) {\n const candidate = afterById.get(part.id);\n if (!candidate || consumedAfter.has(candidate.id)) continue;\n matches.push({ before: part, after: candidate });\n consumedBefore.add(part.id);\n consumedAfter.add(candidate.id);\n }\n}\n\nfunction pairUniquePrimaryRoles(\n before: readonly StackPart[],\n after: readonly StackPart[],\n matches: MatchedPart[],\n consumedBefore: Set<string>,\n consumedAfter: Set<string>,\n): void {\n const roles = new Set([\n ...before.filter(primaryPart).map((part) => part.role),\n ...after.filter(primaryPart).map((part) => part.role),\n ]);\n\n for (const role of roles) {\n const beforeCandidates = before.filter(\n (part) => primaryPart(part) && part.role === role && !consumedBefore.has(part.id),\n );\n const afterCandidates = after.filter(\n (part) => primaryPart(part) && part.role === role && !consumedAfter.has(part.id),\n );\n if (beforeCandidates.length === 1 && afterCandidates.length === 1) {\n const beforePart = beforeCandidates[0];\n const afterPart = afterCandidates[0];\n if (!beforePart || !afterPart) continue;\n matches.push({ before: beforePart, after: afterPart });\n consumedBefore.add(beforePart.id);\n consumedAfter.add(afterPart.id);\n continue;\n }\n\n for (const beforePart of beforeCandidates) {\n const candidates = afterCandidates.filter(\n (afterPart) =>\n !consumedAfter.has(afterPart.id) &&\n ((beforePart.targetPath && beforePart.targetPath === afterPart.targetPath) ||\n (beforePart.ecosystem === afterPart.ecosystem &&\n beforePart.toolId === afterPart.toolId)),\n );\n if (candidates.length !== 1) continue;\n const afterPart = candidates[0];\n if (!afterPart) continue;\n matches.push({ before: beforePart, after: afterPart });\n consumedBefore.add(beforePart.id);\n consumedAfter.add(afterPart.id);\n }\n }\n}\n\nfunction pairOwnedParts(\n before: readonly StackPart[],\n after: readonly StackPart[],\n matches: MatchedPart[],\n consumedBefore: Set<string>,\n consumedAfter: Set<string>,\n): void {\n const ownerReplacements = new Map(\n matches\n .filter((match) => primaryPart(match.before) && primaryPart(match.after))\n .map((match) => [match.before.id, match.after.id] as const),\n );\n\n const expectedOwner = (part: StackPart) =>\n part.ownerPartId ? (ownerReplacements.get(part.ownerPartId) ?? part.ownerPartId) : undefined;\n\n for (const beforePart of before) {\n if (!beforePart.ownerPartId || consumedBefore.has(beforePart.id)) continue;\n const candidates = after.filter(\n (afterPart) =>\n !consumedAfter.has(afterPart.id) &&\n afterPart.ownerPartId === expectedOwner(beforePart) &&\n afterPart.role === beforePart.role &&\n afterPart.ecosystem === beforePart.ecosystem &&\n afterPart.toolId === beforePart.toolId &&\n afterPart.source === beforePart.source,\n );\n if (candidates.length !== 1) continue;\n const afterPart = candidates[0];\n if (!afterPart) continue;\n matches.push({ before: beforePart, after: afterPart });\n consumedBefore.add(beforePart.id);\n consumedAfter.add(afterPart.id);\n }\n\n const slotKeys = new Set(\n before\n .filter((part) => part.ownerPartId && !consumedBefore.has(part.id))\n .map((part) => `${expectedOwner(part)}:${part.role}:${part.source}`),\n );\n for (const slotKey of slotKeys) {\n const beforeCandidates = before.filter(\n (part) =>\n part.ownerPartId !== undefined &&\n !consumedBefore.has(part.id) &&\n `${expectedOwner(part)}:${part.role}:${part.source}` === slotKey,\n );\n const afterCandidates = after.filter(\n (part) =>\n part.ownerPartId !== undefined &&\n !consumedAfter.has(part.id) &&\n `${part.ownerPartId}:${part.role}:${part.source}` === slotKey,\n );\n if (beforeCandidates.length !== 1 || afterCandidates.length !== 1) continue;\n const beforePart = beforeCandidates[0];\n const afterPart = afterCandidates[0];\n if (!beforePart || !afterPart) continue;\n matches.push({ before: beforePart, after: afterPart });\n consumedBefore.add(beforePart.id);\n consumedAfter.add(afterPart.id);\n }\n}\n\nexport function compareStackGraphs(\n beforeInput: readonly StackPart[],\n afterInput: readonly StackPart[],\n options: StackGraphComparisonOptions = {},\n): StackGraphComparison {\n const before = selectedParts(beforeInput);\n const after = selectedParts(afterInput);\n const matches: MatchedPart[] = [];\n const consumedBefore = new Set<string>();\n const consumedAfter = new Set<string>();\n\n pairByExactId(before, after, matches, consumedBefore, consumedAfter);\n pairUniquePrimaryRoles(before, after, matches, consumedBefore, consumedAfter);\n pairOwnedParts(before, after, matches, consumedBefore, consumedAfter);\n\n const replacements: StackPartReplacement[] = [];\n const ownerChanges: StackPartOwnerChange[] = [];\n const evidenceChanges: StackPartEvidenceChange[] = [];\n let unchanged = 0;\n\n for (const match of matches) {\n const beforeSnapshot = snapshot(match.before, before, options);\n const afterSnapshot = snapshot(match.after, after, options);\n const pair = { before: beforeSnapshot, after: afterSnapshot };\n const replaced = persistedPartKey(match.before) !== persistedPartKey(match.after);\n const ownerChanged = (match.before.ownerPartId ?? null) !== (match.after.ownerPartId ?? null);\n const beforeEvidence = options.evidenceForPart?.(match.before) ?? null;\n const afterEvidence = options.evidenceForPart?.(match.after) ?? null;\n const evidenceChanged = evidenceKey(beforeEvidence) !== evidenceKey(afterEvidence);\n\n if (replaced) replacements.push(pair);\n if (ownerChanged) {\n ownerChanges.push({\n ...pair,\n beforeOwnerId: match.before.ownerPartId ?? null,\n afterOwnerId: match.after.ownerPartId ?? null,\n });\n }\n if (evidenceChanged) {\n evidenceChanges.push({ ...pair, beforeEvidence, afterEvidence });\n }\n if (!replaced && !ownerChanged && !evidenceChanged) unchanged += 1;\n }\n\n const additions = sortSnapshots(\n after\n .filter((part) => !consumedAfter.has(part.id))\n .map((part) => snapshot(part, after, options)),\n );\n const removals = sortSnapshots(\n before\n .filter((part) => !consumedBefore.has(part.id))\n .map((part) => snapshot(part, before, options)),\n );\n replacements.sort((left, right) => left.before.spec.localeCompare(right.before.spec));\n ownerChanges.sort((left, right) => left.before.spec.localeCompare(right.before.spec));\n evidenceChanges.sort((left, right) => left.before.spec.localeCompare(right.before.spec));\n\n return {\n additions,\n removals,\n replacements,\n ownerChanges,\n evidenceChanges,\n unchanged,\n hasChanges:\n additions.length > 0 ||\n removals.length > 0 ||\n replacements.length > 0 ||\n ownerChanges.length > 0 ||\n evidenceChanges.length > 0,\n };\n}\n"],"mappings":"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"}
|