@better-fullstack/types 2.6.0 → 2.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/{defaults-7VECSARb.d.mts → defaults-CZeSVSu8.d.mts} +3 -3
  2. package/dist/defaults-CZeSVSu8.d.mts.map +1 -0
  3. package/dist/{defaults-Bp46Ajyg.mjs → defaults-DTS30ICD.mjs} +2 -2
  4. package/dist/defaults-DTS30ICD.mjs.map +1 -0
  5. package/dist/defaults.d.mts +3 -3
  6. package/dist/defaults.mjs +1 -1
  7. package/dist/index.d.mts +1258 -11
  8. package/dist/index.d.mts.map +1 -1
  9. package/dist/index.mjs +289 -9
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/json-schema.d.mts +324 -324
  12. package/dist/json-schema.d.mts.map +1 -1
  13. package/dist/json-schema.mjs +2 -2
  14. package/dist/json-schema.mjs.map +1 -1
  15. package/dist/{schemas-CY0MaZmU.d.mts → schemas-82xJXQrZ.d.mts} +680 -598
  16. package/dist/schemas-82xJXQrZ.d.mts.map +1 -0
  17. package/dist/{schemas-CH1UszP5.mjs → schemas-cgmdgudQ.mjs} +41 -4
  18. package/dist/schemas-cgmdgudQ.mjs.map +1 -0
  19. package/dist/schemas.d.mts +2 -2
  20. package/dist/schemas.mjs +2 -2
  21. package/dist/{stack-graph-DkJ944IX.d.mts → stack-graph-DG53F1Q2.d.mts} +26 -4
  22. package/dist/stack-graph-DG53F1Q2.d.mts.map +1 -0
  23. package/dist/{stack-graph-AWbdUrN3.mjs → stack-graph-Oj-P0cij.mjs} +91 -14
  24. package/dist/stack-graph-Oj-P0cij.mjs.map +1 -0
  25. package/dist/stack-graph.d.mts +4 -4
  26. package/dist/stack-graph.mjs +3 -3
  27. package/dist/{stack-translation-C9yYLNwM.d.mts → stack-translation-0OwfhcBf.d.mts} +59 -9
  28. package/dist/stack-translation-0OwfhcBf.d.mts.map +1 -0
  29. package/dist/{stack-translation-Cn6zGJ5q.mjs → stack-translation-49iba9M5.mjs} +161 -30
  30. package/dist/stack-translation-49iba9M5.mjs.map +1 -0
  31. package/dist/stack-translation.d.mts +4 -4
  32. package/dist/stack-translation.mjs +3 -3
  33. package/dist/telemetry-C9qQ80l9.mjs +2270 -0
  34. package/dist/telemetry-C9qQ80l9.mjs.map +1 -0
  35. package/dist/telemetry-CUtrUTe9.d.mts +36 -0
  36. package/dist/telemetry-CUtrUTe9.d.mts.map +1 -0
  37. package/dist/telemetry.d.mts +2 -0
  38. package/dist/telemetry.mjs +6 -0
  39. package/dist/{types-fGT5qf7O.d.mts → types-CfEIdtDo.d.mts} +3 -3
  40. package/dist/types-CfEIdtDo.d.mts.map +1 -0
  41. package/dist/types.d.mts +2 -2
  42. package/package.json +5 -1
  43. package/dist/defaults-7VECSARb.d.mts.map +0 -1
  44. package/dist/defaults-Bp46Ajyg.mjs.map +0 -1
  45. package/dist/schemas-CH1UszP5.mjs.map +0 -1
  46. package/dist/schemas-CY0MaZmU.d.mts.map +0 -1
  47. package/dist/stack-graph-AWbdUrN3.mjs.map +0 -1
  48. package/dist/stack-graph-DkJ944IX.d.mts.map +0 -1
  49. package/dist/stack-translation-C9yYLNwM.d.mts.map +0 -1
  50. package/dist/stack-translation-Cn6zGJ5q.mjs.map +0 -1
  51. package/dist/types-fGT5qf7O.d.mts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-graph-Oj-P0cij.mjs","names":["TOOLING_CATEGORIES: readonly ToolingCategoryDefinition[]","TOOLING_SELECTION_OPTIONS: readonly ToolingSelectionOption[]","TOOLING_CAPABILITIES: readonly ToolingCapabilityDefinition[]","WEB_FRAMEWORKS: readonly Frontend[]","UI_LIBRARY_COMPATIBILITY: Record<\n UILibrary,\n {\n frontends: readonly Frontend[];\n cssFrameworks: readonly CSSFramework[];\n }\n>","ELIXIR_PHOENIX_REQUIRED_ROLE_MESSAGES: Partial<Record<StackPartRole, string>>","ELIXIR_UNSUPPORTED_GRAPH_TOOL_MESSAGES: Record<string, string>","ROLE_TARGET_PATHS: Record<StackPrimaryRole, string>","SHARED_NON_TYPESCRIPT_BACKEND_SERVICE_RULES: Partial<\n Record<StackPartRole, SharedNonTypeScriptBackendServiceRule>\n>","projected: StackPartProjectSettings","definition: ToolDefinition","STACK_TOOL_DEFINITIONS: readonly ToolDefinition[]","repeatedTargetRoot: Partial<Record<StackPrimaryRole, string>>","selectedToolIdsByRole: Partial<Record<StackPartRole, string>>","selectedToolIdsByRoleList: Partial<Record<StackPartRole, string[]>>","selectedEcosystemsByRoleList: Partial<Record<StackPartRole, StackPartEcosystem[]>>","primaryToolIdsByRole: Partial<Record<StackPrimaryRole, string>>","primaryEcosystemsByRole: Partial<Record<StackPrimaryRole, StackPartEcosystem>>","siblingToolIdsByRole: Partial<Record<StackPartRole, string>>","siblingToolIdsByRoleList: Partial<Record<StackPartRole, string[]>>","parts: StackPart[]","backendPart: StackPart | undefined","config: Partial<ProjectConfig>","legacyArrayCategory","legacyCategory","projected: ProjectConfig","issues: StackGraphIssue[]"],"sources":["../src/capabilities/tooling-capabilities.ts","../src/stack/stack-compatibility-rules.ts","../src/stack/stack-graph.ts"],"sourcesContent":["import type { StackPartEcosystem, StackPartRole } from \"@/config/types\";\n\nexport const TOOLING_CATEGORY_IDS = [\n \"toolchain\",\n \"workspaceRunner\",\n \"codeQuality\",\n \"gitHooks\",\n \"staticAnalysis\",\n \"aiTooling\",\n \"documentation\",\n \"appPlatforms\",\n \"testingTools\",\n \"dataClient\",\n \"frontendUtilities\",\n \"httpClient\",\n \"codeGeneration\",\n \"developerEnvironment\",\n \"containerOrchestration\",\n \"apiGateway\",\n \"continuousIntegration\",\n \"backendUtilities\",\n] as const;\n\nexport type ToolingCategoryId = (typeof TOOLING_CATEGORY_IDS)[number];\n\nexport type ToolingCategoryDefinition = {\n id: ToolingCategoryId;\n label: string;\n description: string;\n selectionMode: \"single\" | \"multiple\";\n ownerRole?: \"frontend\" | \"backend\";\n};\n\nexport const TOOLING_CATEGORIES: readonly ToolingCategoryDefinition[] = [\n {\n id: \"toolchain\",\n label: \"JavaScript Toolchain\",\n description: \"Choose the primary development toolchain for JavaScript workspaces.\",\n selectionMode: \"single\",\n },\n {\n id: \"workspaceRunner\",\n label: \"Workspace Runner\",\n description: \"Choose one task runner and cache for a modular monorepo.\",\n selectionMode: \"single\",\n },\n {\n id: \"codeQuality\",\n label: \"Code Quality\",\n description: \"Choose one coherent linting and formatting profile.\",\n selectionMode: \"single\",\n },\n {\n id: \"gitHooks\",\n label: \"Git Hooks\",\n description: \"Choose one Git hook manager.\",\n selectionMode: \"single\",\n },\n {\n id: \"staticAnalysis\",\n label: \"Static Analysis\",\n description: \"Add compatible project and secret analysis checks.\",\n selectionMode: \"multiple\",\n },\n {\n id: \"aiTooling\",\n label: \"AI Tooling\",\n description: \"Install compatible agent rules, MCP guidance, and skills.\",\n selectionMode: \"multiple\",\n },\n {\n id: \"documentation\",\n label: \"Documentation App\",\n description: \"Choose one generated documentation application.\",\n selectionMode: \"single\",\n },\n {\n id: \"appPlatforms\",\n label: \"App Platforms\",\n description: \"Add compatible desktop, mobile, extension, terminal, or PWA targets.\",\n selectionMode: \"multiple\",\n ownerRole: \"frontend\",\n },\n {\n id: \"testingTools\",\n label: \"Testing Support\",\n description: \"Add complementary API mocking and component-workshop tools.\",\n selectionMode: \"multiple\",\n ownerRole: \"frontend\",\n },\n {\n id: \"dataClient\",\n label: \"Data Client\",\n description: \"Choose one primary remote-data client for each frontend.\",\n selectionMode: \"single\",\n ownerRole: \"frontend\",\n },\n {\n id: \"frontendUtilities\",\n label: \"Frontend Utilities\",\n description: \"Add compatible, independent frontend libraries.\",\n selectionMode: \"multiple\",\n ownerRole: \"frontend\",\n },\n {\n id: \"httpClient\",\n label: \"HTTP Client\",\n description: \"Choose an explicit HTTP client or use the platform fetch API.\",\n selectionMode: \"single\",\n ownerRole: \"frontend\",\n },\n {\n id: \"codeGeneration\",\n label: \"API Code Generation\",\n description: \"Generate typed clients from compatible GraphQL or OpenAPI contracts.\",\n selectionMode: \"multiple\",\n },\n {\n id: \"developerEnvironment\",\n label: \"Developer Environment\",\n description: \"Generate a reproducible editor and container development environment.\",\n selectionMode: \"multiple\",\n },\n {\n id: \"containerOrchestration\",\n label: \"Local Containers\",\n description: \"Generate local container orchestration for project services.\",\n selectionMode: \"single\",\n },\n {\n id: \"apiGateway\",\n label: \"API Gateway\",\n description: \"Choose a gateway for compatible containerized APIs.\",\n selectionMode: \"single\",\n },\n {\n id: \"continuousIntegration\",\n label: \"Continuous Integration\",\n description: \"Choose generated CI automation for the repository.\",\n selectionMode: \"single\",\n },\n {\n id: \"backendUtilities\",\n label: \"Backend Utilities\",\n description: \"Add compatible server-side helper packages and generated utilities.\",\n selectionMode: \"multiple\",\n ownerRole: \"backend\",\n },\n];\n\nexport type ToolingCapabilityDefinition = {\n toolId: string;\n category: ToolingCategoryId;\n role: StackPartRole;\n ecosystem: StackPartEcosystem;\n ownerRole?: \"frontend\" | \"backend\";\n};\n\nexport type ToolingSelectionOption = {\n id: string;\n category: ToolingCategoryId;\n label: string;\n description: string;\n toolIds: readonly string[];\n};\n\nconst option = (\n category: ToolingCategoryId,\n id: string,\n label: string,\n description: string,\n toolIds: readonly string[] = id === \"none\" ? [] : [id],\n): ToolingSelectionOption => ({ category, id, label, description, toolIds });\n\nexport const TOOLING_SELECTION_OPTIONS: readonly ToolingSelectionOption[] = [\n option(\"toolchain\", \"modular\", \"Modular\", \"Choose each JavaScript tool independently.\", []),\n option(\n \"toolchain\",\n \"vite-plus\",\n \"Vite+\",\n \"Unified Vite, Vitest, Oxlint, Oxfmt, Rolldown, tsdown, and workspace runner (Beta).\",\n ),\n option(\"workspaceRunner\", \"none\", \"None\", \"Use package-manager workspace scripts only.\"),\n option(\"workspaceRunner\", \"turborepo\", \"Turborepo\", \"Task runner with remote caching.\"),\n option(\"workspaceRunner\", \"nx\", \"Nx\", \"Task runner with a project graph and caching.\"),\n option(\"codeQuality\", \"none\", \"None\", \"Do not generate a linting and formatting profile.\"),\n option(\"codeQuality\", \"biome\", \"Biome\", \"Biome linting and formatting.\"),\n option(\n \"codeQuality\",\n \"eslint-prettier\",\n \"ESLint + Prettier\",\n \"ESLint flat config with Prettier formatting.\",\n [\"eslint\", \"prettier\"],\n ),\n option(\"codeQuality\", \"oxlint\", \"Oxlint + Oxfmt\", \"Oxc linting and formatting.\", [\"oxlint\"]),\n option(\"codeQuality\", \"ultracite\", \"Ultracite\", \"Opinionated Biome profile with AI support.\"),\n option(\"gitHooks\", \"none\", \"None\", \"Do not generate a Git hook manager.\"),\n option(\"gitHooks\", \"lefthook\", \"Lefthook\", \"Fast language-independent Git hooks.\"),\n option(\"gitHooks\", \"husky\", \"Husky\", \"JavaScript-native Git hooks.\"),\n option(\"staticAnalysis\", \"knip\", \"Knip\", \"Find unused files, exports, and dependencies.\"),\n option(\"staticAnalysis\", \"gitleaks\", \"Gitleaks\", \"Detect secrets in Git history and changes.\"),\n option(\"aiTooling\", \"ruler\", \"Ruler\", \"Centralize and distribute AI coding rules.\"),\n option(\"aiTooling\", \"mcp\", \"MCP Guidance\", \"Generate stack-aware MCP recommendations.\"),\n option(\"aiTooling\", \"skills\", \"Agent Skills\", \"Install curated stack-aware agent skills.\"),\n option(\"documentation\", \"none\", \"None\", \"Do not generate a documentation application.\"),\n option(\"documentation\", \"starlight\", \"Starlight\", \"Astro-powered documentation application.\"),\n option(\"documentation\", \"fumadocs\", \"Fumadocs\", \"Next.js-powered documentation application.\"),\n option(\"appPlatforms\", \"pwa\", \"PWA\", \"Installable and offline-capable web application.\"),\n option(\"appPlatforms\", \"tauri\", \"Tauri\", \"Rust-powered desktop shell.\"),\n option(\"appPlatforms\", \"electron\", \"Electron\", \"JavaScript-powered desktop shell.\"),\n option(\"appPlatforms\", \"capacitor\", \"Capacitor\", \"iOS and Android shell for a web application.\"),\n option(\"appPlatforms\", \"wxt\", \"WXT\", \"Browser extension application.\"),\n option(\"appPlatforms\", \"opentui\", \"OpenTUI\", \"Terminal user interface application.\"),\n option(\"testingTools\", \"msw\", \"MSW\", \"Network-level API mocking.\"),\n option(\"testingTools\", \"storybook\", \"Storybook\", \"Component workshop and visual testing.\"),\n option(\"dataClient\", \"none\", \"None\", \"Use framework-native data loading.\"),\n option(\"dataClient\", \"swr\", \"SWR\", \"React Hooks for remote data.\"),\n option(\"dataClient\", \"tanstack-query\", \"TanStack Query\", \"Async server-state management.\"),\n option(\"dataClient\", \"apollo-client\", \"Apollo Client\", \"GraphQL client and normalized cache.\"),\n option(\"frontendUtilities\", \"tanstack-table\", \"TanStack Table\", \"Headless tables.\"),\n option(\n \"frontendUtilities\",\n \"tanstack-virtual\",\n \"TanStack Virtual\",\n \"Virtualized lists and grids.\",\n ),\n option(\"frontendUtilities\", \"tanstack-db\", \"TanStack DB\", \"Reactive client data store (Beta).\"),\n option(\n \"frontendUtilities\",\n \"tanstack-pacer\",\n \"TanStack Pacer\",\n \"Rate and queue utilities (Beta).\",\n ),\n option(\"frontendUtilities\", \"firebase\", \"Firebase JS SDK\", \"Firebase client services.\"),\n option(\"httpClient\", \"none\", \"Platform Fetch\", \"Use the platform fetch API.\"),\n option(\"httpClient\", \"axios\", \"Axios\", \"HTTP client with interceptors and cancellation.\"),\n option(\n \"codeGeneration\",\n \"graphql-codegen\",\n \"GraphQL Code Generator\",\n \"Generate typed GraphQL operations.\",\n ),\n option(\n \"codeGeneration\",\n \"openapi-typescript\",\n \"openapi-typescript\",\n \"Generate types from OpenAPI.\",\n ),\n option(\n \"developerEnvironment\",\n \"devcontainer\",\n \"Dev Container\",\n \"Generate a containerized editor environment.\",\n ),\n option(\n \"containerOrchestration\",\n \"none\",\n \"None\",\n \"Do not generate local container orchestration.\",\n ),\n option(\n \"containerOrchestration\",\n \"docker-compose\",\n \"Docker Compose\",\n \"Run project services in local containers.\",\n ),\n option(\"apiGateway\", \"none\", \"None\", \"Do not generate an API gateway.\"),\n option(\"apiGateway\", \"kong\", \"Kong Gateway\", \"DB-less gateway for containerized APIs.\"),\n option(\"continuousIntegration\", \"none\", \"None\", \"Do not generate CI automation.\"),\n option(\n \"continuousIntegration\",\n \"github-actions\",\n \"GitHub Actions\",\n \"Repository CI for install, check, and build.\",\n ),\n option(\n \"backendUtilities\",\n \"backend-utils\",\n \"Backend Utilities\",\n \"Generated handlers, responses, and error helpers.\",\n ),\n];\n\nexport const TOOLING_CAPABILITIES: readonly ToolingCapabilityDefinition[] = [\n { toolId: \"vite-plus\", category: \"toolchain\", role: \"toolchain\", ecosystem: \"universal\" },\n {\n toolId: \"turborepo\",\n category: \"workspaceRunner\",\n role: \"workspaceRunner\",\n ecosystem: \"universal\",\n },\n { toolId: \"nx\", category: \"workspaceRunner\", role: \"workspaceRunner\", ecosystem: \"universal\" },\n { toolId: \"biome\", category: \"codeQuality\", role: \"codeQuality\", ecosystem: \"universal\" },\n { toolId: \"eslint\", category: \"codeQuality\", role: \"codeQuality\", ecosystem: \"universal\" },\n { toolId: \"prettier\", category: \"codeQuality\", role: \"codeQuality\", ecosystem: \"universal\" },\n { toolId: \"oxlint\", category: \"codeQuality\", role: \"codeQuality\", ecosystem: \"universal\" },\n { toolId: \"ultracite\", category: \"codeQuality\", role: \"codeQuality\", ecosystem: \"universal\" },\n { toolId: \"lefthook\", category: \"gitHooks\", role: \"gitHooks\", ecosystem: \"universal\" },\n { toolId: \"husky\", category: \"gitHooks\", role: \"gitHooks\", ecosystem: \"universal\" },\n { toolId: \"knip\", category: \"staticAnalysis\", role: \"staticAnalysis\", ecosystem: \"typescript\" },\n {\n toolId: \"gitleaks\",\n category: \"staticAnalysis\",\n role: \"staticAnalysis\",\n ecosystem: \"universal\",\n },\n { toolId: \"ruler\", category: \"aiTooling\", role: \"aiTooling\", ecosystem: \"universal\" },\n { toolId: \"mcp\", category: \"aiTooling\", role: \"aiTooling\", ecosystem: \"universal\" },\n { toolId: \"skills\", category: \"aiTooling\", role: \"aiTooling\", ecosystem: \"universal\" },\n {\n toolId: \"starlight\",\n category: \"documentation\",\n role: \"documentation\",\n ecosystem: \"universal\",\n },\n {\n toolId: \"fumadocs\",\n category: \"documentation\",\n role: \"documentation\",\n ecosystem: \"universal\",\n },\n ...([\"pwa\", \"tauri\", \"electron\", \"capacitor\"] as const).map((toolId) => ({\n toolId,\n category: \"appPlatforms\" as const,\n role: \"appPlatform\" as const,\n ecosystem: \"typescript\" as const,\n ownerRole: \"frontend\" as const,\n })),\n ...([\"wxt\", \"opentui\"] as const).map((toolId) => ({\n toolId,\n category: \"appPlatforms\" as const,\n role: \"appPlatform\" as const,\n ecosystem: \"typescript\" as const,\n })),\n { toolId: \"msw\", category: \"testingTools\", role: \"testing\", ecosystem: \"typescript\" },\n {\n toolId: \"storybook\",\n category: \"testingTools\",\n role: \"testing\",\n ecosystem: \"typescript\",\n ownerRole: \"frontend\",\n },\n ...([\"swr\", \"tanstack-query\", \"apollo-client\"] as const).map((toolId) => ({\n toolId,\n category: \"dataClient\" as const,\n role: \"dataFetching\" as const,\n ecosystem: \"typescript\" as const,\n ownerRole: \"frontend\" as const,\n })),\n ...(\n [\"tanstack-table\", \"tanstack-virtual\", \"tanstack-db\", \"tanstack-pacer\", \"firebase\"] as const\n ).map((toolId) => ({\n toolId,\n category: \"frontendUtilities\" as const,\n role: \"libraries\" as const,\n ecosystem: \"typescript\" as const,\n ownerRole: \"frontend\" as const,\n })),\n {\n toolId: \"axios\",\n category: \"httpClient\",\n role: \"httpClient\",\n ecosystem: \"typescript\",\n ownerRole: \"frontend\",\n },\n ...([\"graphql-codegen\", \"openapi-typescript\"] as const).map((toolId) => ({\n toolId,\n category: \"codeGeneration\" as const,\n role: \"codeGeneration\" as const,\n ecosystem: \"universal\" as const,\n })),\n {\n toolId: \"devcontainer\",\n category: \"developerEnvironment\",\n role: \"developerEnvironment\",\n ecosystem: \"universal\",\n },\n {\n toolId: \"docker-compose\",\n category: \"containerOrchestration\",\n role: \"containerOrchestration\",\n ecosystem: \"universal\",\n },\n { toolId: \"kong\", category: \"apiGateway\", role: \"apiGateway\", ecosystem: \"universal\" },\n {\n toolId: \"github-actions\",\n category: \"continuousIntegration\",\n role: \"continuousIntegration\",\n ecosystem: \"universal\",\n },\n {\n toolId: \"backend-utils\",\n category: \"backendUtilities\",\n role: \"backendUtilities\",\n ecosystem: \"typescript\",\n ownerRole: \"backend\",\n },\n];\n\nexport const TOOLING_TOOL_IDS = TOOLING_CAPABILITIES.map((capability) => capability.toolId);\n\nexport function getToolingCategory(category: ToolingCategoryId) {\n return TOOLING_CATEGORIES.find((definition) => definition.id === category);\n}\n\nexport function getToolingCapability(toolId: string) {\n return TOOLING_CAPABILITIES.find((definition) => definition.toolId === toolId);\n}\n\nexport function getToolingCapabilities(category: ToolingCategoryId) {\n return TOOLING_CAPABILITIES.filter((definition) => definition.category === category);\n}\n\nexport function getToolingSelectionOptions(category: ToolingCategoryId) {\n return TOOLING_SELECTION_OPTIONS.filter((definition) => definition.category === category);\n}\n\nexport function isToolingOverlayPart(part: {\n readonly toolId: string;\n readonly role: StackPartRole;\n readonly ecosystem?: StackPartEcosystem;\n readonly source?: string;\n}) {\n const capability = getToolingCapability(part.toolId);\n if (!capability || part.source === \"provided\") return false;\n return (\n capability.role === part.role &&\n (part.ecosystem === undefined || capability.ecosystem === part.ecosystem)\n );\n}\n\nexport function isToolingOverlayOnly(\n parts:\n | readonly {\n toolId: string;\n role: StackPartRole;\n ecosystem?: StackPartEcosystem;\n source?: string;\n }[]\n | undefined,\n) {\n return (parts ?? []).every((part) => isToolingOverlayPart(part));\n}\n\nexport function getSelectedToolingOption(\n category: ToolingCategoryId,\n selectedToolIds: readonly string[],\n) {\n return getToolingSelectionOptions(category).find((selection) =>\n selection.toolIds.length === 0\n ? getToolingCapabilities(category).every(\n (capability) => !selectedToolIds.includes(capability.toolId),\n )\n : selection.toolIds.every((toolId) => selectedToolIds.includes(toolId)),\n );\n}\n","import type { Backend, CSSFramework, Frontend, Runtime, UILibrary, WebDeploy } from \"@/config/types\";\n\nconst WEB_FRAMEWORKS: readonly Frontend[] = [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"vanilla-vite\",\n \"vue\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n \"astro\",\n \"qwik\",\n \"angular\",\n \"redwood\",\n \"fresh\",\n \"none\",\n] as const;\n\nconst WEB_DEPLOY_COMPATIBLE_FRONTENDS = {\n cloudflare: [\n \"tanstack-router\",\n \"react-router\",\n \"tanstack-start\",\n \"next\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"astro\",\n ],\n render: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n ],\n netlify: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n ],\n} as const satisfies Partial<Record<WebDeploy, readonly Frontend[]>>;\n\nexport const hasPWACompatibleFrontend = (webFrontend: string[]) =>\n webFrontend.some((frontend) =>\n [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"vanilla-vite\",\n \"vue\",\n \"solid\",\n \"next\",\n \"vinext\",\n \"astro\",\n ].includes(frontend),\n );\n\nexport const hasTauriCompatibleFrontend = (webFrontend: string[]) =>\n webFrontend.some((frontend) =>\n [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"vanilla-vite\",\n \"vue\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"next\",\n \"vinext\",\n \"astro\",\n ].includes(frontend),\n );\n\nexport const hasDockerComposeCompatibleFrontend = (webFrontend: string[]) =>\n webFrontend.some((frontend) =>\n [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"vanilla-vite\",\n \"vue\",\n \"solid\",\n \"next\",\n \"vinext\",\n \"astro\",\n ].includes(frontend),\n );\n\nexport function getUnsupportedWebDeployFrontend(\n webDeploy: string | undefined,\n frontends: readonly string[] = [],\n): string | undefined {\n const supported = WEB_DEPLOY_COMPATIBLE_FRONTENDS[\n webDeploy as keyof typeof WEB_DEPLOY_COMPATIBLE_FRONTENDS\n ];\n if (!supported) return undefined;\n\n return frontends.find((frontend) => {\n if (frontend === \"none\" || !WEB_FRAMEWORKS.includes(frontend as Frontend)) return false;\n return !(supported as readonly string[]).includes(frontend);\n });\n}\n\nexport const UI_LIBRARY_COMPATIBILITY: Record<\n UILibrary,\n {\n frontends: readonly Frontend[];\n cssFrameworks: readonly CSSFramework[];\n }\n> = {\n \"shadcn-ui\": {\n frontends: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n \"astro\",\n ],\n cssFrameworks: [\"tailwind\"],\n },\n \"shadcn-svelte\": {\n frontends: [\"svelte\", \"astro\"],\n cssFrameworks: [\"tailwind\"],\n },\n daisyui: {\n frontends: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"vanilla-vite\",\n \"vue\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n \"astro\",\n \"qwik\",\n \"angular\",\n \"redwood\",\n \"fresh\",\n ],\n cssFrameworks: [\"tailwind\"],\n },\n \"radix-ui\": {\n frontends: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n \"astro\",\n ],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"styled-components\", \"none\"],\n },\n \"headless-ui\": {\n frontends: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n \"nuxt\",\n \"astro\",\n ],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n \"park-ui\": {\n frontends: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n \"nuxt\",\n \"solid\",\n \"solid-start\",\n \"astro\",\n ],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\"],\n },\n \"chakra-ui\": {\n frontends: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n \"astro\",\n ],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n nextui: {\n frontends: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n \"astro\",\n ],\n cssFrameworks: [\"tailwind\"],\n },\n mantine: {\n frontends: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n \"astro\",\n ],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n mui: {\n frontends: [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\", \"astro\"],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n antd: {\n frontends: [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\", \"astro\"],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n \"base-ui\": {\n frontends: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n \"astro\",\n ],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n \"ark-ui\": {\n frontends: [\n \"tanstack-router\",\n \"react-router\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n \"astro\",\n ],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n \"react-aria\": {\n frontends: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n \"astro\",\n ],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n none: {\n frontends: WEB_FRAMEWORKS,\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"styled-components\", \"none\"],\n },\n};\n\nexport const BACKEND_UTILS_COMPATIBLE_BACKENDS = [\n \"hono\",\n \"express\",\n \"fastify\",\n \"elysia\",\n \"fets\",\n \"nestjs\",\n] as const satisfies readonly Backend[];\n\nexport function isBackendUtilsCompatibleBackend(backend: string | undefined): boolean {\n return (\n backend !== undefined && (BACKEND_UTILS_COMPATIBLE_BACKENDS as readonly string[]).includes(backend)\n );\n}\n\nexport function isExampleAIAllowed(backend?: Backend, frontends: Frontend[] = []) {\n const includesSolid = frontends.includes(\"solid\");\n const includesSolidStart = frontends.includes(\"solid-start\");\n if (includesSolid || includesSolidStart) return false;\n\n if (backend === \"convex\") {\n const includesNuxt = frontends.includes(\"nuxt\");\n const includesSvelte = frontends.includes(\"svelte\");\n if (includesNuxt || includesSvelte) return false;\n }\n\n return true;\n}\n\nfunction hasExampleChatSdkSelfFrontend(frontends: Frontend[] = []) {\n return frontends.some((frontend) => [\"next\", \"tanstack-start\", \"nuxt\"].includes(frontend));\n}\n\nexport function isExampleChatSdkAllowed(\n backend?: Backend | string,\n frontends: Frontend[] = [],\n runtime?: Runtime | string,\n) {\n if (frontends.includes(\"react-vite\")) return false;\n if (!backend || backend === \"none\" || backend === \"convex\") return false;\n\n if (backend === \"self\") {\n return hasExampleChatSdkSelfFrontend(frontends);\n }\n\n if (backend === \"self-next\" || backend === \"self-tanstack-start\" || backend === \"self-nuxt\") {\n return true;\n }\n\n if (backend === \"self-astro\" || backend === \"self-svelte\" || backend === \"self-solid-start\") {\n return false;\n }\n\n if (backend === \"hono\") {\n return runtime === \"node\";\n }\n\n return false;\n}\n\nexport function requiresChatSdkVercelAIForExamples(\n backend?: Backend | string,\n runtime?: Runtime | string,\n examples: readonly string[] = [],\n): boolean {\n return (\n examples.includes(\"chat-sdk\") &&\n (backend === \"self-nuxt\" || (backend === \"hono\" && runtime === \"node\"))\n );\n}\n\nexport function hasTanStackAICompatibleFrontend(frontends: readonly string[] = []): boolean {\n return frontends.some((frontend) =>\n [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"redwood\",\n \"solid\",\n \"solid-start\",\n ].includes(frontend),\n );\n}\n","import type {\n Ecosystem,\n ProjectConfig,\n StackPart,\n StackPartEcosystem,\n StackPartRole,\n StackPartSource,\n} from \"@/config/types\";\n\nimport {\n API_VALUES,\n AUTH_VALUES,\n AI_VALUES,\n ANALYTICS_VALUES,\n ANIMATION_VALUES,\n ASTRO_INTEGRATION_VALUES,\n BACKEND_VALUES,\n CACHING_VALUES,\n CMS_VALUES,\n CSS_FRAMEWORK_VALUES,\n DATABASE_VALUES,\n DATABASE_SETUP_VALUES,\n DOTNET_API_VALUES,\n DOTNET_AUTH_VALUES,\n DOTNET_FRONTEND_VALUES,\n DOTNET_VALIDATION_VALUES,\n DOTNET_CACHING_VALUES,\n DOTNET_DEPLOY_VALUES,\n DOTNET_JOB_QUEUE_VALUES,\n DOTNET_LIBRARIES_VALUES,\n DOTNET_OBSERVABILITY_VALUES,\n DOTNET_ORM_VALUES,\n DOTNET_REALTIME_VALUES,\n DOTNET_TESTING_VALUES,\n DOTNET_WEB_FRAMEWORK_VALUES,\n DART_MOBILE_VALUES,\n ELIXIR_API_VALUES,\n ELIXIR_LIBRARIES_VALUES,\n ELIXIR_AUTH_VALUES,\n ELIXIR_CACHING_VALUES,\n ELIXIR_DEPLOY_VALUES,\n ELIXIR_EMAIL_VALUES,\n ELIXIR_JOBS_VALUES,\n ELIXIR_OBSERVABILITY_VALUES,\n ELIXIR_ORM_VALUES,\n ELIXIR_REALTIME_VALUES,\n ELIXIR_TESTING_VALUES,\n ELIXIR_VALIDATION_VALUES,\n ELIXIR_WEB_FRAMEWORK_VALUES,\n EFFECT_VALUES,\n EMAIL_VALUES,\n ECOMMERCE_VALUES,\n EXAMPLES_VALUES,\n FEATURE_FLAGS_VALUES,\n INTEGRATIONS_VALUES,\n FILE_STORAGE_VALUES,\n FILE_UPLOAD_VALUES,\n FORMS_VALUES,\n FRONTEND_VALUES,\n GO_API_VALUES,\n GO_AUTH_VALUES,\n GO_CACHING_VALUES,\n GO_CLI_VALUES,\n GO_CONFIG_VALUES,\n GO_LOGGING_VALUES,\n GO_MESSAGE_QUEUE_VALUES,\n GO_OBSERVABILITY_VALUES,\n GO_ORM_VALUES,\n GO_VALIDATION_VALUES,\n GO_QUALITY_VALUES,\n GO_MIGRATIONS_VALUES,\n GO_TEMPLATING_VALUES,\n GO_PROTO_TOOLING_VALUES,\n GO_DI_VALUES,\n GO_REALTIME_VALUES,\n GO_TESTING_VALUES,\n GO_WEB_FRAMEWORK_VALUES,\n JAVA_AUTH_VALUES,\n JAVA_API_VALUES,\n JAVA_LOGGING_VALUES,\n JAVA_LANGUAGE_VALUES,\n JAVA_BUILD_TOOL_VALUES,\n JAVA_LIBRARIES_VALUES,\n JAVA_ORM_VALUES,\n JAVA_TESTING_LIBRARIES_VALUES,\n JAVA_WEB_FRAMEWORK_VALUES,\n JOB_QUEUE_VALUES,\n LOGGING_VALUES,\n MOBILE_NAVIGATION_VALUES,\n MOBILE_LIBRARIES_VALUES,\n MOBILE_DEEP_LINKING_VALUES,\n MOBILE_OTA_VALUES,\n MOBILE_PUSH_VALUES,\n MOBILE_STORAGE_VALUES,\n MOBILE_TESTING_VALUES,\n MOBILE_UI_VALUES,\n KOTLIN_MOBILE_VALUES,\n KOTLIN_MOBILE_LIBRARIES_VALUES,\n SWIFT_MOBILE_VALUES,\n OBSERVABILITY_VALUES,\n ORM_VALUES,\n PAYMENTS_VALUES,\n PYTHON_API_VALUES,\n PYTHON_AI_VALUES,\n PYTHON_AUTH_VALUES,\n PYTHON_GRAPHQL_VALUES,\n PYTHON_ORM_VALUES,\n PYTHON_QUALITY_VALUES,\n PYTHON_TESTING_VALUES,\n PYTHON_CACHING_VALUES,\n PYTHON_REALTIME_VALUES,\n PYTHON_OBSERVABILITY_VALUES,\n PYTHON_CLI_VALUES,\n PYTHON_CLOUD_SDK_VALUES,\n PYTHON_DATA_VALUES,\n PYTHON_HTTP_CLIENT_VALUES,\n PYTHON_MEDIA_VALUES,\n PYTHON_MESSAGE_QUEUE_VALUES,\n PYTHON_PACKAGE_MANAGER_VALUES,\n PYTHON_SERVER_VALUES,\n PYTHON_TASK_QUEUE_VALUES,\n PYTHON_VALIDATION_VALUES,\n PYTHON_WEB_FRAMEWORK_VALUES,\n RATE_LIMIT_VALUES,\n BOT_PROTECTION_VALUES,\n REALTIME_VALUES,\n RUNTIME_VALUES,\n RUST_API_VALUES,\n RUST_AUTH_VALUES,\n RUST_CACHING_VALUES,\n RUST_REALTIME_VALUES,\n RUST_MESSAGE_QUEUE_VALUES,\n RUST_OBSERVABILITY_VALUES,\n RUST_TEMPLATING_VALUES,\n RUST_CLI_VALUES,\n RUST_ERROR_HANDLING_VALUES,\n RUST_FRONTEND_VALUES,\n RUST_LIBRARIES_VALUES,\n RUST_LOGGING_VALUES,\n RUST_ORM_VALUES,\n RUST_WEB_FRAMEWORK_VALUES,\n SERVER_DEPLOY_VALUES,\n SEARCH_VALUES,\n SHADCN_BASE_COLOR_VALUES,\n SHADCN_BASE_VALUES,\n SHADCN_COLOR_THEME_VALUES,\n SHADCN_FONT_VALUES,\n SHADCN_ICON_LIBRARY_VALUES,\n SHADCN_RADIUS_VALUES,\n SHADCN_STYLE_VALUES,\n VECTOR_DB_VALUES,\n I18N_VALUES,\n ELIXIR_HTTP_VALUES,\n ELIXIR_QUALITY_VALUES,\n ELIXIR_I18N_VALUES,\n ELIXIR_HTTP_SERVER_VALUES,\n ELIXIR_APPLICATION_FRAMEWORK_VALUES,\n ELIXIR_DOCUMENTATION_VALUES,\n ELIXIR_CLUSTERING_VALUES,\n StackPartRoleSchema,\n STATE_MANAGEMENT_VALUES,\n TESTING_VALUES,\n UI_LIBRARY_VALUES,\n VALIDATION_VALUES,\n WEB_DEPLOY_VALUES,\n} from \"@/config/schemas\";\nimport {\n getUnsupportedWebDeployFrontend,\n hasDockerComposeCompatibleFrontend,\n hasPWACompatibleFrontend,\n hasTanStackAICompatibleFrontend,\n hasTauriCompatibleFrontend,\n isBackendUtilsCompatibleBackend,\n isExampleAIAllowed,\n isExampleChatSdkAllowed,\n requiresChatSdkVercelAIForExamples,\n UI_LIBRARY_COMPATIBILITY,\n} from \"@/stack/stack-compatibility-rules\";\nimport {\n getToolingCapability,\n getToolingCategory,\n getToolingSelectionOptions,\n TOOLING_CAPABILITIES,\n} from \"@/capabilities/tooling-capabilities\";\n\nexport type StackPrimaryRole = Extract<\n StackPartRole,\n \"frontend\" | \"backend\" | \"mobile\" | \"database\"\n>;\ntype LegacyBackendEcosystem = Exclude<Ecosystem, \"typescript\" | \"react-native\">;\ntype LegacyCapabilityRole = Extract<\n StackPartRole,\n \"orm\" | \"api\" | \"auth\" | \"email\" | \"observability\"\n>;\n\nexport type ProvidedCapabilityDefinition = {\n role: StackPartRole;\n toolId: string;\n ecosystem?: StackPartEcosystem;\n overrideable?: boolean;\n};\n\nexport type ToolDefinition = {\n toolId: string;\n label?: string;\n roles: readonly StackPartRole[];\n ecosystems: readonly StackPartEcosystem[];\n legacyCategory?: keyof ProjectConfig;\n selectable?: boolean;\n allowMultiple?: boolean;\n ownerless?: boolean;\n provides?: readonly ProvidedCapabilityDefinition[];\n};\n\nexport type StackPartOptionContext = {\n role: StackPartRole;\n ecosystem?: StackPartEcosystem;\n ownerRole?: StackPrimaryRole;\n ownerToolId?: string;\n ownerEcosystem?: StackPartEcosystem;\n settings?: Partial<ProjectConfig>;\n siblingToolIdsByRole?: Partial<Record<StackPartRole, string | undefined>>;\n siblingToolIdsByRoleList?: Partial<Record<StackPartRole, readonly string[] | undefined>>;\n selectedToolIdsByRole?: Partial<Record<StackPartRole, string | undefined>>;\n selectedToolIdsByRoleList?: Partial<Record<StackPartRole, readonly string[] | undefined>>;\n selectedEcosystemsByRoleList?: Partial<\n Record<StackPartRole, readonly StackPartEcosystem[] | undefined>\n >;\n primaryToolIdsByRole?: Partial<Record<StackPrimaryRole, string | undefined>>;\n primaryEcosystemsByRole?: Partial<Record<StackPrimaryRole, StackPartEcosystem | undefined>>;\n};\n\nexport type StackGraphIssue = {\n code: string;\n message: string;\n partId?: string;\n role?: StackPartRole;\n toolId?: string;\n alternatives?: string[];\n};\n\nexport type StackGraphValidationResult = {\n issues: StackGraphIssue[];\n};\n\nexport type StackGraphDiagnostic = {\n code: string;\n message: string;\n path?: string;\n};\n\nconst PRIMARY_ROLES = new Set<StackPartRole>([\"frontend\", \"backend\", \"mobile\", \"database\"]);\nconst NATIVE_FRONTENDS = new Set([\"native-bare\", \"native-uniwind\", \"native-unistyles\"]);\nconst WEB_FRONTENDS = FRONTEND_VALUES.filter(\n (value) => value !== \"none\" && !NATIVE_FRONTENDS.has(value),\n);\nconst DJANGO_API_TOOLS = new Set([\"django-rest-framework\", \"django-ninja\"]);\nconst JAVA_SPRING_CAPABILITY_TOOLS = new Set([\"spring-data-jpa\", \"spring-security\"]);\nconst PARAGLIDE_COMPATIBLE_FRONTENDS = new Set([\n \"next\",\n \"nuxt\",\n \"vinext\",\n \"tanstack-router\",\n \"tanstack-start\",\n \"react-router\",\n \"react-vite\",\n \"vanilla-vite\",\n \"vue\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n \"astro\",\n]);\nconst TYPESCRIPT_TRPC_INCOMPATIBLE_FRONTENDS = new Set([\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n \"vanilla-vite\",\n \"vue\",\n]);\nconst TYPESCRIPT_APOLLO_SERVER_COMPATIBLE_FRONTENDS = new Set([\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"vanilla-vite\",\n \"vue\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n]);\nconst BETTER_AUTH_UNSUPPORTED_ORM_TOOLS = new Set([\"typeorm\", \"mikroorm\", \"sequelize\"]);\nconst ELIXIR_ECTO_REQUIRED_TOOLS = new Set([\"absinthe\"]);\nconst ELIXIR_ECTO_SQL_REQUIRED_TOOLS = new Set([\"oban\"]);\nconst ELIXIR_SQL_REPO_REQUIRED_TOOLS = new Set([\"pow\", \"ex_machina\", \"phx-gen-auth\"]);\nconst ELIXIR_PHOENIX_REQUIRED_ROLE_MESSAGES: Partial<Record<StackPartRole, string>> = {\n auth: \"Elixir auth scaffolds require Phoenix\",\n api: \"Elixir API scaffolds require Phoenix\",\n realtime: \"Elixir realtime scaffolds require Phoenix\",\n i18n: \"Elixir Internationalization requires Phoenix\",\n runtime: \"HTTP server adapters require Phoenix\",\n};\nconst ELIXIR_UNSUPPORTED_GRAPH_TOOL_MESSAGES: Record<string, string> = {};\nexport const ELIXIR_UNSUPPORTED_GRAPH_TOOLS = new Set(\n Object.keys(ELIXIR_UNSUPPORTED_GRAPH_TOOL_MESSAGES),\n);\n\nconst ROLE_TARGET_PATHS: Record<StackPrimaryRole, string> = {\n frontend: \"apps/web\",\n backend: \"apps/server\",\n mobile: \"apps/native\",\n database: \"packages/db\",\n};\n\nconst LEGACY_BACKEND_CATEGORY_BY_ECOSYSTEM = {\n rust: \"rustWebFramework\",\n python: \"pythonWebFramework\",\n go: \"goWebFramework\",\n java: \"javaWebFramework\",\n dotnet: \"dotnetWebFramework\",\n elixir: \"elixirWebFramework\",\n} as const satisfies Record<LegacyBackendEcosystem, keyof ProjectConfig>;\n\nconst LEGACY_CAPABILITY_CATEGORIES_BY_ECOSYSTEM = {\n rust: {\n orm: \"rustOrm\",\n api: \"rustApi\",\n auth: \"rustAuth\",\n email: \"email\",\n observability: \"observability\",\n },\n python: {\n orm: \"pythonOrm\",\n api: \"pythonApi\",\n auth: \"pythonAuth\",\n email: \"email\",\n observability: \"observability\",\n },\n go: {\n orm: \"goOrm\",\n api: \"goApi\",\n auth: \"goAuth\",\n email: \"email\",\n observability: \"observability\",\n },\n java: {\n orm: \"javaOrm\",\n api: \"javaApi\",\n auth: \"javaAuth\",\n email: \"email\",\n observability: \"observability\",\n },\n dotnet: { orm: \"dotnetOrm\", api: \"dotnetApi\", auth: \"dotnetAuth\" },\n elixir: { orm: \"elixirOrm\", api: \"elixirApi\", auth: \"elixirAuth\" },\n} as const satisfies Record<\n LegacyBackendEcosystem,\n Partial<Record<LegacyCapabilityRole, keyof ProjectConfig>>\n>;\n\nconst LEGACY_TYPESCRIPT_BACKEND_SINGLE_CATEGORIES = {\n logging: \"logging\",\n email: \"email\",\n search: \"search\",\n vectorDb: \"vectorDb\",\n caching: \"caching\",\n observability: \"observability\",\n jobQueue: \"jobQueue\",\n rateLimit: \"rateLimit\",\n fileStorage: \"fileStorage\",\n featureFlags: \"featureFlags\",\n integrations: \"integrations\",\n ecommerce: \"ecommerce\",\n payments: \"payments\",\n realtime: \"realtime\",\n ai: \"ai\",\n cms: \"cms\",\n // Shared web+server categories collapse onto the backend owner (inventory §5 decision 3);\n // without a TypeScript backend they stay flat-only, like the rest of this map.\n // `testing` (vitest/playwright/jest/cypress) is the shared test-runner choice; owning it\n // on the backend keeps it in a different scope from the frontend-owned msw/storybook\n // testing addons, so the two never collide in a single `(owner, role)` scope.\n validation: \"validation\",\n effect: \"effect\",\n testing: \"testing\",\n} as const satisfies Partial<Record<StackPartRole, keyof ProjectConfig>>;\n\nconst LEGACY_TYPESCRIPT_BACKEND_INFRA_CATEGORIES = {\n runtime: \"runtime\",\n deploy: \"serverDeploy\",\n} as const satisfies Partial<Record<StackPartRole, keyof ProjectConfig>>;\n\nconst LEGACY_TYPESCRIPT_FRONTEND_SINGLE_CATEGORIES = {\n deploy: \"webDeploy\",\n css: \"cssFramework\",\n ui: \"uiLibrary\",\n forms: \"forms\",\n stateManagement: \"stateManagement\",\n animation: \"animation\",\n fileUpload: \"fileUpload\",\n i18n: \"i18n\",\n analytics: \"analytics\",\n botProtection: \"botProtection\",\n} as const satisfies Partial<Record<StackPartRole, keyof ProjectConfig>>;\n\nconst LEGACY_DATABASE_SINGLE_CATEGORIES = {\n dbSetup: \"dbSetup\",\n} as const satisfies Partial<Record<StackPartRole, keyof ProjectConfig>>;\n\nconst LEGACY_MOBILE_SINGLE_CATEGORIES = {\n auth: \"auth\",\n payments: \"payments\",\n navigation: \"mobileNavigation\",\n ui: \"mobileUI\",\n storage: \"mobileStorage\",\n testing: \"mobileTesting\",\n push: \"mobilePush\",\n ota: \"mobileOTA\",\n deepLinking: \"mobileDeepLinking\",\n} as const satisfies Partial<Record<StackPartRole, keyof ProjectConfig>>;\n\nconst LEGACY_MOBILE_ARRAY_CATEGORIES = {\n libraries: \"mobileLibraries\",\n} as const satisfies Partial<Record<StackPartRole, keyof ProjectConfig>>;\n\nconst LEGACY_BACKEND_ARRAY_CATEGORIES_BY_ECOSYSTEM = {\n rust: { libraries: \"rustLibraries\" },\n python: { ai: \"pythonAi\", testing: \"pythonTesting\", cli: \"pythonCli\", data: \"pythonData\" },\n go: { testing: \"goTesting\" },\n java: { libraries: \"javaLibraries\", testing: \"javaTestingLibraries\" },\n dotnet: {\n testing: \"dotnetTesting\",\n observability: \"dotnetObservability\",\n libraries: \"dotnetLibraries\",\n },\n elixir: { libraries: \"elixirLibraries\" },\n} as const satisfies Record<\n LegacyBackendEcosystem,\n Partial<Record<StackPartRole, keyof ProjectConfig>>\n>;\n\nconst DOCKER_COMPOSE_COMPATIBLE_ECOSYSTEMS = new Set<StackPartEcosystem>([\n \"typescript\",\n \"python\",\n \"go\",\n \"rust\",\n \"java\",\n]);\nconst LEGACY_ADDON_GRAPH_ROLES = new Set<StackPartRole>([\n ...TOOLING_CAPABILITIES.map((capability) => capability.role),\n \"workspaceTooling\",\n]);\n\nfunction getHistoricalAddonRole(toolId: string): StackPartRole | undefined {\n if (\n [\n \"biome\",\n \"eslint\",\n \"prettier\",\n \"oxlint\",\n \"ultracite\",\n \"lefthook\",\n \"husky\",\n \"knip\",\n \"gitleaks\",\n ].includes(toolId)\n ) {\n return \"codeQuality\";\n }\n if ([\"starlight\", \"fumadocs\"].includes(toolId)) return \"documentation\";\n if ([\"pwa\", \"tauri\", \"electron\", \"capacitor\", \"wxt\", \"opentui\"].includes(toolId)) {\n return \"appPlatform\";\n }\n if (\n [\n \"swr\",\n \"apollo-client\",\n \"tanstack-query\",\n \"tanstack-table\",\n \"tanstack-virtual\",\n \"tanstack-db\",\n \"tanstack-pacer\",\n ].includes(toolId)\n ) {\n return \"dataFetching\";\n }\n if (toolId === \"axios\") return \"httpClient\";\n if (toolId === \"firebase\") return \"libraries\";\n if ([\"msw\", \"storybook\"].includes(toolId)) return \"testing\";\n if (getToolingCapability(toolId)) return \"workspaceTooling\";\n return undefined;\n}\n\nfunction getHistoricalAddonEcosystem(toolId: string): StackPartEcosystem | undefined {\n const role = getHistoricalAddonRole(toolId);\n if (!role) return undefined;\n if (role === \"workspaceTooling\") return \"universal\";\n return getToolingCapability(toolId)?.ecosystem;\n}\nconst LEGACY_ARRAY_CATEGORIES = new Set<keyof ProjectConfig>([\n \"addons\",\n \"examples\",\n \"rustLibraries\",\n \"pythonAi\",\n \"javaLibraries\",\n \"javaTestingLibraries\",\n \"mobileLibraries\",\n \"kotlinMobileLibraries\",\n \"dotnetLibraries\",\n \"dotnetTesting\",\n \"dotnetObservability\",\n \"goTesting\",\n \"pythonTesting\",\n \"pythonCli\",\n \"pythonData\",\n \"elixirLibraries\",\n]);\n\nexport type AddonStackPartBinding = {\n role: StackPartRole;\n ecosystem: StackPartEcosystem;\n ownerRole?: \"frontend\" | \"backend\" | \"database\";\n};\n\nexport function getAddonStackPartBinding(toolId: string): AddonStackPartBinding | undefined {\n const capability = getToolingCapability(toolId);\n if (!capability) return undefined;\n return {\n role: capability.role,\n ecosystem: capability.ecosystem,\n ownerRole: capability.ownerRole,\n };\n}\n\nexport function toolingOverlayStackParts(\n addons: readonly string[] | undefined,\n source: StackPartSource = \"selected\",\n): StackPart[] {\n return (addons ?? [])\n .filter((toolId) => toolId !== \"none\")\n .flatMap((toolId) => {\n const capability = getToolingCapability(toolId);\n if (!capability) return [];\n return [\n createStackPart({\n role: capability.role,\n ecosystem: capability.ecosystem,\n toolId,\n source,\n }),\n ];\n });\n}\n\nconst OWNER_ROLES_BY_SCOPED_ROLE = {\n ...Object.fromEntries(\n [\n ...Object.keys(LEGACY_TYPESCRIPT_BACKEND_SINGLE_CATEGORIES),\n ...Object.keys(LEGACY_TYPESCRIPT_BACKEND_INFRA_CATEGORIES),\n ].map((role) => [role, [\"backend\"]]),\n ),\n ...Object.fromEntries(\n Object.keys(LEGACY_TYPESCRIPT_FRONTEND_SINGLE_CATEGORIES).map((role) => [role, [\"frontend\"]]),\n ),\n ...Object.fromEntries(\n [\n ...Object.keys(LEGACY_MOBILE_SINGLE_CATEGORIES),\n ...Object.keys(LEGACY_MOBILE_ARRAY_CATEGORIES),\n ].map((role) => [role, [\"mobile\"]]),\n ),\n deploy: [\"frontend\", \"backend\"],\n auth: [\"frontend\", \"backend\", \"mobile\"],\n payments: [\"backend\", \"mobile\"],\n dbSetup: [\"database\"],\n migrations: [\"backend\"],\n ui: [\"frontend\", \"mobile\"],\n graphql: [\"backend\"],\n appPlatform: [\"frontend\"],\n dataFetching: [\"frontend\"],\n testing: [\"frontend\", \"mobile\", \"backend\"],\n codeQuality: [\"backend\"],\n buildTool: [\"backend\"],\n cli: [\"backend\"],\n errorHandling: [\"backend\"],\n httpClient: [\"frontend\", \"backend\"],\n libraries: [\"frontend\", \"mobile\", \"backend\"],\n cloudSdk: [\"backend\"],\n data: [\"backend\"],\n media: [\"backend\"],\n server: [\"backend\"],\n packageManager: [\"backend\"],\n messageQueue: [\"backend\"],\n} as Partial<Record<StackPartRole, readonly StackPrimaryRole[]>>;\n\nconst FRESH_UNSUPPORTED_STATE_MANAGEMENT_TOOLS = new Set([\n \"nanostores\",\n \"xstate\",\n \"tanstack-store\",\n]);\nconst RUNTIMELESS_TYPESCRIPT_BACKENDS = new Set([\n \"convex\",\n \"none\",\n \"self\",\n \"self-next\",\n \"self-vinext\",\n \"self-tanstack-start\",\n \"self-astro\",\n \"self-nuxt\",\n \"self-svelte\",\n \"self-solid-start\",\n]);\nconst NO_SERVER_DEPLOY_TYPESCRIPT_BACKENDS = new Set([\n \"none\",\n \"convex\",\n \"self\",\n \"self-next\",\n \"self-vinext\",\n \"self-tanstack-start\",\n \"self-astro\",\n \"self-nuxt\",\n \"self-svelte\",\n \"self-solid-start\",\n]);\n\ntype SharedNonTypeScriptBackendServiceRule = {\n allowedToolId: string;\n unsupportedToolMessage: string;\n javaNoBuildToolMessage: string;\n};\n\nconst SHARED_NON_TYPESCRIPT_BACKEND_SERVICE_RULES: Partial<\n Record<StackPartRole, SharedNonTypeScriptBackendServiceRule>\n> = {\n email: {\n allowedToolId: \"resend\",\n unsupportedToolMessage: \"Only Resend email is available for non-TypeScript ecosystems\",\n javaNoBuildToolMessage:\n \"Resend email for Java requires Maven or Gradle to manage the SDK dependency\",\n },\n observability: {\n allowedToolId: \"sentry\",\n unsupportedToolMessage: \"Only Sentry observability is available for non-TypeScript ecosystems\",\n javaNoBuildToolMessage:\n \"Sentry observability for Java requires Maven or Gradle to manage the SDK dependency\",\n },\n caching: {\n allowedToolId: \"upstash-redis\",\n unsupportedToolMessage: \"Only Upstash Redis caching is available for non-TypeScript ecosystems\",\n javaNoBuildToolMessage:\n \"Upstash Redis caching for Java requires Maven or Gradle to manage the Redis client dependency\",\n },\n search: {\n allowedToolId: \"meilisearch\",\n unsupportedToolMessage:\n \"Search must use Meilisearch or an ecosystem-native option for non-TypeScript backends\",\n javaNoBuildToolMessage:\n \"Meilisearch search for Java requires Maven or Gradle to manage the SDK dependency\",\n },\n};\n\nfunction isNativeEcosystemBackendServiceTool(\n part: Pick<StackPart, \"role\" | \"toolId\" | \"ecosystem\">,\n) {\n if (part.role === \"email\" && part.ecosystem === \"elixir\") {\n return (ELIXIR_EMAIL_VALUES as readonly string[]).includes(part.toolId);\n }\n\n if (part.role === \"caching\") {\n if (part.ecosystem === \"elixir\") {\n return (ELIXIR_CACHING_VALUES as readonly string[]).includes(part.toolId);\n }\n if (part.ecosystem === \"rust\") {\n return (RUST_CACHING_VALUES as readonly string[]).includes(part.toolId);\n }\n if (part.ecosystem === \"dotnet\") {\n return (DOTNET_CACHING_VALUES as readonly string[]).includes(part.toolId);\n }\n if (part.ecosystem === \"go\") {\n return (GO_CACHING_VALUES as readonly string[]).includes(part.toolId);\n }\n if (part.ecosystem === \"python\") {\n return (PYTHON_CACHING_VALUES as readonly string[]).includes(part.toolId);\n }\n }\n\n if (part.role === \"observability\") {\n if (part.ecosystem === \"elixir\") {\n return (ELIXIR_OBSERVABILITY_VALUES as readonly string[]).includes(part.toolId);\n }\n if (part.ecosystem === \"dotnet\") {\n return (DOTNET_OBSERVABILITY_VALUES as readonly string[]).includes(part.toolId);\n }\n if (part.ecosystem === \"go\") {\n return (GO_OBSERVABILITY_VALUES as readonly string[]).includes(part.toolId);\n }\n if (part.ecosystem === \"python\") {\n return (PYTHON_OBSERVABILITY_VALUES as readonly string[]).includes(part.toolId);\n }\n if (part.ecosystem === \"rust\") {\n return (RUST_OBSERVABILITY_VALUES as readonly string[]).includes(part.toolId);\n }\n }\n\n return false;\n}\n\n// Phase 2 Batch 0/1 (docs/reference/stack-graph-phase-0-library-inventory.md):\n// registered backend-owned singles/extras that round-trip through the graph.\nconst LEGACY_EXTRA_CATEGORIES_BY_ECOSYSTEM = {\n rust: {\n caching: \"rustCaching\",\n cli: \"rustCli\",\n logging: \"rustLogging\",\n errorHandling: \"rustErrorHandling\",\n realtime: \"rustRealtime\",\n jobQueue: \"rustMessageQueue\",\n observability: \"rustObservability\",\n templating: \"rustTemplating\",\n },\n python: {\n validation: \"pythonValidation\",\n jobQueue: \"pythonTaskQueue\",\n graphql: \"pythonGraphql\",\n codeQuality: \"pythonQuality\",\n caching: \"pythonCaching\",\n realtime: \"pythonRealtime\",\n observability: \"pythonObservability\",\n cloudSdk: \"pythonCloudSdk\",\n httpClient: \"pythonHttpClient\",\n media: \"pythonMedia\",\n server: \"pythonServer\",\n packageManager: \"pythonPackageManager\",\n messageQueue: \"pythonMessageQueue\",\n },\n go: {\n cli: \"goCli\",\n logging: \"goLogging\",\n realtime: \"goRealtime\",\n jobQueue: \"goMessageQueue\",\n caching: \"goCaching\",\n config: \"goConfig\",\n observability: \"goObservability\",\n validation: \"goValidation\",\n codeQuality: \"goQuality\",\n migrations: \"goMigrations\",\n templating: \"goTemplating\",\n buildTool: \"goProtoTooling\",\n libraries: \"goDI\",\n },\n java: { buildTool: \"javaBuildTool\", logging: \"javaLogging\" },\n dotnet: {\n jobQueue: \"dotnetJobQueue\",\n realtime: \"dotnetRealtime\",\n caching: \"dotnetCaching\",\n deploy: \"dotnetDeploy\",\n validation: \"dotnetValidation\",\n },\n elixir: {\n realtime: \"elixirRealtime\",\n jobQueue: \"elixirJobs\",\n validation: \"elixirValidation\",\n httpClient: \"elixirHttp\",\n email: \"elixirEmail\",\n caching: \"elixirCaching\",\n observability: \"elixirObservability\",\n testing: \"elixirTesting\",\n codeQuality: \"elixirQuality\",\n i18n: \"elixirI18n\",\n runtime: \"elixirHttpServer\",\n libraries: \"elixirApplicationFramework\",\n documentation: \"elixirDocumentation\",\n config: \"elixirClustering\",\n deploy: \"elixirDeploy\",\n },\n} as const satisfies Record<\n LegacyBackendEcosystem,\n Partial<Record<StackPartRole, keyof ProjectConfig>>\n>;\n\nconst LEGACY_SHARED_BACKEND_SINGLE_CATEGORIES_BY_ECOSYSTEM = {\n rust: {\n caching: \"caching\",\n search: \"search\",\n },\n python: {\n caching: \"caching\",\n search: \"search\",\n },\n go: {\n caching: \"caching\",\n search: \"search\",\n },\n java: {\n caching: \"caching\",\n search: \"search\",\n },\n dotnet: {},\n elixir: {},\n} as const satisfies Record<\n LegacyBackendEcosystem,\n Partial<Record<StackPartRole, keyof ProjectConfig>>\n>;\n\nconst GRAPH_PROJECTION_DEFAULT_LEGACY_CATEGORIES = [\n \"backend\",\n \"database\",\n \"orm\",\n \"api\",\n \"auth\",\n \"astroIntegration\",\n \"rustFrontend\",\n ...Object.values(LEGACY_BACKEND_CATEGORY_BY_ECOSYSTEM),\n ...Object.values(LEGACY_CAPABILITY_CATEGORIES_BY_ECOSYSTEM).flatMap((categories) =>\n Object.values(categories),\n ),\n ...Object.values(LEGACY_TYPESCRIPT_BACKEND_SINGLE_CATEGORIES),\n ...Object.values(LEGACY_TYPESCRIPT_BACKEND_INFRA_CATEGORIES),\n ...Object.values(LEGACY_TYPESCRIPT_FRONTEND_SINGLE_CATEGORIES),\n ...Object.values(LEGACY_DATABASE_SINGLE_CATEGORIES),\n ...Object.values(LEGACY_MOBILE_SINGLE_CATEGORIES),\n ...Object.values(LEGACY_MOBILE_ARRAY_CATEGORIES),\n \"kotlinMobileLibraries\",\n ...Object.values(LEGACY_EXTRA_CATEGORIES_BY_ECOSYSTEM).flatMap((categories) =>\n Object.values(categories),\n ),\n ...Object.values(LEGACY_SHARED_BACKEND_SINGLE_CATEGORIES_BY_ECOSYSTEM).flatMap((categories) =>\n Object.values(categories),\n ),\n] as Array<keyof ProjectConfig>;\n\nexport const STACK_PART_PROJECT_SETTING_KEYS = [\n \"astroIntegration\",\n \"shadcnBase\",\n \"shadcnStyle\",\n \"shadcnIconLibrary\",\n \"shadcnColorTheme\",\n \"shadcnBaseColor\",\n \"shadcnFont\",\n \"shadcnRadius\",\n] as const satisfies readonly (keyof ProjectConfig)[];\n\nexport const PROJECT_METADATA_SETTING_KEYS = [\n \"elixirJson\",\n] as const satisfies readonly (keyof ProjectConfig)[];\n\nexport type StackPartProjectSettingKey = (typeof STACK_PART_PROJECT_SETTING_KEYS)[number];\n\ntype StackPartProjectSettings = Partial<Pick<ProjectConfig, StackPartProjectSettingKey>>;\ntype StackPartProjectSettingsInput = Partial<Record<StackPartProjectSettingKey, unknown>>;\n\nconst SHADCN_PROJECT_SETTING_KEYS = [\n \"shadcnBase\",\n \"shadcnStyle\",\n \"shadcnIconLibrary\",\n \"shadcnColorTheme\",\n \"shadcnBaseColor\",\n \"shadcnFont\",\n \"shadcnRadius\",\n] as const satisfies readonly StackPartProjectSettingKey[];\n\nconst STACK_PART_PROJECT_SETTING_VALUES = {\n astroIntegration: ASTRO_INTEGRATION_VALUES,\n shadcnBase: SHADCN_BASE_VALUES,\n shadcnStyle: SHADCN_STYLE_VALUES,\n shadcnIconLibrary: SHADCN_ICON_LIBRARY_VALUES,\n shadcnColorTheme: SHADCN_COLOR_THEME_VALUES,\n shadcnBaseColor: SHADCN_BASE_COLOR_VALUES,\n shadcnFont: SHADCN_FONT_VALUES,\n shadcnRadius: SHADCN_RADIUS_VALUES,\n} as const satisfies Record<StackPartProjectSettingKey, readonly string[]>;\n\nexport const DEFAULT_SHADCN_STACK_PART_SETTINGS = {\n shadcnBase: \"radix\",\n shadcnStyle: \"nova\",\n shadcnIconLibrary: \"lucide\",\n shadcnColorTheme: \"neutral\",\n shadcnBaseColor: \"neutral\",\n shadcnFont: \"inter\",\n shadcnRadius: \"default\",\n} as const satisfies Pick<ProjectConfig, (typeof SHADCN_PROJECT_SETTING_KEYS)[number]>;\n\nfunction isStackPartProjectSettingValue(\n key: StackPartProjectSettingKey,\n value: unknown,\n): value is string {\n return (\n typeof value === \"string\" &&\n (STACK_PART_PROJECT_SETTING_VALUES[key] as readonly string[]).includes(value)\n );\n}\n\nfunction isStackPartSettingsOwner(part: StackPart, key: StackPartProjectSettingKey): boolean {\n if (part.source === \"provided\") return false;\n if (key === \"astroIntegration\") {\n return (\n part.role === \"frontend\" &&\n part.ecosystem === \"typescript\" &&\n part.toolId === \"astro\" &&\n !part.ownerPartId\n );\n }\n return part.role === \"ui\" && part.ecosystem === \"typescript\" && part.toolId === \"shadcn-ui\";\n}\n\nexport function mergeProjectConfigSettingsIntoStackParts(\n parts: readonly StackPart[],\n config: StackPartProjectSettingsInput,\n options: { replaceKeys?: readonly StackPartProjectSettingKey[] } = {},\n): StackPart[] {\n const replaceKeys = new Set(options.replaceKeys ?? []);\n\n return parts.map((part) => {\n const ownedKeys = STACK_PART_PROJECT_SETTING_KEYS.filter((key) =>\n isStackPartSettingsOwner(part, key),\n );\n if (ownedKeys.length === 0) return { ...part };\n\n const settings = { ...part.settings };\n for (const key of ownedKeys) {\n const value = config[key];\n if (!isStackPartProjectSettingValue(key, value)) continue;\n if (settings[key] === undefined || replaceKeys.has(key)) {\n settings[key] = value;\n }\n }\n\n return Object.keys(settings).length > 0 ? { ...part, settings } : { ...part };\n });\n}\n\nexport function projectStackPartSettingsToProjectConfig(\n parts: readonly StackPart[],\n options: { includeDefaults?: boolean } = {},\n): StackPartProjectSettings {\n const projected: StackPartProjectSettings = options.includeDefaults\n ? { astroIntegration: \"none\", ...DEFAULT_SHADCN_STACK_PART_SETTINGS }\n : {};\n\n for (const part of parts) {\n for (const key of STACK_PART_PROJECT_SETTING_KEYS) {\n if (!isStackPartSettingsOwner(part, key)) continue;\n const value = part.settings?.[key];\n if (isStackPartProjectSettingValue(key, value)) {\n (projected as Record<string, unknown>)[key] = value;\n }\n }\n }\n\n return projected;\n}\n\nfunction defineTools(\n values: readonly string[],\n role: StackPartRole,\n ecosystem: StackPartEcosystem,\n legacyCategory?: keyof ProjectConfig,\n options: Pick<ToolDefinition, \"allowMultiple\" | \"ownerless\"> = {},\n): ToolDefinition[] {\n return values\n .filter((toolId) => toolId !== \"none\")\n .map((toolId) => {\n const definition: ToolDefinition = {\n toolId,\n roles: [role],\n ecosystems: [ecosystem],\n legacyCategory,\n };\n if (options.allowMultiple !== undefined) {\n definition.allowMultiple = options.allowMultiple;\n }\n if (options.ownerless !== undefined) {\n definition.ownerless = options.ownerless;\n }\n return definition;\n });\n}\n\nexport const STACK_TOOL_DEFINITIONS: readonly ToolDefinition[] = [\n ...defineTools(WEB_FRONTENDS, \"frontend\", \"typescript\", \"frontend\"),\n ...defineTools([...NATIVE_FRONTENDS], \"mobile\", \"react-native\", \"frontend\"),\n ...defineTools(\n BACKEND_VALUES.filter((value) => value !== \"convex\"),\n \"backend\",\n \"typescript\",\n \"backend\",\n ),\n ...defineTools(DATABASE_VALUES, \"database\", \"universal\", \"database\"),\n ...defineTools(DATABASE_VALUES, \"database\", \"typescript\", \"database\"),\n ...defineTools(DATABASE_SETUP_VALUES, \"dbSetup\", \"universal\", \"dbSetup\"),\n ...defineTools(RUNTIME_VALUES, \"runtime\", \"typescript\", \"runtime\"),\n ...defineTools(WEB_DEPLOY_VALUES, \"deploy\", \"typescript\"),\n ...defineTools(SERVER_DEPLOY_VALUES, \"deploy\", \"typescript\"),\n ...defineTools(ORM_VALUES, \"orm\", \"typescript\", \"orm\"),\n ...defineTools(API_VALUES, \"api\", \"typescript\", \"api\"),\n ...defineTools(AUTH_VALUES, \"auth\", \"typescript\", \"auth\"),\n ...defineTools(CSS_FRAMEWORK_VALUES, \"css\", \"typescript\", \"cssFramework\"),\n ...defineTools(UI_LIBRARY_VALUES, \"ui\", \"typescript\", \"uiLibrary\"),\n ...defineTools(FORMS_VALUES, \"forms\", \"typescript\", \"forms\"),\n ...defineTools(STATE_MANAGEMENT_VALUES, \"stateManagement\", \"typescript\", \"stateManagement\"),\n ...defineTools(ANIMATION_VALUES, \"animation\", \"typescript\", \"animation\"),\n ...defineTools(FILE_UPLOAD_VALUES, \"fileUpload\", \"typescript\", \"fileUpload\"),\n ...defineTools(I18N_VALUES, \"i18n\", \"typescript\", \"i18n\"),\n ...defineTools(ANALYTICS_VALUES, \"analytics\", \"typescript\", \"analytics\"),\n ...defineTools(BOT_PROTECTION_VALUES, \"botProtection\", \"typescript\", \"botProtection\"),\n ...TOOLING_CAPABILITIES.map((capability) => {\n const category = getToolingCategory(capability.category);\n return {\n toolId: capability.toolId,\n roles: [capability.role],\n ecosystems: [capability.ecosystem],\n allowMultiple:\n category?.selectionMode === \"multiple\" || capability.category === \"codeQuality\",\n ownerless: capability.ownerRole === undefined,\n } satisfies ToolDefinition;\n }),\n ...TOOLING_CAPABILITIES.flatMap((capability) => {\n const historicalRole = getHistoricalAddonRole(capability.toolId);\n if (!historicalRole || historicalRole === capability.role) return [];\n return [\n {\n toolId: capability.toolId,\n roles: [historicalRole],\n ecosystems: [getHistoricalAddonEcosystem(capability.toolId) ?? capability.ecosystem],\n selectable: false,\n allowMultiple: true,\n ownerless: historicalRole === \"workspaceTooling\" || capability.ownerRole === undefined,\n } satisfies ToolDefinition,\n ];\n }),\n ...defineTools(EXAMPLES_VALUES, \"examples\", \"universal\", undefined, {\n allowMultiple: true,\n ownerless: true,\n }),\n ...defineTools(LOGGING_VALUES, \"logging\", \"typescript\", \"logging\"),\n ...defineTools(EMAIL_VALUES, \"email\", \"typescript\", \"email\"),\n ...defineTools(SEARCH_VALUES, \"search\", \"typescript\", \"search\"),\n ...defineTools(VECTOR_DB_VALUES, \"vectorDb\", \"typescript\", \"vectorDb\"),\n ...defineTools(CACHING_VALUES, \"caching\", \"typescript\", \"caching\"),\n ...defineTools(OBSERVABILITY_VALUES, \"observability\", \"typescript\", \"observability\"),\n ...defineTools(JOB_QUEUE_VALUES, \"jobQueue\", \"typescript\", \"jobQueue\"),\n ...defineTools(RATE_LIMIT_VALUES, \"rateLimit\", \"typescript\", \"rateLimit\"),\n ...defineTools(FILE_STORAGE_VALUES, \"fileStorage\", \"typescript\", \"fileStorage\"),\n ...defineTools(FEATURE_FLAGS_VALUES, \"featureFlags\", \"typescript\", \"featureFlags\"),\n ...defineTools(INTEGRATIONS_VALUES, \"integrations\", \"typescript\", \"integrations\"),\n ...defineTools(ECOMMERCE_VALUES, \"ecommerce\", \"typescript\", \"ecommerce\"),\n ...defineTools(PAYMENTS_VALUES, \"payments\", \"typescript\", \"payments\"),\n ...defineTools(REALTIME_VALUES, \"realtime\", \"typescript\", \"realtime\"),\n ...defineTools(AI_VALUES, \"ai\", \"typescript\", \"ai\"),\n ...defineTools(CMS_VALUES, \"cms\", \"typescript\", \"cms\"),\n ...defineTools(VALIDATION_VALUES, \"validation\", \"typescript\", \"validation\"),\n ...defineTools(EFFECT_VALUES, \"effect\", \"typescript\", \"effect\"),\n // TypeScript test-runner framework (distinct toolIds from the msw/storybook testing\n // addons registered above), backend-owned so it never shares a scope with them.\n ...defineTools(TESTING_VALUES, \"testing\", \"typescript\", \"testing\"),\n ...defineTools(AUTH_VALUES, \"auth\", \"react-native\", \"auth\"),\n ...defineTools([\"revenuecat\"], \"payments\", \"react-native\", \"payments\"),\n ...defineTools(MOBILE_NAVIGATION_VALUES, \"navigation\", \"react-native\", \"mobileNavigation\"),\n ...defineTools(MOBILE_UI_VALUES, \"ui\", \"react-native\", \"mobileUI\"),\n ...defineTools(MOBILE_STORAGE_VALUES, \"storage\", \"react-native\", \"mobileStorage\"),\n ...defineTools(MOBILE_TESTING_VALUES, \"testing\", \"react-native\", \"mobileTesting\"),\n ...defineTools(MOBILE_PUSH_VALUES, \"push\", \"react-native\", \"mobilePush\"),\n ...defineTools(MOBILE_OTA_VALUES, \"ota\", \"react-native\", \"mobileOTA\"),\n ...defineTools(MOBILE_DEEP_LINKING_VALUES, \"deepLinking\", \"react-native\", \"mobileDeepLinking\"),\n ...defineTools(MOBILE_LIBRARIES_VALUES, \"libraries\", \"react-native\", \"mobileLibraries\", {\n allowMultiple: true,\n }),\n ...defineTools(RUST_WEB_FRAMEWORK_VALUES, \"backend\", \"rust\", \"rustWebFramework\"),\n ...defineTools(RUST_FRONTEND_VALUES, \"frontend\", \"rust\", \"rustFrontend\"),\n ...defineTools(DOTNET_FRONTEND_VALUES, \"frontend\", \"dotnet\", \"dotnetFrontend\"),\n ...defineTools(KOTLIN_MOBILE_VALUES, \"mobile\", \"kotlin\", \"kotlinMobile\"),\n ...defineTools(KOTLIN_MOBILE_LIBRARIES_VALUES, \"libraries\", \"kotlin\", \"kotlinMobileLibraries\", {\n allowMultiple: true,\n }),\n ...defineTools(SWIFT_MOBILE_VALUES, \"mobile\", \"swift\", \"swiftMobile\"),\n ...defineTools(DART_MOBILE_VALUES, \"mobile\", \"dart\", \"dartMobile\"),\n ...defineTools(RUST_ORM_VALUES, \"orm\", \"rust\", \"rustOrm\"),\n ...defineTools(RUST_API_VALUES, \"api\", \"rust\", \"rustApi\"),\n ...defineTools(RUST_AUTH_VALUES, \"auth\", \"rust\", \"rustAuth\"),\n ...defineTools([\"resend\"], \"email\", \"rust\", \"email\"),\n ...defineTools([\"sentry\"], \"observability\", \"rust\", \"observability\"),\n ...defineTools(RUST_REALTIME_VALUES, \"realtime\", \"rust\", \"rustRealtime\"),\n ...defineTools(RUST_MESSAGE_QUEUE_VALUES, \"jobQueue\", \"rust\", \"rustMessageQueue\"),\n ...defineTools([\"upstash-redis\"], \"caching\", \"rust\", \"caching\"),\n ...defineTools([\"meilisearch\"], \"search\", \"rust\", \"search\"),\n ...defineTools(RUST_OBSERVABILITY_VALUES, \"observability\", \"rust\", \"rustObservability\"),\n ...defineTools(RUST_TEMPLATING_VALUES, \"templating\", \"rust\", \"rustTemplating\"),\n ...defineTools(RUST_CLI_VALUES, \"cli\", \"rust\", \"rustCli\"),\n ...defineTools(RUST_LIBRARIES_VALUES, \"libraries\", \"rust\", \"rustLibraries\", {\n allowMultiple: true,\n }),\n ...defineTools(RUST_LOGGING_VALUES, \"logging\", \"rust\", \"rustLogging\"),\n ...defineTools(RUST_ERROR_HANDLING_VALUES, \"errorHandling\", \"rust\", \"rustErrorHandling\"),\n ...defineTools(RUST_CACHING_VALUES, \"caching\", \"rust\", \"rustCaching\"),\n ...defineTools(PYTHON_WEB_FRAMEWORK_VALUES, \"backend\", \"python\", \"pythonWebFramework\"),\n ...defineTools(PYTHON_ORM_VALUES, \"orm\", \"python\", \"pythonOrm\"),\n ...defineTools(PYTHON_VALIDATION_VALUES, \"validation\", \"python\", \"pythonValidation\"),\n ...defineTools(PYTHON_AI_VALUES, \"ai\", \"python\", \"pythonAi\", {\n allowMultiple: true,\n }),\n ...defineTools(PYTHON_API_VALUES, \"api\", \"python\", \"pythonApi\"),\n ...defineTools(PYTHON_AUTH_VALUES, \"auth\", \"python\", \"pythonAuth\"),\n ...defineTools([\"resend\"], \"email\", \"python\", \"email\"),\n ...defineTools([\"sentry\"], \"observability\", \"python\", \"observability\"),\n ...defineTools(PYTHON_TASK_QUEUE_VALUES, \"jobQueue\", \"python\", \"pythonTaskQueue\"),\n ...defineTools(PYTHON_GRAPHQL_VALUES, \"graphql\", \"python\", \"pythonGraphql\"),\n ...defineTools(PYTHON_QUALITY_VALUES, \"codeQuality\", \"python\", \"pythonQuality\"),\n ...defineTools(PYTHON_TESTING_VALUES, \"testing\", \"python\", \"pythonTesting\", {\n allowMultiple: true,\n }),\n ...defineTools(PYTHON_CACHING_VALUES, \"caching\", \"python\", \"pythonCaching\"),\n ...defineTools([\"upstash-redis\"], \"caching\", \"python\", \"caching\"),\n ...defineTools([\"meilisearch\"], \"search\", \"python\", \"search\"),\n ...defineTools(PYTHON_REALTIME_VALUES, \"realtime\", \"python\", \"pythonRealtime\"),\n ...defineTools(PYTHON_OBSERVABILITY_VALUES, \"observability\", \"python\", \"pythonObservability\"),\n ...defineTools(PYTHON_CLI_VALUES, \"cli\", \"python\", \"pythonCli\", {\n allowMultiple: true,\n }),\n ...defineTools(PYTHON_CLOUD_SDK_VALUES, \"cloudSdk\", \"python\", \"pythonCloudSdk\"),\n ...defineTools(PYTHON_HTTP_CLIENT_VALUES, \"httpClient\", \"python\", \"pythonHttpClient\"),\n ...defineTools(PYTHON_DATA_VALUES, \"data\", \"python\", \"pythonData\", {\n allowMultiple: true,\n }),\n ...defineTools(PYTHON_MEDIA_VALUES, \"media\", \"python\", \"pythonMedia\"),\n ...defineTools(PYTHON_SERVER_VALUES, \"server\", \"python\", \"pythonServer\"),\n ...defineTools(PYTHON_PACKAGE_MANAGER_VALUES, \"packageManager\", \"python\", \"pythonPackageManager\"),\n ...defineTools(PYTHON_MESSAGE_QUEUE_VALUES, \"messageQueue\", \"python\", \"pythonMessageQueue\"),\n ...defineTools(GO_WEB_FRAMEWORK_VALUES, \"backend\", \"go\", \"goWebFramework\"),\n ...defineTools(GO_ORM_VALUES, \"orm\", \"go\", \"goOrm\"),\n ...defineTools(GO_API_VALUES, \"api\", \"go\", \"goApi\"),\n ...defineTools(GO_AUTH_VALUES, \"auth\", \"go\", \"goAuth\"),\n ...defineTools([\"resend\"], \"email\", \"go\", \"email\"),\n ...defineTools([\"sentry\"], \"observability\", \"go\", \"observability\"),\n ...defineTools(GO_CLI_VALUES, \"cli\", \"go\", \"goCli\"),\n ...defineTools(GO_LOGGING_VALUES, \"logging\", \"go\", \"goLogging\"),\n ...defineTools(GO_TESTING_VALUES, \"testing\", \"go\", \"goTesting\", {\n allowMultiple: true,\n }),\n ...defineTools(GO_REALTIME_VALUES, \"realtime\", \"go\", \"goRealtime\"),\n ...defineTools(GO_MESSAGE_QUEUE_VALUES, \"jobQueue\", \"go\", \"goMessageQueue\"),\n ...defineTools(GO_CACHING_VALUES, \"caching\", \"go\", \"goCaching\"),\n ...defineTools([\"upstash-redis\"], \"caching\", \"go\", \"caching\"),\n ...defineTools([\"meilisearch\", \"bleve\"], \"search\", \"go\", \"search\"),\n ...defineTools(GO_CONFIG_VALUES, \"config\", \"go\", \"goConfig\"),\n ...defineTools(GO_OBSERVABILITY_VALUES, \"observability\", \"go\", \"goObservability\"),\n ...defineTools(GO_VALIDATION_VALUES, \"validation\", \"go\", \"goValidation\"),\n ...defineTools(GO_QUALITY_VALUES, \"codeQuality\", \"go\", \"goQuality\"),\n ...defineTools(GO_MIGRATIONS_VALUES, \"migrations\", \"go\", \"goMigrations\"),\n ...defineTools(GO_TEMPLATING_VALUES, \"templating\", \"go\", \"goTemplating\"),\n ...defineTools(GO_PROTO_TOOLING_VALUES, \"buildTool\", \"go\", \"goProtoTooling\"),\n ...defineTools(GO_DI_VALUES, \"libraries\", \"go\", \"goDI\"),\n ...defineTools(JAVA_WEB_FRAMEWORK_VALUES, \"backend\", \"java\", \"javaWebFramework\"),\n ...defineTools(JAVA_LANGUAGE_VALUES, \"language\", \"java\", \"javaLanguage\"),\n ...defineTools(JAVA_BUILD_TOOL_VALUES, \"buildTool\", \"java\", \"javaBuildTool\"),\n ...defineTools(JAVA_ORM_VALUES, \"orm\", \"java\", \"javaOrm\"),\n ...defineTools(JAVA_AUTH_VALUES, \"auth\", \"java\", \"javaAuth\"),\n ...defineTools(JAVA_API_VALUES, \"api\", \"java\", \"javaApi\"),\n ...defineTools([\"resend\"], \"email\", \"java\", \"email\"),\n ...defineTools([\"sentry\"], \"observability\", \"java\", \"observability\"),\n ...defineTools([\"upstash-redis\"], \"caching\", \"java\", \"caching\"),\n ...defineTools([\"meilisearch\"], \"search\", \"java\", \"search\"),\n ...defineTools(JAVA_LOGGING_VALUES, \"logging\", \"java\", \"javaLogging\"),\n ...defineTools(JAVA_LIBRARIES_VALUES, \"libraries\", \"java\", \"javaLibraries\", {\n allowMultiple: true,\n }),\n ...defineTools(JAVA_TESTING_LIBRARIES_VALUES, \"testing\", \"java\", \"javaTestingLibraries\", {\n allowMultiple: true,\n }),\n ...defineTools(DOTNET_WEB_FRAMEWORK_VALUES, \"backend\", \"dotnet\", \"dotnetWebFramework\"),\n ...defineTools(DOTNET_ORM_VALUES, \"orm\", \"dotnet\", \"dotnetOrm\"),\n ...defineTools(DOTNET_AUTH_VALUES, \"auth\", \"dotnet\", \"dotnetAuth\"),\n ...defineTools(DOTNET_API_VALUES, \"api\", \"dotnet\", \"dotnetApi\"),\n ...defineTools(DOTNET_TESTING_VALUES, \"testing\", \"dotnet\", \"dotnetTesting\", {\n allowMultiple: true,\n }),\n ...defineTools(DOTNET_JOB_QUEUE_VALUES, \"jobQueue\", \"dotnet\", \"dotnetJobQueue\"),\n ...defineTools(DOTNET_REALTIME_VALUES, \"realtime\", \"dotnet\", \"dotnetRealtime\"),\n ...defineTools(DOTNET_OBSERVABILITY_VALUES, \"observability\", \"dotnet\", \"dotnetObservability\", {\n allowMultiple: true,\n }),\n ...defineTools(DOTNET_VALIDATION_VALUES, \"validation\", \"dotnet\", \"dotnetValidation\"),\n ...defineTools(DOTNET_CACHING_VALUES, \"caching\", \"dotnet\", \"dotnetCaching\"),\n ...defineTools(DOTNET_DEPLOY_VALUES, \"deploy\", \"dotnet\", \"dotnetDeploy\"),\n ...defineTools(DOTNET_LIBRARIES_VALUES, \"libraries\", \"dotnet\", \"dotnetLibraries\", {\n allowMultiple: true,\n }),\n ...defineTools(ELIXIR_WEB_FRAMEWORK_VALUES, \"backend\", \"elixir\", \"elixirWebFramework\"),\n ...defineTools(ELIXIR_ORM_VALUES, \"orm\", \"elixir\", \"elixirOrm\"),\n ...defineTools(ELIXIR_AUTH_VALUES, \"auth\", \"elixir\", \"elixirAuth\"),\n ...defineTools(ELIXIR_API_VALUES, \"api\", \"elixir\", \"elixirApi\"),\n ...defineTools(ELIXIR_LIBRARIES_VALUES, \"libraries\", \"elixir\", \"elixirLibraries\", {\n allowMultiple: true,\n }),\n ...defineTools(ELIXIR_REALTIME_VALUES, \"realtime\", \"elixir\", \"elixirRealtime\"),\n ...defineTools(ELIXIR_JOBS_VALUES, \"jobQueue\", \"elixir\", \"elixirJobs\"),\n ...defineTools(ELIXIR_VALIDATION_VALUES, \"validation\", \"elixir\", \"elixirValidation\"),\n ...defineTools(ELIXIR_HTTP_VALUES, \"httpClient\", \"elixir\", \"elixirHttp\"),\n ...defineTools(ELIXIR_EMAIL_VALUES, \"email\", \"elixir\", \"elixirEmail\"),\n ...defineTools(ELIXIR_CACHING_VALUES, \"caching\", \"elixir\", \"elixirCaching\"),\n ...defineTools(ELIXIR_OBSERVABILITY_VALUES, \"observability\", \"elixir\", \"elixirObservability\"),\n ...defineTools(ELIXIR_TESTING_VALUES, \"testing\", \"elixir\", \"elixirTesting\"),\n ...defineTools(ELIXIR_QUALITY_VALUES, \"codeQuality\", \"elixir\", \"elixirQuality\"),\n ...defineTools(ELIXIR_I18N_VALUES, \"i18n\", \"elixir\", \"elixirI18n\"),\n ...defineTools(ELIXIR_HTTP_SERVER_VALUES, \"runtime\", \"elixir\", \"elixirHttpServer\"),\n ...defineTools(\n ELIXIR_APPLICATION_FRAMEWORK_VALUES,\n \"libraries\",\n \"elixir\",\n \"elixirApplicationFramework\",\n { allowMultiple: true, ownerless: true },\n ),\n ...defineTools(ELIXIR_DOCUMENTATION_VALUES, \"documentation\", \"elixir\", \"elixirDocumentation\", {\n ownerless: true,\n }),\n ...defineTools(ELIXIR_CLUSTERING_VALUES, \"config\", \"elixir\", \"elixirClustering\"),\n ...defineTools(ELIXIR_DEPLOY_VALUES, \"deploy\", \"elixir\", \"elixirDeploy\"),\n {\n toolId: \"convex\",\n roles: [\"backend\"],\n ecosystems: [\"typescript\"],\n legacyCategory: \"backend\",\n provides: [\n {\n role: \"database\",\n toolId: \"convex\",\n ecosystem: \"typescript\",\n overrideable: false,\n },\n {\n role: \"api\",\n toolId: \"convex\",\n ecosystem: \"typescript\",\n overrideable: false,\n },\n ],\n },\n {\n toolId: \"convex\",\n roles: [\"database\", \"api\"],\n ecosystems: [\"typescript\"],\n selectable: false,\n },\n];\n\nfunction sanitizePartId(input: string): string {\n return input\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9:._-]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\nexport function getRoleTargetPath(role: StackPartRole): string | undefined {\n return PRIMARY_ROLES.has(role) ? ROLE_TARGET_PATHS[role as StackPrimaryRole] : undefined;\n}\n\nexport function createStackPart(input: {\n role: StackPartRole;\n toolId: string;\n ecosystem: StackPartEcosystem;\n ownerPartId?: string;\n source?: StackPartSource;\n providedByPartId?: string;\n id?: string;\n targetPath?: string;\n settings?: Record<string, unknown>;\n}): StackPart {\n const roleKey = input.ownerPartId ? `${input.ownerPartId}.${input.role}` : input.role;\n return {\n id: input.id ?? sanitizePartId(`${roleKey}:${input.ecosystem}:${input.toolId}`),\n role: input.role,\n toolId: input.toolId,\n ecosystem: input.ecosystem,\n ownerPartId: input.ownerPartId,\n source: input.source ?? \"selected\",\n providedByPartId: input.providedByPartId,\n targetPath: input.targetPath ?? getRoleTargetPath(input.role),\n settings: input.settings,\n };\n}\n\nfunction isNoneTool(toolId: string | undefined) {\n return !toolId || toolId === \"none\";\n}\n\nfunction isLegacyBackendEcosystem(\n ecosystem: StackPartEcosystem | undefined,\n): ecosystem is LegacyBackendEcosystem {\n return ecosystem !== undefined && ecosystem in LEGACY_BACKEND_CATEGORY_BY_ECOSYSTEM;\n}\n\nfunction allowsCrossEcosystemOwner(\n part: Pick<StackPart, \"role\" | \"ecosystem\">,\n context: StackPartOptionContext,\n) {\n if (part.ecosystem === \"universal\") return true;\n if (part.role === \"auth\" && context.ownerRole === \"mobile\" && part.ecosystem === \"react-native\") {\n return true;\n }\n return false;\n}\n\nfunction createStackGraphIssue(input: {\n code: string;\n message: string;\n partId?: string;\n role: StackPartRole;\n toolId: string;\n}): StackGraphIssue {\n return {\n code: input.code,\n message: input.message,\n partId: input.partId,\n role: input.role,\n toolId: input.toolId,\n };\n}\n\nfunction createTypeScriptFrontendCompatibilityIssue(\n part: Pick<StackPart, \"id\" | \"role\" | \"toolId\" | \"ecosystem\">,\n context: StackPartOptionContext,\n): StackGraphIssue | undefined {\n if (part.ecosystem !== \"typescript\" || context.ownerRole !== \"frontend\") return undefined;\n\n if (context.ownerToolId === \"fresh\") {\n if (part.role === \"forms\" && part.toolId === \"tanstack-form\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"'tanstack-form' has no Preact adapter for the Fresh frontend.\",\n });\n }\n\n if (\n part.role === \"stateManagement\" &&\n FRESH_UNSUPPORTED_STATE_MANAGEMENT_TOOLS.has(part.toolId)\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `'${part.toolId}' requires React bindings and is not compatible with Fresh.`,\n });\n }\n\n if (part.role === \"animation\" && part.toolId === \"lottie\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"'lottie' uses lottie-react and is not compatible with Fresh.\",\n });\n }\n }\n\n if (part.role === \"i18n\" && part.toolId === \"next-intl\" && context.ownerToolId !== \"next\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"'next-intl' can only be selected for a Next.js frontend.\",\n });\n }\n\n if (\n part.role === \"i18n\" &&\n part.toolId === \"paraglide\" &&\n context.ownerToolId &&\n !PARAGLIDE_COMPATIBLE_FRONTENDS.has(context.ownerToolId)\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `Paraglide is not yet wired for the '${context.ownerToolId}' frontend`,\n });\n }\n\n if (part.role === \"ui\") {\n const compatibility =\n UI_LIBRARY_COMPATIBILITY[part.toolId as keyof typeof UI_LIBRARY_COMPATIBILITY];\n if (\n compatibility &&\n context.ownerToolId &&\n !(compatibility.frontends as readonly string[]).includes(context.ownerToolId)\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `'${part.toolId}' is not compatible with the '${context.ownerToolId}' frontend.`,\n });\n }\n\n if (context.ownerToolId === \"astro\" && context.settings?.astroIntegration !== undefined) {\n const astroIntegration = context.settings.astroIntegration;\n const reactOnlyLibraries = new Set([\n \"shadcn-ui\",\n \"radix-ui\",\n \"chakra-ui\",\n \"nextui\",\n \"mui\",\n \"antd\",\n ]);\n\n if (reactOnlyLibraries.has(part.toolId) && astroIntegration !== \"react\") {\n const libraryName =\n part.toolId === \"shadcn-ui\"\n ? \"shadcn/ui\"\n : part.toolId === \"radix-ui\"\n ? \"Radix UI\"\n : part.toolId === \"chakra-ui\"\n ? \"Chakra UI\"\n : part.toolId === \"mui\"\n ? \"MUI\"\n : part.toolId === \"antd\"\n ? \"Ant Design\"\n : \"NextUI\";\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `${libraryName} requires a React-based frontend`,\n });\n }\n\n if (part.toolId === \"shadcn-svelte\" && astroIntegration !== \"svelte\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"shadcn-svelte requires SvelteKit or Astro with Svelte integration\",\n });\n }\n\n if (\n part.toolId === \"headless-ui\" &&\n astroIntegration !== \"react\" &&\n astroIntegration !== \"vue\"\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Headless UI requires React or Vue frontend\",\n });\n }\n\n if (\n part.toolId === \"park-ui\" &&\n astroIntegration !== \"react\" &&\n astroIntegration !== \"vue\" &&\n astroIntegration !== \"solid\"\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Park UI requires React, Vue, or Solid frontend\",\n });\n }\n }\n\n const cssTool = context.siblingToolIdsByRole?.css ?? \"tailwind\";\n if (compatibility && !(compatibility.cssFrameworks as readonly string[]).includes(cssTool)) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `'${part.toolId}' is not compatible with the '${cssTool}' CSS framework.`,\n });\n }\n }\n\n if (part.role === \"css\") {\n const uiTool = context.siblingToolIdsByRole?.ui;\n const compatibility = uiTool\n ? UI_LIBRARY_COMPATIBILITY[uiTool as keyof typeof UI_LIBRARY_COMPATIBILITY]\n : undefined;\n if (\n compatibility &&\n !(compatibility.cssFrameworks as readonly string[]).includes(part.toolId)\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `'${uiTool}' is not compatible with the '${part.toolId}' CSS framework.`,\n });\n }\n }\n\n return undefined;\n}\n\nfunction createTypeScriptBackendCompatibilityIssue(\n part: Pick<StackPart, \"id\" | \"role\" | \"toolId\" | \"ecosystem\">,\n context: StackPartOptionContext,\n): StackGraphIssue | undefined {\n if (part.ecosystem !== \"typescript\" || context.ownerRole !== \"backend\") return undefined;\n\n if (context.ownerToolId === \"effect\") {\n if (part.role === \"effect\" && part.toolId !== \"effect-full\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Effect backend requires Effect Platform + SQL services.\",\n });\n }\n\n if (part.role === \"validation\" && part.toolId !== \"effect-schema\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Effect backend requires Effect Schema validation.\",\n });\n }\n }\n\n if (part.role === \"payments\" && part.toolId === \"polar\") {\n const authTool = context.siblingToolIdsByRole?.auth;\n if (authTool !== \"better-auth\" && authTool !== \"better-auth-organizations\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Polar requires Better Auth.\",\n });\n }\n\n const frontendTool = context.primaryToolIdsByRole?.frontend;\n if (!frontendTool || frontendTool === \"none\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Polar requires a web frontend.\",\n });\n }\n }\n\n if (part.role === \"payments\" && part.toolId === \"dodo\") {\n const frontendTool = context.primaryToolIdsByRole?.frontend;\n if (frontendTool === \"react-vite\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Dodo Payments are not yet supported for React + Vite projects.\",\n });\n }\n }\n\n if (\n part.role === \"payments\" &&\n part.toolId === \"xendit\" &&\n (context.ownerToolId === \"none\" || context.ownerToolId === \"convex\")\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Xendit Payment Sessions require a server backend.\",\n });\n }\n\n if (part.role === \"email\" && part.toolId !== \"none\" && context.ownerToolId === \"convex\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Email integration is not available with Convex backend\",\n });\n }\n\n if (part.role === \"rateLimit\" && part.toolId !== \"none\" && context.ownerToolId === \"convex\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Rate limiting helpers are not generated with Convex backend\",\n });\n }\n\n if (part.role === \"integrations\" && part.toolId === \"nango\") {\n if (context.ownerToolId === \"none\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Nango integrations require a generated backend.\",\n });\n }\n if (context.ownerToolId === \"convex\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Nango integrations are not available with the Convex backend.\",\n });\n }\n\n const runtimeTool = context.siblingToolIdsByRole?.runtime;\n const deployTools = context.selectedToolIdsByRoleList?.deploy ?? [];\n if (\n runtimeTool === \"workers\" ||\n (context.ownerToolId === \"self\" && deployTools.includes(\"cloudflare\"))\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Nango's Node SDK is not available on Cloudflare Workers.\",\n });\n }\n }\n\n if (part.role === \"cms\" && part.toolId === \"payload\") {\n const frontendTool = context.primaryToolIdsByRole?.frontend;\n if (frontendTool !== \"next\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Payload CMS v3 requires a Next.js frontend.\",\n });\n }\n }\n\n if (part.role === \"cms\" && part.toolId === \"keystatic\") {\n const frontendTool = context.primaryToolIdsByRole?.frontend;\n if (frontendTool !== \"next\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message:\n \"Keystatic is currently scaffolded for Next.js only because @keystatic/astro is not Astro 7-compatible yet.\",\n });\n }\n }\n\n if (part.role === \"ai\") {\n const frontendTool = context.primaryToolIdsByRole?.frontend;\n const frontendTools = frontendTool ? [frontendTool] : [];\n const examples = context.selectedToolIdsByRoleList?.examples ?? [];\n const runtimeTool = context.siblingToolIdsByRole?.runtime ?? \"bun\";\n\n if (\n part.toolId !== \"vercel-ai\" &&\n requiresChatSdkVercelAIForExamples(context.ownerToolId, runtimeTool, examples)\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Chat SDK example (Nuxt/Hono profile) requires Vercel AI SDK in v1.\",\n });\n }\n\n if (part.toolId === \"tanstack-ai\" && !hasTanStackAICompatibleFrontend(frontendTools)) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message:\n \"TanStack AI requires React or Solid frontend (no Vue/Svelte/Angular adapter yet).\",\n });\n }\n }\n\n return undefined;\n}\n\nfunction createSharedBackendServiceCompatibilityIssue(\n part: Pick<StackPart, \"id\" | \"role\" | \"toolId\" | \"ecosystem\">,\n context: StackPartOptionContext,\n): StackGraphIssue | undefined {\n if (\n part.ecosystem === \"typescript\" ||\n part.ecosystem === \"react-native\" ||\n context.ownerRole !== \"backend\" ||\n part.toolId === \"none\"\n ) {\n return undefined;\n }\n\n const rule = SHARED_NON_TYPESCRIPT_BACKEND_SERVICE_RULES[part.role];\n if (!rule) return undefined;\n if (\n (!part.id.startsWith(\"candidate:\") || part.id.startsWith(\"candidate:native:\")) &&\n isNativeEcosystemBackendServiceTool(part)\n ) {\n return undefined;\n }\n\n // Some non-TypeScript ecosystems have native search engines beyond\n // Meilisearch: Bleve (embedded) for Go and Elasticsearch for Python.\n const isNativeEcosystemSearch =\n part.role === \"search\" &&\n ((part.ecosystem === \"go\" && part.toolId === \"bleve\") ||\n (part.ecosystem === \"python\" && part.toolId === \"elasticsearch\"));\n\n if (part.toolId !== rule.allowedToolId && !isNativeEcosystemSearch) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_ECOSYSTEM_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: rule.unsupportedToolMessage,\n });\n }\n\n if (part.ecosystem === \"java\" && isNoneTool(context.siblingToolIdsByRole?.buildTool)) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: rule.javaNoBuildToolMessage,\n });\n }\n\n return undefined;\n}\n\nfunction createMobileCompatibilityIssue(\n part: Pick<StackPart, \"id\" | \"role\" | \"toolId\" | \"ecosystem\">,\n context: StackPartOptionContext,\n): StackGraphIssue | undefined {\n if (part.ecosystem !== \"react-native\" || context.ownerRole !== \"mobile\") return undefined;\n\n if (part.role === \"ui\") {\n if (part.toolId === \"uniwind\" && context.ownerToolId !== \"native-uniwind\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Uniwind mobile UI requires the Expo + Uniwind frontend.\",\n });\n }\n\n if (part.toolId === \"unistyles\" && context.ownerToolId !== \"native-unistyles\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Unistyles mobile UI requires the Expo + Unistyles frontend.\",\n });\n }\n\n if (\n [\"tamagui\", \"gluestack-ui\"].includes(part.toolId) &&\n [\"native-uniwind\", \"native-unistyles\"].includes(context.ownerToolId ?? \"\")\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message:\n \"Tamagui and Gluestack UI require the base Expo frontend to avoid conflicting styling setup.\",\n });\n }\n }\n\n return undefined;\n}\n\nfunction createInfrastructureCompatibilityIssue(\n part: Pick<StackPart, \"id\" | \"role\" | \"toolId\" | \"ecosystem\">,\n context: StackPartOptionContext,\n): StackGraphIssue | undefined {\n if (part.role === \"runtime\" && part.ecosystem === \"typescript\") {\n if (context.ownerRole !== \"backend\") return undefined;\n\n if (RUNTIMELESS_TYPESCRIPT_BACKENDS.has(context.ownerToolId ?? \"none\")) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `'${context.ownerToolId}' does not use a separate backend runtime.`,\n });\n }\n\n if (part.toolId === \"workers\" && context.ownerToolId !== \"hono\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Workers runtime currently requires the Hono backend.\",\n });\n }\n }\n\n if (part.role === \"deploy\" && part.ecosystem === \"typescript\") {\n if (context.ownerRole === \"frontend\") {\n if (!(WEB_DEPLOY_VALUES as readonly string[]).includes(part.toolId)) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `'${part.toolId}' is not a web deployment target.`,\n });\n }\n\n if (part.toolId === \"vercel\" && [\"redwood\", \"fresh\"].includes(context.ownerToolId ?? \"\")) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `Vercel deployment is not available for the '${context.ownerToolId}' frontend.`,\n });\n }\n\n const unsupportedFrontend = getUnsupportedWebDeployFrontend(part.toolId, [\n context.ownerToolId ?? \"none\",\n ]);\n if (unsupportedFrontend) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `'${part.toolId}' web deployment is not wired for the '${unsupportedFrontend}' frontend.`,\n });\n }\n }\n\n if (context.ownerRole === \"backend\") {\n if (!(SERVER_DEPLOY_VALUES as readonly string[]).includes(part.toolId)) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `'${part.toolId}' is not a server deployment target.`,\n });\n }\n\n const backendTool = context.ownerToolId ?? \"none\";\n const runtimeTool = context.siblingToolIdsByRole?.runtime ?? \"bun\";\n\n if (part.toolId === \"cloudflare\") {\n if (runtimeTool !== \"workers\" || backendTool !== \"hono\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Cloudflare server deploy requires Workers runtime with the Hono backend.\",\n });\n }\n }\n\n if (part.toolId === \"vercel\") {\n if ([\"nestjs\", \"adonisjs\"].includes(backendTool)) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Vercel serverless functions are incompatible with NestJS and AdonisJS.\",\n });\n }\n if (backendTool === \"encore\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Encore manages its own deployment infrastructure.\",\n });\n }\n }\n\n if (part.toolId === \"netlify\") {\n if (backendTool !== \"hono\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Netlify Functions server deploy is currently supported only with Hono.\",\n });\n }\n if (runtimeTool !== \"node\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Netlify Functions server deploy requires Node.js runtime.\",\n });\n }\n }\n\n if (NO_SERVER_DEPLOY_TYPESCRIPT_BACKENDS.has(backendTool)) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `'${backendTool}' does not use a separate server deployment target.`,\n });\n }\n }\n }\n\n if (part.role === \"dbSetup\") {\n const databaseTool = context.ownerToolId ?? \"none\";\n const runtimeTool = context.selectedToolIdsByRole?.runtime ?? \"bun\";\n\n if (part.toolId === \"turso\" && databaseTool !== \"sqlite\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Turso database setup requires SQLite.\",\n });\n }\n\n if (part.toolId === \"d1\") {\n if (databaseTool !== \"sqlite\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"D1 database setup requires SQLite.\",\n });\n }\n if (runtimeTool !== \"workers\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"D1 database setup requires Workers runtime.\",\n });\n }\n }\n\n if (\n (part.toolId === \"neon\" || part.toolId === \"supabase\" || part.toolId === \"prisma-postgres\") &&\n databaseTool !== \"postgres\"\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `'${part.toolId}' database setup requires PostgreSQL.`,\n });\n }\n\n if (part.toolId === \"mongodb-atlas\" && databaseTool !== \"mongodb\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"MongoDB Atlas setup requires MongoDB.\",\n });\n }\n\n if (part.toolId === \"planetscale\" && databaseTool !== \"postgres\" && databaseTool !== \"mysql\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"PlanetScale setup requires PostgreSQL or MySQL.\",\n });\n }\n\n if (part.toolId === \"docker\") {\n if (databaseTool === \"sqlite\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"SQLite does not need Docker database setup.\",\n });\n }\n if (runtimeTool === \"workers\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Docker database setup is incompatible with Workers runtime.\",\n });\n }\n }\n }\n\n return undefined;\n}\n\nfunction createAddonCompatibilityIssue(\n part: Pick<StackPart, \"id\" | \"role\" | \"toolId\" | \"ecosystem\">,\n context: StackPartOptionContext,\n): StackGraphIssue | undefined {\n const frontendTool = context.primaryToolIdsByRole?.frontend;\n const frontendTools = frontendTool ? [frontendTool] : [];\n const frontendEcosystem = context.primaryEcosystemsByRole?.frontend;\n const backendTool = context.primaryToolIdsByRole?.backend;\n const backendEcosystem = context.primaryEcosystemsByRole?.backend;\n const runtimeTool = context.selectedToolIdsByRole?.runtime ?? \"bun\";\n const apiTool = context.selectedToolIdsByRole?.api;\n\n if (\n part.toolId === \"graphql-codegen\" &&\n !apiTool?.match(/^(garph|graphql-yoga|apollo-server)$/) &&\n frontendTool !== \"redwood\"\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"GraphQL Code Generator requires a GraphQL API selection.\",\n });\n }\n\n if (part.toolId === \"openapi-typescript\" && apiTool !== \"openapi\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"openapi-typescript requires the OpenAPI API selection.\",\n });\n }\n\n if (part.toolId === \"openapi-typescript\" && backendTool === \"self\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"openapi-typescript requires a standalone backend that exposes an OpenAPI schema.\",\n });\n }\n\n if (part.role === \"appPlatform\") {\n if (part.toolId === \"pwa\" && !hasPWACompatibleFrontend(frontendTools)) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"PWA requires a compatible web frontend.\",\n });\n }\n if (part.toolId === \"tauri\" && !hasTauriCompatibleFrontend(frontendTools)) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Tauri requires a compatible web frontend.\",\n });\n }\n if (\n [\"electron\", \"capacitor\"].includes(part.toolId) &&\n ![\"tanstack-router\", \"react-vite\", \"vanilla-vite\", \"vue\", \"solid\"].includes(\n frontendTool ?? \"\",\n )\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `${part.toolId} requires a compatible Vite SPA frontend.`,\n });\n }\n }\n\n if (part.role === \"dataFetching\") {\n if (\n part.toolId === \"apollo-client\" &&\n !apiTool?.match(/^(garph|graphql-yoga|apollo-server)$/)\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Apollo Client requires a GraphQL API selection.\",\n });\n }\n if (part.toolId === \"tanstack-query\" && apiTool && apiTool !== \"none\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"TanStack Query is already included via the selected API layer.\",\n });\n }\n }\n\n if (\n (part.role === \"dataFetching\" || part.role === \"libraries\") &&\n [\n \"tanstack-query\",\n \"tanstack-table\",\n \"tanstack-virtual\",\n \"tanstack-db\",\n \"tanstack-pacer\",\n ].includes(part.toolId) &&\n frontendTool === \"astro\" &&\n context.settings?.astroIntegration === \"none\"\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message:\n \"TanStack libraries with Astro require a UI framework integration (React, Vue, Svelte, or Solid)\",\n });\n }\n\n if (part.role === \"toolchain\" && part.toolId === \"vite-plus\") {\n const frontendEcosystems =\n context.selectedEcosystemsByRoleList?.frontend ??\n (context.primaryEcosystemsByRole?.frontend ? [context.primaryEcosystemsByRole.frontend] : []);\n if (!frontendEcosystems.includes(\"typescript\")) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Vite+ requires a generated TypeScript web frontend\",\n });\n }\n const conflictingTool = [\n ...(context.selectedToolIdsByRoleList?.workspaceRunner ?? []),\n ...(context.selectedToolIdsByRoleList?.codeQuality ?? []),\n ...(context.selectedToolIdsByRoleList?.gitHooks ?? []),\n ...(context.selectedToolIdsByRoleList?.workspaceTooling ?? []).filter((toolId) =>\n [\"turborepo\", \"nx\"].includes(toolId),\n ),\n ].find((toolId) => toolId !== \"none\");\n if (conflictingTool) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `Vite+ owns workspace tasks, code quality, and commit hooks; remove '${conflictingTool}'`,\n });\n }\n }\n\n if (part.role === \"workspaceRunner\") {\n const workspaceRunners = [\"turborepo\", \"nx\", \"vite-plus\"];\n const otherRunner = [\n ...(context.selectedToolIdsByRoleList?.workspaceRunner ?? []),\n ...(context.selectedToolIdsByRoleList?.workspaceTooling ?? []),\n ].find((toolId) => toolId !== part.toolId && workspaceRunners.includes(toolId));\n if (otherRunner) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Choose one workspace runner: Turborepo, Nx, or Vite+\",\n });\n }\n }\n\n if (\n (part.role === \"workspaceRunner\" || part.role === \"codeQuality\" || part.role === \"gitHooks\") &&\n context.selectedToolIdsByRoleList?.toolchain?.includes(\"vite-plus\")\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Vite+ owns workspace tasks, code quality, and commit hooks\",\n });\n }\n\n if (\n part.role === \"workspaceTooling\" ||\n part.role === \"containerOrchestration\" ||\n part.role === \"developerEnvironment\" ||\n part.role === \"apiGateway\" ||\n part.role === \"backendUtilities\"\n ) {\n const workspaceTooling = context.selectedToolIdsByRoleList?.workspaceTooling ?? [];\n const workspaceRunners = [\"turborepo\", \"nx\", \"vite-plus\"];\n const otherWorkspaceRunner = workspaceTooling.find(\n (toolId) => toolId !== part.toolId && workspaceRunners.includes(toolId),\n );\n if (workspaceRunners.includes(part.toolId) && otherWorkspaceRunner) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Choose one workspace runner: Turborepo, Nx, or Vite+\",\n });\n }\n\n if (\n part.toolId === \"docker-compose\" ||\n part.toolId === \"devcontainer\" ||\n part.toolId === \"kong\"\n ) {\n const title =\n part.toolId === \"devcontainer\"\n ? \"DevContainer\"\n : part.toolId === \"kong\"\n ? \"Kong Gateway\"\n : \"Docker Compose\";\n const databaseTool = context.primaryToolIdsByRole?.database;\n const primaryEcosystem = backendEcosystem ?? frontendEcosystem ?? context.settings?.ecosystem;\n const selectedEcosystems = [backendEcosystem, frontendEcosystem, context.settings?.ecosystem];\n const hasCompatibleEcosystem = selectedEcosystems.some(\n (ecosystem) => ecosystem && DOCKER_COMPOSE_COMPATIBLE_ECOSYSTEMS.has(ecosystem),\n );\n\n if (backendTool === \"convex\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `${title} is not compatible with Convex backend.`,\n });\n }\n if (runtimeTool === \"workers\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `${title} is not compatible with Cloudflare Workers runtime.`,\n });\n }\n if (backendEcosystem && !DOCKER_COMPOSE_COMPATIBLE_ECOSYSTEMS.has(backendEcosystem)) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `${title} does not yet provide a container template for ${backendEcosystem} backends.`,\n });\n }\n if (\n part.toolId === \"kong\" &&\n primaryEcosystem === \"typescript\" &&\n (!backendTool || backendTool === \"none\")\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Kong Gateway requires a TypeScript backend service.\",\n });\n }\n if (\n part.toolId === \"kong\" &&\n primaryEcosystem !== \"typescript\" &&\n primaryEcosystem !== \"java\" &&\n (!backendTool || backendTool === \"none\")\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `Kong Gateway requires a ${primaryEcosystem ?? \"supported\"} HTTP server.`,\n });\n }\n if (!hasCompatibleEcosystem) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `${title} currently supports TypeScript, Python, Go, Rust, or Java projects.`,\n });\n }\n if (\n (frontendEcosystem === \"typescript\" || backendEcosystem === \"typescript\") &&\n (!frontendTool || !hasDockerComposeCompatibleFrontend(frontendTools))\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `${title} currently supports Next.js, TanStack Router, React Router, React Vite, Solid, or Astro.`,\n });\n }\n if (\n backendEcosystem === \"typescript\" &&\n backendTool === \"self\" &&\n frontendTool !== \"next\" &&\n frontendTool !== \"vinext\"\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `${title} self-backend support currently requires Next.js or Vinext.`,\n });\n }\n if (\n part.toolId === \"kong\" &&\n primaryEcosystem === \"rust\" &&\n (apiTool === \"tonic\" || apiTool === \"jsonrpsee\")\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Kong Gateway currently requires an HTTP Rust API.\",\n });\n }\n if (part.toolId === \"kong\" && primaryEcosystem === \"rust\" && backendTool === \"loco\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Kong Gateway does not yet support Loco's container configuration.\",\n });\n }\n if (\n part.toolId === \"kong\" &&\n primaryEcosystem === \"go\" &&\n apiTool !== undefined &&\n [\"connect-go\", \"grpc-gateway\", \"oapi-codegen\", \"grpc-go\"].includes(apiTool)\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Kong Gateway currently requires the primary Go HTTP server API.\",\n });\n }\n if (part.toolId === \"kong\" && primaryEcosystem === \"java\" && apiTool === \"grpc\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Kong Gateway currently requires the primary Java HTTP API.\",\n });\n }\n if (frontendEcosystem === \"rust\" && frontendTool && frontendTool !== \"none\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `${title} for Rust currently supports server-only projects.`,\n });\n }\n if (primaryEcosystem === \"java\" && backendTool !== \"spring-boot\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `${title} for Java currently requires Spring Boot.`,\n });\n }\n if (\n primaryEcosystem === \"python\" &&\n databaseTool &&\n databaseTool !== \"none\" &&\n databaseTool !== \"sqlite\" &&\n databaseTool !== \"postgres\" &&\n databaseTool !== \"mongodb\"\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `${title} for Python ORM projects currently supports SQLite, Postgres, or MongoDB.`,\n });\n }\n }\n\n if (part.toolId === \"backend-utils\") {\n if (backendEcosystem !== \"typescript\" || !isBackendUtilsCompatibleBackend(backendTool)) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Backend Utils requires a compatible TypeScript server stack.\",\n });\n }\n }\n }\n\n if (part.role === \"examples\") {\n if (\n part.toolId === \"ai\" &&\n !isExampleAIAllowed(\n backendTool as ProjectConfig[\"backend\"] | undefined,\n frontendTools as ProjectConfig[\"frontend\"],\n )\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"AI example is not compatible with the selected graph stack.\",\n });\n }\n\n if (part.toolId === \"chat-sdk\") {\n if (\n backendEcosystem !== \"typescript\" ||\n !isExampleChatSdkAllowed(\n backendTool,\n frontendTools as ProjectConfig[\"frontend\"],\n runtimeTool,\n )\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Chat SDK example is not compatible with the selected graph stack.\",\n });\n }\n }\n }\n\n return undefined;\n}\n\nfunction createJavaCompatibilityIssue(\n part: Pick<StackPart, \"id\" | \"role\" | \"toolId\" | \"ecosystem\">,\n context: StackPartOptionContext,\n): StackGraphIssue | undefined {\n if (part.ecosystem !== \"java\") return undefined;\n\n const buildTool = context.siblingToolIdsByRole?.buildTool;\n const hasBuildTool = !isNoneTool(buildTool);\n const javaLibraries = context.siblingToolIdsByRoleList?.libraries ?? [];\n\n if (part.role === \"buildTool\" && part.toolId === \"none\") {\n if (context.ownerToolId && context.ownerToolId !== \"none\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Java web frameworks require Maven or Gradle\",\n });\n }\n\n if (!isNoneTool(context.siblingToolIdsByRole?.orm)) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Java ORM support requires Maven or Gradle\",\n });\n }\n\n if (!isNoneTool(context.siblingToolIdsByRole?.auth)) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Java auth support requires Maven or Gradle\",\n });\n }\n\n if (javaLibraries.some((library) => library !== \"none\")) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Java libraries require Maven or Gradle\",\n });\n }\n\n if ((context.siblingToolIdsByRoleList?.testing ?? []).some((library) => library !== \"none\")) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Java testing libraries require Maven or Gradle\",\n });\n }\n }\n\n if ((part.role === \"orm\" || part.role === \"auth\") && part.toolId !== \"none\") {\n if (context.ownerToolId !== \"spring-boot\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message:\n part.role === \"orm\"\n ? \"Java ORM support currently requires Spring Boot\"\n : \"Java auth support currently requires Spring Boot\",\n });\n }\n\n if (!hasBuildTool) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message:\n part.role === \"orm\"\n ? \"Java ORM support requires Maven or Gradle\"\n : \"Java auth support requires Maven or Gradle\",\n });\n }\n }\n\n if (part.role === \"libraries\" && part.toolId !== \"none\") {\n if (context.ownerToolId !== \"spring-boot\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Spring libraries currently require Spring Boot in the Java scaffold\",\n });\n }\n\n if (!hasBuildTool) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Java libraries require Maven or Gradle\",\n });\n }\n\n if (part.toolId === \"flyway\" && context.siblingToolIdsByRole?.orm !== \"spring-data-jpa\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Flyway currently requires Spring Data JPA in the Java scaffold\",\n });\n }\n\n if (part.toolId === \"liquibase\" && context.siblingToolIdsByRole?.orm !== \"spring-data-jpa\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Liquibase currently requires Spring Data JPA in the Java scaffold\",\n });\n }\n\n if (part.toolId === \"flyway\" && javaLibraries.includes(\"liquibase\")) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Flyway cannot be combined with Liquibase in the current Java scaffold\",\n });\n }\n\n if (part.toolId === \"liquibase\" && javaLibraries.includes(\"flyway\")) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Liquibase cannot be combined with Flyway in the current Java scaffold\",\n });\n }\n }\n\n if (part.role === \"testing\" && part.toolId !== \"none\" && !hasBuildTool) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Java testing libraries require Maven or Gradle\",\n });\n }\n\n return undefined;\n}\n\nfunction getStackPartCompatibilityIssue(\n part: Pick<StackPart, \"id\" | \"role\" | \"toolId\" | \"ecosystem\">,\n context: StackPartOptionContext,\n): StackGraphIssue | undefined {\n if (\n context.ownerEcosystem &&\n part.ecosystem !== context.ownerEcosystem &&\n !allowsCrossEcosystemOwner(part, context)\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_ECOSYSTEM\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `'${part.toolId}' uses the ${part.ecosystem} adapter but its owner uses ${context.ownerEcosystem}.`,\n });\n }\n\n const expectedOwnerRoles =\n part.ecosystem === \"typescript\" || part.role === \"dbSetup\"\n ? OWNER_ROLES_BY_SCOPED_ROLE[part.role]\n : undefined;\n if (expectedOwnerRoles && context.ownerRole && !expectedOwnerRoles.includes(context.ownerRole)) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_ROLE\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `'${part.toolId}' must be owned by one of: ${expectedOwnerRoles.join(\", \")}.`,\n });\n }\n\n const frontendCompatibilityIssue = createTypeScriptFrontendCompatibilityIssue(part, context);\n if (frontendCompatibilityIssue) return frontendCompatibilityIssue;\n\n const backendCompatibilityIssue = createTypeScriptBackendCompatibilityIssue(part, context);\n if (backendCompatibilityIssue) return backendCompatibilityIssue;\n\n const sharedBackendServiceCompatibilityIssue = createSharedBackendServiceCompatibilityIssue(\n part,\n context,\n );\n if (sharedBackendServiceCompatibilityIssue) return sharedBackendServiceCompatibilityIssue;\n\n const mobileCompatibilityIssue = createMobileCompatibilityIssue(part, context);\n if (mobileCompatibilityIssue) return mobileCompatibilityIssue;\n\n const infrastructureCompatibilityIssue = createInfrastructureCompatibilityIssue(part, context);\n if (infrastructureCompatibilityIssue) return infrastructureCompatibilityIssue;\n\n const addonCompatibilityIssue = createAddonCompatibilityIssue(part, context);\n if (addonCompatibilityIssue) return addonCompatibilityIssue;\n\n const javaCompatibilityIssue = createJavaCompatibilityIssue(part, context);\n if (javaCompatibilityIssue) return javaCompatibilityIssue;\n\n if (part.ecosystem === \"go\" && part.role === \"migrations\" && part.toolId === \"golang-migrate\") {\n const databaseTool = context.primaryToolIdsByRole?.database ?? \"none\";\n if (![\"sqlite\", \"postgres\", \"mysql\"].includes(databaseTool)) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Go migrations require SQLite, PostgreSQL, or MySQL\",\n });\n }\n }\n\n if (part.ecosystem === \"python\" && part.role === \"api\" && DJANGO_API_TOOLS.has(part.toolId)) {\n if (context.ownerToolId !== \"django\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `'${part.toolId}' can only be selected for a Django backend.`,\n });\n }\n }\n\n if (\n part.ecosystem === \"java\" &&\n (part.role === \"orm\" || part.role === \"auth\") &&\n JAVA_SPRING_CAPABILITY_TOOLS.has(part.toolId)\n ) {\n if (context.ownerToolId !== \"spring-boot\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `'${part.toolId}' can only be selected for a Spring Boot backend.`,\n });\n }\n }\n\n if (part.ecosystem === \"typescript\" && part.role === \"api\" && part.toolId === \"trpc\") {\n const frontendTool = context.primaryToolIdsByRole?.frontend;\n if (frontendTool && TYPESCRIPT_TRPC_INCOMPATIBLE_FRONTENDS.has(frontendTool)) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `'trpc' cannot be selected with the '${frontendTool}' frontend.`,\n });\n }\n }\n\n if (part.ecosystem === \"typescript\" && part.role === \"api\" && part.toolId === \"apollo-server\") {\n const frontendTool = context.primaryToolIdsByRole?.frontend;\n if (frontendTool && !TYPESCRIPT_APOLLO_SERVER_COMPATIBLE_FRONTENDS.has(frontendTool)) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `'apollo-server' requires a React frontend and cannot be selected with the '${frontendTool}' frontend.`,\n });\n }\n }\n\n if (\n part.ecosystem === \"typescript\" &&\n part.role === \"auth\" &&\n (part.toolId === \"better-auth\" || part.toolId === \"better-auth-organizations\")\n ) {\n const databaseTool = context.primaryToolIdsByRole?.database;\n if (databaseTool === \"redis\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"'better-auth' cannot use Redis as the primary database.\",\n });\n }\n\n const ormTool = context.siblingToolIdsByRole?.orm;\n if (ormTool && BETTER_AUTH_UNSUPPORTED_ORM_TOOLS.has(ormTool)) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `'better-auth' is not compatible with the '${ormTool}' ORM selection.`,\n });\n }\n }\n\n if (\n part.ecosystem === \"elixir\" &&\n ELIXIR_ECTO_REQUIRED_TOOLS.has(part.toolId) &&\n (part.role === \"api\" || part.role === \"auth\") &&\n context.ownerRole === \"backend\"\n ) {\n const ormTool = context.siblingToolIdsByRole?.orm;\n if (isNoneTool(ormTool)) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message:\n part.toolId === \"phx-gen-auth\"\n ? \"phx.gen.auth requires Ecto\"\n : \"Absinthe GraphQL requires Ecto in the current Phoenix scaffold\",\n });\n }\n }\n\n if (part.ecosystem === \"elixir\" && !context.ownerRole) {\n const phoenixRequiredMessage = ELIXIR_PHOENIX_REQUIRED_ROLE_MESSAGES[part.role];\n if (phoenixRequiredMessage && part.toolId !== \"none\") {\n return createStackGraphIssue({\n code: \"MISSING_OWNER_PART\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: phoenixRequiredMessage,\n });\n }\n\n if (part.role === \"observability\" && part.toolId === \"phoenix-telemetry\") {\n return createStackGraphIssue({\n code: \"MISSING_OWNER_PART\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Phoenix telemetry requires Phoenix\",\n });\n }\n }\n\n if (\n part.ecosystem === \"elixir\" &&\n ELIXIR_ECTO_SQL_REQUIRED_TOOLS.has(part.toolId) &&\n (!context.ownerRole || context.ownerRole === \"backend\")\n ) {\n const ormTool = context.siblingToolIdsByRole?.orm ?? context.selectedToolIdsByRole?.orm;\n if (ormTool !== \"ecto-sql\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Oban requires Ecto SQL with PostgreSQL in the current Phoenix scaffold\",\n });\n }\n }\n\n if (\n part.ecosystem === \"elixir\" &&\n ELIXIR_SQL_REPO_REQUIRED_TOOLS.has(part.toolId) &&\n context.ownerRole === \"backend\"\n ) {\n const ormTool = context.siblingToolIdsByRole?.orm ?? context.selectedToolIdsByRole?.orm;\n if (!ormTool || ![\"ecto-sql\", \"myxql\", \"ecto_sqlite3\"].includes(ormTool)) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message:\n part.toolId === \"pow\"\n ? \"Pow requires Phoenix and an Ecto SQL repository\"\n : part.toolId === \"phx-gen-auth\"\n ? \"phx.gen.auth requires an Ecto SQL repository\"\n : \"ExMachina requires an Ecto SQL repository\",\n });\n }\n }\n\n if (\n part.ecosystem === \"elixir\" &&\n part.role === \"runtime\" &&\n part.toolId === \"none\" &&\n context.ownerRole === \"backend\" &&\n context.ownerToolId !== \"none\"\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_GRAPH_SELECTION\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Phoenix requires Bandit or Cowboy\",\n });\n }\n\n if (\n part.ecosystem === \"elixir\" &&\n part.toolId === \"live-view-streams\" &&\n context.ownerRole === \"backend\"\n ) {\n if (context.ownerToolId !== \"phoenix-live-view\") {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"LiveView Streams require Phoenix LiveView\",\n });\n }\n }\n\n if (\n part.ecosystem === \"elixir\" &&\n part.toolId === \"wallaby\" &&\n (!context.ownerRole || (context.ownerRole === \"backend\" && context.ownerToolId === \"none\"))\n ) {\n return createStackGraphIssue({\n code: \"INCOMPATIBLE_OWNER_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: \"Wallaby browser tests require Phoenix\",\n });\n }\n\n const unsupportedElixirGraphToolMessage =\n part.ecosystem === \"elixir\" ? ELIXIR_UNSUPPORTED_GRAPH_TOOL_MESSAGES[part.toolId] : undefined;\n if (unsupportedElixirGraphToolMessage) {\n return createStackGraphIssue({\n code: \"UNSUPPORTED_GRAPH_TOOL\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: unsupportedElixirGraphToolMessage,\n });\n }\n\n return undefined;\n}\n\nexport function getStackPartCompatibilityIssueForPart(\n part: Pick<StackPart, \"id\" | \"role\" | \"toolId\" | \"ecosystem\" | \"ownerPartId\" | \"settings\">,\n parts: readonly StackPart[],\n): StackGraphIssue | undefined {\n const context = getStackPartOptionContextForPart(part, parts);\n const issue = getStackPartCompatibilityIssue(part, context);\n if (!issue) return undefined;\n\n const alternatives = getStackPartOptions(context)\n .filter((toolId) => toolId !== part.toolId)\n .slice(0, 3);\n return alternatives.length > 0 ? { ...issue, alternatives } : issue;\n}\n\nexport function formatStackGraphIssue(issue: StackGraphIssue): string {\n if (!issue.alternatives || issue.alternatives.length === 0) return issue.message;\n return `${issue.message} Compatible alternatives: ${issue.alternatives.join(\", \")}.`;\n}\n\nexport function hasJavaScriptWorkspaceRoot(parts: readonly StackPart[] | undefined) {\n return (\n parts?.some(\n (part) =>\n !part.ownerPartId &&\n part.source !== \"provided\" &&\n part.toolId !== \"none\" &&\n (part.ecosystem === \"typescript\" || part.ecosystem === \"react-native\") &&\n (part.role === \"frontend\" || part.role === \"backend\" || part.role === \"mobile\"),\n ) ?? false\n );\n}\n\nexport function hasVitePlusWorkspaceRoot(parts: readonly StackPart[] | undefined) {\n return (\n parts?.some(\n (part) =>\n !part.ownerPartId &&\n part.source !== \"provided\" &&\n part.toolId !== \"none\" &&\n part.ecosystem === \"typescript\" &&\n part.role === \"frontend\",\n ) ?? false\n );\n}\n\nexport function getStackToolDefinitions(context?: StackPartOptionContext): ToolDefinition[] {\n if (!context) return [...STACK_TOOL_DEFINITIONS];\n return STACK_TOOL_DEFINITIONS.filter((definition) => {\n if (!definition.roles.includes(context.role)) return false;\n if (context.ecosystem && !definition.ecosystems.includes(context.ecosystem)) return false;\n if (definition.selectable === false) return false;\n const ecosystem = context.ecosystem ?? definition.ecosystems[0];\n if (\n getStackPartCompatibilityIssue(\n {\n id: `${context.ownerRole ?? \"root\"}:${context.role}:${definition.toolId}`,\n role: context.role,\n toolId: definition.toolId,\n ecosystem,\n },\n context,\n )\n ) {\n return false;\n }\n return true;\n });\n}\n\nexport function getStackPartOptions(context: StackPartOptionContext): string[] {\n return [...new Set(getStackToolDefinitions(context).map((definition) => definition.toolId))];\n}\n\nfunction findDefinition(part: Pick<StackPart, \"role\" | \"toolId\" | \"ecosystem\">) {\n return STACK_TOOL_DEFINITIONS.find(\n (definition) =>\n definition.toolId === part.toolId &&\n definition.roles.includes(part.role) &&\n definition.ecosystems.includes(part.ecosystem),\n );\n}\n\nfunction isOwnerlessDefinition(definition: ToolDefinition | undefined) {\n return definition?.ownerless === true;\n}\n\nfunction allowsMultipleSelectedParts(parts: readonly StackPart[]) {\n const selectedParts = parts.filter((part) => part.source !== \"provided\");\n return selectedParts.every((part) => findDefinition(part)?.allowMultiple === true);\n}\n\nfunction parseRolePath(rolePath: string): {\n role: StackPartRole;\n ownerRole?: StackPrimaryRole;\n ownerPartId?: string;\n} {\n const segments = rolePath.split(\".\");\n const rawRole = segments.length === 1 ? segments[0] : segments[segments.length - 1];\n const rawOwnerRole = segments.length > 1 ? segments[0] : undefined;\n const role = StackPartRoleSchema.parse(rawRole);\n if (!rawOwnerRole) return { role };\n\n const parsedOwnerRole = StackPartRoleSchema.safeParse(rawOwnerRole);\n if (parsedOwnerRole.success && PRIMARY_ROLES.has(parsedOwnerRole.data)) {\n return { role, ownerRole: parsedOwnerRole.data as StackPrimaryRole };\n }\n\n return { role, ownerPartId: sanitizePartId(rawOwnerRole) };\n}\n\nexport function parseStackPartSpecs(\n specs: readonly string[],\n source: StackPartSource = \"selected\",\n): StackPart[] {\n const unresolved = specs.map((spec) => {\n const [rolePath, ecosystem, toolId, customId] = spec.split(\":\");\n if (!rolePath || !ecosystem || !toolId || spec.split(\":\").length > 4) {\n throw new Error(\n `Invalid --part '${spec}'. Use role:ecosystem:tool or owner.role:ecosystem:tool.`,\n );\n }\n const { role, ownerRole, ownerPartId } = parseRolePath(rolePath);\n return {\n role,\n ownerRole,\n ownerPartId,\n ecosystem: ecosystem as StackPartEcosystem,\n toolId,\n customId,\n };\n });\n\n const unresolvedPrimaryParts = unresolved.filter((part) => !part.ownerRole && !part.ownerPartId);\n const primaryRoleCounts = new Map<StackPartRole, number>();\n for (const part of unresolvedPrimaryParts) {\n primaryRoleCounts.set(part.role, (primaryRoleCounts.get(part.role) ?? 0) + 1);\n }\n const repeatedTargetRoot: Partial<Record<StackPrimaryRole, string>> = {\n frontend: \"apps\",\n backend: \"services\",\n mobile: \"apps\",\n database: \"data\",\n };\n\n const primaryParts = unresolvedPrimaryParts.map((part) =>\n createStackPart({\n role: part.role,\n ecosystem: part.ecosystem,\n toolId: part.toolId,\n source,\n id: part.customId,\n targetPath:\n (primaryRoleCounts.get(part.role) ?? 0) > 1 && PRIMARY_ROLES.has(part.role)\n ? `${repeatedTargetRoot[part.role as StackPrimaryRole]}/${sanitizePartId(\n part.customId ?? `${part.ecosystem}-${part.toolId}`,\n ).replaceAll(\":\", \"-\")}`\n : undefined,\n }),\n );\n\n const primaryByRole = new Map(primaryParts.map((part) => [part.role, part]));\n const primaryByRoleAndEcosystem = new Map(\n primaryParts.map((part) => [`${part.role}:${part.ecosystem}`, part]),\n );\n const scopedParts = unresolved\n .filter((part) => part.ownerRole !== undefined || part.ownerPartId !== undefined)\n .map((part) =>\n createStackPart({\n role: part.role,\n ecosystem: part.ecosystem,\n toolId: part.toolId,\n ownerPartId: part.ownerPartId\n ? (primaryParts.find((candidate) => candidate.id === part.ownerPartId)?.id ??\n part.ownerPartId)\n : part.ownerRole\n ? (primaryByRoleAndEcosystem.get(`${part.ownerRole}:${part.ecosystem}`)?.id ??\n primaryByRole.get(part.ownerRole)?.id)\n : undefined,\n source,\n id: part.customId,\n }),\n );\n\n return materializeProvidedStackParts([...primaryParts, ...scopedParts]);\n}\n\nexport function formatStackPartSpec(part: StackPart, parts: readonly StackPart[] = []): string {\n const owner = part.ownerPartId\n ? parts.find((candidate) => candidate.id === part.ownerPartId)\n : undefined;\n const sameRoleOwners = owner\n ? parts.filter(\n (candidate) =>\n candidate.role === owner.role &&\n candidate.ecosystem === owner.ecosystem &&\n !candidate.ownerPartId &&\n candidate.source !== \"provided\",\n )\n : [];\n const ownerSelector = owner && sameRoleOwners.length > 1 ? owner.id : owner?.role;\n const rolePath = ownerSelector ? `${ownerSelector}.${part.role}` : part.role;\n const canonicalId = sanitizePartId(`${part.role}:${part.ecosystem}:${part.toolId}`);\n const customId = !part.ownerPartId && part.id !== canonicalId ? `:${part.id}` : \"\";\n return `${rolePath}:${part.ecosystem}:${part.toolId}${customId}`;\n}\n\nexport function materializeProvidedStackParts(parts: readonly StackPart[]): StackPart[] {\n const next = [...parts];\n\n for (const part of parts) {\n const definition = findDefinition(part);\n for (const provided of definition?.provides ?? []) {\n next.push(\n createStackPart({\n role: provided.role,\n toolId: provided.toolId,\n ecosystem: provided.ecosystem ?? part.ecosystem,\n ownerPartId: part.id,\n source: \"provided\",\n providedByPartId: part.id,\n }),\n );\n }\n }\n\n return next;\n}\n\nfunction getPrimaryPart(parts: readonly StackPart[], role: StackPrimaryRole) {\n return parts.find((part) => part.role === role && !part.ownerPartId);\n}\n\nfunction getSelectedToolIdsByRole(parts: readonly StackPart[]) {\n const selectedToolIdsByRole: Partial<Record<StackPartRole, string>> = {};\n for (const part of parts) {\n if (part.source !== \"provided\") selectedToolIdsByRole[part.role] = part.toolId;\n }\n return selectedToolIdsByRole;\n}\n\nfunction getSelectedToolIdsByRoleList(parts: readonly StackPart[]) {\n const selectedToolIdsByRoleList: Partial<Record<StackPartRole, string[]>> = {};\n for (const part of parts) {\n if (part.source === \"provided\") continue;\n selectedToolIdsByRoleList[part.role] ??= [];\n selectedToolIdsByRoleList[part.role]?.push(part.toolId);\n }\n return selectedToolIdsByRoleList;\n}\n\nfunction getSelectedEcosystemsByRoleList(parts: readonly StackPart[]) {\n const selectedEcosystemsByRoleList: Partial<Record<StackPartRole, StackPartEcosystem[]>> = {};\n for (const part of parts) {\n if (part.source === \"provided\" || part.ownerPartId || part.toolId === \"none\") continue;\n selectedEcosystemsByRoleList[part.role] ??= [];\n selectedEcosystemsByRoleList[part.role]?.push(part.ecosystem);\n }\n return selectedEcosystemsByRoleList;\n}\n\nfunction getPrimaryToolContext(parts: readonly StackPart[]) {\n const primaryToolIdsByRole: Partial<Record<StackPrimaryRole, string>> = {};\n const primaryEcosystemsByRole: Partial<Record<StackPrimaryRole, StackPartEcosystem>> = {};\n\n for (const role of PRIMARY_ROLES) {\n const primaryPart = getPrimaryPart(parts, role as StackPrimaryRole);\n if (primaryPart) {\n primaryToolIdsByRole[role as StackPrimaryRole] = primaryPart.toolId;\n primaryEcosystemsByRole[role as StackPrimaryRole] = primaryPart.ecosystem;\n }\n }\n\n return { primaryToolIdsByRole, primaryEcosystemsByRole };\n}\n\nfunction getSiblingToolIdsByRole(\n part: Pick<StackPart, \"ownerPartId\">,\n parts: readonly StackPart[],\n) {\n const siblingToolIdsByRole: Partial<Record<StackPartRole, string>> = {};\n for (const sibling of parts) {\n if (sibling.ownerPartId !== part.ownerPartId || sibling.source === \"provided\") continue;\n siblingToolIdsByRole[sibling.role] = sibling.toolId;\n }\n return siblingToolIdsByRole;\n}\n\nfunction getSiblingToolIdsByRoleList(\n part: Pick<StackPart, \"ownerPartId\">,\n parts: readonly StackPart[],\n) {\n const siblingToolIdsByRoleList: Partial<Record<StackPartRole, string[]>> = {};\n for (const sibling of parts) {\n if (sibling.ownerPartId !== part.ownerPartId || sibling.source === \"provided\") continue;\n siblingToolIdsByRoleList[sibling.role] ??= [];\n siblingToolIdsByRoleList[sibling.role]?.push(sibling.toolId);\n }\n return siblingToolIdsByRoleList;\n}\n\nfunction getStackPartOptionContextForPart(\n part: Pick<StackPart, \"role\" | \"ecosystem\" | \"ownerPartId\" | \"settings\">,\n parts: readonly StackPart[],\n): StackPartOptionContext {\n const partsById = new Map(parts.map((candidate) => [candidate.id, candidate]));\n const owner = part.ownerPartId ? partsById.get(part.ownerPartId) : undefined;\n const { primaryToolIdsByRole, primaryEcosystemsByRole } = getPrimaryToolContext(parts);\n\n return {\n role: part.role,\n ecosystem: part.ecosystem,\n ownerRole:\n owner && PRIMARY_ROLES.has(owner.role) ? (owner.role as StackPrimaryRole) : undefined,\n ownerToolId: owner?.toolId,\n ownerEcosystem: owner?.ecosystem,\n settings: part.settings,\n siblingToolIdsByRole: getSiblingToolIdsByRole(part, parts),\n siblingToolIdsByRoleList: getSiblingToolIdsByRoleList(part, parts),\n selectedToolIdsByRole: getSelectedToolIdsByRole(parts),\n selectedToolIdsByRoleList: getSelectedToolIdsByRoleList(parts),\n selectedEcosystemsByRoleList: getSelectedEcosystemsByRoleList(parts),\n primaryToolIdsByRole,\n primaryEcosystemsByRole,\n };\n}\n\nfunction addLegacyPart(\n parts: StackPart[],\n role: StackPartRole,\n ecosystem: StackPartEcosystem,\n toolId: string | undefined,\n source: StackPartSource,\n ownerPartId?: string,\n settings?: Record<string, unknown>,\n) {\n if (!toolId || toolId === \"none\") return undefined;\n const part = createStackPart({\n role,\n ecosystem,\n toolId,\n source,\n ownerPartId,\n settings,\n });\n parts.push(part);\n return part;\n}\n\nfunction addLegacyAddonPart(\n parts: StackPart[],\n toolId: string,\n source: StackPartSource,\n frontendPart: StackPart | undefined,\n backendPart: StackPart | undefined,\n) {\n if (!toolId || toolId === \"none\") return;\n const binding = getAddonStackPartBinding(toolId);\n if (!binding) return;\n const ownerPartId =\n binding.ownerRole === \"frontend\"\n ? frontendPart?.id\n : binding.ownerRole === \"backend\"\n ? backendPart?.id\n : undefined;\n if (binding.ownerRole && !ownerPartId) return;\n addLegacyPart(parts, binding.role, binding.ecosystem, toolId, source, ownerPartId);\n}\n\nfunction appendUniqueLegacyArrayValue(\n config: Partial<ProjectConfig>,\n category: keyof ProjectConfig,\n value: string,\n) {\n if (!LEGACY_ARRAY_CATEGORIES.has(category)) return;\n const current = (config[category] ?? []) as string[];\n if (!current.includes(value)) {\n (config as Record<string, unknown>)[category] = [...current, value];\n }\n}\n\nfunction getLegacyArrayCategoryForPart(part: StackPart): keyof ProjectConfig | undefined {\n if (part.role === \"examples\") return \"examples\";\n if (LEGACY_ADDON_GRAPH_ROLES.has(part.role)) {\n const binding = getAddonStackPartBinding(part.toolId);\n const historicalRole = getHistoricalAddonRole(part.toolId);\n if (\n binding &&\n (binding.role === part.role || historicalRole === part.role) &&\n (binding.ecosystem === part.ecosystem ||\n getHistoricalAddonEcosystem(part.toolId) === part.ecosystem)\n ) {\n return \"addons\";\n }\n }\n const legacyCategory = findDefinition(part)?.legacyCategory;\n if (legacyCategory && LEGACY_ARRAY_CATEGORIES.has(legacyCategory)) return legacyCategory;\n return undefined;\n}\n\nexport function legacyProjectConfigToStackParts(\n config: Partial<ProjectConfig>,\n source: StackPartSource = \"legacy\",\n): StackPart[] {\n const parts: StackPart[] = [];\n const frontends = config.frontend ?? [];\n const webFrontends = frontends.filter(\n (frontend) => frontend !== \"none\" && !NATIVE_FRONTENDS.has(frontend),\n );\n const nativeFrontends = frontends.filter((frontend) => NATIVE_FRONTENDS.has(frontend));\n\n if (webFrontends.length > 1) {\n throw new Error(\"Multiple primary web frontends are not supported in the stack graph.\");\n }\n if (nativeFrontends.length > 1) {\n throw new Error(\"Multiple primary mobile frontends are not supported in the stack graph.\");\n }\n\n const webFrontend = webFrontends[0];\n const nativeFrontend = nativeFrontends[0];\n const frontendPart = addLegacyPart(parts, \"frontend\", \"typescript\", webFrontend, source);\n const mobilePart = addLegacyPart(parts, \"mobile\", \"react-native\", nativeFrontend, source);\n addLegacyPart(parts, \"frontend\", \"dotnet\", config.dotnetFrontend, source);\n const kotlinMobilePart = addLegacyPart(parts, \"mobile\", \"kotlin\", config.kotlinMobile, source);\n addLegacyPart(parts, \"mobile\", \"swift\", config.swiftMobile, source);\n addLegacyPart(parts, \"mobile\", \"dart\", config.dartMobile, source);\n if (kotlinMobilePart) {\n for (const library of config.kotlinMobileLibraries ?? []) {\n addLegacyPart(parts, \"libraries\", \"kotlin\", library, source, kotlinMobilePart.id);\n }\n }\n\n let backendPart: StackPart | undefined;\n if (\n (config.ecosystem === undefined || config.ecosystem === \"typescript\") &&\n config.backend &&\n config.backend !== \"none\"\n ) {\n backendPart = addLegacyPart(parts, \"backend\", \"typescript\", config.backend, source);\n }\n\n if (config.ecosystem === \"rust\" && config.rustFrontend && config.rustFrontend !== \"none\") {\n addLegacyPart(parts, \"frontend\", \"rust\", config.rustFrontend, source);\n }\n\n if (isLegacyBackendEcosystem(config.ecosystem)) {\n const category = LEGACY_BACKEND_CATEGORY_BY_ECOSYSTEM[config.ecosystem];\n backendPart = addLegacyPart(\n parts,\n \"backend\",\n config.ecosystem,\n config[category] as string | undefined,\n source,\n );\n }\n\n const databasePart = addLegacyPart(parts, \"database\", \"universal\", config.database, source);\n const capabilityOwner = backendPart?.id ?? frontendPart?.id ?? mobilePart?.id ?? databasePart?.id;\n if (databasePart) {\n addLegacyPart(parts, \"dbSetup\", \"universal\", config.dbSetup, source, databasePart.id);\n }\n\n for (const addon of config.addons ?? []) {\n addLegacyAddonPart(parts, addon, source, frontendPart, backendPart);\n }\n for (const example of config.examples ?? []) {\n addLegacyPart(parts, \"examples\", \"universal\", example, source);\n }\n\n // The generic `orm`/`api`/`auth` fields only describe TypeScript and React Native\n // stacks. For other ecosystems these are inert TS defaults and the ecosystem-specific\n // blocks below own the real bindings - mapping the generic fields there would emit\n // invalid or duplicate capability parts (e.g. `auth:go:better-auth` alongside `goAuth`).\n if (\n config.ecosystem === undefined ||\n config.ecosystem === \"typescript\" ||\n config.ecosystem === \"react-native\"\n ) {\n addLegacyPart(parts, \"orm\", \"typescript\", config.orm, source, capabilityOwner);\n addLegacyPart(parts, \"api\", \"typescript\", config.api, source, capabilityOwner);\n addLegacyPart(\n parts,\n \"auth\",\n config.ecosystem ?? \"typescript\",\n config.auth,\n source,\n capabilityOwner,\n );\n\n if (frontendPart?.ecosystem === \"typescript\") {\n for (const [role, category] of Object.entries(\n LEGACY_TYPESCRIPT_FRONTEND_SINGLE_CATEGORIES,\n ) as Array<[StackPartRole, keyof ProjectConfig]>) {\n addLegacyPart(\n parts,\n role,\n \"typescript\",\n config[category] as string | undefined,\n source,\n frontendPart.id,\n );\n }\n }\n\n if (mobilePart?.ecosystem === \"react-native\") {\n for (const [role, category] of Object.entries(LEGACY_MOBILE_SINGLE_CATEGORIES) as Array<\n [StackPartRole, keyof ProjectConfig]\n >) {\n addLegacyPart(\n parts,\n role,\n \"react-native\",\n config[category] as string | undefined,\n source,\n mobilePart.id,\n );\n }\n\n for (const [role, category] of Object.entries(LEGACY_MOBILE_ARRAY_CATEGORIES) as Array<\n [StackPartRole, keyof ProjectConfig]\n >) {\n const values = config[category];\n if (!Array.isArray(values)) continue;\n for (const toolId of values) {\n if (typeof toolId !== \"string\") continue;\n addLegacyPart(parts, role, \"react-native\", toolId, source, mobilePart.id);\n }\n }\n }\n\n if (backendPart?.ecosystem === \"typescript\") {\n for (const [role, category] of Object.entries(\n LEGACY_TYPESCRIPT_BACKEND_INFRA_CATEGORIES,\n ) as Array<[StackPartRole, keyof ProjectConfig]>) {\n addLegacyPart(\n parts,\n role,\n \"typescript\",\n config[category] as string | undefined,\n source,\n backendPart.id,\n );\n }\n\n for (const [role, category] of Object.entries(\n LEGACY_TYPESCRIPT_BACKEND_SINGLE_CATEGORIES,\n ) as Array<[StackPartRole, keyof ProjectConfig]>) {\n addLegacyPart(\n parts,\n role,\n \"typescript\",\n config[category] as string | undefined,\n source,\n backendPart.id,\n );\n }\n }\n }\n if (isLegacyBackendEcosystem(config.ecosystem)) {\n for (const [role, category] of Object.entries(\n LEGACY_CAPABILITY_CATEGORIES_BY_ECOSYSTEM[config.ecosystem],\n ) as Array<[LegacyCapabilityRole, keyof ProjectConfig]>) {\n addLegacyPart(\n parts,\n role,\n config.ecosystem,\n config[category] as string | undefined,\n source,\n backendPart?.id,\n );\n }\n\n // Extras require an owning backend part, and tools the current scaffold\n // cannot generate stay flat-only so importing a valid legacy config never\n // produces a graph that validateStackParts rejects.\n if (backendPart) {\n for (const [role, category] of Object.entries(\n LEGACY_SHARED_BACKEND_SINGLE_CATEGORIES_BY_ECOSYSTEM[config.ecosystem],\n ) as Array<[StackPartRole, keyof ProjectConfig]>) {\n const toolId = config[category] as string | undefined;\n if (\n parts.some(\n (part) =>\n part.ownerPartId === backendPart.id &&\n part.role === role &&\n part.ecosystem === config.ecosystem &&\n part.source !== \"provided\",\n )\n ) {\n continue;\n }\n addLegacyPart(parts, role, config.ecosystem, toolId, source, backendPart.id);\n }\n\n for (const [role, category] of Object.entries(\n LEGACY_EXTRA_CATEGORIES_BY_ECOSYSTEM[config.ecosystem],\n ) as Array<[StackPartRole, keyof ProjectConfig]>) {\n const toolId = config[category] as string | undefined;\n if (config.ecosystem === \"elixir\" && toolId && ELIXIR_UNSUPPORTED_GRAPH_TOOLS.has(toolId)) {\n continue;\n }\n if (\n parts.some(\n (part) =>\n part.ownerPartId === backendPart.id &&\n part.role === role &&\n part.ecosystem === config.ecosystem &&\n part.source !== \"provided\",\n )\n ) {\n continue;\n }\n addLegacyPart(parts, role, config.ecosystem, toolId, source, backendPart.id);\n }\n\n for (const [role, category] of Object.entries(\n LEGACY_BACKEND_ARRAY_CATEGORIES_BY_ECOSYSTEM[config.ecosystem],\n ) as Array<[StackPartRole, keyof ProjectConfig]>) {\n const values = config[category];\n if (!Array.isArray(values)) continue;\n for (const toolId of values) {\n if (typeof toolId !== \"string\") continue;\n addLegacyPart(parts, role, config.ecosystem, toolId, source, backendPart.id);\n }\n }\n }\n }\n\n return mergeProjectConfigSettingsIntoStackParts(materializeProvidedStackParts(parts), config);\n}\n\nfunction ecosystemForLegacy(parts: readonly StackPart[]): Ecosystem {\n const frontend = getPrimaryPart(parts, \"frontend\");\n if (\n frontend?.ecosystem &&\n frontend.ecosystem !== \"universal\" &&\n frontend.ecosystem !== \"kotlin\" &&\n frontend.ecosystem !== \"swift\" &&\n frontend.ecosystem !== \"dart\"\n ) {\n return frontend.ecosystem;\n }\n const mobile = getPrimaryPart(parts, \"mobile\");\n if (mobile) return \"react-native\";\n const backend = getPrimaryPart(parts, \"backend\");\n if (\n backend?.ecosystem &&\n backend.ecosystem !== \"universal\" &&\n backend.ecosystem !== \"kotlin\" &&\n backend.ecosystem !== \"swift\" &&\n backend.ecosystem !== \"dart\"\n ) {\n return backend.ecosystem;\n }\n return \"typescript\";\n}\n\nexport function stackPartsToLegacyProjectConfigPartial(\n parts: readonly StackPart[],\n): Partial<ProjectConfig> {\n const config: Partial<ProjectConfig> = {\n stackParts: [...parts],\n ecosystem: ecosystemForLegacy(parts),\n frontend: [],\n backend: \"none\",\n database: \"none\",\n orm: \"none\",\n api: \"none\",\n auth: \"none\",\n };\n const hasTypeScriptBackend = parts.some(\n (part) =>\n part.role === \"backend\" &&\n part.ecosystem === \"typescript\" &&\n !part.ownerPartId &&\n part.source !== \"provided\",\n );\n const hasTypeScriptFrontend = parts.some(\n (part) =>\n part.role === \"frontend\" &&\n part.ecosystem === \"typescript\" &&\n !part.ownerPartId &&\n part.source !== \"provided\",\n );\n const hasMobileFrontend = parts.some(\n (part) =>\n part.role === \"mobile\" &&\n part.ecosystem === \"react-native\" &&\n !part.ownerPartId &&\n part.source !== \"provided\",\n );\n if (hasTypeScriptBackend) {\n for (const category of [\n ...Object.values(LEGACY_TYPESCRIPT_BACKEND_SINGLE_CATEGORIES),\n ...Object.values(LEGACY_TYPESCRIPT_BACKEND_INFRA_CATEGORIES),\n ]) {\n (config as Record<string, unknown>)[category] = \"none\";\n }\n }\n if (hasTypeScriptFrontend) {\n for (const category of Object.values(LEGACY_TYPESCRIPT_FRONTEND_SINGLE_CATEGORIES)) {\n (config as Record<string, unknown>)[category] = \"none\";\n }\n }\n if (hasMobileFrontend) {\n for (const category of Object.values(LEGACY_MOBILE_SINGLE_CATEGORIES)) {\n (config as Record<string, unknown>)[category] = \"none\";\n }\n }\n\n for (const part of parts) {\n if (part.source === \"provided\") continue;\n if (!part.ownerPartId) {\n if (part.role === \"frontend\" && part.ecosystem === \"typescript\") {\n config.frontend = [\n ...(config.frontend ?? []),\n part.toolId as ProjectConfig[\"frontend\"][number],\n ];\n const astroIntegration = part.settings?.astroIntegration;\n if (typeof astroIntegration === \"string\") {\n config.astroIntegration = astroIntegration as ProjectConfig[\"astroIntegration\"];\n }\n } else if (part.role === \"frontend\" && part.ecosystem === \"rust\") {\n config.rustFrontend = part.toolId as ProjectConfig[\"rustFrontend\"];\n } else if (part.role === \"mobile\" && part.ecosystem === \"react-native\") {\n config.frontend = [\n ...(config.frontend ?? []),\n part.toolId as ProjectConfig[\"frontend\"][number],\n ];\n } else {\n const legacyArrayCategory = getLegacyArrayCategoryForPart(part);\n if (legacyArrayCategory) {\n appendUniqueLegacyArrayValue(config, legacyArrayCategory, part.toolId);\n continue;\n }\n\n const legacyCategory = getLegacyCategoryForPart(part, parts);\n if (legacyCategory) {\n (config as Record<string, unknown>)[legacyCategory] = part.toolId;\n }\n }\n continue;\n }\n\n const legacyArrayCategory = getLegacyArrayCategoryForPart(part);\n if (legacyArrayCategory) {\n appendUniqueLegacyArrayValue(config, legacyArrayCategory, part.toolId);\n continue;\n }\n\n const legacyCategory = getLegacyCategoryForPart(part, parts);\n if (legacyCategory) {\n (config as Record<string, unknown>)[legacyCategory] = part.toolId;\n continue;\n }\n }\n\n if (config.backend === \"effect\") {\n config.effect = \"effect-full\";\n config.validation = \"effect-schema\";\n }\n\n Object.assign(config, projectStackPartSettingsToProjectConfig(parts));\n\n return config;\n}\n\ntype GraphProjectionEcosystem = Exclude<\n StackPartEcosystem,\n \"universal\" | \"kotlin\" | \"swift\" | \"dart\"\n>;\n\nfunction getSelectedPrimaryPart(parts: readonly StackPart[], role: StackPartRole) {\n return parts.find(\n (part) => part.role === role && !part.ownerPartId && part.source !== \"provided\",\n );\n}\n\nfunction getSelectedScopedPart(\n parts: readonly StackPart[],\n owner: StackPart | undefined,\n role: StackPartRole,\n) {\n if (!owner) return undefined;\n return parts.find(\n (part) => part.role === role && part.ownerPartId === owner.id && part.source !== \"provided\",\n );\n}\n\nfunction getLegacyCategoryForPart(\n part: StackPart,\n parts: readonly StackPart[],\n): keyof ProjectConfig | undefined {\n const owner = part.ownerPartId\n ? parts.find((candidate) => candidate.id === part.ownerPartId)\n : undefined;\n\n if (\n owner?.role === \"frontend\" &&\n owner.ecosystem === \"typescript\" &&\n part.ecosystem === \"typescript\"\n ) {\n if (part.role === \"auth\") return \"auth\";\n\n const legacyCategory =\n LEGACY_TYPESCRIPT_FRONTEND_SINGLE_CATEGORIES[\n part.role as keyof typeof LEGACY_TYPESCRIPT_FRONTEND_SINGLE_CATEGORIES\n ];\n if (legacyCategory) return legacyCategory;\n }\n\n if (\n owner?.role === \"backend\" &&\n owner.ecosystem === \"typescript\" &&\n part.ecosystem === \"typescript\"\n ) {\n if (part.role === \"orm\" || part.role === \"api\" || part.role === \"auth\") {\n return part.role;\n }\n\n const legacyCategory =\n LEGACY_TYPESCRIPT_BACKEND_SINGLE_CATEGORIES[\n part.role as keyof typeof LEGACY_TYPESCRIPT_BACKEND_SINGLE_CATEGORIES\n ] ??\n LEGACY_TYPESCRIPT_BACKEND_INFRA_CATEGORIES[\n part.role as keyof typeof LEGACY_TYPESCRIPT_BACKEND_INFRA_CATEGORIES\n ];\n if (legacyCategory) return legacyCategory;\n }\n\n if (owner?.role === \"mobile\" && part.ecosystem === \"react-native\") {\n if (part.role === \"auth\") return \"auth\";\n if (part.role === \"payments\") return \"payments\";\n }\n\n if (owner?.role === \"database\" && part.ecosystem === \"universal\") {\n const legacyCategory =\n LEGACY_DATABASE_SINGLE_CATEGORIES[\n part.role as keyof typeof LEGACY_DATABASE_SINGLE_CATEGORIES\n ];\n if (legacyCategory) return legacyCategory;\n }\n\n return findDefinition(part)?.legacyCategory;\n}\n\nfunction projectLegacyCategoryFromPart(\n config: ProjectConfig,\n part: StackPart | undefined,\n ecosystem: GraphProjectionEcosystem,\n parts: readonly StackPart[],\n) {\n if (!part) return;\n const legacyArrayCategory = getLegacyArrayCategoryForPart(part);\n if (legacyArrayCategory) {\n appendUniqueLegacyArrayValue(config, legacyArrayCategory, part.toolId);\n return;\n }\n\n const legacyCategory = getLegacyCategoryForPart(part, parts);\n if (!legacyCategory || legacyCategory === \"frontend\") return;\n\n const owner = part.ownerPartId\n ? parts.find((candidate) => candidate.id === part.ownerPartId)\n : undefined;\n\n const canProject =\n legacyCategory === \"database\" ||\n legacyCategory === \"dbSetup\" ||\n part.ecosystem === ecosystem ||\n (owner?.role === \"mobile\" &&\n part.ecosystem === \"react-native\" &&\n (ecosystem === \"typescript\" || ecosystem === \"react-native\")) ||\n (legacyCategory === \"auth\" &&\n (ecosystem === \"typescript\" || ecosystem === \"react-native\") &&\n (part.ecosystem === \"typescript\" || part.ecosystem === \"react-native\"));\n\n if (canProject) {\n (config as Record<string, unknown>)[legacyCategory] = part.toolId;\n }\n}\n\nexport function stackGraphToLegacyProjectConfigForEcosystem(\n config: ProjectConfig,\n ecosystem: GraphProjectionEcosystem,\n): ProjectConfig {\n const parts = mergeProjectConfigSettingsIntoStackParts(config.stackParts ?? [], config);\n const backend = parts.find(\n (part) => part.role === \"backend\" && part.ecosystem === ecosystem && !part.ownerPartId,\n );\n const frontend = parts.find(\n (part) => part.role === \"frontend\" && part.ecosystem === ecosystem && !part.ownerPartId,\n );\n const mobile = parts.find(\n (part) => part.role === \"mobile\" && part.ecosystem === \"react-native\" && !part.ownerPartId,\n );\n const database =\n getSelectedPrimaryPart(parts, \"database\") ?? getSelectedScopedPart(parts, backend, \"database\");\n const orm = getSelectedScopedPart(parts, backend, \"orm\");\n const api = getSelectedScopedPart(parts, backend, \"api\");\n const auth =\n getSelectedScopedPart(parts, backend, \"auth\") ??\n getSelectedScopedPart(parts, frontend, \"auth\") ??\n getSelectedScopedPart(parts, mobile, \"auth\");\n\n const projected: ProjectConfig = {\n ...config,\n ecosystem,\n stackParts: parts,\n frontend: [\n ...(frontend && frontend.ecosystem === \"typescript\" ? [frontend.toolId] : []),\n ...(mobile && [\"typescript\", \"react-native\"].includes(ecosystem) ? [mobile.toolId] : []),\n ] as ProjectConfig[\"frontend\"],\n };\n\n for (const category of GRAPH_PROJECTION_DEFAULT_LEGACY_CATEGORIES) {\n // Array-valued categories (e.g. mobileLibraries) must reset to [] - a \"none\"\n // string would later be spread character-by-character by\n // appendUniqueLegacyArrayValue and read as truthy by templates.\n (projected as Record<string, unknown>)[category] = LEGACY_ARRAY_CATEGORIES.has(category)\n ? []\n : \"none\";\n }\n projected.addons = [];\n projected.examples = [];\n Object.assign(\n projected,\n projectStackPartSettingsToProjectConfig(parts, { includeDefaults: true }),\n );\n\n projectLegacyCategoryFromPart(projected, backend, ecosystem, parts);\n projectLegacyCategoryFromPart(projected, frontend, ecosystem, parts);\n projectLegacyCategoryFromPart(projected, database, ecosystem, parts);\n projectLegacyCategoryFromPart(projected, orm, ecosystem, parts);\n projectLegacyCategoryFromPart(projected, api, ecosystem, parts);\n projectLegacyCategoryFromPart(projected, auth, ecosystem, parts);\n if (ecosystem === \"go\" && config.auth === \"go-better-auth\") {\n projected.auth = config.auth;\n }\n\n const backendScopedPartRoles = new Set<StackPartRole>([\"database\", \"orm\", \"api\", \"auth\"]);\n for (const part of parts) {\n if (\n part.source === \"provided\" ||\n part.ownerPartId !== backend?.id ||\n backendScopedPartRoles.has(part.role)\n ) {\n continue;\n }\n projectLegacyCategoryFromPart(projected, part, ecosystem, parts);\n }\n\n const frontendScopedPartRoles = new Set<StackPartRole>([\"auth\"]);\n for (const part of parts) {\n if (\n part.source === \"provided\" ||\n part.ownerPartId !== frontend?.id ||\n frontendScopedPartRoles.has(part.role)\n ) {\n continue;\n }\n projectLegacyCategoryFromPart(projected, part, ecosystem, parts);\n }\n\n const mobileScopedPartRoles = new Set<StackPartRole>([\"auth\", \"payments\"]);\n for (const part of parts) {\n if (\n part.source === \"provided\" ||\n part.ownerPartId !== mobile?.id ||\n mobileScopedPartRoles.has(part.role)\n ) {\n continue;\n }\n projectLegacyCategoryFromPart(projected, part, ecosystem, parts);\n }\n\n for (const part of parts) {\n if (part.source === \"provided\" || part.ownerPartId !== database?.id) {\n continue;\n }\n projectLegacyCategoryFromPart(projected, part, ecosystem, parts);\n }\n\n for (const part of parts) {\n if (part.source === \"provided\" || part.ownerPartId) {\n continue;\n }\n projectLegacyCategoryFromPart(projected, part, ecosystem, parts);\n }\n\n return projected;\n}\n\nexport function validateStackParts(parts: readonly StackPart[]): StackGraphValidationResult {\n const issues: StackGraphIssue[] = [];\n const partsById = new Map(parts.map((part) => [part.id, part]));\n const seenPartIds = new Set<string>();\n\n const selectedPrimaryParts = parts.filter(\n (part) => !part.ownerPartId && part.source !== \"provided\" && PRIMARY_ROLES.has(part.role),\n );\n const unsupportedRepeatedPrimaryGroups = [\n {\n label: \"TypeScript web frontend\",\n parts: selectedPrimaryParts.filter(\n (part) => part.role === \"frontend\" && part.ecosystem === \"typescript\",\n ),\n },\n {\n label: \"TypeScript backend\",\n parts: selectedPrimaryParts.filter(\n (part) => part.role === \"backend\" && part.ecosystem === \"typescript\",\n ),\n },\n {\n label: \"React Native mobile app\",\n parts: selectedPrimaryParts.filter(\n (part) => part.role === \"mobile\" && part.ecosystem === \"react-native\",\n ),\n },\n {\n label: \"database\",\n parts: selectedPrimaryParts.filter((part) => part.role === \"database\"),\n },\n ];\n\n for (const group of unsupportedRepeatedPrimaryGroups) {\n for (const part of group.parts.slice(1)) {\n issues.push({\n code: \"UNSUPPORTED_REPEATED_PRIMARY\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `Only one ${group.label} is currently supported. Named repeated backend services are supported for Rust, Python, Go, Java/Kotlin, .NET, and Elixir.`,\n });\n }\n }\n\n for (const part of parts) {\n if (seenPartIds.has(part.id)) {\n issues.push({\n code: \"DUPLICATE_PART_ID\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `Stack part ID '${part.id}' is repeated. Give repeated primary services unique IDs with role:ecosystem:tool:id.`,\n });\n }\n seenPartIds.add(part.id);\n }\n\n for (const part of parts) {\n const definition = findDefinition(part);\n if (!definition) {\n issues.push({\n code: \"UNSUPPORTED_ROLE_BINDING\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `'${part.toolId}' is not a valid ${part.ecosystem} tool for role '${part.role}'.`,\n });\n }\n\n if (!PRIMARY_ROLES.has(part.role) && !part.ownerPartId && !isOwnerlessDefinition(definition)) {\n issues.push({\n code: \"MISSING_OWNER_PART\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `Capability stack part '${part.id}' must reference an owning primary part.`,\n });\n }\n\n if (part.ownerPartId && !partsById.has(part.ownerPartId)) {\n issues.push({\n code: \"MISSING_OWNER_PART\",\n partId: part.id,\n role: part.role,\n toolId: part.toolId,\n message: `Stack part '${part.id}' references missing owner '${part.ownerPartId}'.`,\n });\n }\n\n const owner = part.ownerPartId ? partsById.get(part.ownerPartId) : undefined;\n if (\n definition &&\n (PRIMARY_ROLES.has(part.role) || owner || isOwnerlessDefinition(definition))\n ) {\n const compatibilityIssue = getStackPartCompatibilityIssueForPart(part, parts);\n\n if (compatibilityIssue) {\n issues.push(compatibilityIssue);\n }\n }\n }\n\n const byScope = new Map<string, StackPart[]>();\n for (const part of parts) {\n if (!part.ownerPartId && PRIMARY_ROLES.has(part.role)) continue;\n const key = `${part.ownerPartId ?? \"root\"}:${part.role}`;\n byScope.set(key, [...(byScope.get(key) ?? []), part]);\n }\n\n for (const scopedParts of byScope.values()) {\n const selectedParts = scopedParts.filter((part) => part.source !== \"provided\");\n if (selectedParts.length > 1 && !allowsMultipleSelectedParts(scopedParts)) {\n const [first] = selectedParts;\n issues.push({\n code: \"DUPLICATE_ROLE_SCOPE\",\n partId: first?.id,\n role: first?.role,\n toolId: first?.toolId,\n message: `Only one selected '${first?.role}' stack part is supported per owner scope.`,\n });\n }\n\n const selected = scopedParts.find((part) => part.source !== \"provided\");\n const provided = scopedParts.find((part) => part.source === \"provided\");\n if (!selected || !provided || selected.toolId === provided.toolId) continue;\n\n const provider = provided.providedByPartId\n ? partsById.get(provided.providedByPartId)\n : undefined;\n const providerDefinition = provider ? findDefinition(provider) : undefined;\n const providedDefinition = providerDefinition?.provides?.find(\n (capability) => capability.role === provided.role && capability.toolId === provided.toolId,\n );\n\n if (!providedDefinition?.overrideable) {\n issues.push({\n code: \"PROVIDED_CAPABILITY_CONFLICT\",\n partId: selected.id,\n role: selected.role,\n toolId: selected.toolId,\n message: `'${selected.toolId}' conflicts with '${provided.toolId}' provided by '${provider?.toolId ?? \"another part\"}'.`,\n });\n }\n }\n\n const toolingByCategoryAndScope = new Map<string, StackPart[]>();\n for (const part of parts) {\n if (part.source === \"provided\") continue;\n const capability = getToolingCapability(part.toolId);\n if (!capability || capability.role !== part.role || capability.ecosystem !== part.ecosystem) {\n continue;\n }\n const key = `${part.ownerPartId ?? \"root\"}:${capability.category}`;\n toolingByCategoryAndScope.set(key, [...(toolingByCategoryAndScope.get(key) ?? []), part]);\n }\n\n for (const categoryParts of toolingByCategoryAndScope.values()) {\n const first = categoryParts[0];\n if (!first) continue;\n const capability = getToolingCapability(first.toolId);\n if (!capability || getToolingCategory(capability.category)?.selectionMode !== \"single\") {\n continue;\n }\n if (categoryParts.every((part) => part.source === \"legacy\")) continue;\n\n const selected = [...new Set(categoryParts.map((part) => part.toolId))].sort();\n const matchesProfile = getToolingSelectionOptions(capability.category).some((selection) => {\n const expected = [...selection.toolIds].sort();\n return (\n expected.length === selected.length &&\n expected.every((toolId, index) => toolId === selected[index])\n );\n });\n if (!matchesProfile) {\n issues.push({\n code: \"INCOHERENT_TOOLING_PROFILE\",\n partId: first.id,\n role: first.role,\n toolId: first.toolId,\n message: `Choose one complete '${getToolingCategory(capability.category)?.label}' profile.`,\n });\n }\n }\n\n return { issues };\n}\n"],"mappings":";;;AAEA,MAAa,uBAAuB;CAClC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAYD,MAAaA,qBAA2D;CACtE;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe;EAChB;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe;EAChB;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe;EAChB;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe;EAChB;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe;EAChB;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe;EAChB;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe;EAChB;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe;EACf,WAAW;EACZ;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe;EACf,WAAW;EACZ;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe;EACf,WAAW;EACZ;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe;EACf,WAAW;EACZ;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe;EACf,WAAW;EACZ;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe;EAChB;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe;EAChB;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe;EAChB;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe;EAChB;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe;EAChB;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe;EACf,WAAW;EACZ;CACF;AAkBD,MAAM,UACJ,UACA,IACA,OACA,aACA,UAA6B,OAAO,SAAS,EAAE,GAAG,CAAC,GAAG,MAC1B;CAAE;CAAU;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SAAS,SAAS,CACrB;AAEH,MAAa,8BAA8B,gBACzC,YAAY,MAAM,aAChB;CACE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC,SAAS,SAAS,CACrB;AAEH,MAAa,sCAAsC,gBACjD,YAAY,MAAM,aAChB;CACE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC,SAAS,SAAS,CACrB;AAEH,SAAgB,gCACd,WACA,YAA+B,EAAE,EACb;CACpB,MAAM,YAAY,gCAChB;AAEF,KAAI,CAAC,UAAW,QAAO;AAEvB,QAAO,UAAU,MAAM,aAAa;AAClC,MAAI,aAAa,UAAU,CAAC,eAAe,SAAS,SAAqB,CAAE,QAAO;AAClF,SAAO,CAAE,UAAgC,SAAS,SAAS;GAC3D;;AAGJ,MAAaC,2BAMT;CACF,aAAa;EACX,WAAW;GACT;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,eAAe,CAAC,WAAW;EAC5B;CACD,iBAAiB;EACf,WAAW,CAAC,UAAU,QAAQ;EAC9B,eAAe,CAAC,WAAW;EAC5B;CACD,SAAS;EACP,WAAW;GACT;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,eAAe,CAAC,WAAW;EAC5B;CACD,YAAY;EACV,WAAW;GACT;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,eAAe;GAAC;GAAY;GAAQ;GAAQ;GAAgB;GAAqB;GAAO;EACzF;CACD,eAAe;EACb,WAAW;GACT;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,eAAe;GAAC;GAAY;GAAQ;GAAQ;GAAgB;GAAO;EACpE;CACD,WAAW;EACT,WAAW;GACT;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,eAAe;GAAC;GAAY;GAAQ;GAAQ;GAAe;EAC5D;CACD,aAAa;EACX,WAAW;GACT;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,eAAe;GAAC;GAAY;GAAQ;GAAQ;GAAgB;GAAO;EACp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"}