@stacksolo/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/project/init.ts","../src/regions.ts","../src/gcp/projects.ts","../src/gcp/apis.ts","../src/gcp/org-policy.ts","../src/gcp/iam.ts","../src/templates/index.ts","../../registry/src/db.ts","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-node/rng.js","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-node/stringify.js","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-node/native.js","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-node/v4.js","../../registry/src/repositories/project.repository.ts","../../registry/src/repositories/resource.repository.ts","../../registry/src/repositories/deployment.repository.ts","../../registry/src/services/registry.service.ts","../../registry/src/services/reference.service.ts","../src/commands/project/scaffold.ts","../../blueprint/src/parser.ts","../../blueprint/src/resolver.ts","../../blueprint/src/references.ts","../../blueprint/src/dependencies.ts","../src/scaffold/generators/index.ts","../src/scaffold/generators/env.ts","../src/scaffold/generators/docker-compose.ts","../src/scaffold/generators/resources/container.ts","../src/scaffold/generators/resources/function.ts","../src/scaffold/generators/resources/ui.ts","../src/scaffold/generators/services.ts","../src/commands/infra/deploy.ts","../src/services/deploy.service.ts","../../core/src/define.ts","../../core/src/registry.ts","../../../plugins/gcp-cdktf/src/provider.ts","../../../plugins/gcp-cdktf/src/resources/vpc-network.ts","../../../plugins/gcp-cdktf/src/resources/vpc-connector.ts","../../../plugins/gcp-cdktf/src/resources/cloud-function.ts","../../../plugins/gcp-cdktf/src/resources/load-balancer.ts","../../../plugins/gcp-cdktf/src/resources/storage-website.ts","../../../plugins/gcp-cdktf/src/index.ts","../src/logger.ts","../src/commands/infra/destroy.ts","../src/api-client.ts","../src/commands/infra/status.ts","../src/commands/infra/output.ts","../src/commands/infra/logs.ts","../src/commands/infra/reset.ts","../src/commands/infra/infra.ts","../src/commands/infra/list.ts","../src/commands/dev/build.ts","../src/commands/dev/dev.ts","../src/generators/k8s/yaml.ts","../src/generators/k8s/namespace.ts","../src/generators/k8s/configmap.ts","../src/generators/k8s/runtime.ts","../src/generators/k8s/function.ts","../src/generators/k8s/ui.ts","../src/generators/k8s/emulators.ts","../src/generators/k8s/gateway.ts","../src/generators/k8s/types.ts","../src/generators/k8s/ports.ts","../src/generators/k8s/index.ts","../src/commands/dev/install.ts","../src/commands/dev/serve.ts","../src/commands/config/config.ts","../src/commands/config/env.ts","../src/commands/config/register.ts","../src/commands/config/unregister.ts"],"sourcesContent":["/**\n * @stacksolo/cli\n *\n * CLI entry point for StackSolo commands.\n * Can be run standalone or invoked by the Electron shell.\n */\n\nimport { Command } from 'commander';\nimport {\n // Project commands\n initCommand,\n scaffoldCommand,\n // Infrastructure commands\n deployCommand,\n destroyCommand,\n statusCommand,\n outputCommand,\n logsCommand,\n resetCommand,\n infraCommand,\n listCommand,\n // Development commands\n buildCommand,\n devCommand,\n installCommand,\n serveCommand,\n // Configuration commands\n configCommand,\n envCommand,\n registerCommand,\n unregisterCommand,\n} from './commands';\n\nconst program = new Command();\n\nprogram\n .name('stacksolo')\n .description('Deploy cloud infrastructure for your applications')\n .version('0.1.0');\n\n// Project commands\nprogram.addCommand(initCommand);\nprogram.addCommand(scaffoldCommand);\n\n// Infrastructure commands\nprogram.addCommand(deployCommand);\nprogram.addCommand(destroyCommand);\nprogram.addCommand(statusCommand);\nprogram.addCommand(outputCommand);\nprogram.addCommand(logsCommand);\nprogram.addCommand(resetCommand);\nprogram.addCommand(infraCommand);\nprogram.addCommand(listCommand);\n\n// Development commands\nprogram.addCommand(buildCommand);\nprogram.addCommand(devCommand);\nprogram.addCommand(installCommand);\nprogram.addCommand(serveCommand);\n\n// Configuration commands\nprogram.addCommand(configCommand);\nprogram.addCommand(envCommand);\nprogram.addCommand(registerCommand);\nprogram.addCommand(unregisterCommand);\n\nprogram.parse();\n","/**\n * stacksolo init\n *\n * Initialize a new StackSolo project with full GCP setup:\n * 1. Validate GCP authentication\n * 2. Select/validate GCP project\n * 3. Check and fix org policy restrictions\n * 4. Enable required APIs\n * 5. Select project type and details\n * 6. Generate config and scaffold templates\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport * as path from 'path';\nimport { getRegionsForProvider } from '../../regions';\nimport {\n isGcloudInstalled,\n checkGcloudAuth,\n listProjects,\n getCurrentProject,\n setActiveProject,\n createProject,\n linkBillingAccount,\n listBillingAccounts,\n REQUIRED_APIS,\n checkApis,\n enableApis,\n checkOrgPolicy,\n fixOrgPolicy,\n checkAndFixCloudBuildPermissions,\n} from '../../gcp';\nimport {\n generateConfig,\n createStacksoloDir,\n createConfigFile,\n scaffoldTemplates,\n type ProjectType,\n type UIFramework,\n} from '../../templates';\nimport { getRegistry } from '@stacksolo/registry';\n\nconst BANNER = `\n ███████╗████████╗ █████╗ ██████╗██╗ ██╗███████╗ ██████╗ ██╗ ██████╗\n ██╔════╝╚══██╔══╝██╔══██╗██╔════╝██║ ██╔╝██╔════╝██╔═══██╗██║ ██╔═══██╗\n ███████╗ ██║ ███████║██║ █████╔╝ ███████╗██║ ██║██║ ██║ ██║\n ╚════██║ ██║ ██╔══██║██║ ██╔═██╗ ╚════██║██║ ██║██║ ██║ ██║\n ███████║ ██║ ██║ ██║╚██████╗██║ ██╗███████║╚██████╔╝███████╗╚██████╔╝\n ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚══════╝ ╚═════╝\n`;\n\nconst PROJECT_TYPES: Array<{\n value: ProjectType;\n name: string;\n description: string;\n}> = [\n {\n value: 'function-api',\n name: 'Function API',\n description: 'Serverless API using Cloud Functions behind a load balancer',\n },\n {\n value: 'ui-api',\n name: 'UI + API',\n description: 'Static UI (React/Vue/Svelte) + Cloud Function API behind a load balancer',\n },\n {\n value: 'ui-only',\n name: 'UI Only',\n description: 'Static UI site served via Cloud Storage + CDN',\n },\n {\n value: 'container-api',\n name: 'Container API',\n description: 'Containerized API using Cloud Run behind a load balancer',\n },\n {\n value: 'function-cron',\n name: 'Function Cron',\n description: 'Scheduled Cloud Function triggered by Cloud Scheduler',\n },\n {\n value: 'static-api',\n name: 'Static Site + API (Container)',\n description: 'Static frontend container with serverless API backend',\n },\n];\n\nconst UI_FRAMEWORKS: Array<{\n value: UIFramework;\n name: string;\n description: string;\n}> = [\n {\n value: 'react',\n name: 'React',\n description: 'React with Vite and TypeScript',\n },\n {\n value: 'vue',\n name: 'Vue',\n description: 'Vue 3 with Vite and TypeScript',\n },\n {\n value: 'sveltekit',\n name: 'SvelteKit',\n description: 'SvelteKit with static adapter',\n },\n {\n value: 'html',\n name: 'Plain HTML',\n description: 'Simple HTML/CSS/JS - no build step',\n },\n];\n\nexport const initCommand = new Command('init')\n .description('Initialize a new StackSolo project')\n .option('-n, --name <name>', 'Project name')\n .option('--project-id <id>', 'GCP project ID')\n .option('-r, --region <region>', 'Region')\n .option('-t, --template <template>', 'Project template (function-api, container-api, function-cron, static-api)')\n .option('-y, --yes', 'Skip prompts and use defaults')\n .option('--skip-org-policy', 'Skip org policy check and fix')\n .option('--skip-apis', 'Skip enabling GCP APIs')\n .action(async (options) => {\n const cwd = process.cwd();\n\n // Print banner\n console.log(chalk.cyan(BANNER));\n console.log(chalk.bold(' Let\\'s set up your project.\\n'));\n console.log(chalk.gray('─'.repeat(75)));\n\n // =========================================\n // Step 0: Check gcloud CLI\n // =========================================\n const gcloudSpinner = ora('Checking gcloud CLI...').start();\n\n if (!(await isGcloudInstalled())) {\n gcloudSpinner.fail('gcloud CLI not found');\n console.log(chalk.red('\\n gcloud CLI is not installed.\\n'));\n console.log(chalk.gray(' Install it from: https://cloud.google.com/sdk/docs/install\\n'));\n return;\n }\n\n const authInfo = await checkGcloudAuth();\n if (!authInfo) {\n gcloudSpinner.fail('Not authenticated to GCP');\n console.log(chalk.red('\\n gcloud CLI is not authenticated.\\n'));\n console.log(chalk.gray(' Run these commands:'));\n console.log(chalk.white(' gcloud auth login'));\n console.log(chalk.white(' gcloud auth application-default login\\n'));\n return;\n }\n\n gcloudSpinner.succeed(`Authenticated as ${chalk.green(authInfo.account)}`);\n\n // =========================================\n // Step 1: Select GCP Project\n // =========================================\n console.log(chalk.gray('\\n─'.repeat(75)));\n console.log(chalk.cyan.bold('\\n Step 1: Select GCP Project\\n'));\n\n let projectId = options.projectId;\n\n if (!projectId && !options.yes) {\n const projectsSpinner = ora('Loading accessible projects...').start();\n const projects = await listProjects();\n const currentProject = await getCurrentProject();\n projectsSpinner.stop();\n\n const projectChoices = projects.map((p) => ({\n name: `${p.name} (${p.projectId})`,\n value: p.projectId,\n }));\n\n const { selectedProject } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedProject',\n message: 'Select a GCP project:',\n choices: [\n ...projectChoices,\n new inquirer.Separator(),\n { name: '+ Create new project', value: '__create__' },\n { name: 'Enter manually', value: '__manual__' },\n ],\n default: currentProject || projects[0]?.projectId,\n pageSize: 15,\n },\n ]);\n\n if (selectedProject === '__create__') {\n // Create new project flow\n const { newProjectId, newProjectName } = await inquirer.prompt([\n {\n type: 'input',\n name: 'newProjectId',\n message: 'New project ID:',\n validate: (input: string) => {\n if (!input) return 'Required';\n if (!/^[a-z][a-z0-9-]{4,28}[a-z0-9]$/.test(input)) {\n return 'Must be 6-30 chars: lowercase letters, digits, hyphens. Start with letter, end with letter/digit.';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'newProjectName',\n message: 'Project display name:',\n default: (answers: { newProjectId: string }) => answers.newProjectId,\n },\n ]);\n\n const createSpinner = ora('Creating GCP project...').start();\n const result = await createProject(newProjectId, newProjectName);\n\n if (!result.success) {\n createSpinner.fail('Failed to create project');\n console.log(chalk.red(`\\n ${result.error}\\n`));\n return;\n }\n\n createSpinner.succeed(`Created project: ${newProjectId}`);\n projectId = newProjectId;\n\n // Link billing account\n const billingSpinner = ora('Checking billing accounts...').start();\n const billingAccounts = await listBillingAccounts();\n billingSpinner.stop();\n\n if (billingAccounts.length > 0) {\n console.log(chalk.yellow('\\n A billing account is required to use most GCP services.\\n'));\n\n const { billingAction } = await inquirer.prompt([\n {\n type: 'list',\n name: 'billingAction',\n message: 'Link a billing account?',\n choices: [\n ...billingAccounts.map((b) => ({\n name: `${b.name} (${b.id})`,\n value: b.id,\n })),\n new inquirer.Separator(),\n { name: 'Skip (link later in GCP Console)', value: '__skip__' },\n ],\n },\n ]);\n\n if (billingAction !== '__skip__') {\n const linkSpinner = ora('Linking billing account...').start();\n const linked = await linkBillingAccount(projectId, billingAction);\n if (linked) {\n linkSpinner.succeed('Billing account linked');\n } else {\n linkSpinner.warn('Could not link billing account. Link it manually in GCP Console.');\n }\n }\n } else {\n console.log(chalk.yellow('\\n No billing accounts found. You may need to set up billing in GCP Console.\\n'));\n }\n } else if (selectedProject === '__manual__') {\n const { manualId } = await inquirer.prompt([\n {\n type: 'input',\n name: 'manualId',\n message: 'Enter GCP Project ID:',\n validate: (input: string) => input.length > 0 || 'Required',\n },\n ]);\n projectId = manualId;\n } else {\n projectId = selectedProject;\n }\n }\n\n projectId = projectId || authInfo.project;\n\n if (!projectId) {\n console.log(chalk.red('\\n Project ID is required. Use --project-id or run interactively.\\n'));\n return;\n }\n\n // Set the active project in gcloud config\n const currentProject = await getCurrentProject();\n if (currentProject !== projectId) {\n const setProjectSpinner = ora('Setting active project...').start();\n const projectSet = await setActiveProject(projectId);\n if (projectSet) {\n setProjectSpinner.succeed(`Active project set to ${chalk.green(projectId)}`);\n } else {\n setProjectSpinner.warn(`Could not set active project. Run: gcloud config set project ${projectId}`);\n }\n } else {\n console.log(chalk.gray(`\\n Using project: ${chalk.white(projectId)}`));\n }\n\n // =========================================\n // Step 2: Check & Enable APIs\n // =========================================\n if (!options.skipApis) {\n console.log(chalk.gray('\\n─'.repeat(75)));\n console.log(chalk.cyan.bold('\\n Step 2: Project Permissions\\n'));\n\n const apisSpinner = ora('Checking required APIs...').start();\n const apiStatus = await checkApis(projectId, REQUIRED_APIS);\n const missingApis = apiStatus.filter((a) => !a.enabled);\n apisSpinner.stop();\n\n console.log(' Required APIs:');\n for (const api of apiStatus) {\n if (api.enabled) {\n console.log(chalk.green(` ✓ ${api.name}`));\n } else {\n console.log(chalk.red(` ✗ ${api.name}`));\n }\n }\n\n if (missingApis.length > 0) {\n console.log('');\n const { shouldEnable } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'shouldEnable',\n message: 'Enable missing APIs?',\n default: true,\n },\n ]);\n\n if (shouldEnable) {\n console.log('');\n const enableSpinner = ora('Enabling APIs...').start();\n const result = await enableApis(projectId, missingApis.map((a) => a.api), (api, success) => {\n if (success) {\n enableSpinner.text = `Enabled ${api}`;\n }\n });\n\n if (result.failed.length === 0) {\n enableSpinner.succeed(`Enabled ${result.enabled.length} APIs`);\n } else {\n enableSpinner.warn(`Enabled ${result.enabled.length} APIs, ${result.failed.length} failed`);\n console.log(chalk.yellow(' Failed to enable:'));\n for (const api of result.failed) {\n console.log(chalk.gray(` - ${api}`));\n }\n }\n } else {\n console.log(chalk.yellow('\\n Some features may not work without required APIs.\\n'));\n }\n } else {\n console.log(chalk.green('\\n All required APIs are enabled.'));\n }\n }\n\n // =========================================\n // Step 3: Check & Fix Org Policy\n // =========================================\n let orgPolicyFixed = false;\n\n if (!options.skipOrgPolicy) {\n console.log(chalk.gray('\\n─'.repeat(75)));\n console.log(chalk.cyan.bold('\\n Step 3: Organization Policy\\n'));\n\n const policySpinner = ora('Checking org policy...').start();\n const policyStatus = await checkOrgPolicy(projectId);\n\n if (policyStatus.hasRestriction) {\n policySpinner.warn('Organization policy restricts public access');\n\n console.log(chalk.yellow('\\n Your organization restricts allUsers IAM bindings.'));\n console.log(chalk.gray(' This is required for public load balancer access.\\n'));\n\n if (!policyStatus.canOverride) {\n console.log(chalk.red(' You do not have permission to override this policy.'));\n console.log(chalk.gray(' Contact your GCP organization admin to either:'));\n console.log(chalk.gray(' 1. Add an exception for this project'));\n console.log(chalk.gray(' 2. Grant you the \"Organization Policy Administrator\" role\\n'));\n\n const { continueAnyway } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'continueAnyway',\n message: 'Continue anyway? (Some features may not work)',\n default: false,\n },\n ]);\n\n if (!continueAnyway) {\n return;\n }\n } else {\n const { policyAction } = await inquirer.prompt([\n {\n type: 'list',\n name: 'policyAction',\n message: 'How do you want to handle this?',\n choices: [\n { name: 'Fix automatically (override policy for this project)', value: 'fix' },\n { name: 'Skip (I\\'ll request an exception from my org admin)', value: 'skip' },\n ],\n },\n ]);\n\n if (policyAction === 'fix') {\n const fixSpinner = ora('Updating org policy...').start();\n const fixed = await fixOrgPolicy(projectId);\n\n if (fixed) {\n fixSpinner.succeed(`Policy updated. Public access enabled for ${projectId}.`);\n orgPolicyFixed = true;\n } else {\n fixSpinner.fail('Failed to update org policy');\n console.log(chalk.yellow('\\n Could not override the policy. Some features may not work.\\n'));\n }\n }\n }\n } else {\n policySpinner.succeed('No org policy restrictions detected');\n orgPolicyFixed = true;\n }\n }\n\n // =========================================\n // Step 4: Check Cloud Build Permissions\n // =========================================\n console.log(chalk.gray('\\n─'.repeat(75)));\n console.log(chalk.cyan.bold('\\n Step 4: Cloud Build Permissions\\n'));\n\n const iamSpinner = ora('Checking Cloud Build service account permissions...').start();\n const iamResult = await checkAndFixCloudBuildPermissions(projectId);\n\n if (iamResult.fixed.length > 0) {\n iamSpinner.succeed(`Granted permissions: ${iamResult.fixed.join(', ')}`);\n } else if (iamResult.failed.length > 0) {\n iamSpinner.warn('Could not grant some permissions');\n console.log(chalk.yellow(' You may need to manually grant these roles:'));\n for (const role of iamResult.failed) {\n console.log(chalk.gray(` - ${role}`));\n }\n } else {\n iamSpinner.succeed('Cloud Build permissions are configured');\n }\n\n // =========================================\n // Step 5: Select Project Type\n // =========================================\n console.log(chalk.gray('\\n─'.repeat(75)));\n console.log(chalk.cyan.bold('\\n Step 5: Project Type\\n'));\n\n let projectType: ProjectType = (options.template as ProjectType) || 'function-api';\n let uiFramework: UIFramework | undefined;\n\n if (!options.template && !options.yes) {\n const { selectedType } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedType',\n message: 'What are you building?',\n choices: PROJECT_TYPES.map((t) => ({\n name: `${t.name}\\n ${chalk.gray(t.description)}`,\n value: t.value,\n short: t.name,\n })),\n default: 'function-api',\n },\n ]);\n projectType = selectedType;\n\n // Ask for UI framework if ui-api or ui-only\n if (projectType === 'ui-api' || projectType === 'ui-only') {\n const { selectedFramework } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedFramework',\n message: 'Which UI framework?',\n choices: UI_FRAMEWORKS.map((f) => ({\n name: `${f.name}\\n ${chalk.gray(f.description)}`,\n value: f.value,\n short: f.name,\n })),\n default: 'react',\n },\n ]);\n uiFramework = selectedFramework;\n }\n }\n\n // =========================================\n // Step 6: Project Details\n // =========================================\n console.log(chalk.gray('\\n─'.repeat(75)));\n console.log(chalk.cyan.bold('\\n Step 6: Project Details\\n'));\n\n // Get project name\n let projectName = options.name;\n if (!projectName && !options.yes) {\n const defaultName = path.basename(cwd).toLowerCase().replace(/[^a-z0-9-]/g, '-');\n const { name } = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'Project name:',\n default: defaultName,\n validate: (input: string) => {\n if (!input) return 'Project name is required';\n if (!/^[a-z][a-z0-9-]*$/.test(input)) {\n return 'Must start with letter, only lowercase, numbers, hyphens';\n }\n return true;\n },\n },\n ]);\n projectName = name;\n }\n projectName = projectName || path.basename(cwd).toLowerCase().replace(/[^a-z0-9-]/g, '-');\n\n // Get region\n let region = options.region;\n if (!region && !options.yes) {\n const regions = getRegionsForProvider('gcp');\n const { selectedRegion } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedRegion',\n message: 'Region:',\n choices: regions.map((r) => ({ name: r.name, value: r.value })),\n default: 'us-central1',\n },\n ]);\n region = selectedRegion;\n }\n region = region || 'us-central1';\n\n // =========================================\n // Step 7: Optional Resources\n // =========================================\n console.log(chalk.gray('\\n─'.repeat(75)));\n console.log(chalk.cyan.bold('\\n Step 7: Optional Resources\\n'));\n\n let needsDatabase = false;\n let databaseVersion: string | undefined;\n let needsBucket = false;\n\n if (!options.yes) {\n const { wantsDatabase } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'wantsDatabase',\n message: 'Do you need a database?',\n default: false,\n },\n ]);\n\n if (wantsDatabase) {\n needsDatabase = true;\n const { dbType } = await inquirer.prompt([\n {\n type: 'list',\n name: 'dbType',\n message: 'Database type:',\n choices: [\n { name: 'PostgreSQL 15', value: 'POSTGRES_15' },\n { name: 'PostgreSQL 14', value: 'POSTGRES_14' },\n { name: 'MySQL 8.0', value: 'MYSQL_8_0' },\n ],\n },\n ]);\n databaseVersion = dbType;\n }\n\n const { wantsBucket } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'wantsBucket',\n message: 'Do you need file storage (bucket)?',\n default: false,\n },\n ]);\n needsBucket = wantsBucket;\n }\n\n // =========================================\n // Generate Files\n // =========================================\n console.log(chalk.gray('\\n─'.repeat(75)));\n console.log(chalk.cyan.bold('\\n Creating project files...\\n'));\n\n const generateSpinner = ora('Generating configuration...').start();\n\n // Generate config\n const config = generateConfig({\n projectName,\n gcpProjectId: projectId,\n region,\n projectType,\n uiFramework,\n needsDatabase,\n databaseVersion,\n needsBucket,\n });\n\n // Create .stacksolo directory and state\n await createStacksoloDir(cwd, {\n gcpProjectId: projectId,\n orgPolicyFixed,\n apisEnabled: REQUIRED_APIS,\n });\n generateSpinner.text = 'Created .stacksolo/';\n\n // Write config file\n await createConfigFile(cwd, config);\n generateSpinner.text = 'Created stacksolo.config.json';\n\n // Scaffold templates\n const scaffoldedFiles = await scaffoldTemplates(cwd, projectType, uiFramework);\n generateSpinner.succeed('Project files created');\n\n // Register project in global registry\n const registrySpinner = ora('Registering project...').start();\n try {\n const registry = getRegistry();\n const configPath = path.join(cwd, '.stacksolo', 'stacksolo.config.json');\n\n // Check if already registered\n const existing = await registry.findProjectByName(projectName);\n if (existing) {\n // Update existing registration\n await registry.updateProject(existing.id, {\n gcpProjectId: projectId,\n region,\n configPath,\n });\n registrySpinner.succeed('Updated project in registry');\n } else {\n await registry.registerProject({\n name: projectName,\n gcpProjectId: projectId,\n region,\n configPath,\n });\n registrySpinner.succeed('Registered project in global registry');\n }\n } catch (error) {\n registrySpinner.warn('Could not register in global registry (non-blocking)');\n }\n\n // Determine the main directories created based on project type\n const createdDirs: string[] = [];\n if (projectType === 'function-api') {\n createdDirs.push('functions/api');\n } else if (projectType === 'container-api') {\n createdDirs.push('containers/api');\n } else if (projectType === 'function-cron') {\n createdDirs.push('functions/worker');\n } else if (projectType === 'static-api') {\n createdDirs.push('functions/api', 'containers/web');\n } else if (projectType === 'ui-api') {\n createdDirs.push('functions/api', 'apps/web');\n } else if (projectType === 'ui-only') {\n createdDirs.push('apps/web');\n }\n\n console.log(chalk.green('\\n ✓ Created .stacksolo/'));\n console.log(chalk.green(' ✓ Created stacksolo.config.json'));\n for (const dir of createdDirs) {\n console.log(chalk.green(` ✓ Created ${dir}/ template`));\n }\n\n for (const file of scaffoldedFiles) {\n console.log(chalk.gray(` ${file}`));\n }\n\n // =========================================\n // Done\n // =========================================\n console.log(chalk.gray('\\n─'.repeat(75)));\n console.log(chalk.bold.green('\\n Done! Your project is ready.\\n'));\n\n console.log(chalk.gray(' Next steps:\\n'));\n const mainCodeDir = createdDirs[0];\n const mainCodeFile = mainCodeDir.startsWith('apps/') ? 'src/App.tsx' : 'index.ts';\n console.log(chalk.white(` 1. Edit ${mainCodeDir}/${mainCodeFile} with your code`));\n console.log(chalk.white(' 2. Run: ') + chalk.cyan('stacksolo deploy'));\n console.log('');\n });\n","/**\n * Cloud provider regions\n */\n\nexport interface RegionOption {\n value: string;\n name: string;\n}\n\nexport const GCP_REGIONS: RegionOption[] = [\n { value: 'us-central1', name: 'us-central1 (Iowa)' },\n { value: 'us-east1', name: 'us-east1 (South Carolina)' },\n { value: 'us-east4', name: 'us-east4 (Virginia)' },\n { value: 'us-west1', name: 'us-west1 (Oregon)' },\n { value: 'us-west2', name: 'us-west2 (Los Angeles)' },\n { value: 'europe-west1', name: 'europe-west1 (Belgium)' },\n { value: 'europe-west2', name: 'europe-west2 (London)' },\n { value: 'europe-west3', name: 'europe-west3 (Frankfurt)' },\n { value: 'asia-east1', name: 'asia-east1 (Taiwan)' },\n { value: 'asia-northeast1', name: 'asia-northeast1 (Tokyo)' },\n { value: 'asia-southeast1', name: 'asia-southeast1 (Singapore)' },\n { value: 'australia-southeast1', name: 'australia-southeast1 (Sydney)' },\n];\n\nexport interface ProviderOption {\n value: string;\n name: string;\n regions: RegionOption[];\n}\n\nexport const PROVIDERS: ProviderOption[] = [\n { value: 'gcp', name: 'GCP (Google Cloud Platform)', regions: GCP_REGIONS },\n // AWS regions will be added when the AWS plugin is built\n];\n\nexport function getRegionsForProvider(provider: string): RegionOption[] {\n const found = PROVIDERS.find((p) => p.value === provider);\n return found?.regions || [];\n}\n","/**\n * GCP Project management utilities\n */\n\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\n\nconst execAsync = promisify(exec);\n\nexport interface GcpProject {\n projectId: string;\n name: string;\n}\n\nexport interface GcpAuthInfo {\n account: string;\n project: string;\n}\n\n/**\n * Check if gcloud CLI is installed\n */\nexport async function isGcloudInstalled(): Promise<boolean> {\n try {\n await execAsync('which gcloud');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if gcloud CLI is authenticated\n */\nexport async function checkGcloudAuth(): Promise<GcpAuthInfo | null> {\n try {\n const { stdout: account } = await execAsync('gcloud config get-value account 2>/dev/null');\n const { stdout: project } = await execAsync('gcloud config get-value project 2>/dev/null');\n\n const trimmedAccount = account.trim();\n const trimmedProject = project.trim();\n\n if (!trimmedAccount || trimmedAccount === '(unset)') {\n return null;\n }\n\n return {\n account: trimmedAccount,\n project: trimmedProject !== '(unset)' ? trimmedProject : '',\n };\n } catch {\n return null;\n }\n}\n\n/**\n * List accessible GCP projects\n */\nexport async function listProjects(): Promise<GcpProject[]> {\n try {\n const { stdout } = await execAsync(\n 'gcloud projects list --format=\"json(projectId,name)\" --limit=50 2>/dev/null'\n );\n const projects = JSON.parse(stdout) as Array<{ projectId: string; name: string }>;\n return projects.map((p) => ({ projectId: p.projectId, name: p.name }));\n } catch {\n return [];\n }\n}\n\n/**\n * Get current default GCP project\n */\nexport async function getCurrentProject(): Promise<string | null> {\n try {\n const { stdout } = await execAsync('gcloud config get-value project 2>/dev/null');\n const project = stdout.trim();\n return project && project !== '(unset)' ? project : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Set the active GCP project\n */\nexport async function setActiveProject(projectId: string): Promise<boolean> {\n try {\n await execAsync(`gcloud config set project ${projectId} 2>/dev/null`);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Create a new GCP project\n */\nexport async function createProject(\n projectId: string,\n projectName: string\n): Promise<{ success: boolean; error?: string }> {\n try {\n const { stdout, stderr } = await execAsync(\n `gcloud projects create ${projectId} --name=\"${projectName}\" 2>&1`\n );\n return { success: true };\n } catch (error: unknown) {\n // Extract the actual error message from the command output\n let errorMessage = '';\n if (error && typeof error === 'object' && 'stdout' in error) {\n errorMessage = String((error as { stdout: string }).stdout);\n }\n if (!errorMessage && error && typeof error === 'object' && 'stderr' in error) {\n errorMessage = String((error as { stderr: string }).stderr);\n }\n if (!errorMessage) {\n errorMessage = String(error);\n }\n\n // Parse common errors\n if (errorMessage.includes('already exists') || errorMessage.includes('ALREADY_EXISTS')) {\n return { success: false, error: 'Project ID already exists. Choose a different ID.' };\n }\n if (errorMessage.includes('PERMISSION_DENIED')) {\n return { success: false, error: 'Permission denied. You may need to be in an organization with project creation rights.' };\n }\n if (errorMessage.includes('invalid') || errorMessage.includes('INVALID')) {\n return { success: false, error: 'Invalid project ID. Must be 6-30 lowercase letters, digits, or hyphens.' };\n }\n if (errorMessage.includes('Request contains an invalid argument')) {\n // Try to extract more specific error\n const match = errorMessage.match(/details:\\s*\"([^\"]+)\"/);\n if (match) {\n return { success: false, error: match[1] };\n }\n return { success: false, error: 'Invalid project configuration. Check the project ID format.' };\n }\n\n // Return a cleaner error message\n const cleanError = errorMessage\n .replace(/^Error:.*?gcloud projects create.*?\\n/m, '')\n .replace(/ERROR:.*?\\n/g, '')\n .trim()\n .split('\\n')[0]; // Get first meaningful line\n\n return { success: false, error: cleanError || 'Failed to create project. Check gcloud configuration.' };\n }\n}\n\n/**\n * Link a project to a billing account\n */\nexport async function linkBillingAccount(\n projectId: string,\n billingAccountId: string\n): Promise<boolean> {\n try {\n await execAsync(\n `gcloud billing projects link ${projectId} --billing-account=${billingAccountId} 2>/dev/null`\n );\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * List available billing accounts\n */\nexport async function listBillingAccounts(): Promise<Array<{ id: string; name: string }>> {\n try {\n const { stdout } = await execAsync(\n 'gcloud billing accounts list --format=\"json(name,displayName)\" 2>/dev/null'\n );\n const accounts = JSON.parse(stdout) as Array<{ name: string; displayName: string }>;\n return accounts.map((a) => ({\n id: a.name.replace('billingAccounts/', ''),\n name: a.displayName,\n }));\n } catch {\n return [];\n }\n}\n","/**\n * GCP API enablement utilities\n */\n\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\n\nconst execAsync = promisify(exec);\n\nexport interface ApiStatus {\n api: string;\n name: string;\n enabled: boolean;\n}\n\n/**\n * Required APIs for StackSolo\n */\nexport const REQUIRED_APIS = [\n 'run.googleapis.com',\n 'cloudfunctions.googleapis.com',\n 'cloudbuild.googleapis.com',\n 'compute.googleapis.com',\n 'secretmanager.googleapis.com',\n 'vpcaccess.googleapis.com',\n 'orgpolicy.googleapis.com',\n 'artifactregistry.googleapis.com',\n];\n\n/**\n * Optional APIs based on project type\n */\nexport const OPTIONAL_APIS = {\n database: 'sqladmin.googleapis.com',\n scheduler: 'cloudscheduler.googleapis.com',\n redis: 'redis.googleapis.com',\n};\n\n/**\n * Get human-readable name for an API\n */\nfunction getApiDisplayName(api: string): string {\n const names: Record<string, string> = {\n 'run.googleapis.com': 'Cloud Run API',\n 'cloudfunctions.googleapis.com': 'Cloud Functions API',\n 'cloudbuild.googleapis.com': 'Cloud Build API',\n 'compute.googleapis.com': 'Compute Engine API',\n 'secretmanager.googleapis.com': 'Secret Manager API',\n 'vpcaccess.googleapis.com': 'VPC Access API',\n 'orgpolicy.googleapis.com': 'Organization Policy API',\n 'artifactregistry.googleapis.com': 'Artifact Registry API',\n 'sqladmin.googleapis.com': 'Cloud SQL Admin API',\n 'cloudscheduler.googleapis.com': 'Cloud Scheduler API',\n 'redis.googleapis.com': 'Memorystore Redis API',\n };\n return names[api] || api.replace('.googleapis.com', '');\n}\n\n/**\n * List currently enabled APIs for a project\n */\nexport async function listEnabledApis(projectId: string): Promise<string[]> {\n try {\n const { stdout } = await execAsync(\n `gcloud services list --project=${projectId} --format=\"value(config.name)\" 2>/dev/null`\n );\n return stdout.trim().split('\\n').filter(Boolean);\n } catch {\n return [];\n }\n}\n\n/**\n * Check which required APIs are enabled\n */\nexport async function checkApis(projectId: string, apis: string[]): Promise<ApiStatus[]> {\n const enabled = await listEnabledApis(projectId);\n\n return apis.map((api) => ({\n api,\n name: getApiDisplayName(api),\n enabled: enabled.includes(api),\n }));\n}\n\n/**\n * Enable a single API\n */\nexport async function enableApi(projectId: string, api: string): Promise<boolean> {\n try {\n await execAsync(`gcloud services enable ${api} --project=${projectId} 2>/dev/null`);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Enable multiple APIs\n */\nexport async function enableApis(\n projectId: string,\n apis: string[],\n onProgress?: (api: string, success: boolean) => void\n): Promise<{ enabled: string[]; failed: string[] }> {\n const enabled: string[] = [];\n const failed: string[] = [];\n\n for (const api of apis) {\n const success = await enableApi(projectId, api);\n if (success) {\n enabled.push(api);\n } else {\n failed.push(api);\n }\n onProgress?.(api, success);\n }\n\n return { enabled, failed };\n}\n","/**\n * GCP Organization Policy utilities\n *\n * Handles detection and fixing of org policy restrictions,\n * specifically iam.allowedPolicyMemberDomains which blocks allUsers.\n */\n\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\n\nconst execAsync = promisify(exec);\n\nexport interface OrgPolicyStatus {\n hasRestriction: boolean;\n allowedDomains?: string[];\n canOverride: boolean;\n}\n\n/**\n * Check org policy for iam.allowedPolicyMemberDomains restriction\n */\nexport async function checkOrgPolicy(projectId: string): Promise<OrgPolicyStatus> {\n try {\n // First ensure orgpolicy API is enabled\n await execAsync(\n `gcloud services enable orgpolicy.googleapis.com --project=${projectId} 2>/dev/null`\n );\n\n // Check effective policy (includes inherited from org)\n const { stdout } = await execAsync(\n `gcloud org-policies describe iam.allowedPolicyMemberDomains --project=${projectId} --effective --format=json 2>/dev/null`\n );\n\n const policy = JSON.parse(stdout);\n\n // Check if there's a restriction in the new format\n if (policy.spec?.rules) {\n for (const rule of policy.spec.rules) {\n // If allowAll is true, no restriction\n if (rule.allowAll === true) {\n return { hasRestriction: false, canOverride: true };\n }\n // If there are allowed values, there's a restriction\n if (rule.values?.allowedValues) {\n return {\n hasRestriction: true,\n allowedDomains: rule.values.allowedValues,\n canOverride: true,\n };\n }\n }\n }\n\n // Check legacy listPolicy format\n if (policy.listPolicy?.allowedValues) {\n return {\n hasRestriction: true,\n allowedDomains: policy.listPolicy.allowedValues,\n canOverride: true,\n };\n }\n\n // No restriction found\n return { hasRestriction: false, canOverride: true };\n } catch (error) {\n const errorStr = String(error);\n\n // Permission denied means we can't check/override\n if (errorStr.includes('PERMISSION_DENIED')) {\n return { hasRestriction: true, canOverride: false };\n }\n\n // No policy found or other error - assume no restriction\n return { hasRestriction: false, canOverride: true };\n }\n}\n\n/**\n * Reset org policy to allow all domains at project level\n *\n * This uses `gcloud org-policies reset` which creates a project-level\n * override that resets to the default (allowing all). This only affects\n * the specific project, not the entire organization.\n */\nexport async function fixOrgPolicy(projectId: string): Promise<boolean> {\n try {\n await execAsync(\n `gcloud org-policies reset iam.allowedPolicyMemberDomains --project=${projectId} 2>/dev/null`\n );\n return true;\n } catch (error) {\n const errorStr = String(error);\n if (errorStr.includes('PERMISSION_DENIED')) {\n return false;\n }\n // Other errors - throw\n throw error;\n }\n}\n","/**\n * GCP IAM permission utilities\n */\n\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\n\nconst execAsync = promisify(exec);\n\nexport interface IamBindingCheck {\n serviceAccount: string;\n role: string;\n hasBinding: boolean;\n}\n\n/**\n * Get the default compute service account for a project\n */\nexport async function getDefaultComputeServiceAccount(\n projectId: string\n): Promise<string | null> {\n try {\n // Get project number\n const { stdout } = await execAsync(\n `gcloud projects describe ${projectId} --format=\"value(projectNumber)\" 2>/dev/null`\n );\n const projectNumber = stdout.trim();\n\n if (!projectNumber) {\n return null;\n }\n\n return `${projectNumber}-compute@developer.gserviceaccount.com`;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if a service account has a specific IAM role on a project\n */\nexport async function checkIamBinding(\n projectId: string,\n serviceAccount: string,\n role: string\n): Promise<boolean> {\n try {\n const { stdout } = await execAsync(\n `gcloud projects get-iam-policy ${projectId} --format=\"json\" 2>/dev/null`\n );\n\n const policy = JSON.parse(stdout);\n const member = `serviceAccount:${serviceAccount}`;\n\n for (const binding of policy.bindings || []) {\n if (binding.role === role && binding.members?.includes(member)) {\n return true;\n }\n }\n\n return false;\n } catch {\n return false;\n }\n}\n\n/**\n * Grant an IAM role to a service account on a project\n */\nexport async function grantIamRole(\n projectId: string,\n serviceAccount: string,\n role: string\n): Promise<boolean> {\n try {\n await execAsync(\n `gcloud projects add-iam-policy-binding ${projectId} ` +\n `--member=\"serviceAccount:${serviceAccount}\" ` +\n `--role=\"${role}\" ` +\n `--quiet 2>/dev/null`\n );\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Required IAM bindings for Cloud Functions Gen2 deployment\n */\nexport const REQUIRED_IAM_BINDINGS = [\n {\n role: 'roles/logging.logWriter',\n description: 'Cloud Build logging',\n },\n];\n\n/**\n * Check and fix required IAM bindings for Cloud Functions deployment\n */\nexport async function checkAndFixCloudBuildPermissions(\n projectId: string,\n onLog?: (message: string) => void\n): Promise<{ success: boolean; fixed: string[]; failed: string[] }> {\n const log = onLog || console.log;\n const fixed: string[] = [];\n const failed: string[] = [];\n\n // Get the default compute service account\n const serviceAccount = await getDefaultComputeServiceAccount(projectId);\n\n if (!serviceAccount) {\n log('Could not determine default compute service account');\n return { success: false, fixed, failed: ['Could not get service account'] };\n }\n\n // Check each required binding\n for (const binding of REQUIRED_IAM_BINDINGS) {\n const hasBinding = await checkIamBinding(projectId, serviceAccount, binding.role);\n\n if (!hasBinding) {\n log(`Granting ${binding.role} to ${serviceAccount}...`);\n const granted = await grantIamRole(projectId, serviceAccount, binding.role);\n\n if (granted) {\n fixed.push(binding.role);\n } else {\n failed.push(binding.role);\n }\n }\n }\n\n return {\n success: failed.length === 0,\n fixed,\n failed,\n };\n}\n","/**\n * Project templates for StackSolo\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { StackSoloConfig } from '@stacksolo/blueprint';\n\nexport type ProjectType = 'function-api' | 'container-api' | 'function-cron' | 'static-api' | 'ui-api' | 'ui-only';\nexport type UIFramework = 'react' | 'vue' | 'sveltekit' | 'html';\n\nexport interface TemplateOptions {\n projectName: string;\n gcpProjectId: string;\n region: string;\n projectType: ProjectType;\n uiFramework?: UIFramework;\n needsDatabase?: boolean;\n databaseVersion?: string;\n needsCache?: boolean;\n needsBucket?: boolean;\n}\n\nexport interface StateFile {\n version: number;\n initialized: string;\n lastDeploy: string | null;\n gcpProjectId: string;\n orgPolicyFixed: boolean;\n apisEnabled: string[];\n}\n\n/**\n * Generate config based on project type\n */\nexport function generateConfig(options: TemplateOptions): StackSoloConfig {\n const { projectName, gcpProjectId, region, projectType, needsDatabase, databaseVersion, needsBucket } = options;\n\n const baseConfig: StackSoloConfig = {\n project: {\n name: projectName,\n gcpProjectId,\n region,\n },\n };\n\n // Add buckets if needed\n if (needsBucket) {\n baseConfig.project.buckets = [\n {\n name: `${projectName}-uploads`,\n },\n ];\n }\n\n // Build network config based on project type\n switch (projectType) {\n case 'function-api':\n baseConfig.project.networks = [\n {\n name: 'main',\n loadBalancer: {\n name: `${projectName}-lb`,\n routes: [{ path: '/*', backend: 'api' }],\n },\n functions: [\n {\n name: 'api',\n sourceDir: './functions/api',\n runtime: 'nodejs20',\n entryPoint: 'handler',\n memory: '256Mi',\n timeout: 60,\n },\n ],\n ...(needsDatabase && databaseVersion\n ? {\n databases: [\n {\n name: 'db',\n databaseVersion,\n tier: 'db-f1-micro',\n },\n ],\n }\n : {}),\n },\n ];\n break;\n\n case 'container-api':\n baseConfig.project.networks = [\n {\n name: 'main',\n loadBalancer: {\n name: `${projectName}-lb`,\n routes: [{ path: '/*', backend: 'api' }],\n },\n containers: [\n {\n name: 'api',\n sourceDir: './containers/api',\n port: 8080,\n memory: '512Mi',\n },\n ],\n ...(needsDatabase && databaseVersion\n ? {\n databases: [\n {\n name: 'db',\n databaseVersion,\n tier: 'db-f1-micro',\n },\n ],\n }\n : {}),\n },\n ];\n break;\n\n case 'function-cron':\n baseConfig.project.crons = [\n {\n name: 'daily-job',\n schedule: '0 0 * * *',\n timezone: 'UTC',\n target: 'main/worker',\n },\n ];\n baseConfig.project.networks = [\n {\n name: 'main',\n functions: [\n {\n name: 'worker',\n sourceDir: './functions/worker',\n runtime: 'nodejs20',\n entryPoint: 'handler',\n memory: '512Mi',\n timeout: 540,\n },\n ],\n },\n ];\n break;\n\n case 'static-api':\n baseConfig.project.networks = [\n {\n name: 'main',\n loadBalancer: {\n name: `${projectName}-lb`,\n routes: [\n { path: '/api/*', backend: 'api' },\n { path: '/*', backend: 'web' },\n ],\n },\n containers: [\n {\n name: 'web',\n sourceDir: './containers/web',\n port: 3000,\n memory: '256Mi',\n },\n ],\n functions: [\n {\n name: 'api',\n sourceDir: './functions/api',\n runtime: 'nodejs20',\n entryPoint: 'handler',\n memory: '256Mi',\n },\n ],\n },\n ];\n break;\n\n case 'ui-api':\n // Static UI (Cloud Storage + CDN) + API (Cloud Function)\n baseConfig.project.backend = 'cdktf';\n baseConfig.project.networks = [\n {\n name: 'main',\n loadBalancer: {\n name: `${projectName}-lb`,\n routes: [\n { path: '/api/*', backend: 'api' },\n { path: '/*', backend: 'web' },\n ],\n },\n functions: [\n {\n name: 'api',\n sourceDir: './functions/api',\n runtime: 'nodejs20',\n entryPoint: 'handler',\n memory: '256Mi',\n timeout: 60,\n },\n ],\n uis: [\n {\n name: 'web',\n sourceDir: './apps/web',\n framework: options.uiFramework || 'react',\n },\n ],\n },\n ];\n break;\n\n case 'ui-only':\n // Static UI only (Cloud Storage + CDN)\n baseConfig.project.backend = 'cdktf';\n baseConfig.project.networks = [\n {\n name: 'main',\n loadBalancer: {\n name: `${projectName}-lb`,\n routes: [{ path: '/*', backend: 'web' }],\n },\n uis: [\n {\n name: 'web',\n sourceDir: './apps/web',\n framework: options.uiFramework || 'react',\n },\n ],\n },\n ];\n break;\n }\n\n return baseConfig;\n}\n\n/**\n * Create .stacksolo directory and state file\n */\nexport async function createStacksoloDir(\n cwd: string,\n options: {\n gcpProjectId: string;\n orgPolicyFixed: boolean;\n apisEnabled: string[];\n }\n): Promise<void> {\n const stacksoloDir = path.join(cwd, '.stacksolo');\n await fs.mkdir(stacksoloDir, { recursive: true });\n\n const state: StateFile = {\n version: 1,\n initialized: new Date().toISOString(),\n lastDeploy: null,\n gcpProjectId: options.gcpProjectId,\n orgPolicyFixed: options.orgPolicyFixed,\n apisEnabled: options.apisEnabled,\n };\n\n await fs.writeFile(path.join(stacksoloDir, 'state.json'), JSON.stringify(state, null, 2) + '\\n');\n\n // Add .stacksolo to .gitignore if it exists\n const gitignorePath = path.join(cwd, '.gitignore');\n try {\n const gitignore = await fs.readFile(gitignorePath, 'utf-8');\n if (!gitignore.includes('.stacksolo/')) {\n await fs.appendFile(gitignorePath, '\\n# StackSolo local state\\n.stacksolo/\\n');\n }\n } catch {\n // .gitignore doesn't exist, create it\n await fs.writeFile(gitignorePath, '# StackSolo local state\\n.stacksolo/\\n');\n }\n}\n\n/**\n * Create config file\n */\nexport async function createConfigFile(cwd: string, config: StackSoloConfig): Promise<void> {\n const configPath = path.join(cwd, '.stacksolo', 'stacksolo.config.json');\n await fs.writeFile(configPath, JSON.stringify(config, null, 2) + '\\n');\n}\n\n/**\n * Scaffold code templates based on project type\n */\nexport async function scaffoldTemplates(\n cwd: string,\n projectType: ProjectType,\n uiFramework?: UIFramework\n): Promise<string[]> {\n const files: string[] = [];\n\n switch (projectType) {\n case 'function-api':\n files.push(...(await scaffoldFunctionApi(cwd, 'functions/api')));\n break;\n\n case 'container-api':\n files.push(...(await scaffoldContainerApi(cwd, 'containers/api')));\n break;\n\n case 'function-cron':\n files.push(...(await scaffoldFunctionCron(cwd, 'functions/worker')));\n break;\n\n case 'static-api':\n files.push(...(await scaffoldFunctionApi(cwd, 'functions/api')));\n files.push(...(await scaffoldStaticWeb(cwd, 'containers/web')));\n break;\n\n case 'ui-api':\n files.push(...(await scaffoldFunctionApi(cwd, 'functions/api')));\n files.push(...(await scaffoldUI(cwd, 'apps/web', uiFramework || 'react')));\n break;\n\n case 'ui-only':\n files.push(...(await scaffoldUI(cwd, 'apps/web', uiFramework || 'react')));\n break;\n }\n\n return files;\n}\n\nasync function scaffoldFunctionApi(cwd: string, name: string): Promise<string[]> {\n const dir = path.join(cwd, name);\n await fs.mkdir(dir, { recursive: true });\n\n // package.json\n await fs.writeFile(\n path.join(dir, 'package.json'),\n JSON.stringify(\n {\n name,\n version: '1.0.0',\n main: 'index.js',\n type: 'module',\n scripts: {\n start: 'npx functions-framework --target=handler',\n build: 'tsc',\n },\n dependencies: {\n '@google-cloud/functions-framework': '^3.3.0',\n },\n devDependencies: {\n typescript: '^5.0.0',\n '@types/node': '^20.0.0',\n },\n },\n null,\n 2\n ) + '\\n'\n );\n\n // index.ts\n await fs.writeFile(\n path.join(dir, 'index.ts'),\n `import functions from '@google-cloud/functions-framework';\n\nfunctions.http('handler', (req, res) => {\n const { method, path } = req;\n\n // Health check\n if (path === '/health') {\n return res.json({ status: 'ok' });\n }\n\n // Your API routes here\n res.json({\n message: 'Hello from StackSolo!',\n method,\n path,\n });\n});\n`\n );\n\n // tsconfig.json\n await fs.writeFile(\n path.join(dir, 'tsconfig.json'),\n JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'node',\n esModuleInterop: true,\n strict: true,\n outDir: 'dist',\n declaration: true,\n },\n include: ['*.ts'],\n },\n null,\n 2\n ) + '\\n'\n );\n\n return [`${name}/package.json`, `${name}/index.ts`, `${name}/tsconfig.json`];\n}\n\nasync function scaffoldContainerApi(cwd: string, name: string): Promise<string[]> {\n const dir = path.join(cwd, name);\n await fs.mkdir(dir, { recursive: true });\n\n // package.json\n await fs.writeFile(\n path.join(dir, 'package.json'),\n JSON.stringify(\n {\n name,\n version: '1.0.0',\n main: 'index.js',\n type: 'module',\n scripts: {\n start: 'node index.js',\n build: 'tsc',\n },\n dependencies: {\n express: '^4.18.0',\n },\n devDependencies: {\n typescript: '^5.0.0',\n '@types/node': '^20.0.0',\n '@types/express': '^4.17.0',\n },\n },\n null,\n 2\n ) + '\\n'\n );\n\n // index.ts\n await fs.writeFile(\n path.join(dir, 'index.ts'),\n `import express from 'express';\n\nconst app = express();\napp.use(express.json());\n\napp.get('/health', (req, res) => {\n res.json({ status: 'ok' });\n});\n\napp.get('/', (req, res) => {\n res.json({ message: 'Hello from StackSolo!' });\n});\n\nconst port = process.env.PORT || 8080;\napp.listen(port, () => {\n console.log(\\`Server listening on port \\${port}\\`);\n});\n`\n );\n\n // tsconfig.json\n await fs.writeFile(\n path.join(dir, 'tsconfig.json'),\n JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'node',\n esModuleInterop: true,\n strict: true,\n outDir: 'dist',\n declaration: true,\n },\n include: ['*.ts'],\n },\n null,\n 2\n ) + '\\n'\n );\n\n // Dockerfile\n await fs.writeFile(\n path.join(dir, 'Dockerfile'),\n `FROM node:20-slim\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\nCOPY . .\nEXPOSE 8080\nCMD [\"node\", \"index.js\"]\n`\n );\n\n return [`${name}/package.json`, `${name}/index.ts`, `${name}/tsconfig.json`, `${name}/Dockerfile`];\n}\n\nasync function scaffoldFunctionCron(cwd: string, name: string): Promise<string[]> {\n const dir = path.join(cwd, name);\n await fs.mkdir(dir, { recursive: true });\n\n // package.json\n await fs.writeFile(\n path.join(dir, 'package.json'),\n JSON.stringify(\n {\n name,\n version: '1.0.0',\n main: 'index.js',\n type: 'module',\n scripts: {\n start: 'npx functions-framework --target=handler',\n build: 'tsc',\n },\n dependencies: {\n '@google-cloud/functions-framework': '^3.3.0',\n },\n devDependencies: {\n typescript: '^5.0.0',\n '@types/node': '^20.0.0',\n },\n },\n null,\n 2\n ) + '\\n'\n );\n\n // index.ts\n await fs.writeFile(\n path.join(dir, 'index.ts'),\n `import functions from '@google-cloud/functions-framework';\n\nfunctions.http('handler', (req, res) => {\n console.log('Cron triggered:', new Date().toISOString());\n\n // Your scheduled job logic here\n\n console.log('Job complete');\n res.json({ status: 'ok' });\n});\n`\n );\n\n // tsconfig.json\n await fs.writeFile(\n path.join(dir, 'tsconfig.json'),\n JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'node',\n esModuleInterop: true,\n strict: true,\n outDir: 'dist',\n declaration: true,\n },\n include: ['*.ts'],\n },\n null,\n 2\n ) + '\\n'\n );\n\n return [`${name}/package.json`, `${name}/index.ts`, `${name}/tsconfig.json`];\n}\n\nasync function scaffoldStaticWeb(cwd: string, name: string): Promise<string[]> {\n const dir = path.join(cwd, name);\n await fs.mkdir(dir, { recursive: true });\n\n // package.json\n await fs.writeFile(\n path.join(dir, 'package.json'),\n JSON.stringify(\n {\n name,\n version: '1.0.0',\n scripts: {\n dev: 'vite',\n build: 'vite build',\n preview: 'vite preview',\n },\n devDependencies: {\n vite: '^5.0.0',\n },\n },\n null,\n 2\n ) + '\\n'\n );\n\n // index.html\n await fs.writeFile(\n path.join(dir, 'index.html'),\n `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>My App</title>\n <style>\n body { font-family: system-ui, sans-serif; max-width: 800px; margin: 2rem auto; padding: 0 1rem; }\n #result { background: #f5f5f5; padding: 1rem; border-radius: 4px; margin-top: 1rem; }\n </style>\n</head>\n<body>\n <h1>Hello, World!</h1>\n <button onclick=\"callApi()\">Call API</button>\n <pre id=\"result\"></pre>\n <script>\n async function callApi() {\n const res = await fetch('/api/');\n const data = await res.json();\n document.getElementById('result').textContent = JSON.stringify(data, null, 2);\n }\n </script>\n</body>\n</html>\n`\n );\n\n // Dockerfile\n await fs.writeFile(\n path.join(dir, 'Dockerfile'),\n `FROM node:20-slim AS build\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci\nCOPY . .\nRUN npm run build\n\nFROM nginx:alpine\nCOPY --from=build /app/dist /usr/share/nginx/html\nEXPOSE 3000\nCMD [\"nginx\", \"-g\", \"daemon off;\"]\n`\n );\n\n return [`${name}/package.json`, `${name}/index.html`, `${name}/Dockerfile`];\n}\n\n/**\n * Scaffold UI based on framework\n */\nasync function scaffoldUI(cwd: string, name: string, framework: UIFramework): Promise<string[]> {\n switch (framework) {\n case 'react':\n return scaffoldReactUI(cwd, name);\n case 'vue':\n return scaffoldVueUI(cwd, name);\n case 'sveltekit':\n return scaffoldSvelteKitUI(cwd, name);\n case 'html':\n return scaffoldHTMLUI(cwd, name);\n default:\n return scaffoldReactUI(cwd, name);\n }\n}\n\nasync function scaffoldReactUI(cwd: string, name: string): Promise<string[]> {\n const dir = path.join(cwd, name);\n await fs.mkdir(path.join(dir, 'src'), { recursive: true });\n\n // package.json\n await fs.writeFile(\n path.join(dir, 'package.json'),\n JSON.stringify(\n {\n name,\n version: '1.0.0',\n type: 'module',\n scripts: {\n dev: 'vite',\n build: 'tsc && vite build',\n preview: 'vite preview',\n },\n dependencies: {\n react: '^18.2.0',\n 'react-dom': '^18.2.0',\n },\n devDependencies: {\n '@types/react': '^18.2.0',\n '@types/react-dom': '^18.2.0',\n '@vitejs/plugin-react': '^4.2.0',\n typescript: '^5.0.0',\n vite: '^5.0.0',\n },\n },\n null,\n 2\n ) + '\\n'\n );\n\n // vite.config.ts\n await fs.writeFile(\n path.join(dir, 'vite.config.ts'),\n `import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\n\nexport default defineConfig({\n plugins: [react()],\n server: {\n proxy: {\n '/api': 'http://localhost:8080',\n },\n },\n});\n`\n );\n\n // tsconfig.json\n await fs.writeFile(\n path.join(dir, 'tsconfig.json'),\n JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2020',\n useDefineForClassFields: true,\n lib: ['ES2020', 'DOM', 'DOM.Iterable'],\n module: 'ESNext',\n skipLibCheck: true,\n moduleResolution: 'bundler',\n allowImportingTsExtensions: true,\n resolveJsonModule: true,\n isolatedModules: true,\n noEmit: true,\n jsx: 'react-jsx',\n strict: true,\n noUnusedLocals: true,\n noUnusedParameters: true,\n noFallthroughCasesInSwitch: true,\n },\n include: ['src'],\n },\n null,\n 2\n ) + '\\n'\n );\n\n // index.html\n await fs.writeFile(\n path.join(dir, 'index.html'),\n `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>My App</title>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/src/main.tsx\"></script>\n </body>\n</html>\n`\n );\n\n // src/main.tsx\n await fs.writeFile(\n path.join(dir, 'src', 'main.tsx'),\n `import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport App from './App';\nimport './index.css';\n\nReactDOM.createRoot(document.getElementById('root')!).render(\n <React.StrictMode>\n <App />\n </React.StrictMode>\n);\n`\n );\n\n // src/App.tsx\n await fs.writeFile(\n path.join(dir, 'src', 'App.tsx'),\n `import { useState } from 'react';\n\nfunction App() {\n const [data, setData] = useState<unknown>(null);\n\n const callApi = async () => {\n const res = await fetch('/api/');\n const json = await res.json();\n setData(json);\n };\n\n return (\n <div style={{ fontFamily: 'system-ui', maxWidth: 800, margin: '2rem auto', padding: '0 1rem' }}>\n <h1>Hello, World!</h1>\n <button onClick={callApi}>Call API</button>\n {data && (\n <pre style={{ background: '#f5f5f5', padding: '1rem', borderRadius: 4, marginTop: '1rem' }}>\n {JSON.stringify(data, null, 2)}\n </pre>\n )}\n </div>\n );\n}\n\nexport default App;\n`\n );\n\n // src/index.css\n await fs.writeFile(\n path.join(dir, 'src', 'index.css'),\n `* {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n\nbody {\n font-family: system-ui, -apple-system, sans-serif;\n line-height: 1.5;\n}\n\nbutton {\n padding: 0.5rem 1rem;\n cursor: pointer;\n}\n`\n );\n\n return [\n `${name}/package.json`,\n `${name}/vite.config.ts`,\n `${name}/tsconfig.json`,\n `${name}/index.html`,\n `${name}/src/main.tsx`,\n `${name}/src/App.tsx`,\n `${name}/src/index.css`,\n ];\n}\n\nasync function scaffoldVueUI(cwd: string, name: string): Promise<string[]> {\n const dir = path.join(cwd, name);\n await fs.mkdir(path.join(dir, 'src'), { recursive: true });\n\n // package.json\n await fs.writeFile(\n path.join(dir, 'package.json'),\n JSON.stringify(\n {\n name,\n version: '1.0.0',\n type: 'module',\n scripts: {\n dev: 'vite',\n build: 'vue-tsc && vite build',\n preview: 'vite preview',\n },\n dependencies: {\n vue: '^3.4.0',\n },\n devDependencies: {\n '@vitejs/plugin-vue': '^5.0.0',\n typescript: '^5.0.0',\n vite: '^5.0.0',\n 'vue-tsc': '^2.0.0',\n },\n },\n null,\n 2\n ) + '\\n'\n );\n\n // vite.config.ts\n await fs.writeFile(\n path.join(dir, 'vite.config.ts'),\n `import { defineConfig } from 'vite';\nimport vue from '@vitejs/plugin-vue';\n\nexport default defineConfig({\n plugins: [vue()],\n server: {\n proxy: {\n '/api': 'http://localhost:8080',\n },\n },\n});\n`\n );\n\n // tsconfig.json\n await fs.writeFile(\n path.join(dir, 'tsconfig.json'),\n JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2020',\n useDefineForClassFields: true,\n module: 'ESNext',\n lib: ['ES2020', 'DOM', 'DOM.Iterable'],\n skipLibCheck: true,\n moduleResolution: 'bundler',\n allowImportingTsExtensions: true,\n resolveJsonModule: true,\n isolatedModules: true,\n noEmit: true,\n jsx: 'preserve',\n strict: true,\n noUnusedLocals: true,\n noUnusedParameters: true,\n noFallthroughCasesInSwitch: true,\n },\n include: ['src/**/*.ts', 'src/**/*.tsx', 'src/**/*.vue'],\n },\n null,\n 2\n ) + '\\n'\n );\n\n // index.html\n await fs.writeFile(\n path.join(dir, 'index.html'),\n `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>My App</title>\n </head>\n <body>\n <div id=\"app\"></div>\n <script type=\"module\" src=\"/src/main.ts\"></script>\n </body>\n</html>\n`\n );\n\n // src/main.ts\n await fs.writeFile(\n path.join(dir, 'src', 'main.ts'),\n `import { createApp } from 'vue';\nimport App from './App.vue';\nimport './style.css';\n\ncreateApp(App).mount('#app');\n`\n );\n\n // src/App.vue\n await fs.writeFile(\n path.join(dir, 'src', 'App.vue'),\n `<script setup lang=\"ts\">\nimport { ref } from 'vue';\n\nconst data = ref<unknown>(null);\n\nasync function callApi() {\n const res = await fetch('/api/');\n data.value = await res.json();\n}\n</script>\n\n<template>\n <div class=\"container\">\n <h1>Hello, World!</h1>\n <button @click=\"callApi\">Call API</button>\n <pre v-if=\"data\" class=\"result\">{{ JSON.stringify(data, null, 2) }}</pre>\n </div>\n</template>\n\n<style scoped>\n.container {\n font-family: system-ui, sans-serif;\n max-width: 800px;\n margin: 2rem auto;\n padding: 0 1rem;\n}\n.result {\n background: #f5f5f5;\n padding: 1rem;\n border-radius: 4px;\n margin-top: 1rem;\n}\n</style>\n`\n );\n\n // src/style.css\n await fs.writeFile(\n path.join(dir, 'src', 'style.css'),\n `* {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n\nbody {\n font-family: system-ui, -apple-system, sans-serif;\n line-height: 1.5;\n}\n\nbutton {\n padding: 0.5rem 1rem;\n cursor: pointer;\n}\n`\n );\n\n // src/vite-env.d.ts\n await fs.writeFile(\n path.join(dir, 'src', 'vite-env.d.ts'),\n `/// <reference types=\"vite/client\" />\n`\n );\n\n return [\n `${name}/package.json`,\n `${name}/vite.config.ts`,\n `${name}/tsconfig.json`,\n `${name}/index.html`,\n `${name}/src/main.ts`,\n `${name}/src/App.vue`,\n `${name}/src/style.css`,\n `${name}/src/vite-env.d.ts`,\n ];\n}\n\nasync function scaffoldSvelteKitUI(cwd: string, name: string): Promise<string[]> {\n const dir = path.join(cwd, name);\n await fs.mkdir(path.join(dir, 'src', 'routes'), { recursive: true });\n\n // package.json\n await fs.writeFile(\n path.join(dir, 'package.json'),\n JSON.stringify(\n {\n name,\n version: '1.0.0',\n type: 'module',\n scripts: {\n dev: 'vite dev',\n build: 'vite build',\n preview: 'vite preview',\n },\n devDependencies: {\n '@sveltejs/adapter-static': '^3.0.0',\n '@sveltejs/kit': '^2.0.0',\n '@sveltejs/vite-plugin-svelte': '^3.0.0',\n svelte: '^4.2.0',\n typescript: '^5.0.0',\n vite: '^5.0.0',\n },\n },\n null,\n 2\n ) + '\\n'\n );\n\n // svelte.config.js\n await fs.writeFile(\n path.join(dir, 'svelte.config.js'),\n `import adapter from '@sveltejs/adapter-static';\n\nexport default {\n kit: {\n adapter: adapter({\n fallback: 'index.html',\n }),\n },\n};\n`\n );\n\n // vite.config.ts\n await fs.writeFile(\n path.join(dir, 'vite.config.ts'),\n `import { sveltekit } from '@sveltejs/kit/vite';\nimport { defineConfig } from 'vite';\n\nexport default defineConfig({\n plugins: [sveltekit()],\n server: {\n proxy: {\n '/api': 'http://localhost:8080',\n },\n },\n});\n`\n );\n\n // tsconfig.json\n await fs.writeFile(\n path.join(dir, 'tsconfig.json'),\n JSON.stringify(\n {\n extends: './.svelte-kit/tsconfig.json',\n compilerOptions: {\n strict: true,\n },\n },\n null,\n 2\n ) + '\\n'\n );\n\n // src/app.html\n await fs.writeFile(\n path.join(dir, 'src', 'app.html'),\n `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n %sveltekit.head%\n </head>\n <body>\n <div>%sveltekit.body%</div>\n </body>\n</html>\n`\n );\n\n // src/routes/+page.svelte\n await fs.writeFile(\n path.join(dir, 'src', 'routes', '+page.svelte'),\n `<script lang=\"ts\">\n let data: unknown = null;\n\n async function callApi() {\n const res = await fetch('/api/');\n data = await res.json();\n }\n</script>\n\n<div class=\"container\">\n <h1>Hello, World!</h1>\n <button on:click={callApi}>Call API</button>\n {#if data}\n <pre class=\"result\">{JSON.stringify(data, null, 2)}</pre>\n {/if}\n</div>\n\n<style>\n .container {\n font-family: system-ui, sans-serif;\n max-width: 800px;\n margin: 2rem auto;\n padding: 0 1rem;\n }\n .result {\n background: #f5f5f5;\n padding: 1rem;\n border-radius: 4px;\n margin-top: 1rem;\n }\n button {\n padding: 0.5rem 1rem;\n cursor: pointer;\n }\n</style>\n`\n );\n\n // src/routes/+layout.ts (for static prerendering)\n await fs.writeFile(\n path.join(dir, 'src', 'routes', '+layout.ts'),\n `export const prerender = true;\nexport const ssr = false;\n`\n );\n\n return [\n `${name}/package.json`,\n `${name}/svelte.config.js`,\n `${name}/vite.config.ts`,\n `${name}/tsconfig.json`,\n `${name}/src/app.html`,\n `${name}/src/routes/+page.svelte`,\n `${name}/src/routes/+layout.ts`,\n ];\n}\n\nasync function scaffoldHTMLUI(cwd: string, name: string): Promise<string[]> {\n const dir = path.join(cwd, name);\n await fs.mkdir(dir, { recursive: true });\n\n // index.html\n await fs.writeFile(\n path.join(dir, 'index.html'),\n `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>My App</title>\n <link rel=\"stylesheet\" href=\"styles.css\">\n</head>\n<body>\n <div class=\"container\">\n <h1>Hello, World!</h1>\n <button onclick=\"callApi()\">Call API</button>\n <pre id=\"result\"></pre>\n </div>\n <script src=\"script.js\"></script>\n</body>\n</html>\n`\n );\n\n // styles.css\n await fs.writeFile(\n path.join(dir, 'styles.css'),\n `* {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n\nbody {\n font-family: system-ui, -apple-system, sans-serif;\n line-height: 1.5;\n}\n\n.container {\n max-width: 800px;\n margin: 2rem auto;\n padding: 0 1rem;\n}\n\nbutton {\n padding: 0.5rem 1rem;\n cursor: pointer;\n}\n\n#result {\n background: #f5f5f5;\n padding: 1rem;\n border-radius: 4px;\n margin-top: 1rem;\n display: none;\n}\n\n#result:not(:empty) {\n display: block;\n}\n`\n );\n\n // script.js\n await fs.writeFile(\n path.join(dir, 'script.js'),\n `async function callApi() {\n const res = await fetch('/api/');\n const data = await res.json();\n document.getElementById('result').textContent = JSON.stringify(data, null, 2);\n}\n`\n );\n\n return [`${name}/index.html`, `${name}/styles.css`, `${name}/script.js`];\n}\n","/**\n * Registry database connection\n * Stores data at ~/.stacksolo/registry.db\n */\n\nimport { Kysely, SqliteDialect } from 'kysely';\nimport SQLite from 'better-sqlite3';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { existsSync, mkdirSync } from 'fs';\nimport type { RegistryDatabase } from './schema.js';\n\n// Registry directory and database location\nconst STACKSOLO_DIR = join(homedir(), '.stacksolo');\nconst DB_PATH = process.env.STACKSOLO_REGISTRY_PATH || join(STACKSOLO_DIR, 'registry.db');\n\nlet dbInstance: Kysely<RegistryDatabase> | null = null;\n\n/**\n * Get or create the registry database connection\n */\nexport function getDb(): Kysely<RegistryDatabase> {\n if (dbInstance) {\n return dbInstance;\n }\n\n // Ensure directory exists\n const dbDir = join(DB_PATH, '..');\n if (!existsSync(dbDir)) {\n mkdirSync(dbDir, { recursive: true });\n }\n\n const dialect = new SqliteDialect({\n database: new SQLite(DB_PATH),\n });\n\n dbInstance = new Kysely<RegistryDatabase>({\n dialect,\n });\n\n return dbInstance;\n}\n\n/**\n * Initialize the database schema\n * Creates tables if they don't exist\n */\nexport async function initRegistry(): Promise<void> {\n const db = getDb();\n\n // Create projects table\n await db.schema\n .createTable('projects')\n .ifNotExists()\n .addColumn('id', 'text', (col) => col.primaryKey())\n .addColumn('name', 'text', (col) => col.notNull().unique())\n .addColumn('gcp_project_id', 'text', (col) => col.notNull())\n .addColumn('region', 'text', (col) => col.notNull())\n .addColumn('config_path', 'text')\n .addColumn('config_hash', 'text')\n .addColumn('status', 'text', (col) => col.notNull().defaultTo('pending'))\n .addColumn('last_deployed_at', 'text')\n .addColumn('created_at', 'text', (col) => col.notNull())\n .addColumn('updated_at', 'text', (col) => col.notNull())\n .execute();\n\n // Create resources table\n await db.schema\n .createTable('resources')\n .ifNotExists()\n .addColumn('id', 'text', (col) => col.primaryKey())\n .addColumn('project_id', 'text', (col) =>\n col.notNull().references('projects.id').onDelete('cascade')\n )\n .addColumn('type', 'text', (col) => col.notNull())\n .addColumn('name', 'text', (col) => col.notNull())\n .addColumn('network', 'text')\n .addColumn('resource_type', 'text', (col) => col.notNull())\n .addColumn('config', 'text', (col) => col.notNull())\n .addColumn('outputs', 'text')\n .addColumn('status', 'text', (col) => col.notNull().defaultTo('pending'))\n .addColumn('pulumi_urn', 'text')\n .addColumn('last_deployed_at', 'text')\n .addColumn('created_at', 'text', (col) => col.notNull())\n .addColumn('updated_at', 'text', (col) => col.notNull())\n .execute();\n\n // Create deployments table\n await db.schema\n .createTable('deployments')\n .ifNotExists()\n .addColumn('id', 'text', (col) => col.primaryKey())\n .addColumn('project_id', 'text', (col) =>\n col.notNull().references('projects.id').onDelete('cascade')\n )\n .addColumn('action', 'text', (col) => col.notNull())\n .addColumn('status', 'text', (col) => col.notNull())\n .addColumn('config_snapshot', 'text', (col) => col.notNull())\n .addColumn('log_path', 'text')\n .addColumn('error', 'text')\n .addColumn('started_at', 'text', (col) => col.notNull())\n .addColumn('completed_at', 'text')\n .execute();\n\n // Create indexes for common queries\n await db.schema\n .createIndex('idx_resources_project')\n .ifNotExists()\n .on('resources')\n .column('project_id')\n .execute();\n\n await db.schema\n .createIndex('idx_resources_lookup')\n .ifNotExists()\n .on('resources')\n .columns(['project_id', 'network', 'name'])\n .execute();\n\n await db.schema\n .createIndex('idx_deployments_project')\n .ifNotExists()\n .on('deployments')\n .column('project_id')\n .execute();\n\n await db.schema\n .createIndex('idx_projects_gcp')\n .ifNotExists()\n .on('projects')\n .column('gcp_project_id')\n .execute();\n}\n\n/**\n * Close the database connection\n */\nexport async function closeRegistry(): Promise<void> {\n if (dbInstance) {\n await dbInstance.destroy();\n dbInstance = null;\n }\n}\n\n/**\n * Get the registry directory path\n */\nexport function getRegistryDir(): string {\n return STACKSOLO_DIR;\n}\n\n/**\n * Get the registry database path\n */\nexport function getRegistryDbPath(): string {\n return DB_PATH;\n}\n\nexport type { RegistryDatabase } from './schema.js';\n","import crypto from 'crypto';\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\n\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n crypto.randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import crypto from 'crypto';\nexport default {\n randomUUID: crypto.randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","/**\n * Project repository - CRUD operations for projects in the registry\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport { getDb } from '../db.js';\nimport type {\n RegistryProject,\n CreateProjectInput,\n UpdateProjectInput,\n ProjectStatus,\n} from '../types.js';\n\n/**\n * Convert database row to RegistryProject\n */\nfunction toProject(row: {\n id: string;\n name: string;\n gcp_project_id: string;\n region: string;\n config_path: string | null;\n config_hash: string | null;\n status: string;\n last_deployed_at: string | null;\n created_at: string;\n updated_at: string;\n}): RegistryProject {\n return {\n id: row.id,\n name: row.name,\n gcpProjectId: row.gcp_project_id,\n region: row.region,\n configPath: row.config_path,\n configHash: row.config_hash,\n status: row.status as ProjectStatus,\n lastDeployedAt: row.last_deployed_at ? new Date(row.last_deployed_at) : null,\n createdAt: new Date(row.created_at),\n updatedAt: new Date(row.updated_at),\n };\n}\n\nexport class ProjectRepository {\n /**\n * Create a new project\n */\n async create(input: CreateProjectInput): Promise<RegistryProject> {\n const db = getDb();\n const now = new Date().toISOString();\n const id = uuidv4();\n\n const row = {\n id,\n name: input.name,\n gcp_project_id: input.gcpProjectId,\n region: input.region,\n config_path: input.configPath ?? null,\n config_hash: input.configHash ?? null,\n status: 'pending',\n last_deployed_at: null,\n created_at: now,\n updated_at: now,\n };\n\n await db.insertInto('projects').values(row).execute();\n\n return toProject(row);\n }\n\n /**\n * Find a project by ID\n */\n async findById(id: string): Promise<RegistryProject | null> {\n const db = getDb();\n const row = await db\n .selectFrom('projects')\n .selectAll()\n .where('id', '=', id)\n .executeTakeFirst();\n\n return row ? toProject(row) : null;\n }\n\n /**\n * Find a project by name\n */\n async findByName(name: string): Promise<RegistryProject | null> {\n const db = getDb();\n const row = await db\n .selectFrom('projects')\n .selectAll()\n .where('name', '=', name)\n .executeTakeFirst();\n\n return row ? toProject(row) : null;\n }\n\n /**\n * Find a project by config path\n */\n async findByConfigPath(configPath: string): Promise<RegistryProject | null> {\n const db = getDb();\n const row = await db\n .selectFrom('projects')\n .selectAll()\n .where('config_path', '=', configPath)\n .executeTakeFirst();\n\n return row ? toProject(row) : null;\n }\n\n /**\n * Find all projects by GCP project ID\n */\n async findByGcpProjectId(gcpProjectId: string): Promise<RegistryProject[]> {\n const db = getDb();\n const rows = await db\n .selectFrom('projects')\n .selectAll()\n .where('gcp_project_id', '=', gcpProjectId)\n .orderBy('created_at', 'desc')\n .execute();\n\n return rows.map(toProject);\n }\n\n /**\n * Find all projects\n */\n async findAll(): Promise<RegistryProject[]> {\n const db = getDb();\n const rows = await db\n .selectFrom('projects')\n .selectAll()\n .orderBy('created_at', 'desc')\n .execute();\n\n return rows.map(toProject);\n }\n\n /**\n * Update a project\n */\n async update(id: string, input: UpdateProjectInput): Promise<RegistryProject> {\n const db = getDb();\n const now = new Date().toISOString();\n\n const updates: Record<string, unknown> = {\n updated_at: now,\n };\n\n if (input.name !== undefined) updates.name = input.name;\n if (input.gcpProjectId !== undefined) updates.gcp_project_id = input.gcpProjectId;\n if (input.region !== undefined) updates.region = input.region;\n if (input.configPath !== undefined) updates.config_path = input.configPath;\n if (input.configHash !== undefined) updates.config_hash = input.configHash;\n if (input.status !== undefined) updates.status = input.status;\n if (input.lastDeployedAt !== undefined) {\n updates.last_deployed_at = input.lastDeployedAt.toISOString();\n }\n\n await db.updateTable('projects').set(updates).where('id', '=', id).execute();\n\n const project = await this.findById(id);\n if (!project) {\n throw new Error(`Project not found: ${id}`);\n }\n\n return project;\n }\n\n /**\n * Update project status\n */\n async updateStatus(id: string, status: ProjectStatus): Promise<void> {\n const db = getDb();\n const now = new Date().toISOString();\n\n await db\n .updateTable('projects')\n .set({\n status,\n updated_at: now,\n })\n .where('id', '=', id)\n .execute();\n }\n\n /**\n * Mark project as deployed\n */\n async markDeployed(id: string): Promise<void> {\n const db = getDb();\n const now = new Date().toISOString();\n\n await db\n .updateTable('projects')\n .set({\n status: 'deployed',\n last_deployed_at: now,\n updated_at: now,\n })\n .where('id', '=', id)\n .execute();\n }\n\n /**\n * Delete a project\n */\n async delete(id: string): Promise<void> {\n const db = getDb();\n await db.deleteFrom('projects').where('id', '=', id).execute();\n }\n}\n","/**\n * Resource repository - CRUD operations for resources in the registry\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport { getDb } from '../db.js';\nimport type {\n RegistryResource,\n CreateResourceInput,\n UpdateResourceInput,\n ResourceLogicalType,\n ResourceStatus,\n ResourceOutputs,\n} from '../types.js';\n\n/**\n * Convert database row to RegistryResource\n */\nfunction toResource(row: {\n id: string;\n project_id: string;\n type: string;\n name: string;\n network: string | null;\n resource_type: string;\n config: string;\n outputs: string | null;\n status: string;\n pulumi_urn: string | null;\n last_deployed_at: string | null;\n created_at: string;\n updated_at: string;\n}): RegistryResource {\n return {\n id: row.id,\n projectId: row.project_id,\n type: row.type as ResourceLogicalType,\n name: row.name,\n network: row.network,\n resourceType: row.resource_type,\n config: JSON.parse(row.config),\n outputs: row.outputs ? JSON.parse(row.outputs) : null,\n status: row.status as ResourceStatus,\n pulumiUrn: row.pulumi_urn,\n lastDeployedAt: row.last_deployed_at ? new Date(row.last_deployed_at) : null,\n createdAt: new Date(row.created_at),\n updatedAt: new Date(row.updated_at),\n };\n}\n\nexport class ResourceRepository {\n /**\n * Create a new resource\n */\n async create(input: CreateResourceInput): Promise<RegistryResource> {\n const db = getDb();\n const now = new Date().toISOString();\n const id = uuidv4();\n\n const row = {\n id,\n project_id: input.projectId,\n type: input.type,\n name: input.name,\n network: input.network ?? null,\n resource_type: input.resourceType,\n config: JSON.stringify(input.config),\n outputs: null,\n status: 'pending',\n pulumi_urn: null,\n last_deployed_at: null,\n created_at: now,\n updated_at: now,\n };\n\n await db.insertInto('resources').values(row).execute();\n\n return toResource(row);\n }\n\n /**\n * Find a resource by ID\n */\n async findById(id: string): Promise<RegistryResource | null> {\n const db = getDb();\n const row = await db\n .selectFrom('resources')\n .selectAll()\n .where('id', '=', id)\n .executeTakeFirst();\n\n return row ? toResource(row) : null;\n }\n\n /**\n * Find resources by project ID\n */\n async findByProjectId(projectId: string): Promise<RegistryResource[]> {\n const db = getDb();\n const rows = await db\n .selectFrom('resources')\n .selectAll()\n .where('project_id', '=', projectId)\n .orderBy('created_at', 'asc')\n .execute();\n\n return rows.map(toResource);\n }\n\n /**\n * Find resources by project ID and network\n */\n async findByProjectAndNetwork(\n projectId: string,\n network: string\n ): Promise<RegistryResource[]> {\n const db = getDb();\n const rows = await db\n .selectFrom('resources')\n .selectAll()\n .where('project_id', '=', projectId)\n .where('network', '=', network)\n .orderBy('created_at', 'asc')\n .execute();\n\n return rows.map(toResource);\n }\n\n /**\n * Find a resource by reference (project name, network, resource name)\n * Used for cross-project reference resolution\n */\n async findByReference(\n projectId: string,\n resourceName: string,\n network?: string | null\n ): Promise<RegistryResource | null> {\n const db = getDb();\n\n let query = db\n .selectFrom('resources')\n .selectAll()\n .where('project_id', '=', projectId)\n .where('name', '=', resourceName);\n\n if (network !== undefined && network !== null) {\n query = query.where('network', '=', network);\n }\n\n const row = await query.executeTakeFirst();\n return row ? toResource(row) : null;\n }\n\n /**\n * Find a resource by name within a project\n */\n async findByName(projectId: string, name: string): Promise<RegistryResource | null> {\n const db = getDb();\n const row = await db\n .selectFrom('resources')\n .selectAll()\n .where('project_id', '=', projectId)\n .where('name', '=', name)\n .executeTakeFirst();\n\n return row ? toResource(row) : null;\n }\n\n /**\n * Update a resource\n */\n async update(id: string, input: UpdateResourceInput): Promise<RegistryResource> {\n const db = getDb();\n const now = new Date().toISOString();\n\n const updates: Record<string, unknown> = {\n updated_at: now,\n };\n\n if (input.type !== undefined) updates.type = input.type;\n if (input.name !== undefined) updates.name = input.name;\n if (input.network !== undefined) updates.network = input.network;\n if (input.resourceType !== undefined) updates.resource_type = input.resourceType;\n if (input.config !== undefined) updates.config = JSON.stringify(input.config);\n if (input.outputs !== undefined) updates.outputs = JSON.stringify(input.outputs);\n if (input.status !== undefined) updates.status = input.status;\n if (input.pulumiUrn !== undefined) updates.pulumi_urn = input.pulumiUrn;\n if (input.lastDeployedAt !== undefined) {\n updates.last_deployed_at = input.lastDeployedAt.toISOString();\n }\n\n await db.updateTable('resources').set(updates).where('id', '=', id).execute();\n\n const resource = await this.findById(id);\n if (!resource) {\n throw new Error(`Resource not found: ${id}`);\n }\n\n return resource;\n }\n\n /**\n * Update resource outputs\n */\n async updateOutputs(id: string, outputs: ResourceOutputs): Promise<void> {\n const db = getDb();\n const now = new Date().toISOString();\n\n await db\n .updateTable('resources')\n .set({\n outputs: JSON.stringify(outputs),\n status: 'ready',\n last_deployed_at: now,\n updated_at: now,\n })\n .where('id', '=', id)\n .execute();\n }\n\n /**\n * Update resource status\n */\n async updateStatus(id: string, status: ResourceStatus): Promise<void> {\n const db = getDb();\n const now = new Date().toISOString();\n\n await db\n .updateTable('resources')\n .set({\n status,\n updated_at: now,\n })\n .where('id', '=', id)\n .execute();\n }\n\n /**\n * Upsert resources for a project\n * Updates existing resources or creates new ones\n */\n async upsert(projectId: string, resources: CreateResourceInput[]): Promise<void> {\n for (const input of resources) {\n const existing = await this.findByName(projectId, input.name);\n\n if (existing) {\n await this.update(existing.id, {\n type: input.type,\n network: input.network,\n resourceType: input.resourceType,\n config: input.config,\n });\n } else {\n await this.create(input);\n }\n }\n }\n\n /**\n * Delete a resource\n */\n async delete(id: string): Promise<void> {\n const db = getDb();\n await db.deleteFrom('resources').where('id', '=', id).execute();\n }\n\n /**\n * Delete all resources for a project\n */\n async deleteByProjectId(projectId: string): Promise<void> {\n const db = getDb();\n await db.deleteFrom('resources').where('project_id', '=', projectId).execute();\n }\n}\n","/**\n * Deployment repository - CRUD operations for deployments in the registry\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport { getDb } from '../db.js';\nimport type {\n RegistryDeployment,\n CreateDeploymentInput,\n UpdateDeploymentInput,\n DeploymentAction,\n DeploymentStatus,\n} from '../types.js';\n\n/**\n * Convert database row to RegistryDeployment\n */\nfunction toDeployment(row: {\n id: string;\n project_id: string;\n action: string;\n status: string;\n config_snapshot: string;\n log_path: string | null;\n error: string | null;\n started_at: string;\n completed_at: string | null;\n}): RegistryDeployment {\n return {\n id: row.id,\n projectId: row.project_id,\n action: row.action as DeploymentAction,\n status: row.status as DeploymentStatus,\n configSnapshot: JSON.parse(row.config_snapshot),\n logPath: row.log_path,\n error: row.error,\n startedAt: new Date(row.started_at),\n completedAt: row.completed_at ? new Date(row.completed_at) : null,\n };\n}\n\nexport class DeploymentRepository {\n /**\n * Create a new deployment\n */\n async create(input: CreateDeploymentInput): Promise<RegistryDeployment> {\n const db = getDb();\n const now = new Date().toISOString();\n const id = uuidv4();\n\n const row = {\n id,\n project_id: input.projectId,\n action: input.action,\n status: 'pending' as const,\n config_snapshot: JSON.stringify(input.configSnapshot),\n log_path: input.logPath ?? null,\n error: null,\n started_at: now,\n completed_at: null,\n };\n\n await db.insertInto('deployments').values(row).execute();\n\n return toDeployment(row);\n }\n\n /**\n * Find a deployment by ID\n */\n async findById(id: string): Promise<RegistryDeployment | null> {\n const db = getDb();\n const row = await db\n .selectFrom('deployments')\n .selectAll()\n .where('id', '=', id)\n .executeTakeFirst();\n\n return row ? toDeployment(row) : null;\n }\n\n /**\n * Find deployments by project ID\n */\n async findByProjectId(projectId: string): Promise<RegistryDeployment[]> {\n const db = getDb();\n const rows = await db\n .selectFrom('deployments')\n .selectAll()\n .where('project_id', '=', projectId)\n .orderBy('started_at', 'desc')\n .execute();\n\n return rows.map(toDeployment);\n }\n\n /**\n * Find the latest deployment for a project\n */\n async findLatest(projectId: string): Promise<RegistryDeployment | null> {\n const db = getDb();\n const row = await db\n .selectFrom('deployments')\n .selectAll()\n .where('project_id', '=', projectId)\n .orderBy('started_at', 'desc')\n .limit(1)\n .executeTakeFirst();\n\n return row ? toDeployment(row) : null;\n }\n\n /**\n * Update a deployment\n */\n async update(id: string, input: UpdateDeploymentInput): Promise<RegistryDeployment> {\n const db = getDb();\n\n const updates: Record<string, unknown> = {};\n\n if (input.status !== undefined) updates.status = input.status;\n if (input.logPath !== undefined) updates.log_path = input.logPath;\n if (input.error !== undefined) updates.error = input.error;\n if (input.completedAt !== undefined) {\n updates.completed_at = input.completedAt.toISOString();\n }\n\n if (Object.keys(updates).length > 0) {\n await db.updateTable('deployments').set(updates).where('id', '=', id).execute();\n }\n\n const deployment = await this.findById(id);\n if (!deployment) {\n throw new Error(`Deployment not found: ${id}`);\n }\n\n return deployment;\n }\n\n /**\n * Update deployment status\n */\n async updateStatus(\n id: string,\n status: DeploymentStatus,\n error?: string\n ): Promise<void> {\n const db = getDb();\n\n const updates: Record<string, unknown> = {\n status,\n };\n\n // Set completed_at for terminal states\n if (status === 'succeeded' || status === 'failed') {\n updates.completed_at = new Date().toISOString();\n }\n\n if (error !== undefined) {\n updates.error = error;\n }\n\n await db.updateTable('deployments').set(updates).where('id', '=', id).execute();\n }\n\n /**\n * Mark deployment as running\n */\n async markRunning(id: string): Promise<void> {\n await this.updateStatus(id, 'running');\n }\n\n /**\n * Mark deployment as succeeded\n */\n async markSucceeded(id: string): Promise<void> {\n await this.updateStatus(id, 'succeeded');\n }\n\n /**\n * Mark deployment as failed\n */\n async markFailed(id: string, error: string): Promise<void> {\n await this.updateStatus(id, 'failed', error);\n }\n\n /**\n * Delete a deployment\n */\n async delete(id: string): Promise<void> {\n const db = getDb();\n await db.deleteFrom('deployments').where('id', '=', id).execute();\n }\n\n /**\n * Delete all deployments for a project\n */\n async deleteByProjectId(projectId: string): Promise<void> {\n const db = getDb();\n await db.deleteFrom('deployments').where('project_id', '=', projectId).execute();\n }\n}\n","/**\n * Registry Service - High-level operations for the StackSolo registry\n */\n\nimport { createHash } from 'crypto';\nimport { readFileSync, existsSync } from 'fs';\nimport { initRegistry } from '../db.js';\nimport { ProjectRepository } from '../repositories/project.repository.js';\nimport { ResourceRepository } from '../repositories/resource.repository.js';\nimport { DeploymentRepository } from '../repositories/deployment.repository.js';\nimport type {\n RegistryProject,\n RegistryResource,\n RegistryDeployment,\n CreateProjectInput,\n UpdateProjectInput,\n CreateResourceInput,\n UpdateResourceInput,\n CreateDeploymentInput,\n ResourceOutputs,\n ProjectStatus,\n ResourceStatus,\n DeploymentStatus,\n} from '../types.js';\n\nexport class RegistryService {\n private projectRepo: ProjectRepository;\n private resourceRepo: ResourceRepository;\n private deploymentRepo: DeploymentRepository;\n private initialized: boolean = false;\n\n constructor() {\n this.projectRepo = new ProjectRepository();\n this.resourceRepo = new ResourceRepository();\n this.deploymentRepo = new DeploymentRepository();\n }\n\n /**\n * Initialize the registry database\n */\n async init(): Promise<void> {\n if (this.initialized) return;\n await initRegistry();\n this.initialized = true;\n }\n\n // ==================== Project Operations ====================\n\n /**\n * Register a project in the registry\n */\n async registerProject(input: CreateProjectInput): Promise<RegistryProject> {\n await this.init();\n\n // Compute config hash if path provided\n let configHash = input.configHash;\n if (input.configPath && existsSync(input.configPath) && !configHash) {\n configHash = this.hashFile(input.configPath);\n }\n\n return this.projectRepo.create({\n ...input,\n configHash,\n });\n }\n\n /**\n * Find a project by name\n */\n async findProjectByName(name: string): Promise<RegistryProject | null> {\n await this.init();\n return this.projectRepo.findByName(name);\n }\n\n /**\n * Find a project by ID\n */\n async findProjectById(id: string): Promise<RegistryProject | null> {\n await this.init();\n return this.projectRepo.findById(id);\n }\n\n /**\n * Find a project by config path\n */\n async findProjectByPath(configPath: string): Promise<RegistryProject | null> {\n await this.init();\n return this.projectRepo.findByConfigPath(configPath);\n }\n\n /**\n * List all projects\n */\n async listProjects(): Promise<RegistryProject[]> {\n await this.init();\n return this.projectRepo.findAll();\n }\n\n /**\n * Update a project\n */\n async updateProject(id: string, input: UpdateProjectInput): Promise<RegistryProject> {\n await this.init();\n return this.projectRepo.update(id, input);\n }\n\n /**\n * Update project status\n */\n async updateProjectStatus(id: string, status: ProjectStatus): Promise<void> {\n await this.init();\n await this.projectRepo.updateStatus(id, status);\n }\n\n /**\n * Mark a project as deployed\n */\n async markProjectDeployed(id: string): Promise<void> {\n await this.init();\n await this.projectRepo.markDeployed(id);\n }\n\n /**\n * Unregister a project (delete from registry)\n */\n async unregisterProject(id: string): Promise<void> {\n await this.init();\n await this.projectRepo.delete(id);\n }\n\n /**\n * Unregister a project by name\n */\n async unregisterProjectByName(name: string): Promise<boolean> {\n await this.init();\n const project = await this.projectRepo.findByName(name);\n if (!project) return false;\n await this.projectRepo.delete(project.id);\n return true;\n }\n\n // ==================== Config Change Detection ====================\n\n /**\n * Check if the config file has changed since last registered\n */\n async checkConfigChanged(\n projectId: string\n ): Promise<{ changed: boolean; currentHash: string | null; storedHash: string | null }> {\n await this.init();\n const project = await this.projectRepo.findById(projectId);\n\n if (!project || !project.configPath) {\n return { changed: false, currentHash: null, storedHash: null };\n }\n\n if (!existsSync(project.configPath)) {\n return { changed: true, currentHash: null, storedHash: project.configHash };\n }\n\n const currentHash = this.hashFile(project.configPath);\n const changed = currentHash !== project.configHash;\n\n return {\n changed,\n currentHash,\n storedHash: project.configHash,\n };\n }\n\n /**\n * Update the stored config hash\n */\n async updateConfigHash(projectId: string, hash: string): Promise<void> {\n await this.init();\n await this.projectRepo.update(projectId, { configHash: hash });\n }\n\n /**\n * Compute SHA256 hash of a file\n */\n private hashFile(filePath: string): string {\n const content = readFileSync(filePath, 'utf-8');\n return createHash('sha256').update(content).digest('hex');\n }\n\n // ==================== Resource Operations ====================\n\n /**\n * Create a resource\n */\n async createResource(input: CreateResourceInput): Promise<RegistryResource> {\n await this.init();\n return this.resourceRepo.create(input);\n }\n\n /**\n * Find resources by project ID\n */\n async findResourcesByProject(projectId: string): Promise<RegistryResource[]> {\n await this.init();\n return this.resourceRepo.findByProjectId(projectId);\n }\n\n /**\n * Find a resource by reference\n */\n async findResourceByRef(\n projectId: string,\n resourceName: string,\n network?: string | null\n ): Promise<RegistryResource | null> {\n await this.init();\n return this.resourceRepo.findByReference(projectId, resourceName, network);\n }\n\n /**\n * Update a resource\n */\n async updateResource(\n id: string,\n input: UpdateResourceInput\n ): Promise<RegistryResource> {\n await this.init();\n return this.resourceRepo.update(id, input);\n }\n\n /**\n * Update resource outputs\n */\n async updateResourceOutputs(id: string, outputs: ResourceOutputs): Promise<void> {\n await this.init();\n await this.resourceRepo.updateOutputs(id, outputs);\n }\n\n /**\n * Update resource status\n */\n async updateResourceStatus(id: string, status: ResourceStatus): Promise<void> {\n await this.init();\n await this.resourceRepo.updateStatus(id, status);\n }\n\n /**\n * Upsert resources for a project (sync from config)\n */\n async upsertResources(\n projectId: string,\n resources: CreateResourceInput[]\n ): Promise<void> {\n await this.init();\n await this.resourceRepo.upsert(projectId, resources);\n }\n\n // ==================== Deployment Operations ====================\n\n /**\n * Record a new deployment\n */\n async recordDeployment(input: CreateDeploymentInput): Promise<RegistryDeployment> {\n await this.init();\n return this.deploymentRepo.create(input);\n }\n\n /**\n * Find deployments by project ID\n */\n async findDeploymentsByProject(projectId: string): Promise<RegistryDeployment[]> {\n await this.init();\n return this.deploymentRepo.findByProjectId(projectId);\n }\n\n /**\n * Find the latest deployment for a project\n */\n async findLatestDeployment(projectId: string): Promise<RegistryDeployment | null> {\n await this.init();\n return this.deploymentRepo.findLatest(projectId);\n }\n\n /**\n * Update deployment status\n */\n async updateDeploymentStatus(\n id: string,\n status: DeploymentStatus,\n error?: string\n ): Promise<void> {\n await this.init();\n await this.deploymentRepo.updateStatus(id, status, error);\n }\n\n /**\n * Mark deployment as running\n */\n async markDeploymentRunning(id: string): Promise<void> {\n await this.init();\n await this.deploymentRepo.markRunning(id);\n }\n\n /**\n * Mark deployment as succeeded\n */\n async markDeploymentSucceeded(id: string): Promise<void> {\n await this.init();\n await this.deploymentRepo.markSucceeded(id);\n }\n\n /**\n * Mark deployment as failed\n */\n async markDeploymentFailed(id: string, error: string): Promise<void> {\n await this.init();\n await this.deploymentRepo.markFailed(id, error);\n }\n}\n\n// Singleton instance\nlet registryInstance: RegistryService | null = null;\n\n/**\n * Get the registry service instance\n */\nexport function getRegistry(): RegistryService {\n if (!registryInstance) {\n registryInstance = new RegistryService();\n }\n return registryInstance;\n}\n","/**\n * Reference Service - Cross-project reference resolution\n *\n * Parses and resolves references like:\n * @project/resource.property\n * @project/network/resource.property\n */\n\nimport type { RegistryService } from './registry.service.js';\nimport type { CrossProjectReference, ResourceLogicalType, RegistryResource } from '../types.js';\n\n/**\n * Default output properties for each resource type\n */\nconst DEFAULT_OUTPUTS: Record<ResourceLogicalType, string> = {\n container: 'url',\n function: 'url',\n database: 'connectionString',\n cache: 'host',\n bucket: 'name',\n secret: 'secretId',\n topic: 'name',\n queue: 'name',\n network: 'selfLink',\n cron: 'name',\n};\n\nexport class ReferenceService {\n constructor(private registry: RegistryService) {}\n\n /**\n * Parse a cross-project reference string\n *\n * Formats:\n * @project/resource.property\n * @project/network/resource.property\n *\n * Examples:\n * @shared-infra/users-db.connectionString\n * @shared-infra/main/api.url\n * @shared-infra/uploads (defaults to 'name' for bucket)\n */\n parseReference(ref: string): CrossProjectReference | null {\n if (!ref.startsWith('@')) {\n return null;\n }\n\n // Try format: @project/network/resource.property\n const withNetwork = ref.match(\n /^@([a-z0-9-]+)\\/([a-z0-9-]+)\\/([a-z0-9-]+)(?:\\.([a-zA-Z]+))?$/\n );\n if (withNetwork) {\n const [, projectName, network, resourceName, property] = withNetwork;\n return {\n projectName,\n network,\n resourceName,\n property: property || null,\n };\n }\n\n // Try format: @project/resource.property\n const withoutNetwork = ref.match(\n /^@([a-z0-9-]+)\\/([a-z0-9-]+)(?:\\.([a-zA-Z]+))?$/\n );\n if (withoutNetwork) {\n const [, projectName, resourceName, property] = withoutNetwork;\n return {\n projectName,\n network: null,\n resourceName,\n property: property || null,\n };\n }\n\n return null;\n }\n\n /**\n * Check if a string is a cross-project reference\n */\n isCrossProjectReference(value: string): boolean {\n return this.parseReference(value) !== null;\n }\n\n /**\n * Resolve a reference to its actual value from the registry\n */\n async resolve(ref: string): Promise<string> {\n const parsed = this.parseReference(ref);\n if (!parsed) {\n throw new Error(`Invalid cross-project reference: ${ref}`);\n }\n\n // Find the project\n const project = await this.registry.findProjectByName(parsed.projectName);\n if (!project) {\n throw new Error(`Project not found: ${parsed.projectName}`);\n }\n\n // Find the resource\n const resource = await this.registry.findResourceByRef(\n project.id,\n parsed.resourceName,\n parsed.network\n );\n\n if (!resource) {\n const location = parsed.network\n ? `${parsed.projectName}/${parsed.network}/${parsed.resourceName}`\n : `${parsed.projectName}/${parsed.resourceName}`;\n throw new Error(`Resource not found: ${location}`);\n }\n\n // Check if resource has outputs\n if (!resource.outputs) {\n throw new Error(\n `Resource \"${ref}\" has not been deployed (no outputs available)`\n );\n }\n\n // Get the property (or default)\n const property = parsed.property || this.getDefaultProperty(resource.type);\n const value = resource.outputs[property];\n\n if (value === undefined || value === null) {\n const available = Object.keys(resource.outputs).join(', ');\n throw new Error(\n `Property \"${property}\" not found in outputs for \"${ref}\". Available: ${available}`\n );\n }\n\n return String(value);\n }\n\n /**\n * Resolve a reference, returning the resource and value\n */\n async resolveWithResource(\n ref: string\n ): Promise<{ value: string; resource: RegistryResource }> {\n const parsed = this.parseReference(ref);\n if (!parsed) {\n throw new Error(`Invalid cross-project reference: ${ref}`);\n }\n\n const project = await this.registry.findProjectByName(parsed.projectName);\n if (!project) {\n throw new Error(`Project not found: ${parsed.projectName}`);\n }\n\n const resource = await this.registry.findResourceByRef(\n project.id,\n parsed.resourceName,\n parsed.network\n );\n\n if (!resource) {\n throw new Error(`Resource not found in reference: ${ref}`);\n }\n\n if (!resource.outputs) {\n throw new Error(`Resource \"${ref}\" has not been deployed`);\n }\n\n const property = parsed.property || this.getDefaultProperty(resource.type);\n const value = resource.outputs[property];\n\n if (value === undefined || value === null) {\n throw new Error(`Property \"${property}\" not found for \"${ref}\"`);\n }\n\n return {\n value: String(value),\n resource,\n };\n }\n\n /**\n * Validate that a reference can be resolved\n * Returns null if valid, error message if invalid\n */\n async validate(ref: string): Promise<string | null> {\n try {\n await this.resolve(ref);\n return null;\n } catch (error) {\n return error instanceof Error ? error.message : 'Unknown error';\n }\n }\n\n /**\n * Find all cross-project references in an object\n */\n findReferences(obj: Record<string, unknown>): string[] {\n const refs: string[] = [];\n\n const walk = (value: unknown) => {\n if (typeof value === 'string' && this.isCrossProjectReference(value)) {\n refs.push(value);\n } else if (Array.isArray(value)) {\n value.forEach(walk);\n } else if (value && typeof value === 'object') {\n Object.values(value).forEach(walk);\n }\n };\n\n walk(obj);\n return refs;\n }\n\n /**\n * Resolve all cross-project references in an object\n */\n async resolveAll(obj: Record<string, unknown>): Promise<Record<string, unknown>> {\n const resolveValue = async (value: unknown): Promise<unknown> => {\n if (typeof value === 'string' && this.isCrossProjectReference(value)) {\n return this.resolve(value);\n } else if (Array.isArray(value)) {\n return Promise.all(value.map(resolveValue));\n } else if (value && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = await resolveValue(v);\n }\n return result;\n }\n return value;\n };\n\n return (await resolveValue(obj)) as Record<string, unknown>;\n }\n\n /**\n * Get the default output property for a resource type\n */\n private getDefaultProperty(type: ResourceLogicalType): string {\n return DEFAULT_OUTPUTS[type] || 'name';\n }\n}\n","/**\n * stacksolo scaffold\n *\n * Generate local development environment from config\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport * as path from 'path';\nimport { parseConfig, validateConfig } from '@stacksolo/blueprint';\nimport {\n generateScaffold,\n writeScaffoldFiles,\n createLocalStorageDirs,\n updateGitignore,\n} from '../../scaffold/generators';\n\nconst STACKSOLO_DIR = '.stacksolo';\nconst CONFIG_FILENAME = 'stacksolo.config.json';\n\nfunction getConfigPath(): string {\n return path.join(process.cwd(), STACKSOLO_DIR, CONFIG_FILENAME);\n}\n\nexport const scaffoldCommand = new Command('scaffold')\n .description('Generate local development environment from config')\n .option('--env-only', 'Generate only .env files')\n .option('--docker-only', 'Generate only docker-compose.yml')\n .option('--services-only', 'Generate only service directories')\n .option('-f, --force', 'Overwrite existing files')\n .option('-d, --dry-run', 'Preview what would be generated without writing files')\n .action(async (options) => {\n const configPath = getConfigPath();\n const targetDir = process.cwd();\n\n // Check for config file\n const spinner = ora('Reading configuration...').start();\n\n let config;\n try {\n config = parseConfig(configPath);\n spinner.succeed('Configuration loaded');\n } catch (error) {\n spinner.fail(`Could not read ${STACKSOLO_DIR}/${CONFIG_FILENAME}`);\n console.log(chalk.gray(`\\n ${error}\\n`));\n console.log(chalk.yellow(' Run `stacksolo init` to create a configuration file.\\n'));\n process.exit(1);\n }\n\n // Validate config\n const validation = validateConfig(config);\n if (!validation.valid) {\n console.log(chalk.red('\\n Configuration has errors:\\n'));\n validation.errors.forEach((err) => {\n console.log(chalk.red(` - ${err.path}: ${err.message}`));\n });\n console.log(chalk.yellow('\\n Run `stacksolo config validate` for details.\\n'));\n process.exit(1);\n }\n\n // Generate scaffold\n const scaffoldSpinner = ora('Generating scaffold...').start();\n\n const result = generateScaffold(config, {\n targetDir,\n force: options.force,\n envOnly: options.envOnly,\n dockerOnly: options.dockerOnly,\n servicesOnly: options.servicesOnly,\n });\n\n scaffoldSpinner.succeed('Scaffold generated');\n\n // Dry run - just show what would be created\n if (options.dryRun) {\n console.log(chalk.bold('\\n Files that would be created:\\n'));\n\n result.files.forEach((file) => {\n console.log(chalk.white(` ${file.path}`));\n });\n\n console.log(chalk.bold('\\n Summary:\\n'));\n console.log(chalk.gray(` Environment variables: ${result.summary.envVars}`));\n console.log(chalk.gray(` Docker services: ${result.summary.dockerServices}`));\n console.log(chalk.gray(` Service directories: ${result.summary.serviceDirectories}`));\n console.log(chalk.gray(` UI directories: ${result.summary.uiDirectories}`));\n console.log('');\n return;\n }\n\n // Write files\n const writeSpinner = ora('Writing files...').start();\n\n try {\n const { written, skipped } = await writeScaffoldFiles(\n result.files,\n targetDir,\n options.force\n );\n\n // Create local storage directories for buckets\n const storageDirs = await createLocalStorageDirs(config, targetDir);\n\n // Update .gitignore\n await updateGitignore(targetDir);\n\n writeSpinner.succeed(`Created ${written.length} files`);\n\n // Show what was created\n console.log(chalk.bold('\\n Created:\\n'));\n\n if (written.length > 0) {\n written.forEach((file) => {\n console.log(chalk.green(` ✓ ${file}`));\n });\n }\n\n if (storageDirs.length > 0) {\n console.log(chalk.cyan('\\n Storage directories:\\n'));\n storageDirs.forEach((dir) => {\n console.log(chalk.green(` ✓ ${dir}/`));\n });\n }\n\n if (skipped.length > 0) {\n console.log(chalk.yellow('\\n Skipped (already exist):\\n'));\n skipped.forEach((file) => {\n console.log(chalk.yellow(` - ${file}`));\n });\n console.log(chalk.gray('\\n Use --force to overwrite existing files'));\n }\n\n // Show summary\n console.log(chalk.bold('\\n Summary:\\n'));\n console.log(chalk.gray(` Environment variables: ${result.summary.envVars}`));\n console.log(chalk.gray(` Docker services: ${result.summary.dockerServices}`));\n console.log(chalk.gray(` Service directories: ${result.summary.serviceDirectories}`));\n console.log(chalk.gray(` UI directories: ${result.summary.uiDirectories}`));\n\n // Show next steps\n console.log(chalk.bold('\\n Next steps:\\n'));\n\n let step = 1;\n\n if (result.summary.dockerServices > 0) {\n console.log(chalk.white(` ${step}. Start local services:`));\n console.log(chalk.cyan(' docker-compose up -d\\n'));\n step++;\n }\n\n if (result.summary.serviceDirectories > 0) {\n console.log(chalk.white(` ${step}. Install service dependencies:`));\n console.log(chalk.cyan(' cd services/<name> && npm install\\n'));\n step++;\n }\n\n if (result.summary.uiDirectories > 0) {\n console.log(chalk.white(` ${step}. Install UI dependencies:`));\n console.log(chalk.cyan(' cd <ui-dir> && npm install\\n'));\n step++;\n }\n\n console.log(chalk.white(` ${step}. Update .env.local with real secret values\\n`));\n step++;\n\n if (result.summary.serviceDirectories > 0) {\n console.log(chalk.white(` ${step}. Start API development:`));\n console.log(chalk.cyan(' cd services/<name> && npm run dev\\n'));\n step++;\n }\n\n if (result.summary.uiDirectories > 0) {\n console.log(chalk.white(` ${step}. Start UI development:`));\n console.log(chalk.cyan(' cd <ui-dir> && npm run dev\\n'));\n }\n\n } catch (error) {\n writeSpinner.fail('Failed to write files');\n console.log(chalk.red(`\\n Error: ${error}\\n`));\n process.exit(1);\n }\n });\n","/**\n * StackSolo Blueprint Parser\n * Reads and validates stacksolo.config.json\n */\n\nimport { readFileSync, existsSync } from 'fs';\nimport { resolve } from 'path';\nimport type {\n StackSoloConfig,\n ValidationResult,\n ValidationError,\n ProjectConfig,\n NetworkConfig,\n ContainerConfig,\n FunctionConfig,\n DatabaseConfig,\n CacheConfig,\n BucketConfig,\n SecretConfig,\n TopicConfig,\n QueueConfig,\n CronConfig,\n} from './schema.js';\n\nconst CONFIG_FILENAMES = [\n 'stacksolo.config.json',\n 'stacksolo.json',\n '.stacksolo.json',\n];\n\n/**\n * Find the config file in the given directory\n */\nexport function findConfigFile(dir: string): string | null {\n for (const filename of CONFIG_FILENAMES) {\n const filepath = resolve(dir, filename);\n if (existsSync(filepath)) {\n return filepath;\n }\n }\n return null;\n}\n\n/**\n * Parse the config file from a path\n */\nexport function parseConfig(configPath: string): StackSoloConfig {\n if (!existsSync(configPath)) {\n throw new Error(`Config file not found: ${configPath}`);\n }\n\n const content = readFileSync(configPath, 'utf-8');\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch (err) {\n throw new Error(`Invalid JSON in config file: ${(err as Error).message}`);\n }\n\n return parsed as StackSoloConfig;\n}\n\n/**\n * Parse config from a directory (auto-discovers config file)\n */\nexport function parseConfigFromDir(dir: string): StackSoloConfig {\n const configPath = findConfigFile(dir);\n if (!configPath) {\n throw new Error(\n `No config file found in ${dir}. Expected one of: ${CONFIG_FILENAMES.join(', ')}`\n );\n }\n return parseConfig(configPath);\n}\n\n// =============================================================================\n// Validation\n// =============================================================================\n\n/**\n * Validate the entire config\n */\nexport function validateConfig(config: StackSoloConfig): ValidationResult {\n const errors: ValidationError[] = [];\n\n // Check root structure\n if (!config.project) {\n errors.push({ path: 'project', message: 'project is required' });\n return { valid: false, errors };\n }\n\n // Validate project\n validateProject(config.project, errors);\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nfunction validateProject(project: ProjectConfig, errors: ValidationError[]): void {\n // Required fields\n if (!project.name) {\n errors.push({ path: 'project.name', message: 'name is required' });\n } else if (!isValidResourceName(project.name)) {\n errors.push({\n path: 'project.name',\n message: 'name must be lowercase alphanumeric with hyphens, 1-63 chars',\n value: project.name,\n });\n }\n\n if (!project.region) {\n errors.push({ path: 'project.region', message: 'region is required' });\n }\n\n if (!project.gcpProjectId) {\n errors.push({ path: 'project.gcpProjectId', message: 'gcpProjectId is required' });\n }\n\n // Validate buckets\n if (project.buckets) {\n project.buckets.forEach((bucket, i) => {\n validateBucket(bucket, `project.buckets[${i}]`, errors);\n });\n }\n\n // Validate secrets\n if (project.secrets) {\n project.secrets.forEach((secret, i) => {\n validateSecret(secret, `project.secrets[${i}]`, errors);\n });\n }\n\n // Validate topics\n if (project.topics) {\n project.topics.forEach((topic, i) => {\n validateTopic(topic, `project.topics[${i}]`, errors);\n });\n }\n\n // Validate queues\n if (project.queues) {\n project.queues.forEach((queue, i) => {\n validateQueue(queue, `project.queues[${i}]`, errors);\n });\n }\n\n // Validate crons\n if (project.crons) {\n project.crons.forEach((cron, i) => {\n validateCron(cron, `project.crons[${i}]`, errors);\n });\n }\n\n // Validate networks\n if (project.networks) {\n project.networks.forEach((network, i) => {\n validateNetwork(network, `project.networks[${i}]`, errors);\n });\n }\n\n // Check for duplicate names across all resources\n checkDuplicateNames(project, errors);\n}\n\nfunction validateBucket(bucket: BucketConfig, path: string, errors: ValidationError[]): void {\n if (!bucket.name) {\n errors.push({ path: `${path}.name`, message: 'name is required' });\n } else if (!isValidBucketName(bucket.name)) {\n errors.push({\n path: `${path}.name`,\n message: 'bucket name must be 3-63 chars, lowercase alphanumeric with hyphens/underscores',\n value: bucket.name,\n });\n }\n\n if (bucket.storageClass && !['STANDARD', 'NEARLINE', 'COLDLINE', 'ARCHIVE'].includes(bucket.storageClass)) {\n errors.push({\n path: `${path}.storageClass`,\n message: 'storageClass must be STANDARD, NEARLINE, COLDLINE, or ARCHIVE',\n value: bucket.storageClass,\n });\n }\n}\n\nfunction validateSecret(secret: SecretConfig, path: string, errors: ValidationError[]): void {\n if (!secret.name) {\n errors.push({ path: `${path}.name`, message: 'name is required' });\n } else if (!isValidResourceName(secret.name)) {\n errors.push({\n path: `${path}.name`,\n message: 'name must be lowercase alphanumeric with hyphens, 1-63 chars',\n value: secret.name,\n });\n }\n}\n\nfunction validateTopic(topic: TopicConfig, path: string, errors: ValidationError[]): void {\n if (!topic.name) {\n errors.push({ path: `${path}.name`, message: 'name is required' });\n } else if (!isValidResourceName(topic.name)) {\n errors.push({\n path: `${path}.name`,\n message: 'name must be lowercase alphanumeric with hyphens, 1-63 chars',\n value: topic.name,\n });\n }\n}\n\nfunction validateQueue(queue: QueueConfig, path: string, errors: ValidationError[]): void {\n if (!queue.name) {\n errors.push({ path: `${path}.name`, message: 'name is required' });\n } else if (!isValidResourceName(queue.name)) {\n errors.push({\n path: `${path}.name`,\n message: 'name must be lowercase alphanumeric with hyphens, 1-63 chars',\n value: queue.name,\n });\n }\n}\n\nfunction validateCron(cron: CronConfig, path: string, errors: ValidationError[]): void {\n if (!cron.name) {\n errors.push({ path: `${path}.name`, message: 'name is required' });\n }\n\n if (!cron.schedule) {\n errors.push({ path: `${path}.schedule`, message: 'schedule is required' });\n } else if (!isValidCronExpression(cron.schedule)) {\n errors.push({\n path: `${path}.schedule`,\n message: 'schedule must be a valid cron expression',\n value: cron.schedule,\n });\n }\n\n if (!cron.target) {\n errors.push({ path: `${path}.target`, message: 'target is required' });\n }\n}\n\nfunction validateNetwork(network: NetworkConfig, path: string, errors: ValidationError[]): void {\n if (!network.name) {\n errors.push({ path: `${path}.name`, message: 'name is required' });\n } else if (!isValidResourceName(network.name)) {\n errors.push({\n path: `${path}.name`,\n message: 'name must be lowercase alphanumeric with hyphens, 1-63 chars',\n value: network.name,\n });\n }\n\n // Validate containers\n if (network.containers) {\n network.containers.forEach((container, i) => {\n validateContainer(container, `${path}.containers[${i}]`, errors);\n });\n }\n\n // Validate functions\n if (network.functions) {\n network.functions.forEach((fn, i) => {\n validateFunction(fn, `${path}.functions[${i}]`, errors);\n });\n }\n\n // Validate databases\n if (network.databases) {\n network.databases.forEach((db, i) => {\n validateDatabase(db, `${path}.databases[${i}]`, errors);\n });\n }\n\n // Validate caches\n if (network.caches) {\n network.caches.forEach((cache, i) => {\n validateCache(cache, `${path}.caches[${i}]`, errors);\n });\n }\n}\n\nfunction validateContainer(container: ContainerConfig, path: string, errors: ValidationError[]): void {\n if (!container.name) {\n errors.push({ path: `${path}.name`, message: 'name is required' });\n } else if (!isValidResourceName(container.name)) {\n errors.push({\n path: `${path}.name`,\n message: 'name must be lowercase alphanumeric with hyphens, 1-63 chars',\n value: container.name,\n });\n }\n\n // Validate memory format\n if (container.memory && !isValidMemoryFormat(container.memory)) {\n errors.push({\n path: `${path}.memory`,\n message: 'memory must be in format like 256Mi, 1Gi, 2Gi',\n value: container.memory,\n });\n }\n\n // Validate env references\n if (container.env) {\n validateEnvReferences(container.env, `${path}.env`, errors);\n }\n}\n\nfunction validateFunction(fn: FunctionConfig, path: string, errors: ValidationError[]): void {\n if (!fn.name) {\n errors.push({ path: `${path}.name`, message: 'name is required' });\n } else if (!isValidResourceName(fn.name)) {\n errors.push({\n path: `${path}.name`,\n message: 'name must be lowercase alphanumeric with hyphens, 1-63 chars',\n value: fn.name,\n });\n }\n\n // Validate runtime\n const validRuntimes = ['nodejs20', 'nodejs18', 'python311', 'python310', 'go121', 'go120'];\n if (fn.runtime && !validRuntimes.includes(fn.runtime)) {\n errors.push({\n path: `${path}.runtime`,\n message: `runtime must be one of: ${validRuntimes.join(', ')}`,\n value: fn.runtime,\n });\n }\n\n // Validate env references\n if (fn.env) {\n validateEnvReferences(fn.env, `${path}.env`, errors);\n }\n}\n\nfunction validateDatabase(db: DatabaseConfig, path: string, errors: ValidationError[]): void {\n if (!db.name) {\n errors.push({ path: `${path}.name`, message: 'name is required' });\n } else if (!isValidResourceName(db.name)) {\n errors.push({\n path: `${path}.name`,\n message: 'name must be lowercase alphanumeric with hyphens, 1-63 chars',\n value: db.name,\n });\n }\n\n // Validate database version\n const validVersions = ['POSTGRES_15', 'POSTGRES_14', 'MYSQL_8_0', 'MYSQL_5_7'];\n if (db.databaseVersion && !validVersions.includes(db.databaseVersion)) {\n errors.push({\n path: `${path}.databaseVersion`,\n message: `databaseVersion must be one of: ${validVersions.join(', ')}`,\n value: db.databaseVersion,\n });\n }\n}\n\nfunction validateCache(cache: CacheConfig, path: string, errors: ValidationError[]): void {\n if (!cache.name) {\n errors.push({ path: `${path}.name`, message: 'name is required' });\n } else if (!isValidResourceName(cache.name)) {\n errors.push({\n path: `${path}.name`,\n message: 'name must be lowercase alphanumeric with hyphens, 1-63 chars',\n value: cache.name,\n });\n }\n\n // Validate tier\n if (cache.tier && !['BASIC', 'STANDARD_HA'].includes(cache.tier)) {\n errors.push({\n path: `${path}.tier`,\n message: 'tier must be BASIC or STANDARD_HA',\n value: cache.tier,\n });\n }\n}\n\nfunction validateEnvReferences(env: Record<string, string>, path: string, errors: ValidationError[]): void {\n for (const [key, value] of Object.entries(env)) {\n if (value.startsWith('@')) {\n // Validate reference format\n if (!isValidReference(value)) {\n errors.push({\n path: `${path}.${key}`,\n message: 'invalid reference format. Expected @type/name or @type/name.property',\n value,\n });\n }\n }\n }\n}\n\nfunction checkDuplicateNames(project: ProjectConfig, errors: ValidationError[]): void {\n const seen = new Map<string, string>(); // name -> path\n\n const check = (name: string, path: string) => {\n if (seen.has(name)) {\n errors.push({\n path,\n message: `duplicate resource name \"${name}\" (also defined at ${seen.get(name)})`,\n value: name,\n });\n } else {\n seen.set(name, path);\n }\n };\n\n // Check global resources\n project.buckets?.forEach((b, i) => check(b.name, `project.buckets[${i}]`));\n project.secrets?.forEach((s, i) => check(s.name, `project.secrets[${i}]`));\n project.topics?.forEach((t, i) => check(t.name, `project.topics[${i}]`));\n project.queues?.forEach((q, i) => check(q.name, `project.queues[${i}]`));\n project.crons?.forEach((c, i) => check(c.name, `project.crons[${i}]`));\n\n // Check network resources (scoped by network)\n project.networks?.forEach((network, ni) => {\n const networkSeen = new Map<string, string>();\n const checkNetwork = (name: string, path: string) => {\n if (networkSeen.has(name)) {\n errors.push({\n path,\n message: `duplicate resource name \"${name}\" in network \"${network.name}\" (also at ${networkSeen.get(name)})`,\n value: name,\n });\n } else {\n networkSeen.set(name, path);\n }\n };\n\n network.containers?.forEach((c, i) => checkNetwork(c.name, `project.networks[${ni}].containers[${i}]`));\n network.functions?.forEach((f, i) => checkNetwork(f.name, `project.networks[${ni}].functions[${i}]`));\n network.databases?.forEach((d, i) => checkNetwork(d.name, `project.networks[${ni}].databases[${i}]`));\n network.caches?.forEach((c, i) => checkNetwork(c.name, `project.networks[${ni}].caches[${i}]`));\n });\n}\n\n// =============================================================================\n// Validation Helpers\n// =============================================================================\n\nfunction isValidResourceName(name: string): boolean {\n // GCP resource names: lowercase, alphanumeric, hyphens, 1-63 chars\n return /^[a-z][a-z0-9-]{0,62}$/.test(name);\n}\n\nfunction isValidBucketName(name: string): boolean {\n // Bucket names: 3-63 chars, lowercase, alphanumeric, hyphens, underscores\n return /^[a-z0-9][a-z0-9_-]{1,61}[a-z0-9]$/.test(name);\n}\n\nfunction isValidCronExpression(expr: string): boolean {\n // Basic cron validation (5 or 6 fields)\n const parts = expr.trim().split(/\\s+/);\n return parts.length >= 5 && parts.length <= 6;\n}\n\nfunction isValidMemoryFormat(memory: string): boolean {\n return /^\\d+(Mi|Gi)$/.test(memory);\n}\n\nfunction isValidReference(ref: string): boolean {\n // @type/name or @type/name.property\n return /^@[a-z]+\\/[a-z0-9-]+(\\.[a-zA-Z]+)?$/.test(ref);\n}\n","/**\n * StackSolo Blueprint Resolver\n * Expands config into individual resources with proper typing\n */\n\nimport type {\n StackSoloConfig,\n ProjectConfig,\n NetworkConfig,\n ResolvedResource,\n ResolvedConfig,\n BucketConfig,\n SecretConfig,\n TopicConfig,\n QueueConfig,\n CronConfig,\n ContainerConfig,\n FunctionConfig,\n DatabaseConfig,\n CacheConfig,\n ServiceAccountConfig,\n SubnetConfig,\n FirewallRuleConfig,\n LoadBalancerRouteConfig,\n UIConfig,\n} from './schema.js';\n\n/**\n * Resolve a StackSolo config into individual resources\n */\nexport function resolveConfig(config: StackSoloConfig): ResolvedConfig {\n const resources: ResolvedResource[] = [];\n const project = config.project;\n\n // Extract project info\n const projectInfo = {\n name: project.name,\n region: project.region,\n gcpProjectId: project.gcpProjectId,\n };\n\n // CDKTF backend uses composite resources\n if (project.backend === 'cdktf') {\n return resolveCdktfConfig(config, projectInfo);\n }\n\n // Resolve global resources first (no network dependency)\n if (project.serviceAccount) {\n resources.push(resolveServiceAccount(project.serviceAccount, projectInfo.region));\n }\n\n if (project.buckets) {\n for (const bucket of project.buckets) {\n resources.push(resolveBucket(bucket, projectInfo.region));\n }\n }\n\n if (project.secrets) {\n for (const secret of project.secrets) {\n resources.push(resolveSecret(secret));\n }\n }\n\n if (project.topics) {\n for (const topic of project.topics) {\n resources.push(resolveTopic(topic));\n }\n }\n\n if (project.queues) {\n for (const queue of project.queues) {\n resources.push(resolveQueue(queue, projectInfo.region));\n }\n }\n\n // Resolve networks and their resources\n if (project.networks) {\n for (const network of project.networks) {\n resources.push(...resolveNetwork(network, projectInfo.region));\n }\n }\n\n // Resolve crons last (they reference other resources)\n if (project.crons) {\n for (const cron of project.crons) {\n resources.push(resolveCron(cron, projectInfo.region));\n }\n }\n\n return {\n project: projectInfo,\n resources,\n order: [], // Will be filled by dependency resolver\n };\n}\n\n// =============================================================================\n// Resource Resolvers\n// =============================================================================\n\nfunction resolveServiceAccount(sa: ServiceAccountConfig, region: string): ResolvedResource {\n return {\n id: `service-account-${sa.name}`,\n type: 'gcp:service_account',\n name: sa.name,\n config: {\n name: sa.name,\n displayName: sa.displayName,\n description: sa.description,\n createKey: sa.createKey,\n },\n dependsOn: [],\n };\n}\n\nfunction resolveBucket(bucket: BucketConfig, defaultRegion: string): ResolvedResource {\n return {\n id: `bucket-${bucket.name}`,\n type: 'gcp:storage_bucket',\n name: bucket.name,\n config: {\n name: bucket.name,\n location: bucket.location || defaultRegion,\n storageClass: bucket.storageClass || 'STANDARD',\n versioning: bucket.versioning ?? false,\n uniformBucketLevelAccess: bucket.uniformBucketLevelAccess ?? true,\n publicAccess: bucket.publicAccess ?? false,\n cors: bucket.cors,\n lifecycle: bucket.lifecycle,\n },\n dependsOn: [],\n };\n}\n\nfunction resolveSecret(secret: SecretConfig): ResolvedResource {\n return {\n id: `secret-${secret.name}`,\n type: 'gcp:secret',\n name: secret.name,\n config: {\n name: secret.name,\n value: secret.value,\n labels: secret.labels,\n },\n dependsOn: [],\n };\n}\n\nfunction resolveTopic(topic: TopicConfig): ResolvedResource {\n return {\n id: `topic-${topic.name}`,\n type: 'gcp:pubsub_topic',\n name: topic.name,\n config: {\n name: topic.name,\n messageRetentionDuration: topic.messageRetentionDuration,\n labels: topic.labels,\n },\n dependsOn: [],\n };\n}\n\nfunction resolveQueue(queue: QueueConfig, defaultRegion: string): ResolvedResource {\n return {\n id: `queue-${queue.name}`,\n type: 'gcp:cloud_tasks',\n name: queue.name,\n config: {\n name: queue.name,\n location: queue.location || defaultRegion,\n rateLimits: queue.rateLimits,\n retryConfig: queue.retryConfig,\n },\n dependsOn: [],\n };\n}\n\nfunction resolveCron(cron: CronConfig, defaultRegion: string): ResolvedResource {\n // Parse target to determine dependencies\n const dependsOn: string[] = [];\n\n if (cron.target.startsWith('@')) {\n // Reference format: @container/name or @function/name\n const match = cron.target.match(/^@(container|function)\\/([a-z0-9-]+)/);\n if (match) {\n const [, type, name] = match;\n dependsOn.push(`${type}-${name}`);\n }\n } else if (cron.target.includes('/')) {\n // Network/resource format: main/api\n const [network, resource] = cron.target.split('/');\n // Could be container or function - we'll resolve this later\n dependsOn.push(`container-${resource}`);\n dependsOn.push(`function-${resource}`);\n }\n\n return {\n id: `cron-${cron.name}`,\n type: 'gcp:scheduler_job',\n name: cron.name,\n config: {\n name: cron.name,\n schedule: cron.schedule,\n timezone: cron.timezone || 'UTC',\n description: cron.description,\n target: cron.target,\n path: cron.path,\n httpMethod: cron.method || 'GET',\n httpBody: cron.body,\n httpHeaders: cron.headers,\n retryCount: cron.retryCount ?? 3,\n attemptDeadline: cron.attemptDeadline || '180s',\n },\n dependsOn,\n };\n}\n\n// =============================================================================\n// Network Resources\n// =============================================================================\n\nfunction resolveNetwork(network: NetworkConfig, defaultRegion: string): ResolvedResource[] {\n const resources: ResolvedResource[] = [];\n const networkId = `network-${network.name}`;\n const registryId = `registry-${network.name}`;\n\n // Create the VPC network\n resources.push({\n id: networkId,\n type: 'gcp:vpc_network',\n name: network.name,\n config: {\n name: network.name,\n description: network.description,\n autoCreateSubnetworks: network.autoCreateSubnetworks ?? false,\n routingMode: network.routingMode || 'REGIONAL',\n mtu: network.mtu || 1460,\n },\n dependsOn: [],\n });\n\n // Create subnets\n if (network.subnets) {\n for (const subnet of network.subnets) {\n resources.push(resolveSubnet(subnet, network.name, defaultRegion, networkId));\n }\n }\n\n // Create firewall rules\n if (network.firewallRules) {\n for (const rule of network.firewallRules) {\n resources.push(resolveFirewallRule(rule, network.name, networkId));\n }\n }\n\n // Auto-create Artifact Registry if containers or functions exist\n const hasContainers = network.containers && network.containers.length > 0;\n const hasFunctions = network.functions && network.functions.length > 0;\n\n if (hasContainers || hasFunctions) {\n resources.push({\n id: registryId,\n type: 'gcp:artifact_registry',\n name: `${network.name}-registry`,\n config: {\n name: `${network.name}-registry`,\n location: defaultRegion,\n format: 'DOCKER',\n description: `Container registry for ${network.name} network`,\n },\n dependsOn: [networkId],\n network: network.name,\n });\n }\n\n // Create containers (Cloud Run) - depend on registry if it exists\n if (network.containers) {\n for (const container of network.containers) {\n resources.push(resolveContainer(container, network.name, defaultRegion, networkId, registryId));\n }\n }\n\n // Create functions - depend on registry if it exists\n if (network.functions) {\n for (const fn of network.functions) {\n resources.push(resolveFunction(fn, network.name, defaultRegion, networkId, registryId));\n }\n }\n\n // Create databases\n if (network.databases) {\n for (const db of network.databases) {\n resources.push(resolveDatabase(db, network.name, defaultRegion, networkId));\n }\n }\n\n // Create caches\n if (network.caches) {\n for (const cache of network.caches) {\n resources.push(resolveCache(cache, network.name, defaultRegion, networkId));\n }\n }\n\n return resources;\n}\n\nfunction resolveSubnet(\n subnet: SubnetConfig,\n networkName: string,\n defaultRegion: string,\n networkId: string\n): ResolvedResource {\n return {\n id: `subnet-${subnet.name}`,\n type: 'gcp:vpc_subnet',\n name: subnet.name,\n config: {\n name: subnet.name,\n network: networkName,\n region: subnet.region || defaultRegion,\n ipCidrRange: subnet.ipCidrRange,\n privateIpGoogleAccess: subnet.privateGoogleAccess ?? true,\n logConfig: subnet.flowLogs ?? false,\n secondaryIpRanges: subnet.secondaryRanges,\n },\n dependsOn: [networkId],\n network: networkName,\n };\n}\n\nfunction resolveFirewallRule(\n rule: FirewallRuleConfig,\n networkName: string,\n networkId: string\n): ResolvedResource {\n return {\n id: `firewall-${rule.name}`,\n type: 'gcp:firewall',\n name: rule.name,\n config: {\n name: rule.name,\n network: networkName,\n direction: rule.direction || 'INGRESS',\n priority: rule.priority ?? 1000,\n action: rule.action || 'allow',\n protocol: rule.protocol || 'tcp',\n ports: rule.ports,\n sourceRanges: rule.sourceRanges,\n targetTags: rule.targetTags,\n description: rule.description,\n },\n dependsOn: [networkId],\n network: networkName,\n };\n}\n\nfunction resolveContainer(\n container: ContainerConfig,\n networkName: string,\n defaultRegion: string,\n networkId: string,\n registryId?: string\n): ResolvedResource {\n const dependsOn = [networkId];\n\n // Depend on registry if it exists\n if (registryId) {\n dependsOn.push(registryId);\n }\n\n // Parse env references to find dependencies\n if (container.env) {\n for (const value of Object.values(container.env)) {\n if (typeof value === 'string' && value.startsWith('@')) {\n const dep = parseReferenceToDependency(value);\n if (dep) dependsOn.push(dep);\n }\n }\n }\n\n // Parse secrets references\n if (container.secrets) {\n for (const secretRef of Object.values(container.secrets)) {\n if (typeof secretRef === 'string' && secretRef.startsWith('@')) {\n const dep = parseReferenceToDependency(secretRef);\n if (dep) dependsOn.push(dep);\n }\n }\n }\n\n return {\n id: `container-${container.name}`,\n type: 'gcp:cloud_run',\n name: container.name,\n config: {\n name: container.name,\n image: container.image,\n port: container.port || 8080,\n memory: container.memory || '512Mi',\n cpu: container.cpu || '1',\n minInstances: container.minInstances ?? 0,\n maxInstances: container.maxInstances ?? 100,\n concurrency: container.concurrency ?? 80,\n timeout: container.timeout || '300s',\n allowUnauthenticated: container.allowUnauthenticated ?? true,\n env: container.env,\n secrets: container.secrets,\n serviceAccount: container.serviceAccount,\n vpcConnector: container.vpcConnector,\n labels: container.labels,\n location: defaultRegion,\n },\n dependsOn: [...new Set(dependsOn)], // Deduplicate\n network: networkName,\n };\n}\n\nfunction resolveFunction(\n fn: FunctionConfig,\n networkName: string,\n defaultRegion: string,\n networkId: string,\n registryId?: string\n): ResolvedResource {\n const dependsOn = [networkId];\n\n // Depend on registry if it exists\n if (registryId) {\n dependsOn.push(registryId);\n }\n\n // Parse env references to find dependencies\n if (fn.env) {\n for (const value of Object.values(fn.env)) {\n if (typeof value === 'string' && value.startsWith('@')) {\n const dep = parseReferenceToDependency(value);\n if (dep) dependsOn.push(dep);\n }\n }\n }\n\n // Parse secrets references\n if (fn.secrets) {\n for (const secretRef of Object.values(fn.secrets)) {\n if (typeof secretRef === 'string' && secretRef.startsWith('@')) {\n const dep = parseReferenceToDependency(secretRef);\n if (dep) dependsOn.push(dep);\n }\n }\n }\n\n // Check trigger dependencies\n if (fn.trigger) {\n if (fn.trigger.type === 'pubsub' && fn.trigger.topic) {\n dependsOn.push(`topic-${fn.trigger.topic}`);\n }\n if (fn.trigger.type === 'storage' && fn.trigger.bucket) {\n dependsOn.push(`bucket-${fn.trigger.bucket}`);\n }\n }\n\n return {\n id: `function-${fn.name}`,\n type: 'gcp:cloud_function',\n name: fn.name,\n config: {\n name: fn.name,\n sourceDir: fn.sourceDir || `functions/${fn.name}`,\n entryPoint: fn.entryPoint || fn.name,\n runtime: fn.runtime || 'nodejs20',\n memory: fn.memory || '256Mi',\n minInstances: fn.minInstances ?? 0,\n maxInstances: fn.maxInstances ?? 100,\n timeout: fn.timeout || 60,\n allowUnauthenticated: fn.allowUnauthenticated ?? true,\n env: fn.env,\n secrets: fn.secrets,\n serviceAccount: fn.serviceAccount,\n vpcConnector: fn.vpcConnector,\n labels: fn.labels,\n location: defaultRegion,\n trigger: fn.trigger,\n },\n dependsOn: [...new Set(dependsOn)],\n network: networkName,\n };\n}\n\nfunction resolveDatabase(\n db: DatabaseConfig,\n networkName: string,\n defaultRegion: string,\n networkId: string\n): ResolvedResource {\n return {\n id: `database-${db.name}`,\n type: 'gcp:cloud_sql',\n name: db.name,\n config: {\n name: db.name,\n databaseVersion: db.databaseVersion || 'POSTGRES_15',\n tier: db.tier || 'db-f1-micro',\n diskSize: db.diskSize || 10,\n diskType: db.diskType || 'PD_SSD',\n databaseName: db.databaseName || db.name,\n enablePublicIp: db.enablePublicIp ?? false,\n requireSsl: db.requireSsl ?? true,\n backupEnabled: db.backupEnabled ?? true,\n backupStartTime: db.backupStartTime || '02:00',\n maintenanceWindowDay: db.maintenanceWindowDay ?? 7,\n maintenanceWindowHour: db.maintenanceWindowHour ?? 3,\n flags: db.flags,\n labels: db.labels,\n region: defaultRegion,\n network: networkName,\n },\n dependsOn: [networkId],\n network: networkName,\n };\n}\n\nfunction resolveCache(\n cache: CacheConfig,\n networkName: string,\n defaultRegion: string,\n networkId: string\n): ResolvedResource {\n return {\n id: `cache-${cache.name}`,\n type: 'gcp:memorystore',\n name: cache.name,\n config: {\n name: cache.name,\n tier: cache.tier || 'BASIC',\n memorySizeGb: cache.memorySizeGb || 1,\n redisVersion: cache.redisVersion || 'REDIS_7_0',\n authEnabled: cache.authEnabled ?? false,\n transitEncryptionMode: cache.transitEncryptionMode || 'DISABLED',\n labels: cache.labels,\n region: defaultRegion,\n authorizedNetwork: networkName,\n },\n dependsOn: [networkId],\n network: networkName,\n };\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Parse a reference string to a dependency ID\n */\nfunction parseReferenceToDependency(ref: string): string | null {\n // @secret/api-key -> secret-api-key\n // @database/db.connectionString -> database-db\n // @bucket/uploads -> bucket-uploads\n const match = ref.match(/^@([a-z]+)\\/([a-z0-9-]+)/);\n if (!match) return null;\n\n const [, type, name] = match;\n return `${type}-${name}`;\n}\n\n/**\n * Get all resource IDs from resolved config\n */\nexport function getResourceIds(resolved: ResolvedConfig): string[] {\n return resolved.resources.map((r) => r.id);\n}\n\n/**\n * Find a resource by ID\n */\nexport function findResource(resolved: ResolvedConfig, id: string): ResolvedResource | undefined {\n return resolved.resources.find((r) => r.id === id);\n}\n\n/**\n * Find resources by type\n */\nexport function findResourcesByType(resolved: ResolvedConfig, type: string): ResolvedResource[] {\n return resolved.resources.filter((r) => r.type === type);\n}\n\n/**\n * Find resources by network\n */\nexport function findResourcesByNetwork(resolved: ResolvedConfig, network: string): ResolvedResource[] {\n return resolved.resources.filter((r) => r.network === network);\n}\n\n// =============================================================================\n// CDKTF Backend Resolution\n// =============================================================================\n\n/**\n * Resolve config for CDKTF backend\n * Creates individual resources: vpc_network, vpc_connector, cloud_function, load_balancer\n */\nfunction resolveCdktfConfig(\n config: StackSoloConfig,\n projectInfo: { name: string; region: string; gcpProjectId: string }\n): ResolvedConfig {\n const project = config.project;\n const resources: ResolvedResource[] = [];\n\n // Validate CDKTF-compatible config\n const network = project.networks?.[0];\n if (!network) {\n throw new Error('CDKTF backend requires at least one network with a function');\n }\n\n const functions = network.functions || [];\n const uis = network.uis || [];\n\n if (functions.length === 0 && uis.length === 0) {\n throw new Error('CDKTF backend requires at least one function or UI in the network');\n }\n\n // Check for unsupported resources\n if (network.containers?.length) {\n throw new Error('CDKTF backend does not support containers. Use backend: \"pulumi\" instead.');\n }\n if (network.databases?.length) {\n throw new Error('CDKTF backend does not support databases. Use backend: \"pulumi\" instead.');\n }\n if (network.caches?.length) {\n throw new Error('CDKTF backend does not support caches. Use backend: \"pulumi\" instead.');\n }\n if (project.crons?.length) {\n throw new Error('CDKTF backend does not support crons. Use backend: \"pulumi\" instead.');\n }\n\n // Check if using existing network (skip VPC creation)\n const useExistingNetwork = network.existing === true;\n const networkName = useExistingNetwork ? network.name : `${projectInfo.name}-${network.name}`;\n const connectorName = `${projectInfo.name}-connector`;\n\n const networkId = `network-${network.name}`;\n const connectorId = `connector-${network.name}`;\n const lbName = `${projectInfo.name}-lb`;\n const loadBalancerId = `lb-${network.name}`;\n\n // 1. VPC Network (skip if using existing)\n if (!useExistingNetwork) {\n resources.push({\n id: networkId,\n type: 'gcp-cdktf:vpc_network',\n name: networkName,\n config: {\n name: networkName,\n description: network.description,\n autoCreateSubnetworks: network.autoCreateSubnetworks ?? true,\n },\n dependsOn: [],\n network: network.name,\n });\n }\n\n // 2. VPC Access Connector (references existing or new network by name)\n resources.push({\n id: connectorId,\n type: 'gcp-cdktf:vpc_connector',\n name: connectorName,\n config: {\n name: connectorName,\n region: projectInfo.region,\n network: networkName,\n existingNetwork: useExistingNetwork, // Flag to use data source instead of resource reference\n ipCidrRange: '10.8.0.0/28',\n minThroughput: 200,\n maxThroughput: 300,\n },\n dependsOn: useExistingNetwork ? [] : [networkId],\n network: network.name,\n });\n\n // 3. Cloud Functions (Gen2) - create one for each function in config\n const functionIds: string[] = [];\n const functionNames: string[] = [];\n\n for (const fn of functions) {\n const functionName = `${projectInfo.name}-${fn.name}`;\n const functionId = `function-${fn.name}`;\n functionIds.push(functionId);\n functionNames.push(functionName);\n\n resources.push({\n id: functionId,\n type: 'gcp-cdktf:cloud_function',\n name: functionName,\n config: {\n name: functionName,\n location: projectInfo.region,\n sourceDir: fn.sourceDir || `functions/${fn.name}`,\n entryPoint: fn.entryPoint || fn.name,\n runtime: fn.runtime || 'nodejs20',\n memory: fn.memory || '256Mi',\n timeout: fn.timeout || 60,\n minInstances: fn.minInstances ?? 0,\n maxInstances: fn.maxInstances ?? 100,\n vpcConnector: connectorName,\n allowUnauthenticated: fn.allowUnauthenticated ?? true,\n projectId: projectInfo.gcpProjectId,\n },\n dependsOn: [connectorId],\n network: network.name,\n });\n }\n\n // 4. Static UI Sites (Storage Website + CDN)\n const uiIds: string[] = [];\n const uiNames: string[] = [];\n\n for (const ui of uis) {\n const uiName = `${projectInfo.name}-${ui.name}`;\n const uiId = `ui-${ui.name}`;\n uiIds.push(uiId);\n uiNames.push(uiName);\n\n resources.push({\n id: uiId,\n type: 'gcp-cdktf:storage_website',\n name: uiName,\n config: {\n name: uiName,\n location: 'US', // Multi-region for CDN\n sourceDir: ui.sourceDir || `apps/${ui.name}`,\n framework: ui.framework,\n buildCommand: ui.buildCommand || 'npm run build',\n buildOutputDir: ui.buildOutputDir,\n indexDocument: ui.indexDocument || 'index.html',\n errorDocument: ui.errorDocument || 'index.html',\n enableCdn: true,\n projectId: projectInfo.gcpProjectId,\n },\n dependsOn: [],\n network: network.name,\n });\n }\n\n // 5. Load Balancer (HTTP) - routes to functions and UIs based on loadBalancer config\n // Build default routes if none specified\n let routes: LoadBalancerRouteConfig[];\n if (network.loadBalancer?.routes) {\n routes = network.loadBalancer.routes;\n } else if (functions.length > 0) {\n routes = [{ path: '/*', backend: functions[0].name }];\n } else if (uis.length > 0) {\n routes = [{ path: '/*', backend: uis[0].name }];\n } else {\n routes = [];\n }\n\n // Map routes to either function or UI backends\n const mappedRoutes = routes.map((r: LoadBalancerRouteConfig) => {\n // Check if backend is a UI\n const isUI = uis.some(ui => ui.name === r.backend);\n if (isUI) {\n return {\n path: r.path,\n uiName: `${projectInfo.name}-${r.backend}`,\n };\n }\n // Otherwise it's a function\n return {\n path: r.path,\n functionName: `${projectInfo.name}-${r.backend}`,\n };\n });\n\n // Only create load balancer if we have routes\n if (routes.length > 0) {\n resources.push({\n id: loadBalancerId,\n type: 'gcp-cdktf:load_balancer',\n name: lbName,\n config: {\n name: lbName,\n region: projectInfo.region,\n routes: mappedRoutes,\n // Keep single function for backwards compat (if functions exist)\n functionName: functionNames.length > 0 ? functionNames[0] : undefined,\n },\n dependsOn: [...functionIds, ...uiIds],\n network: network.name,\n });\n }\n\n return {\n project: projectInfo,\n resources,\n order: resources.map((r) => r.id),\n };\n}\n","/**\n * StackSolo Blueprint References\n * Parse and resolve @type/name.property references\n */\n\nimport type { Reference, ReferenceType, ResolvedResource } from './schema.js';\n\n/**\n * Reference output mappings\n * Maps reference types and properties to Pulumi output variable names\n */\nconst REFERENCE_OUTPUTS: Record<ReferenceType, Record<string, string>> = {\n secret: {\n default: 'secretId',\n id: 'secretId',\n name: 'secretName',\n version: 'secretVersionId',\n },\n database: {\n default: 'connectionString',\n connectionString: 'connectionString',\n privateIp: 'privateIp',\n publicIp: 'publicIp',\n instanceName: 'instanceName',\n name: 'databaseName',\n },\n bucket: {\n default: 'name',\n name: 'name',\n url: 'url',\n selfLink: 'selfLink',\n },\n cache: {\n default: 'host',\n host: 'host',\n port: 'port',\n connectionString: 'connectionString',\n authString: 'authString',\n },\n container: {\n default: 'url',\n url: 'url',\n name: 'name',\n },\n function: {\n default: 'url',\n url: 'url',\n name: 'name',\n },\n topic: {\n default: 'name',\n name: 'name',\n id: 'topicId',\n },\n queue: {\n default: 'name',\n name: 'name',\n id: 'queueId',\n },\n network: {\n default: 'selfLink',\n name: 'name',\n id: 'networkId',\n selfLink: 'selfLink',\n },\n ui: {\n default: 'url',\n url: 'url',\n bucketName: 'bucketName',\n name: 'name',\n },\n kernel: {\n default: 'url',\n url: 'url',\n authUrl: 'authUrl',\n natsUrl: 'natsUrl',\n },\n};\n\n/**\n * Parse a reference string into its components\n *\n * Examples:\n * \"@secret/api-key\" -> { type: 'secret', name: 'api-key' }\n * \"@database/db.connectionString\" -> { type: 'database', name: 'db', property: 'connectionString' }\n * \"@bucket/uploads.url\" -> { type: 'bucket', name: 'uploads', property: 'url' }\n */\nexport function parseReference(ref: string): Reference | null {\n if (!ref.startsWith('@')) {\n return null;\n }\n\n // Match @type/name or @type/name.property\n const match = ref.match(/^@([a-z]+)\\/([a-z0-9-]+)(?:\\.([a-zA-Z]+))?$/);\n if (!match) {\n return null;\n }\n\n const [, typeStr, name, property] = match;\n\n // Validate type\n const validTypes: ReferenceType[] = [\n 'secret', 'database', 'bucket', 'cache',\n 'container', 'function', 'topic', 'queue', 'network', 'ui', 'kernel'\n ];\n\n if (!validTypes.includes(typeStr as ReferenceType)) {\n return null;\n }\n\n return {\n type: typeStr as ReferenceType,\n name,\n property,\n };\n}\n\n/**\n * Check if a string is a reference\n */\nexport function isReference(value: string): boolean {\n return value.startsWith('@') && parseReference(value) !== null;\n}\n\n/**\n * Get the resource ID for a reference\n */\nexport function getReferenceResourceId(ref: Reference): string {\n return `${ref.type}-${ref.name}`;\n}\n\n/**\n * Get the Pulumi output variable name for a reference\n */\nexport function getReferenceOutputName(ref: Reference): string {\n const outputs = REFERENCE_OUTPUTS[ref.type];\n if (!outputs) {\n throw new Error(`Unknown reference type: ${ref.type}`);\n }\n\n const property = ref.property || 'default';\n const outputName = outputs[property];\n\n if (!outputName) {\n throw new Error(`Unknown property \"${property}\" for reference type \"${ref.type}\"`);\n }\n\n return outputName;\n}\n\n/**\n * Convert a resource name to a valid variable name\n */\nfunction toVariableName(name: string): string {\n return name.replace(/[^a-zA-Z0-9]/g, '_').replace(/^(\\d)/, '_$1');\n}\n\n/**\n * Resolve a reference to a Pulumi interpolation string\n *\n * Example:\n * \"@database/db.connectionString\" -> \"${dbConnectionString}\"\n */\nexport function resolveReferenceToPulumi(ref: Reference): string {\n const varName = toVariableName(ref.name);\n const outputName = getReferenceOutputName(ref);\n\n // Capitalize first letter of output name for the full variable\n const fullVarName = `${varName}${outputName.charAt(0).toUpperCase()}${outputName.slice(1)}`;\n\n return `\\${${fullVarName}}`;\n}\n\n/**\n * Resolve a reference string directly to Pulumi interpolation\n */\nexport function resolveReference(refString: string): string {\n const ref = parseReference(refString);\n if (!ref) {\n throw new Error(`Invalid reference: ${refString}`);\n }\n return resolveReferenceToPulumi(ref);\n}\n\n/**\n * Find all references in an env object\n */\nexport function findEnvReferences(env: Record<string, string>): Reference[] {\n const references: Reference[] = [];\n\n for (const value of Object.values(env)) {\n if (typeof value === 'string' && value.startsWith('@')) {\n const ref = parseReference(value);\n if (ref) {\n references.push(ref);\n }\n }\n }\n\n return references;\n}\n\n/**\n * Resolve all references in an env object to Pulumi interpolations\n */\nexport function resolveEnvReferences(env: Record<string, string>): Record<string, string> {\n const resolved: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(env)) {\n if (typeof value === 'string' && value.startsWith('@')) {\n const ref = parseReference(value);\n if (ref) {\n resolved[key] = resolveReferenceToPulumi(ref);\n } else {\n resolved[key] = value; // Keep as-is if not a valid reference\n }\n } else {\n resolved[key] = value;\n }\n }\n\n return resolved;\n}\n\n/**\n * Extract all dependencies from a resolved resource's config\n */\nexport function extractDependencies(resource: ResolvedResource): string[] {\n const deps = new Set<string>(resource.dependsOn);\n const config = resource.config as Record<string, unknown>;\n\n // Check env for references\n if (config.env && typeof config.env === 'object') {\n const env = config.env as Record<string, string>;\n for (const ref of findEnvReferences(env)) {\n deps.add(getReferenceResourceId(ref));\n }\n }\n\n // Check secrets for references\n if (config.secrets && typeof config.secrets === 'object') {\n const secrets = config.secrets as Record<string, string>;\n for (const ref of findEnvReferences(secrets)) {\n deps.add(getReferenceResourceId(ref));\n }\n }\n\n return [...deps];\n}\n\n/**\n * Validate that all references point to existing resources\n */\nexport function validateReferences(\n resources: ResolvedResource[]\n): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n const resourceIds = new Set(resources.map(r => r.id));\n\n for (const resource of resources) {\n const deps = extractDependencies(resource);\n for (const dep of deps) {\n if (!resourceIds.has(dep)) {\n errors.push(`Resource \"${resource.id}\" references non-existent resource \"${dep}\"`);\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","/**\n * StackSolo Blueprint Dependencies\n * Build dependency graph and topologically sort resources\n */\n\nimport type { ResolvedResource, ResolvedConfig } from './schema.js';\nimport { extractDependencies } from './references.js';\n\n/**\n * Dependency graph node\n */\ninterface GraphNode {\n id: string;\n resource: ResolvedResource;\n dependencies: Set<string>;\n dependents: Set<string>;\n}\n\n/**\n * Build a dependency graph from resolved resources\n */\nexport function buildDependencyGraph(resources: ResolvedResource[]): Map<string, GraphNode> {\n const graph = new Map<string, GraphNode>();\n\n // Create nodes\n for (const resource of resources) {\n graph.set(resource.id, {\n id: resource.id,\n resource,\n dependencies: new Set(),\n dependents: new Set(),\n });\n }\n\n // Add edges\n for (const resource of resources) {\n const node = graph.get(resource.id)!;\n const deps = extractDependencies(resource);\n\n for (const depId of deps) {\n // Only add if the dependency exists\n if (graph.has(depId)) {\n node.dependencies.add(depId);\n graph.get(depId)!.dependents.add(resource.id);\n }\n }\n }\n\n return graph;\n}\n\n/**\n * Detect cycles in the dependency graph\n * Returns the cycle path if found, null otherwise\n */\nexport function detectCycles(graph: Map<string, GraphNode>): string[] | null {\n const visited = new Set<string>();\n const recursionStack = new Set<string>();\n const path: string[] = [];\n\n function dfs(nodeId: string): boolean {\n visited.add(nodeId);\n recursionStack.add(nodeId);\n path.push(nodeId);\n\n const node = graph.get(nodeId);\n if (node) {\n for (const depId of node.dependencies) {\n if (!visited.has(depId)) {\n if (dfs(depId)) return true;\n } else if (recursionStack.has(depId)) {\n // Found a cycle\n const cycleStart = path.indexOf(depId);\n path.push(depId); // Complete the cycle\n return true;\n }\n }\n }\n\n path.pop();\n recursionStack.delete(nodeId);\n return false;\n }\n\n for (const nodeId of graph.keys()) {\n if (!visited.has(nodeId)) {\n if (dfs(nodeId)) {\n return path;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Topologically sort resources based on their dependencies\n * Returns resource IDs in the order they should be created\n */\nexport function topologicalSort(resources: ResolvedResource[]): string[] {\n const graph = buildDependencyGraph(resources);\n\n // Check for cycles\n const cycle = detectCycles(graph);\n if (cycle) {\n throw new Error(`Circular dependency detected: ${cycle.join(' -> ')}`);\n }\n\n const result: string[] = [];\n const visited = new Set<string>();\n\n function visit(nodeId: string) {\n if (visited.has(nodeId)) return;\n visited.add(nodeId);\n\n const node = graph.get(nodeId);\n if (node) {\n // Visit all dependencies first\n for (const depId of node.dependencies) {\n visit(depId);\n }\n }\n\n result.push(nodeId);\n }\n\n // Visit all nodes\n for (const nodeId of graph.keys()) {\n visit(nodeId);\n }\n\n return result;\n}\n\n/**\n * Get resources in creation order\n */\nexport function getResourcesInOrder(resolved: ResolvedConfig): ResolvedResource[] {\n const order = topologicalSort(resolved.resources);\n const resourceMap = new Map(resolved.resources.map(r => [r.id, r]));\n\n return order.map(id => resourceMap.get(id)!);\n}\n\n/**\n * Get resources that can be created in parallel (no dependencies on each other)\n * Returns arrays of resource IDs that can be created together\n */\nexport function getParallelBatches(resources: ResolvedResource[]): string[][] {\n const graph = buildDependencyGraph(resources);\n const batches: string[][] = [];\n const completed = new Set<string>();\n\n while (completed.size < resources.length) {\n const batch: string[] = [];\n\n for (const [id, node] of graph) {\n if (completed.has(id)) continue;\n\n // Check if all dependencies are completed\n const allDepsCompleted = [...node.dependencies].every(dep => completed.has(dep));\n if (allDepsCompleted) {\n batch.push(id);\n }\n }\n\n if (batch.length === 0 && completed.size < resources.length) {\n throw new Error('Unable to make progress - possible circular dependency');\n }\n\n batches.push(batch);\n batch.forEach(id => completed.add(id));\n }\n\n return batches;\n}\n\n/**\n * Get direct dependencies of a resource\n */\nexport function getDependencies(\n resources: ResolvedResource[],\n resourceId: string\n): ResolvedResource[] {\n const graph = buildDependencyGraph(resources);\n const node = graph.get(resourceId);\n if (!node) return [];\n\n const resourceMap = new Map(resources.map(r => [r.id, r]));\n return [...node.dependencies]\n .map(id => resourceMap.get(id))\n .filter((r): r is ResolvedResource => r !== undefined);\n}\n\n/**\n * Get direct dependents of a resource (resources that depend on it)\n */\nexport function getDependents(\n resources: ResolvedResource[],\n resourceId: string\n): ResolvedResource[] {\n const graph = buildDependencyGraph(resources);\n const node = graph.get(resourceId);\n if (!node) return [];\n\n const resourceMap = new Map(resources.map(r => [r.id, r]));\n return [...node.dependents]\n .map(id => resourceMap.get(id))\n .filter((r): r is ResolvedResource => r !== undefined);\n}\n\n/**\n * Get all transitive dependencies of a resource\n */\nexport function getTransitiveDependencies(\n resources: ResolvedResource[],\n resourceId: string\n): ResolvedResource[] {\n const graph = buildDependencyGraph(resources);\n const visited = new Set<string>();\n const result: string[] = [];\n\n function collect(id: string) {\n if (visited.has(id)) return;\n visited.add(id);\n\n const node = graph.get(id);\n if (node) {\n for (const depId of node.dependencies) {\n collect(depId);\n }\n }\n\n if (id !== resourceId) {\n result.push(id);\n }\n }\n\n collect(resourceId);\n\n const resourceMap = new Map(resources.map(r => [r.id, r]));\n return result\n .map(id => resourceMap.get(id))\n .filter((r): r is ResolvedResource => r !== undefined);\n}\n\n/**\n * Resolve config with topologically sorted order\n */\nexport function resolveWithOrder(resolved: ResolvedConfig): ResolvedConfig {\n return {\n ...resolved,\n order: topologicalSort(resolved.resources),\n };\n}\n","/**\n * Scaffold generators orchestrator\n * Coordinates generation of env files, docker-compose, and service directories\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { StackSoloConfig } from '@stacksolo/blueprint';\nimport { generateEnvFiles } from './env';\nimport { generateDockerCompose } from './docker-compose';\nimport { generateServiceScaffolds } from './services';\nimport type { ScaffoldOptions, ScaffoldResult, GeneratedFile } from './types';\n\nexport { generateEnvFiles } from './env';\nexport { generateDockerCompose } from './docker-compose';\nexport { generateServiceScaffolds } from './services';\nexport type { ScaffoldOptions, ScaffoldResult, GeneratedFile } from './types';\n\n/**\n * Generate all scaffold files from config\n */\nexport function generateScaffold(\n config: StackSoloConfig,\n options: Partial<ScaffoldOptions> = {}\n): ScaffoldResult {\n const files: GeneratedFile[] = [];\n const warnings: string[] = [];\n let envVarCount = 0;\n let dockerServiceCount = 0;\n let serviceDirectoryCount = 0;\n let uiDirectoryCount = 0;\n\n const generateEnv = !options.dockerOnly && !options.servicesOnly;\n const generateDocker = !options.envOnly && !options.servicesOnly;\n const generateServices = !options.envOnly && !options.dockerOnly;\n\n // Generate environment files\n if (generateEnv) {\n const envResult = generateEnvFiles(config);\n files.push(envResult.envLocal);\n files.push(envResult.envExample);\n files.push(envResult.envTs);\n // Count variables by parsing the content\n const envLocalLines = envResult.envLocal.content.split('\\n');\n envVarCount = envLocalLines.filter((line) => line.includes('=') && !line.startsWith('#')).length;\n }\n\n\n // Generate docker-compose\n if (generateDocker) {\n const dockerResult = generateDockerCompose(config);\n if (dockerResult.dockerCompose) {\n files.push(dockerResult.dockerCompose);\n dockerServiceCount = dockerResult.services.length;\n }\n }\n\n // Generate service scaffolds (containers, functions, UIs)\n if (generateServices) {\n const servicesResult = generateServiceScaffolds(config);\n files.push(...servicesResult.files);\n // Count services excluding UIs\n serviceDirectoryCount = servicesResult.services.filter(s => s.type !== 'ui').length;\n uiDirectoryCount = servicesResult.uiCount;\n }\n\n return {\n files,\n warnings,\n summary: {\n envVars: envVarCount,\n dockerServices: dockerServiceCount,\n serviceDirectories: serviceDirectoryCount,\n uiDirectories: uiDirectoryCount,\n },\n };\n}\n\n/**\n * Write scaffold files to disk\n */\nexport async function writeScaffoldFiles(\n files: GeneratedFile[],\n targetDir: string,\n force: boolean = false\n): Promise<{ written: string[]; skipped: string[] }> {\n const written: string[] = [];\n const skipped: string[] = [];\n\n for (const file of files) {\n const fullPath = path.join(targetDir, file.path);\n const dir = path.dirname(fullPath);\n\n // Create directory if needed\n await fs.mkdir(dir, { recursive: true });\n\n // Check if file exists\n const exists = await fs.stat(fullPath).then(() => true).catch(() => false);\n\n if (exists && !force) {\n skipped.push(file.path);\n continue;\n }\n\n await fs.writeFile(fullPath, file.content);\n written.push(file.path);\n }\n\n return { written, skipped };\n}\n\n/**\n * Create local storage directories for buckets\n */\nexport async function createLocalStorageDirs(\n config: StackSoloConfig,\n targetDir: string\n): Promise<string[]> {\n const created: string[] = [];\n\n for (const bucket of config.project.buckets || []) {\n const storagePath = path.join(targetDir, 'local-storage', bucket.name);\n await fs.mkdir(storagePath, { recursive: true });\n\n // Create .gitkeep to track empty directory\n await fs.writeFile(path.join(storagePath, '.gitkeep'), '');\n created.push(`local-storage/${bucket.name}`);\n }\n\n return created;\n}\n\n/**\n * Update .gitignore with scaffold entries\n */\nexport async function updateGitignore(targetDir: string): Promise<void> {\n const gitignorePath = path.join(targetDir, '.gitignore');\n const entriesToAdd = [\n '',\n '# StackSolo local development',\n '.env.local',\n '.stacksolo/',\n 'local-storage/',\n '',\n ];\n\n let content = '';\n try {\n content = await fs.readFile(gitignorePath, 'utf-8');\n } catch {\n // File doesn't exist, create new\n }\n\n // Check if already has stacksolo entries\n if (content.includes('# StackSolo local development')) {\n return;\n }\n\n content = content.trimEnd() + '\\n' + entriesToAdd.join('\\n');\n await fs.writeFile(gitignorePath, content);\n}\n","/**\n * Environment file generator\n * Generates .env.local and .env.example from config\n */\n\nimport type {\n StackSoloConfig,\n DatabaseConfig,\n CacheConfig,\n SecretConfig,\n BucketConfig,\n ContainerConfig,\n FunctionConfig,\n} from '@stacksolo/blueprint';\nimport type { EnvSection, EnvVariable, GeneratedFile } from './types';\n\ninterface EnvGeneratorResult {\n envLocal: GeneratedFile;\n envExample: GeneratedFile;\n envTs: GeneratedFile;\n}\n\n/**\n * Generate environment files from config\n */\nexport function generateEnvFiles(config: StackSoloConfig): EnvGeneratorResult {\n const sections: EnvSection[] = [];\n\n // Project info\n sections.push({\n header: 'Project',\n variables: [\n { name: 'PROJECT_NAME', value: config.project.name },\n { name: 'GCP_PROJECT_ID', value: config.project.gcpProjectId },\n { name: 'GCP_REGION', value: config.project.region },\n ],\n });\n\n // Collect all referenced resources from container/function env vars\n const referencedSecrets = new Set<string>();\n const referencedDatabases = new Set<string>();\n const referencedCaches = new Set<string>();\n const referencedBuckets = new Set<string>();\n\n // Scan all containers and functions for references\n for (const network of config.project.networks || []) {\n for (const container of network.containers || []) {\n collectReferences(container.env || {}, referencedSecrets, referencedDatabases, referencedCaches, referencedBuckets);\n }\n for (const func of network.functions || []) {\n collectReferences(func.env || {}, referencedSecrets, referencedDatabases, referencedCaches, referencedBuckets);\n }\n }\n\n // Database section\n const databases = collectDatabases(config);\n if (databases.length > 0) {\n sections.push({\n header: 'Database',\n variables: databases.flatMap((db) => generateDatabaseEnvVars(db)),\n });\n }\n\n // Cache section\n const caches = collectCaches(config);\n if (caches.length > 0) {\n sections.push({\n header: 'Cache',\n variables: caches.flatMap((cache) => generateCacheEnvVars(cache)),\n });\n }\n\n // Secrets section\n const secrets = config.project.secrets || [];\n if (secrets.length > 0) {\n sections.push({\n header: 'Secrets (replace with real values)',\n variables: secrets.map((secret) => generateSecretEnvVar(secret)),\n });\n }\n\n // Storage section\n const buckets = config.project.buckets || [];\n if (buckets.length > 0) {\n sections.push({\n header: 'Storage',\n variables: buckets.map((bucket) => generateBucketEnvVar(bucket)),\n });\n }\n\n const envLocalContent = generateEnvFileContent(sections, false);\n const envExampleContent = generateEnvFileContent(sections, true);\n const envTsContent = generateEnvTsContent(sections);\n\n return {\n envLocal: { path: '.env.local', content: envLocalContent },\n envExample: { path: '.env.example', content: envExampleContent },\n envTs: { path: 'lib/env.ts', content: envTsContent },\n };\n}\n\nfunction collectReferences(\n env: Record<string, string>,\n secrets: Set<string>,\n databases: Set<string>,\n caches: Set<string>,\n buckets: Set<string>\n): void {\n for (const value of Object.values(env)) {\n if (value.startsWith('@secret/')) {\n secrets.add(value.slice(8));\n } else if (value.startsWith('@database/')) {\n const parts = value.slice(10).split('.');\n databases.add(parts[0]);\n } else if (value.startsWith('@cache/')) {\n const parts = value.slice(7).split('.');\n caches.add(parts[0]);\n } else if (value.startsWith('@bucket/')) {\n const parts = value.slice(8).split('.');\n buckets.add(parts[0]);\n }\n }\n}\n\nfunction collectDatabases(config: StackSoloConfig): DatabaseConfig[] {\n const databases: DatabaseConfig[] = [];\n for (const network of config.project.networks || []) {\n for (const db of network.databases || []) {\n databases.push(db);\n }\n }\n return databases;\n}\n\nfunction collectCaches(config: StackSoloConfig): CacheConfig[] {\n const caches: CacheConfig[] = [];\n for (const network of config.project.networks || []) {\n for (const cache of network.caches || []) {\n caches.push(cache);\n }\n }\n return caches;\n}\n\nfunction generateDatabaseEnvVars(db: DatabaseConfig): EnvVariable[] {\n const prefix = toEnvVarName(db.name);\n const isPostgres = db.databaseVersion?.startsWith('POSTGRES') ?? true;\n const dbName = db.databaseName || 'app';\n const defaultPort = isPostgres ? '5432' : '3306';\n const protocol = isPostgres ? 'postgres' : 'mysql';\n\n return [\n {\n name: `${prefix}_HOST`,\n value: 'localhost',\n },\n {\n name: `${prefix}_PORT`,\n value: defaultPort,\n },\n {\n name: `${prefix}_USER`,\n value: isPostgres ? 'postgres' : 'root',\n },\n {\n name: `${prefix}_PASSWORD`,\n value: 'postgres',\n isSecret: true,\n },\n {\n name: `${prefix}_DATABASE`,\n value: dbName,\n },\n {\n name: `${prefix}_CONNECTION_STRING`,\n value: `${protocol}://${isPostgres ? 'postgres' : 'root'}:postgres@localhost:${defaultPort}/${dbName}`,\n },\n ];\n}\n\nfunction generateCacheEnvVars(cache: CacheConfig): EnvVariable[] {\n const prefix = toEnvVarName(cache.name);\n return [\n {\n name: `${prefix}_HOST`,\n value: 'localhost',\n },\n {\n name: `${prefix}_PORT`,\n value: '6379',\n },\n {\n name: `${prefix}_URL`,\n value: 'redis://localhost:6379',\n },\n ];\n}\n\nfunction generateSecretEnvVar(secret: SecretConfig): EnvVariable {\n const name = toEnvVarName(secret.name);\n return {\n name,\n value: `your-${secret.name}-here`,\n isSecret: true,\n comment: 'Replace with actual secret value',\n };\n}\n\nfunction generateBucketEnvVar(bucket: BucketConfig): EnvVariable {\n const name = `BUCKET_${toEnvVarName(bucket.name)}_PATH`;\n return {\n name,\n value: `./local-storage/${bucket.name}`,\n comment: 'Local filesystem path for development',\n };\n}\n\nfunction toEnvVarName(name: string): string {\n return name.toUpperCase().replace(/-/g, '_');\n}\n\nfunction generateEnvFileContent(sections: EnvSection[], isExample: boolean): string {\n const lines: string[] = [\n '# StackSolo Local Development Environment',\n `# Generated by: stacksolo scaffold`,\n `# ${isExample ? 'Template file - copy to .env.local and fill in secrets' : 'Local development values - DO NOT COMMIT'}`,\n '',\n ];\n\n for (const section of sections) {\n lines.push(`# ${section.header}`);\n for (const variable of section.variables) {\n if (variable.comment) {\n lines.push(`# ${variable.comment}`);\n }\n const value = isExample && variable.isSecret ? '' : variable.value;\n lines.push(`${variable.name}=${value}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nfunction generateEnvTsContent(sections: EnvSection[]): string {\n const lines: string[] = [\n '/**',\n ' * Type-safe environment configuration',\n ' * Generated by: stacksolo scaffold',\n ' */',\n '',\n 'function requireEnv(name: string): string {',\n ' const value = process.env[name];',\n ' if (!value) {',\n ' throw new Error(`Missing required environment variable: ${name}`);',\n ' }',\n ' return value;',\n '}',\n '',\n 'function optionalEnv(name: string, defaultValue: string): string {',\n ' return process.env[name] || defaultValue;',\n '}',\n '',\n 'export const env = {',\n ];\n\n // Group by section type\n for (const section of sections) {\n if (section.header === 'Project') continue; // Skip project info in typed config\n\n const sectionName = sectionToPropertyName(section.header);\n const vars = section.variables;\n\n if (sectionName === 'database' || sectionName === 'cache' || sectionName === 'storage') {\n // Object with properties\n lines.push(` ${sectionName}: {`);\n for (const v of vars) {\n const propName = envVarToPropertyName(v.name);\n if (v.name.includes('PORT')) {\n lines.push(` ${propName}: parseInt(optionalEnv('${v.name}', '${v.value}'), 10),`);\n } else if (v.isSecret) {\n lines.push(` ${propName}: requireEnv('${v.name}'),`);\n } else {\n lines.push(` ${propName}: optionalEnv('${v.name}', '${v.value}'),`);\n }\n }\n lines.push(' },');\n } else if (sectionName === 'secrets') {\n lines.push(' secrets: {');\n for (const v of vars) {\n const propName = envVarToPropertyName(v.name);\n lines.push(` ${propName}: requireEnv('${v.name}'),`);\n }\n lines.push(' },');\n }\n }\n\n lines.push('} as const;');\n lines.push('');\n lines.push('export type Env = typeof env;');\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction sectionToPropertyName(header: string): string {\n if (header.toLowerCase().includes('database')) return 'database';\n if (header.toLowerCase().includes('cache')) return 'cache';\n if (header.toLowerCase().includes('secret')) return 'secrets';\n if (header.toLowerCase().includes('storage')) return 'storage';\n return header.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n\nfunction envVarToPropertyName(envVar: string): string {\n // Remove common prefixes and convert to camelCase\n const parts = envVar.toLowerCase().split('_');\n if (parts.length <= 1) return parts[0];\n\n // Skip first part if it's a known prefix (e.g., DB_, REDIS_, BUCKET_)\n const skipFirst = ['db', 'redis', 'bucket'].includes(parts[0]) || parts[0] === parts[1];\n const startIndex = skipFirst ? 1 : 0;\n\n return parts.slice(startIndex).map((part, i) => {\n if (i === 0) return part;\n return part.charAt(0).toUpperCase() + part.slice(1);\n }).join('');\n}\n","/**\n * Docker Compose generator\n * Generates docker-compose.yml from config for local development\n */\n\nimport type {\n StackSoloConfig,\n DatabaseConfig,\n CacheConfig,\n} from '@stacksolo/blueprint';\nimport type { DockerComposeConfig, DockerService, GeneratedFile } from './types';\n\ninterface DockerGeneratorResult {\n dockerCompose: GeneratedFile | null;\n services: string[];\n}\n\n/**\n * Generate docker-compose.yml from config\n */\nexport function generateDockerCompose(config: StackSoloConfig): DockerGeneratorResult {\n const services: Record<string, DockerService> = {};\n const volumes: Record<string, { driver?: string }> = {};\n const serviceNames: string[] = [];\n\n // Collect databases and caches from networks\n for (const network of config.project.networks || []) {\n for (const db of network.databases || []) {\n const service = generateDatabaseService(db);\n if (service) {\n services[service.name] = service;\n serviceNames.push(service.name);\n volumes[`${service.name}_data`] = {};\n }\n }\n\n for (const cache of network.caches || []) {\n const service = generateCacheService(cache);\n if (service) {\n services[service.name] = service;\n serviceNames.push(service.name);\n }\n }\n }\n\n // Only generate if we have services\n if (Object.keys(services).length === 0) {\n return { dockerCompose: null, services: [] };\n }\n\n const composeConfig: DockerComposeConfig = {\n version: '3.8',\n services,\n ...(Object.keys(volumes).length > 0 ? { volumes } : {}),\n };\n\n const content = generateDockerComposeYaml(composeConfig);\n\n return {\n dockerCompose: { path: 'docker-compose.yml', content },\n services: serviceNames,\n };\n}\n\nfunction generateDatabaseService(db: DatabaseConfig): DockerService | null {\n const isPostgres = db.databaseVersion?.startsWith('POSTGRES') ?? true;\n const dbName = db.databaseName || 'app';\n const serviceName = db.name.replace(/-/g, '_');\n\n if (isPostgres) {\n const version = extractPostgresVersion(db.databaseVersion);\n return {\n name: serviceName,\n image: `postgres:${version}`,\n environment: {\n POSTGRES_USER: 'postgres',\n POSTGRES_PASSWORD: 'postgres',\n POSTGRES_DB: dbName,\n },\n ports: ['5432:5432'],\n volumes: [`${serviceName}_data:/var/lib/postgresql/data`],\n healthcheck: {\n test: ['CMD-SHELL', 'pg_isready -U postgres'],\n interval: '10s',\n timeout: '5s',\n retries: 5,\n },\n };\n } else {\n // MySQL\n const version = extractMySqlVersion(db.databaseVersion);\n return {\n name: serviceName,\n image: `mysql:${version}`,\n environment: {\n MYSQL_ROOT_PASSWORD: 'mysql',\n MYSQL_DATABASE: dbName,\n },\n ports: ['3306:3306'],\n volumes: [`${serviceName}_data:/var/lib/mysql`],\n healthcheck: {\n test: ['CMD', 'mysqladmin', 'ping', '-h', 'localhost'],\n interval: '10s',\n timeout: '5s',\n retries: 5,\n },\n };\n }\n}\n\nfunction generateCacheService(cache: CacheConfig): DockerService {\n const serviceName = cache.name.replace(/-/g, '_');\n const version = cache.redisVersion || '7';\n\n return {\n name: serviceName,\n image: `redis:${version}-alpine`,\n ports: ['6379:6379'],\n healthcheck: {\n test: ['CMD', 'redis-cli', 'ping'],\n interval: '10s',\n timeout: '5s',\n retries: 5,\n },\n };\n}\n\nfunction extractPostgresVersion(version?: string): string {\n if (!version) return '15';\n const match = version.match(/POSTGRES_(\\d+)/);\n return match ? match[1] : '15';\n}\n\nfunction extractMySqlVersion(version?: string): string {\n if (!version) return '8.0';\n if (version.includes('8_0')) return '8.0';\n if (version.includes('5_7')) return '5.7';\n return '8.0';\n}\n\nfunction generateDockerComposeYaml(config: DockerComposeConfig): string {\n const lines: string[] = [\n '# StackSolo Local Development Services',\n '# Generated by: stacksolo scaffold',\n '#',\n '# Usage:',\n '# docker-compose up -d Start all services',\n '# docker-compose down Stop all services',\n '# docker-compose logs -f View logs',\n '',\n ];\n\n lines.push(`version: '${config.version}'`);\n lines.push('');\n lines.push('services:');\n\n for (const [name, service] of Object.entries(config.services)) {\n lines.push(` ${name}:`);\n lines.push(` image: ${service.image}`);\n\n if (service.environment && Object.keys(service.environment).length > 0) {\n lines.push(' environment:');\n for (const [key, value] of Object.entries(service.environment)) {\n lines.push(` ${key}: ${value}`);\n }\n }\n\n if (service.ports && service.ports.length > 0) {\n lines.push(' ports:');\n for (const port of service.ports) {\n lines.push(` - \"${port}\"`);\n }\n }\n\n if (service.volumes && service.volumes.length > 0) {\n lines.push(' volumes:');\n for (const volume of service.volumes) {\n lines.push(` - ${volume}`);\n }\n }\n\n if (service.healthcheck) {\n lines.push(' healthcheck:');\n lines.push(` test: ${JSON.stringify(service.healthcheck.test)}`);\n lines.push(` interval: ${service.healthcheck.interval}`);\n lines.push(` timeout: ${service.healthcheck.timeout}`);\n lines.push(` retries: ${service.healthcheck.retries}`);\n }\n\n if (service.depends_on && service.depends_on.length > 0) {\n lines.push(' depends_on:');\n for (const dep of service.depends_on) {\n lines.push(` - ${dep}`);\n }\n }\n\n lines.push('');\n }\n\n if (config.volumes && Object.keys(config.volumes).length > 0) {\n lines.push('volumes:');\n for (const name of Object.keys(config.volumes)) {\n lines.push(` ${name}:`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","/**\n * Container scaffolder\n * Generates directory structure and starter code for Cloud Run containers\n */\n\nimport type { StackSoloConfig, ContainerConfig } from '@stacksolo/blueprint';\nimport type { ServiceScaffold, GeneratedFile } from '../types';\n\nexport function generateContainerScaffold(\n container: ContainerConfig,\n config: StackSoloConfig\n): ServiceScaffold {\n // Use sourceDir from config if provided, otherwise default to containers/<name>\n const servicePath =\n (container as { sourceDir?: string }).sourceDir?.replace(/^\\.\\//, '') ||\n `containers/${container.name}`;\n const files: GeneratedFile[] = [];\n\n // Dockerfile\n files.push({\n path: `${servicePath}/Dockerfile`,\n content: generateContainerDockerfile(container),\n });\n\n // package.json\n files.push({\n path: `${servicePath}/package.json`,\n content: generateContainerPackageJson(container, config),\n });\n\n // tsconfig.json\n files.push({\n path: `${servicePath}/tsconfig.json`,\n content: generateTsConfig(),\n });\n\n // src/index.ts\n files.push({\n path: `${servicePath}/src/index.ts`,\n content: generateContainerEntrypoint(container),\n });\n\n // .gitignore\n files.push({\n path: `${servicePath}/.gitignore`,\n content: generateGitignore(),\n });\n\n return {\n name: container.name,\n type: 'container',\n files,\n };\n}\n\nfunction generateContainerDockerfile(container: ContainerConfig): string {\n const port = container.port || 8080;\n return `# ${container.name} container\n# Generated by: stacksolo scaffold\n\nFROM node:20-slim AS builder\n\nWORKDIR /app\n\n# Install dependencies\nCOPY package*.json ./\nRUN npm ci\n\n# Copy source\nCOPY . .\n\n# Build\nRUN npm run build\n\n# Production image\nFROM node:20-slim\n\nWORKDIR /app\n\n# Copy built files\nCOPY --from=builder /app/dist ./dist\nCOPY --from=builder /app/node_modules ./node_modules\nCOPY --from=builder /app/package.json ./\n\nENV NODE_ENV=production\nENV PORT=${port}\n\nEXPOSE ${port}\n\nCMD [\"node\", \"dist/index.js\"]\n`;\n}\n\nfunction generateContainerPackageJson(\n container: ContainerConfig,\n config: StackSoloConfig\n): string {\n const pkg = {\n name: `@${config.project.name}/${container.name}`,\n version: '0.1.0',\n private: true,\n type: 'module',\n scripts: {\n dev: 'tsx watch src/index.ts',\n build: 'tsc',\n start: 'node dist/index.js',\n lint: 'eslint src/',\n typecheck: 'tsc --noEmit',\n },\n dependencies: {\n express: '^4.18.2',\n '@stacksolo/runtime': '^0.1.0',\n },\n devDependencies: {\n '@types/express': '^4.17.21',\n '@types/node': '^20.10.0',\n tsx: '^4.6.0',\n typescript: '^5.3.0',\n },\n };\n\n return JSON.stringify(pkg, null, 2) + '\\n';\n}\n\nfunction generateTsConfig(): string {\n const config = {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n esModuleInterop: true,\n strict: true,\n skipLibCheck: true,\n outDir: 'dist',\n rootDir: 'src',\n declaration: true,\n },\n include: ['src/**/*'],\n exclude: ['node_modules', 'dist'],\n };\n\n return JSON.stringify(config, null, 2) + '\\n';\n}\n\nfunction generateContainerEntrypoint(container: ContainerConfig): string {\n const port = container.port || 8080;\n\n // Build env imports based on referenced secrets/resources\n const envVars = Object.keys(container.env || {});\n const envImports =\n envVars.length > 0\n ? `// Environment variables from config:\\n${envVars.map((k) => `// - ${k}`).join('\\n')}\\n`\n : '';\n\n return `/**\n * ${container.name} service entrypoint\n * Generated by: stacksolo scaffold\n */\n\nimport express from 'express';\n\n${envImports}\nconst app = express();\nconst port = process.env.PORT || ${port};\n\napp.use(express.json());\n\n// Health check endpoint\napp.get('/health', (_req, res) => {\n res.json({ status: 'healthy' });\n});\n\n// Main endpoint\napp.get('/', (_req, res) => {\n res.json({\n service: '${container.name}',\n message: 'Hello from ${container.name}!'\n });\n});\n\napp.listen(port, () => {\n console.log(\\`${container.name} listening on port \\${port}\\`);\n});\n`;\n}\n\nfunction generateGitignore(): string {\n return `# Dependencies\nnode_modules/\n\n# Build output\ndist/\n\n# Logs\n*.log\n\n# Environment\n.env\n.env.local\n.env.*.local\n\n# IDE\n.idea/\n.vscode/\n*.swp\n\n# OS\n.DS_Store\nThumbs.db\n`;\n}\n","/**\n * Function scaffolder\n * Generates directory structure and starter code for Cloud Functions\n */\n\nimport type { StackSoloConfig, FunctionConfig } from '@stacksolo/blueprint';\nimport type { ServiceScaffold, GeneratedFile } from '../types';\n\nexport function generateFunctionScaffold(\n func: FunctionConfig,\n config: StackSoloConfig\n): ServiceScaffold {\n // Use sourceDir from config if provided, otherwise default to functions/<name>\n const servicePath =\n func.sourceDir?.replace(/^\\.\\//, '') || `functions/${func.name}`;\n const files: GeneratedFile[] = [];\n\n // package.json\n files.push({\n path: `${servicePath}/package.json`,\n content: generateFunctionPackageJson(func, config),\n });\n\n // tsconfig.json\n files.push({\n path: `${servicePath}/tsconfig.json`,\n content: generateTsConfig(),\n });\n\n // src/index.ts\n files.push({\n path: `${servicePath}/src/index.ts`,\n content: generateFunctionEntrypoint(func),\n });\n\n // .gitignore\n files.push({\n path: `${servicePath}/.gitignore`,\n content: generateGitignore(),\n });\n\n return {\n name: func.name,\n type: 'function',\n files,\n };\n}\n\nfunction generateFunctionPackageJson(\n func: FunctionConfig,\n config: StackSoloConfig\n): string {\n const pkg = {\n name: `@${config.project.name}/${func.name}`,\n version: '0.1.0',\n private: true,\n type: 'module',\n main: 'dist/index.js',\n scripts: {\n dev: 'functions-framework --source=src --target=handler',\n build: 'tsc',\n start: 'functions-framework --source=dist --target=handler',\n lint: 'eslint src/',\n typecheck: 'tsc --noEmit',\n },\n dependencies: {\n '@google-cloud/functions-framework': '^3.3.0',\n '@stacksolo/runtime': '^0.1.0',\n },\n devDependencies: {\n '@types/node': '^20.10.0',\n tsx: '^4.6.0',\n typescript: '^5.3.0',\n },\n };\n\n return JSON.stringify(pkg, null, 2) + '\\n';\n}\n\nfunction generateTsConfig(): string {\n const config = {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n esModuleInterop: true,\n strict: true,\n skipLibCheck: true,\n outDir: 'dist',\n rootDir: 'src',\n declaration: true,\n },\n include: ['src/**/*'],\n exclude: ['node_modules', 'dist'],\n };\n\n return JSON.stringify(config, null, 2) + '\\n';\n}\n\nfunction generateFunctionEntrypoint(func: FunctionConfig): string {\n const trigger = func.trigger || { type: 'http' };\n\n if (trigger.type === 'http') {\n return generateHttpFunctionEntrypoint(func);\n } else if (trigger.type === 'pubsub') {\n return generatePubSubFunctionEntrypoint(func, trigger.topic || 'unknown');\n } else if (trigger.type === 'storage') {\n return generateStorageFunctionEntrypoint(func, trigger.bucket || 'unknown');\n }\n\n return generateHttpFunctionEntrypoint(func);\n}\n\nfunction generateHttpFunctionEntrypoint(func: FunctionConfig): string {\n return `/**\n * ${func.name} HTTP function\n * Generated by: stacksolo scaffold\n */\n\nimport type { Request, Response } from '@google-cloud/functions-framework';\n\nexport function handler(req: Request, res: Response): void {\n console.log('${func.name} invoked', { method: req.method, path: req.path });\n\n res.json({\n function: '${func.name}',\n message: 'Hello from ${func.name}!',\n });\n}\n`;\n}\n\nfunction generatePubSubFunctionEntrypoint(\n func: FunctionConfig,\n topic: string\n): string {\n return `/**\n * ${func.name} Pub/Sub function\n * Triggered by: ${topic}\n * Generated by: stacksolo scaffold\n */\n\nimport type { CloudEvent } from '@google-cloud/functions-framework';\n\ninterface PubSubMessage {\n message: {\n data: string;\n attributes?: Record<string, string>;\n messageId: string;\n publishTime: string;\n };\n subscription: string;\n}\n\nexport function handler(event: CloudEvent<PubSubMessage>): void {\n const message = event.data?.message;\n\n if (!message) {\n console.error('No message received');\n return;\n }\n\n // Decode the message data\n const data = message.data\n ? JSON.parse(Buffer.from(message.data, 'base64').toString())\n : {};\n\n console.log('${func.name} received message', {\n messageId: message.messageId,\n data,\n attributes: message.attributes,\n });\n\n // TODO: Process the message\n}\n`;\n}\n\nfunction generateStorageFunctionEntrypoint(\n func: FunctionConfig,\n bucket: string\n): string {\n return `/**\n * ${func.name} Storage function\n * Triggered by: ${bucket} bucket events\n * Generated by: stacksolo scaffold\n */\n\nimport type { CloudEvent } from '@google-cloud/functions-framework';\n\ninterface StorageObjectData {\n bucket: string;\n name: string;\n metageneration: string;\n timeCreated: string;\n updated: string;\n}\n\nexport function handler(event: CloudEvent<StorageObjectData>): void {\n const data = event.data;\n\n if (!data) {\n console.error('No data received');\n return;\n }\n\n console.log('${func.name} triggered', {\n bucket: data.bucket,\n file: data.name,\n event: event.type,\n });\n\n // TODO: Process the storage event\n}\n`;\n}\n\nfunction generateGitignore(): string {\n return `# Dependencies\nnode_modules/\n\n# Build output\ndist/\n\n# Logs\n*.log\n\n# Environment\n.env\n.env.local\n.env.*.local\n\n# IDE\n.idea/\n.vscode/\n*.swp\n\n# OS\n.DS_Store\nThumbs.db\n`;\n}\n","/**\n * UI scaffolder\n * Generates directory structure and starter code for static UI sites\n * Supports React, Vue, SvelteKit, and plain HTML\n */\n\nimport type { StackSoloConfig, UIConfig } from '@stacksolo/blueprint';\nimport type { ServiceScaffold, GeneratedFile } from '../types';\n\nexport function generateUIScaffold(\n ui: UIConfig,\n config: StackSoloConfig\n): ServiceScaffold {\n // Use sourceDir from config if provided, otherwise default to apps/<name>\n const uiPath = ui.sourceDir?.replace(/^\\.\\//, '') || `apps/${ui.name}`;\n const framework = ui.framework || 'react';\n\n switch (framework) {\n case 'react':\n return generateReactUIScaffold(ui, config, uiPath);\n case 'vue':\n return generateVueUIScaffold(ui, config, uiPath);\n case 'sveltekit':\n return generateSvelteKitUIScaffold(ui, config, uiPath);\n case 'html':\n return generateHTMLUIScaffold(ui, config, uiPath);\n default:\n return generateReactUIScaffold(ui, config, uiPath);\n }\n}\n\nfunction generateReactUIScaffold(\n ui: UIConfig,\n config: StackSoloConfig,\n uiPath: string\n): ServiceScaffold {\n const files: GeneratedFile[] = [];\n\n // package.json\n files.push({\n path: `${uiPath}/package.json`,\n content:\n JSON.stringify(\n {\n name: `@${config.project.name}/${ui.name}`,\n version: '0.1.0',\n private: true,\n type: 'module',\n scripts: {\n dev: 'vite',\n build: 'tsc && vite build',\n preview: 'vite preview',\n lint: 'eslint src/',\n typecheck: 'tsc --noEmit',\n },\n dependencies: {\n react: '^18.2.0',\n 'react-dom': '^18.2.0',\n },\n devDependencies: {\n '@types/react': '^18.2.0',\n '@types/react-dom': '^18.2.0',\n '@vitejs/plugin-react': '^4.2.0',\n typescript: '^5.3.0',\n vite: '^5.0.0',\n },\n },\n null,\n 2\n ) + '\\n',\n });\n\n // tsconfig.json\n files.push({\n path: `${uiPath}/tsconfig.json`,\n content:\n JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2020',\n useDefineForClassFields: true,\n lib: ['ES2020', 'DOM', 'DOM.Iterable'],\n module: 'ESNext',\n skipLibCheck: true,\n moduleResolution: 'bundler',\n allowImportingTsExtensions: true,\n resolveJsonModule: true,\n isolatedModules: true,\n noEmit: true,\n jsx: 'react-jsx',\n strict: true,\n noUnusedLocals: true,\n noUnusedParameters: true,\n noFallthroughCasesInSwitch: true,\n },\n include: ['src'],\n references: [{ path: './tsconfig.node.json' }],\n },\n null,\n 2\n ) + '\\n',\n });\n\n // tsconfig.node.json\n files.push({\n path: `${uiPath}/tsconfig.node.json`,\n content:\n JSON.stringify(\n {\n compilerOptions: {\n composite: true,\n skipLibCheck: true,\n module: 'ESNext',\n moduleResolution: 'bundler',\n allowSyntheticDefaultImports: true,\n },\n include: ['vite.config.ts'],\n },\n null,\n 2\n ) + '\\n',\n });\n\n // vite.config.ts\n files.push({\n path: `${uiPath}/vite.config.ts`,\n content: `import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\n\nexport default defineConfig({\n plugins: [react()],\n server: {\n port: 3000,\n },\n});\n`,\n });\n\n // index.html\n files.push({\n path: `${uiPath}/index.html`,\n content: `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <link rel=\"icon\" type=\"image/svg+xml\" href=\"/vite.svg\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${ui.name}</title>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/src/main.tsx\"></script>\n </body>\n</html>\n`,\n });\n\n // src/main.tsx\n files.push({\n path: `${uiPath}/src/main.tsx`,\n content: `import { StrictMode } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport App from './App';\nimport './index.css';\n\ncreateRoot(document.getElementById('root')!).render(\n <StrictMode>\n <App />\n </StrictMode>,\n);\n`,\n });\n\n // src/App.tsx\n files.push({\n path: `${uiPath}/src/App.tsx`,\n content: `/**\n * ${ui.name} React App\n * Generated by: stacksolo scaffold\n */\n\nimport { useState } from 'react';\n\nfunction App() {\n const [count, setCount] = useState(0);\n\n return (\n <div className=\"app\">\n <h1>${ui.name}</h1>\n <p>Welcome to your React app!</p>\n <button onClick={() => setCount((c) => c + 1)}>\n Count: {count}\n </button>\n </div>\n );\n}\n\nexport default App;\n`,\n });\n\n // src/index.css\n files.push({\n path: `${uiPath}/src/index.css`,\n content: `:root {\n font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;\n line-height: 1.5;\n font-weight: 400;\n color: #213547;\n background-color: #ffffff;\n}\n\n.app {\n max-width: 1280px;\n margin: 0 auto;\n padding: 2rem;\n text-align: center;\n}\n\nbutton {\n border-radius: 8px;\n border: 1px solid transparent;\n padding: 0.6em 1.2em;\n font-size: 1em;\n font-weight: 500;\n font-family: inherit;\n background-color: #f9f9f9;\n cursor: pointer;\n transition: border-color 0.25s;\n}\n\nbutton:hover {\n border-color: #646cff;\n}\n`,\n });\n\n // .gitignore\n files.push({\n path: `${uiPath}/.gitignore`,\n content: generateUIGitignore(),\n });\n\n return {\n name: ui.name,\n type: 'ui',\n files,\n };\n}\n\nfunction generateVueUIScaffold(\n ui: UIConfig,\n config: StackSoloConfig,\n uiPath: string\n): ServiceScaffold {\n const files: GeneratedFile[] = [];\n\n // package.json\n files.push({\n path: `${uiPath}/package.json`,\n content:\n JSON.stringify(\n {\n name: `@${config.project.name}/${ui.name}`,\n version: '0.1.0',\n private: true,\n type: 'module',\n scripts: {\n dev: 'vite',\n build: 'vue-tsc -b && vite build',\n preview: 'vite preview',\n lint: 'eslint src/',\n typecheck: 'vue-tsc --noEmit',\n },\n dependencies: {\n vue: '^3.4.0',\n },\n devDependencies: {\n '@vitejs/plugin-vue': '^5.0.0',\n typescript: '~5.6.0',\n vite: '^5.0.0',\n 'vue-tsc': '^2.0.0',\n },\n },\n null,\n 2\n ) + '\\n',\n });\n\n // tsconfig.json\n files.push({\n path: `${uiPath}/tsconfig.json`,\n content:\n JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2020',\n useDefineForClassFields: true,\n module: 'ESNext',\n lib: ['ES2020', 'DOM', 'DOM.Iterable'],\n skipLibCheck: true,\n moduleResolution: 'bundler',\n allowImportingTsExtensions: true,\n resolveJsonModule: true,\n isolatedModules: true,\n noEmit: true,\n jsx: 'preserve',\n strict: true,\n noUnusedLocals: true,\n noUnusedParameters: true,\n noFallthroughCasesInSwitch: true,\n },\n include: ['src/**/*.ts', 'src/**/*.tsx', 'src/**/*.vue'],\n references: [{ path: './tsconfig.node.json' }],\n },\n null,\n 2\n ) + '\\n',\n });\n\n // tsconfig.node.json\n files.push({\n path: `${uiPath}/tsconfig.node.json`,\n content:\n JSON.stringify(\n {\n compilerOptions: {\n composite: true,\n skipLibCheck: true,\n module: 'ESNext',\n moduleResolution: 'bundler',\n allowSyntheticDefaultImports: true,\n },\n include: ['vite.config.ts'],\n },\n null,\n 2\n ) + '\\n',\n });\n\n // vite.config.ts\n files.push({\n path: `${uiPath}/vite.config.ts`,\n content: `import { defineConfig } from 'vite';\nimport vue from '@vitejs/plugin-vue';\n\nexport default defineConfig({\n plugins: [vue()],\n server: {\n port: 3000,\n },\n});\n`,\n });\n\n // index.html\n files.push({\n path: `${uiPath}/index.html`,\n content: `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <link rel=\"icon\" type=\"image/svg+xml\" href=\"/vite.svg\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${ui.name}</title>\n </head>\n <body>\n <div id=\"app\"></div>\n <script type=\"module\" src=\"/src/main.ts\"></script>\n </body>\n</html>\n`,\n });\n\n // src/main.ts\n files.push({\n path: `${uiPath}/src/main.ts`,\n content: `import { createApp } from 'vue';\nimport App from './App.vue';\nimport './style.css';\n\ncreateApp(App).mount('#app');\n`,\n });\n\n // src/App.vue\n files.push({\n path: `${uiPath}/src/App.vue`,\n content: `<!--\n ${ui.name} Vue App\n Generated by: stacksolo scaffold\n-->\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\n\nconst count = ref(0);\n</script>\n\n<template>\n <div class=\"app\">\n <h1>${ui.name}</h1>\n <p>Welcome to your Vue app!</p>\n <button @click=\"count++\">\n Count: {{ count }}\n </button>\n </div>\n</template>\n\n<style scoped>\n.app {\n max-width: 1280px;\n margin: 0 auto;\n padding: 2rem;\n text-align: center;\n}\n\nbutton {\n border-radius: 8px;\n border: 1px solid transparent;\n padding: 0.6em 1.2em;\n font-size: 1em;\n font-weight: 500;\n font-family: inherit;\n background-color: #f9f9f9;\n cursor: pointer;\n transition: border-color 0.25s;\n}\n\nbutton:hover {\n border-color: #42b883;\n}\n</style>\n`,\n });\n\n // src/style.css\n files.push({\n path: `${uiPath}/src/style.css`,\n content: `:root {\n font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;\n line-height: 1.5;\n font-weight: 400;\n color: #213547;\n background-color: #ffffff;\n}\n\nbody {\n margin: 0;\n display: flex;\n place-items: center;\n min-width: 320px;\n min-height: 100vh;\n}\n\n#app {\n width: 100%;\n}\n`,\n });\n\n // src/vite-env.d.ts\n files.push({\n path: `${uiPath}/src/vite-env.d.ts`,\n content: `/// <reference types=\"vite/client\" />\n`,\n });\n\n // .gitignore\n files.push({\n path: `${uiPath}/.gitignore`,\n content: generateUIGitignore(),\n });\n\n return {\n name: ui.name,\n type: 'ui',\n files,\n };\n}\n\nfunction generateSvelteKitUIScaffold(\n ui: UIConfig,\n config: StackSoloConfig,\n uiPath: string\n): ServiceScaffold {\n const files: GeneratedFile[] = [];\n\n // package.json\n files.push({\n path: `${uiPath}/package.json`,\n content:\n JSON.stringify(\n {\n name: `@${config.project.name}/${ui.name}`,\n version: '0.1.0',\n private: true,\n type: 'module',\n scripts: {\n dev: 'vite dev',\n build: 'vite build',\n preview: 'vite preview',\n check: 'svelte-kit sync && svelte-check --tsconfig ./tsconfig.json',\n },\n devDependencies: {\n '@sveltejs/adapter-static': '^3.0.0',\n '@sveltejs/kit': '^2.0.0',\n '@sveltejs/vite-plugin-svelte': '^3.0.0',\n svelte: '^4.2.0',\n 'svelte-check': '^3.6.0',\n typescript: '^5.3.0',\n vite: '^5.0.0',\n },\n },\n null,\n 2\n ) + '\\n',\n });\n\n // svelte.config.js\n files.push({\n path: `${uiPath}/svelte.config.js`,\n content: `import adapter from '@sveltejs/adapter-static';\nimport { vitePreprocess } from '@sveltejs/vite-plugin-svelte';\n\n/** @type {import('@sveltejs/kit').Config} */\nconst config = {\n preprocess: vitePreprocess(),\n kit: {\n adapter: adapter({\n pages: 'build',\n assets: 'build',\n fallback: 'index.html',\n precompress: false,\n strict: true,\n }),\n },\n};\n\nexport default config;\n`,\n });\n\n // vite.config.ts\n files.push({\n path: `${uiPath}/vite.config.ts`,\n content: `import { sveltekit } from '@sveltejs/kit/vite';\nimport { defineConfig } from 'vite';\n\nexport default defineConfig({\n plugins: [sveltekit()],\n server: {\n port: 3000,\n },\n});\n`,\n });\n\n // tsconfig.json\n files.push({\n path: `${uiPath}/tsconfig.json`,\n content:\n JSON.stringify(\n {\n extends: './.svelte-kit/tsconfig.json',\n compilerOptions: {\n allowJs: true,\n checkJs: true,\n esModuleInterop: true,\n forceConsistentCasingInFileNames: true,\n resolveJsonModule: true,\n skipLibCheck: true,\n sourceMap: true,\n strict: true,\n moduleResolution: 'bundler',\n },\n },\n null,\n 2\n ) + '\\n',\n });\n\n // src/app.html\n files.push({\n path: `${uiPath}/src/app.html`,\n content: `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <link rel=\"icon\" href=\"%sveltekit.assets%/favicon.png\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n %sveltekit.head%\n </head>\n <body data-sveltekit-preload-data=\"hover\">\n <div style=\"display: contents\">%sveltekit.body%</div>\n </body>\n</html>\n`,\n });\n\n // src/app.css\n files.push({\n path: `${uiPath}/src/app.css`,\n content: `:root {\n font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;\n line-height: 1.5;\n font-weight: 400;\n color: #213547;\n background-color: #ffffff;\n}\n\n.app {\n max-width: 1280px;\n margin: 0 auto;\n padding: 2rem;\n text-align: center;\n}\n\nbutton {\n border-radius: 8px;\n border: 1px solid transparent;\n padding: 0.6em 1.2em;\n font-size: 1em;\n font-weight: 500;\n font-family: inherit;\n background-color: #f9f9f9;\n cursor: pointer;\n transition: border-color 0.25s;\n}\n\nbutton:hover {\n border-color: #ff3e00;\n}\n`,\n });\n\n // src/routes/+layout.svelte\n files.push({\n path: `${uiPath}/src/routes/+layout.svelte`,\n content: `<script>\n import '../app.css';\n</script>\n\n<slot />\n`,\n });\n\n // src/routes/+layout.ts (for static adapter)\n files.push({\n path: `${uiPath}/src/routes/+layout.ts`,\n content: `export const prerender = true;\nexport const ssr = false;\n`,\n });\n\n // src/routes/+page.svelte\n files.push({\n path: `${uiPath}/src/routes/+page.svelte`,\n content: `<!--\n ${ui.name} SvelteKit App\n Generated by: stacksolo scaffold\n-->\n\n<script lang=\"ts\">\n let count = 0;\n</script>\n\n<svelte:head>\n <title>${ui.name}</title>\n</svelte:head>\n\n<div class=\"app\">\n <h1>${ui.name}</h1>\n <p>Welcome to your SvelteKit app!</p>\n <button on:click={() => count++}>\n Count: {count}\n </button>\n</div>\n`,\n });\n\n // static/favicon.png placeholder\n files.push({\n path: `${uiPath}/static/.gitkeep`,\n content: '',\n });\n\n // .gitignore\n files.push({\n path: `${uiPath}/.gitignore`,\n content: generateUIGitignore() + '.svelte-kit/\\n',\n });\n\n return {\n name: ui.name,\n type: 'ui',\n files,\n };\n}\n\nfunction generateHTMLUIScaffold(\n ui: UIConfig,\n config: StackSoloConfig,\n uiPath: string\n): ServiceScaffold {\n const files: GeneratedFile[] = [];\n\n // index.html\n files.push({\n path: `${uiPath}/index.html`,\n content: `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${ui.name}</title>\n <link rel=\"stylesheet\" href=\"styles.css\">\n</head>\n<body>\n <div class=\"app\">\n <h1>${ui.name}</h1>\n <p>Welcome to your static site!</p>\n <button id=\"counter\">Count: 0</button>\n </div>\n <script src=\"script.js\"></script>\n</body>\n</html>\n`,\n });\n\n // styles.css\n files.push({\n path: `${uiPath}/styles.css`,\n content: `:root {\n font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;\n line-height: 1.5;\n font-weight: 400;\n color: #213547;\n background-color: #ffffff;\n}\n\nbody {\n margin: 0;\n display: flex;\n place-items: center;\n min-width: 320px;\n min-height: 100vh;\n}\n\n.app {\n max-width: 1280px;\n margin: 0 auto;\n padding: 2rem;\n text-align: center;\n width: 100%;\n}\n\nbutton {\n border-radius: 8px;\n border: 1px solid transparent;\n padding: 0.6em 1.2em;\n font-size: 1em;\n font-weight: 500;\n font-family: inherit;\n background-color: #f9f9f9;\n cursor: pointer;\n transition: border-color 0.25s;\n}\n\nbutton:hover {\n border-color: #646cff;\n}\n`,\n });\n\n // script.js\n files.push({\n path: `${uiPath}/script.js`,\n content: `/**\n * ${ui.name} JavaScript\n * Generated by: stacksolo scaffold\n */\n\ndocument.addEventListener('DOMContentLoaded', () => {\n const button = document.getElementById('counter');\n let count = 0;\n\n button.addEventListener('click', () => {\n count++;\n button.textContent = \\`Count: \\${count}\\`;\n });\n});\n`,\n });\n\n return {\n name: ui.name,\n type: 'ui',\n files,\n };\n}\n\nfunction generateUIGitignore(): string {\n return `# Dependencies\nnode_modules/\n\n# Build output\ndist/\nbuild/\n\n# Logs\n*.log\n\n# Environment\n.env\n.env.local\n.env.*.local\n\n# IDE\n.idea/\n.vscode/\n*.swp\n\n# OS\n.DS_Store\nThumbs.db\n`;\n}\n","/**\n * Service scaffolder\n * Orchestrates scaffolding for containers, functions, and UIs\n */\n\nimport type { StackSoloConfig } from '@stacksolo/blueprint';\nimport type { ServiceScaffold, GeneratedFile } from './types';\nimport { generateContainerScaffold } from './resources/container';\nimport { generateFunctionScaffold } from './resources/function';\nimport { generateUIScaffold } from './resources/ui';\n\ninterface ServicesGeneratorResult {\n services: ServiceScaffold[];\n files: GeneratedFile[];\n uiCount: number;\n}\n\n/**\n * Generate service scaffolds from config\n */\nexport function generateServiceScaffolds(\n config: StackSoloConfig\n): ServicesGeneratorResult {\n const services: ServiceScaffold[] = [];\n const allFiles: GeneratedFile[] = [];\n let uiCount = 0;\n\n for (const network of config.project.networks || []) {\n // Generate container scaffolds\n for (const container of network.containers || []) {\n const scaffold = generateContainerScaffold(container, config);\n services.push(scaffold);\n allFiles.push(...scaffold.files);\n }\n\n // Generate function scaffolds\n for (const func of network.functions || []) {\n const scaffold = generateFunctionScaffold(func, config);\n services.push(scaffold);\n allFiles.push(...scaffold.files);\n }\n\n // Generate UI scaffolds\n for (const ui of network.uis || []) {\n const scaffold = generateUIScaffold(ui, config);\n services.push(scaffold);\n allFiles.push(...scaffold.files);\n uiCount++;\n }\n }\n\n return { services, files: allFiles, uiCount };\n}\n","/**\n * stacksolo deploy\n *\n * Deploy infrastructure directly using Pulumi Automation API.\n * No API server required.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { homedir } from 'os';\nimport { spawn, exec } from 'child_process';\nimport { promisify } from 'util';\nimport { parseConfig, resolveConfig, topologicalSort } from '@stacksolo/blueprint';\nimport { getRegistry } from '@stacksolo/registry';\nimport { deployConfig } from '../../services/deploy.service';\nimport { createCommandLogger, logFullError, getLogPath } from '../../logger';\n\nconst execAsync = promisify(exec);\n\nconst STACKSOLO_DIR = '.stacksolo';\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\nconst CONFIG_FILENAME = 'stacksolo.config.json';\nconst STATE_DIR = path.join(homedir(), '.stacksolo', 'pulumi-state');\n\nfunction getConfigPath(): string {\n return path.join(process.cwd(), STACKSOLO_DIR, CONFIG_FILENAME);\n}\n\ntype ResourceLogicalType =\n | 'container'\n | 'function'\n | 'database'\n | 'cache'\n | 'bucket'\n | 'secret'\n | 'topic'\n | 'queue'\n | 'network'\n | 'cron';\n\n/**\n * Map a resource type (e.g., gcp:cloud_run) to a logical type (e.g., container)\n */\nfunction mapResourceTypeToLogical(resourceType: string): ResourceLogicalType {\n const typeMap: Record<string, ResourceLogicalType> = {\n 'gcp:cloud_run': 'container',\n 'gcp:cloud_run_job': 'container',\n 'gcp:cloud_function': 'function',\n 'gcp:cloud_sql': 'database',\n 'gcp:firestore': 'database',\n 'gcp:memorystore': 'cache',\n 'gcp:storage_bucket': 'bucket',\n 'gcp:artifact_registry': 'bucket',\n 'gcp:secret_manager': 'secret',\n 'gcp:pubsub_topic': 'topic',\n 'gcp:pubsub_subscription': 'queue',\n 'gcp:cloud_tasks': 'queue',\n 'gcp:vpc_network': 'network',\n 'gcp:vpc_subnet': 'network',\n 'gcp:firewall': 'network',\n 'gcp:scheduler_job': 'cron',\n };\n\n return typeMap[resourceType] || 'container';\n}\n\nexport const deployCommand = new Command('deploy')\n .description('Deploy infrastructure for the current project')\n .option('--preview', 'Preview changes without deploying')\n .option('--destroy', 'Destroy deployed resources')\n .option('--skip-build', 'Skip building and pushing container images')\n .option('--tag <tag>', 'Image tag for containers', 'latest')\n .option('--refresh', 'Refresh Pulumi state and import existing resources')\n .option('--force', 'Force delete and recreate conflicting resources')\n .option('-y, --yes', 'Skip confirmation prompts')\n .action(async (options) => {\n await runDeploy(options);\n });\n\ninterface DeployOptions {\n preview?: boolean;\n destroy?: boolean;\n skipBuild?: boolean;\n tag?: string;\n refresh?: boolean;\n force?: boolean;\n yes?: boolean;\n}\n\ninterface RetryContext {\n grantedBuildPermissions?: boolean;\n grantedGcfArtifactsPermissions?: boolean;\n deletedResource?: string;\n deletedResources?: string[];\n refreshedState?: boolean;\n}\n\ninterface ConflictingResource {\n type: string;\n name: string;\n fullPath: string;\n}\n\n/**\n * Parse conflicting resources from Pulumi/Terraform error output\n * Handles various GCP resource types and their error message formats\n */\nfunction parseConflictingResources(error: string): ConflictingResource[] {\n const conflicts: ConflictingResource[] = [];\n const seen = new Set<string>();\n\n // Extract from error diagnostics sections\n // Patterns handled:\n // 1. projects/PROJECT/locations/LOCATION/TYPE/NAME already exists\n // 2. projects/PROJECT/global/TYPE/NAME already exists\n // 3. the repository already exists (artifact registry)\n // 4. Service account NAME already exists\n // 5. Terraform: google_compute_url_map.NAME: Error 409\n // 6. Terraform: bucket already exists\n const lines = error.split('\\n');\n for (const line of lines) {\n // Match: gcp:TYPE (NAME) - handles multi-line format with \\n in name (Pulumi format)\n const pulumiMatch = line.match(/gcp:([^:]+):([^\\s]+)\\s+\\(([^)]+)\\)/);\n if (pulumiMatch) {\n const [, provider, resourceType, name] = pulumiMatch;\n const cleanName = name.replace(/\\\\n/g, '').trim();\n if (!seen.has(cleanName) && line.includes('409')) {\n seen.add(cleanName);\n conflicts.push({\n type: `${provider}/${resourceType}`,\n name: cleanName,\n fullPath: cleanName,\n });\n }\n }\n\n // Match: gcp:provider:Type (name): followed by 409 error on same or nearby line\n // This catches cases like \"gcp:vpcaccess:Connector (main-connector):\"\n if (line.includes('409') || line.includes('already exists')) {\n const resourceMatch = error.match(/gcp:([^:]+):([^\\s]+)\\s+\\(([^)]+)\\)/);\n if (resourceMatch) {\n const [, provider, resourceType, name] = resourceMatch;\n const cleanName = name.replace(/\\\\n/g, '').trim();\n if (!seen.has(cleanName)) {\n seen.add(cleanName);\n conflicts.push({\n type: `${provider}/${resourceType}`,\n name: cleanName,\n fullPath: cleanName,\n });\n }\n }\n }\n\n // Match: 'projects/xxx/global/addresses/yyy' already exists\n const pathMatch = line.match(/['\"]?(projects\\/[^'\"]+)['\"]?\\s+already exists/i);\n if (pathMatch) {\n const fullPath = pathMatch[1];\n const parts = fullPath.split('/');\n const name = parts[parts.length - 1];\n const type = parts[parts.length - 2];\n if (!seen.has(name)) {\n seen.add(name);\n conflicts.push({\n type: type,\n name: name,\n fullPath: fullPath,\n });\n }\n }\n\n // Match: Service account xxx already exists\n const saMatch = line.match(/Service account ([^\\s]+) already exists/);\n if (saMatch) {\n const name = saMatch[1];\n if (!seen.has(name)) {\n seen.add(name);\n conflicts.push({\n type: 'serviceAccounts',\n name: name,\n fullPath: name,\n });\n }\n }\n\n // Match: the repository already exists (for artifact registry)\n if (line.includes('repository already exists') && line.includes('artifactregistry')) {\n const repoMatch = line.match(/Repository \\(([^)]+)\\)/);\n if (repoMatch) {\n const name = repoMatch[1].replace(/\\\\n/g, '').trim();\n if (!seen.has(name)) {\n seen.add(name);\n conflicts.push({\n type: 'repositories',\n name: name,\n fullPath: name,\n });\n }\n }\n }\n\n // Match: bucket already exists (Storage buckets)\n if (line.includes('already own it') || line.includes('bucket succeeded')) {\n // Look for google_storage_bucket resource name in nearby context\n const bucketResourceMatch = error.match(/google_storage_bucket\\.([a-zA-Z0-9_-]+)/);\n if (bucketResourceMatch) {\n const resourceName = bucketResourceMatch[1];\n if (!seen.has(resourceName)) {\n seen.add(resourceName);\n conflicts.push({\n type: 'buckets',\n name: resourceName,\n fullPath: resourceName,\n });\n }\n }\n }\n }\n\n // Also parse Terraform-specific resource conflict patterns from the full error\n // Terraform errors look like: with google_compute_url_map.solo-project-lb-urlmap\n const terraformResourceMatches = error.matchAll(/with\\s+google_([a-z_]+)\\.([a-zA-Z0-9_-]+)/g);\n for (const match of terraformResourceMatches) {\n const [, resourceType, name] = match;\n // Check if this resource has a 409 error nearby\n const resourceSection = error.slice(Math.max(0, error.indexOf(match[0]) - 200), error.indexOf(match[0]) + 200);\n if (resourceSection.includes('409') || resourceSection.includes('already exists')) {\n if (!seen.has(name)) {\n seen.add(name);\n // Map terraform resource types to our types\n const typeMap: Record<string, string> = {\n 'compute_url_map': 'urlMaps',\n 'compute_target_http_proxy': 'targetHttpProxies',\n 'compute_target_https_proxy': 'targetHttpsProxies',\n 'compute_global_forwarding_rule': 'forwardingRules',\n 'compute_forwarding_rule': 'forwardingRules',\n 'compute_backend_service': 'backendServices',\n 'compute_backend_bucket': 'backendBuckets',\n 'compute_health_check': 'healthChecks',\n 'compute_global_address': 'addresses',\n 'compute_network_endpoint_group': 'networkEndpointGroups',\n 'compute_region_network_endpoint_group': 'networkEndpointGroups',\n 'compute_network': 'networks',\n 'cloudfunctions2_function': 'functions',\n 'cloud_run_service': 'services',\n 'storage_bucket': 'buckets',\n 'vpc_access_connector': 'connectors',\n 'pubsub_topic': 'topics',\n };\n conflicts.push({\n type: typeMap[resourceType] || resourceType,\n name: name,\n fullPath: name,\n });\n }\n }\n }\n\n return conflicts;\n}\n\n/**\n * Sort resources for deletion in reverse dependency order\n * Load balancer resources have complex dependencies:\n * forwarding-rule → target-proxy → url-map → backend-service\n */\nfunction sortResourcesForDeletion(resources: ConflictingResource[]): ConflictingResource[] {\n // Define deletion priority (higher = delete first)\n const deletionPriority: Record<string, number> = {\n // Forwarding rules must be deleted first\n 'forwardingRules': 100,\n 'globalForwardingRules': 100,\n // Then proxies\n 'targetHttpProxies': 90,\n 'targetHttpsProxies': 90,\n // Then SSL certificates (after proxies that use them)\n 'sslCertificates': 85,\n // Then URL maps\n 'urlMaps': 80,\n // Then backend services/buckets (before NEGs that they depend on)\n 'backendServices': 70,\n 'backendBuckets': 70,\n 'compute/BackendService': 70,\n 'compute/BackendBucket': 70,\n // Then health checks\n 'healthChecks': 60,\n // Then network endpoint groups\n 'networkEndpointGroups': 50,\n // Then functions (depend on NEGs)\n 'functions': 45,\n // VPC Connectors (can have dependent functions/Cloud Run)\n 'connectors': 42,\n 'vpcaccess/Connector': 42,\n // Addresses can be deleted whenever\n 'addresses': 40,\n 'globalAddresses': 40,\n // Service accounts\n 'serviceAccounts': 30,\n // Artifact registry\n 'repositories': 20,\n // Everything else\n 'default': 10,\n };\n\n return [...resources].sort((a, b) => {\n const priorityA = deletionPriority[a.type] || deletionPriority['default'];\n const priorityB = deletionPriority[b.type] || deletionPriority['default'];\n return priorityB - priorityA; // Higher priority first\n });\n}\n\nasync function runDeploy(options: DeployOptions, retryCount = 0, retryContext: RetryContext = {}): Promise<void> {\n const MAX_RETRIES = 3;\n const log = createCommandLogger('deploy');\n\n log.info('Starting deploy', { options, retryCount, retryContext });\n\n if (retryCount === 0) {\n console.log(chalk.bold('\\n StackSolo Deploy\\n'));\n } else {\n console.log(chalk.cyan(`\\n Retrying deploy (attempt ${retryCount + 1})...\\n`));\n }\n\n // Load config\n const configPath = getConfigPath();\n let config;\n\n try {\n config = parseConfig(configPath);\n log.info('Config loaded', { configPath, project: config.project });\n } catch (error) {\n logFullError('config-parse', error, { configPath });\n console.log(chalk.red(` Error: Could not read ${STACKSOLO_DIR}/${CONFIG_FILENAME}\\n`));\n console.log(chalk.gray(` ${error}`));\n console.log(chalk.gray(`\\n Run 'stacksolo init' to create a project first.\\n`));\n return;\n }\n\n // Show what we're about to deploy (only on first attempt)\n if (retryCount === 0) {\n console.log(chalk.cyan(' Project:'), config.project.name);\n console.log(chalk.cyan(' GCP Project:'), config.project.gcpProjectId);\n console.log(chalk.cyan(' Region:'), config.project.region);\n }\n\n // Resolve and show resources\n const resolved = resolveConfig(config);\n const order = topologicalSort(resolved.resources);\n\n if (retryCount === 0) {\n console.log(chalk.cyan('\\n Resources:'), `${resolved.resources.length} to ${options.destroy ? 'destroy' : options.preview ? 'preview' : 'deploy'}`);\n\n for (const id of order) {\n const resource = resolved.resources.find((r) => r.id === id);\n if (resource) {\n console.log(chalk.gray(` - ${resource.type}: ${resource.name}`));\n }\n }\n\n console.log('');\n }\n\n // Confirm for destroy (only on first attempt)\n if (options.destroy && !options.yes && retryCount === 0) {\n const inquirer = await import('inquirer');\n const { confirm } = await inquirer.default.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Are you sure you want to destroy all resources?',\n default: false,\n },\n ]);\n\n if (!confirm) {\n console.log(chalk.gray('\\n Cancelled.\\n'));\n return;\n }\n }\n\n // Build and push container images (unless skipped, preview, or destroy)\n // Only build on first attempt\n if (!options.skipBuild && !options.preview && !options.destroy && retryCount === 0) {\n const containers = resolved.resources.filter((r) => r.type === 'gcp:cloud_run');\n\n if (containers.length > 0) {\n console.log(chalk.cyan(' Building container images...\\n'));\n\n // Configure Docker auth for Artifact Registry\n const authSpinner = ora('Configuring Docker authentication...').start();\n try {\n await execAsync(\n `gcloud auth configure-docker ${config.project.region}-docker.pkg.dev --quiet`\n );\n authSpinner.succeed('Docker authentication configured');\n } catch (error) {\n authSpinner.warn('Could not configure Docker auth (may already be configured)');\n }\n\n // Build and push each container\n for (const container of containers) {\n const networkName = container.network || 'default';\n const registryUrl = `${config.project.region}-docker.pkg.dev/${config.project.gcpProjectId}/${networkName}-registry`;\n const imageTag = `${registryUrl}/${container.name}:${options.tag}`;\n const sourceDir = (container.config.sourceDir as string) || `containers/${container.name}`;\n const dockerfilePath = path.join(sourceDir, 'Dockerfile');\n\n // Check if Dockerfile exists\n try {\n await fs.access(dockerfilePath);\n } catch {\n console.log(chalk.yellow(` Skipping ${container.name}: No Dockerfile found at ${dockerfilePath}`));\n continue;\n }\n\n // Build\n const buildSpinner = ora(`Building ${container.name}...`).start();\n try {\n await execAsync(`docker build -t \"${imageTag}\" \"${sourceDir}\"`, {\n maxBuffer: 50 * 1024 * 1024,\n });\n buildSpinner.succeed(`Built ${container.name}`);\n } catch (error) {\n buildSpinner.fail(`Failed to build ${container.name}`);\n console.log(chalk.red(` ${error}\\n`));\n console.log(chalk.gray(' Use --skip-build to deploy without building images.\\n'));\n return;\n }\n\n // Push\n const pushSpinner = ora(`Pushing ${container.name}...`).start();\n try {\n await execAsync(`docker push \"${imageTag}\"`);\n pushSpinner.succeed(`Pushed ${container.name}`);\n console.log(chalk.gray(` ${imageTag}\\n`));\n } catch (error) {\n pushSpinner.fail(`Failed to push ${container.name}`);\n console.log(chalk.red(` ${error}\\n`));\n\n // Check if registry exists\n const errorStr = String(error);\n if (errorStr.includes('not found') || errorStr.includes('does not exist')) {\n console.log(chalk.yellow(' Registry may not exist yet. Running initial deploy to create it...\\n'));\n // Continue with deploy - it will create the registry\n } else {\n console.log(chalk.gray(' Use --skip-build to deploy without pushing images.\\n'));\n return;\n }\n }\n }\n\n console.log('');\n }\n }\n\n // Deploy\n const action = options.destroy ? 'Destroying' : options.preview ? 'Previewing' : 'Deploying';\n const spinner = ora(`${action} infrastructure...`).start();\n const startTime = Date.now();\n const logs: string[] = [];\n\n const result = await deployConfig(config, STATE_DIR, {\n preview: options.preview,\n destroy: options.destroy,\n onLog: (msg) => {\n logs.push(msg);\n // Update spinner with elapsed time\n const elapsed = Math.round((Date.now() - startTime) / 1000);\n spinner.text = `${action} infrastructure... (${elapsed}s)`;\n },\n });\n\n if (result.success) {\n spinner.succeed(`${options.destroy ? 'Destroyed' : options.preview ? 'Preview complete' : 'Deployed'} successfully`);\n\n if (!options.preview && !options.destroy) {\n // Register/update in registry\n const registry = getRegistry();\n\n // Find or create project in registry\n let project = await registry.findProjectByPath(configPath);\n if (!project) {\n project = await registry.registerProject({\n name: config.project.name,\n gcpProjectId: config.project.gcpProjectId,\n region: config.project.region,\n configPath,\n });\n }\n\n // Update project status\n await registry.markProjectDeployed(project.id);\n\n // Register resources in registry\n for (const id of order) {\n const resource = resolved.resources.find((r) => r.id === id);\n if (resource) {\n // Map resource type to logical type\n const logicalType = mapResourceTypeToLogical(resource.type);\n\n // Check if resource already exists\n const existing = await registry.findResourceByRef(\n project.id,\n resource.name,\n resource.network ?? null\n );\n\n let resourceId: string;\n\n if (!existing) {\n const created = await registry.createResource({\n projectId: project.id,\n type: logicalType,\n name: resource.name,\n network: resource.network,\n resourceType: resource.type,\n config: resource.config,\n });\n resourceId = created.id;\n } else {\n resourceId = existing.id;\n }\n\n // Mark resource as ready and update outputs if we have them\n const resourceOutputKey = `${resource.name}`;\n const outputValue = result.outputs[resourceOutputKey];\n\n // For containers, include the image URL\n let imageUrl: string | undefined;\n if (resource.type === 'gcp:cloud_run') {\n const networkName = resource.network || 'default';\n const registryUrl = `${config.project.region}-docker.pkg.dev/${config.project.gcpProjectId}/${networkName}-registry`;\n imageUrl = `${registryUrl}/${resource.name}:${options.tag}`;\n }\n\n await registry.updateResourceOutputs(resourceId, {\n url: outputValue ? String(outputValue) : undefined,\n imageUrl,\n });\n }\n }\n\n // Store outputs in registry\n if (Object.keys(result.outputs).length > 0) {\n console.log(chalk.green('\\n Outputs:'));\n for (const [key, value] of Object.entries(result.outputs)) {\n console.log(chalk.gray(` ${key}: `) + chalk.white(String(value)));\n }\n }\n\n console.log(chalk.green('\\n Infrastructure deployed successfully!\\n'));\n console.log(chalk.gray(' Next steps:'));\n console.log(chalk.gray(' stacksolo list - View registered projects'));\n console.log(chalk.gray(' stacksolo status - View deployment status'));\n console.log(chalk.gray(' stacksolo scaffold - Generate local dev environment\\n'));\n }\n } else {\n spinner.fail(`${action} failed`);\n console.log(chalk.red(`\\n ${result.error}\\n`));\n\n // Log the full error for debugging\n logFullError('deploy', result.error, {\n action,\n projectName: config.project.name,\n gcpProjectId: config.project.gcpProjectId,\n region: config.project.region,\n logs: logs.slice(-50), // Last 50 log lines\n });\n log.info(`Full debug log available at: ${getLogPath()}`);\n\n // Check for GCP auth errors\n if (result.error?.includes('invalid_grant') || result.error?.includes('reauth related error')) {\n console.log(chalk.yellow(' GCP authentication has expired.\\n'));\n const shouldReauth = await promptReauth();\n if (shouldReauth) {\n const success = await runGcloudAuth();\n if (success) {\n console.log(chalk.green('\\n Authentication successful!'));\n if (retryCount < MAX_RETRIES) {\n return runDeploy(options, retryCount + 1, retryContext);\n }\n }\n }\n } else if (result.error?.includes('has not been used in project') || result.error?.includes('SERVICE_DISABLED')) {\n // Extract the API name from the error\n // Match patterns like: eventarc.googleapis.com or API [cloudfunctions.googleapis.com]\n const apiUrlMatch = result.error.match(/apis\\/api\\/([^/]+)\\/overview/);\n const apiBracketMatch = result.error.match(/API \\[([^\\]]+)\\]/);\n\n const apiName = apiUrlMatch ? apiUrlMatch[1] : (apiBracketMatch ? apiBracketMatch[1] : null);\n\n if (apiName) {\n console.log(chalk.yellow(` GCP API needs to be enabled: ${apiName}\\n`));\n\n const spinner = ora(`Enabling ${apiName}...`).start();\n try {\n await execAsync(`gcloud services enable ${apiName} --project=${config.project.gcpProjectId}`);\n spinner.succeed(`Enabled ${apiName}`);\n console.log(chalk.gray(' Waiting 30 seconds for API to propagate...\\n'));\n await sleep(30000);\n\n if (retryCount < MAX_RETRIES) {\n return runDeploy({ ...options, skipBuild: true }, retryCount + 1, retryContext);\n }\n } catch (error) {\n spinner.fail(`Failed to enable ${apiName}`);\n console.log(chalk.red(`\\n ${error}\\n`));\n console.log(chalk.gray(' Enable it manually in the GCP Console and run `stacksolo deploy` again.\\n'));\n }\n } else {\n console.log(chalk.yellow(' A GCP API needs to be enabled for this deployment.\\n'));\n console.log(chalk.gray(' Check the error above and enable the required API in the GCP Console.\\n'));\n }\n } else if (result.error?.includes('missing permission on the build service account')) {\n // Cloud Functions Gen2 build permission error\n console.log(chalk.yellow(' Cloud Build service account needs permissions.\\n'));\n console.log(chalk.gray(' This is required for Cloud Functions Gen2 to build from source.\\n'));\n\n // Check if permissions already exist (might just be propagating)\n const permissionsExist = await checkCloudBuildPermissions(config.project.gcpProjectId);\n\n if (permissionsExist) {\n // Permissions exist but aren't propagated yet - just wait and retry\n console.log(chalk.gray(' Permissions are already configured but still propagating.\\n'));\n console.log(chalk.gray(' Waiting 60 seconds for IAM changes to take effect...\\n'));\n await sleep(60000);\n if (retryCount < MAX_RETRIES) {\n return runDeploy({ ...options, skipBuild: true }, retryCount + 1, { ...retryContext, grantedBuildPermissions: true });\n }\n console.log(chalk.yellow(' Still failing after waiting. Please try again in a minute.\\n'));\n return;\n }\n\n // Check if we already granted permissions in this session (shouldn't happen but safety check)\n if (retryContext.grantedBuildPermissions) {\n console.log(chalk.gray(' Waiting 60 seconds for IAM changes to propagate...\\n'));\n await sleep(60000);\n if (retryCount < MAX_RETRIES) {\n return runDeploy({ ...options, skipBuild: true }, retryCount + 1, retryContext);\n }\n console.log(chalk.yellow(' Still failing after waiting. Please try again in a minute.\\n'));\n return;\n }\n\n const shouldFix = await promptFixBuildPermissions();\n if (shouldFix) {\n const success = await grantCloudBuildPermissions(config.project.gcpProjectId, config.project.region);\n if (success) {\n console.log(chalk.green('\\n Permissions granted!'));\n console.log(chalk.gray(' Waiting 45 seconds for IAM changes to propagate...\\n'));\n await sleep(45000);\n console.log(chalk.cyan(' Continuing deploy...\\n'));\n if (retryCount < MAX_RETRIES) {\n return runDeploy({ ...options, skipBuild: true }, retryCount + 1, { ...retryContext, grantedBuildPermissions: true });\n }\n }\n } else {\n console.log(chalk.gray(' To fix manually, run these commands:\\n'));\n console.log(chalk.cyan(` PROJECT_NUMBER=$(gcloud projects describe ${config.project.gcpProjectId} --format=\"value(projectNumber)\")`));\n console.log(chalk.cyan(` gcloud projects add-iam-policy-binding ${config.project.gcpProjectId} \\\\`));\n console.log(chalk.cyan(` --member=\"serviceAccount:\\${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com\" \\\\`));\n console.log(chalk.cyan(` --role=\"roles/storage.objectViewer\"\\n`));\n console.log(chalk.gray(' After granting, run `stacksolo deploy` again.\\n'));\n }\n } else if (result.error?.includes('artifactregistry.repositories.downloadArtifacts') && result.error?.includes('gcf-artifacts')) {\n // gcf-artifacts permission error - need to grant permissions on the repository itself\n console.log(chalk.yellow(' Cloud Build needs permissions on the gcf-artifacts repository.\\n'));\n console.log(chalk.gray(' This is required for Cloud Functions Gen2 to cache build artifacts.\\n'));\n\n // Check if we already granted permissions in this session\n if (retryContext.grantedGcfArtifactsPermissions) {\n console.log(chalk.yellow(' Permissions were already granted but the error persists.\\n'));\n console.log(chalk.gray(' This usually means IAM changes are still propagating (can take 1-2 minutes).\\n'));\n console.log(chalk.gray(' Please wait a moment and run `stacksolo deploy` again.\\n'));\n return;\n }\n\n const shouldFix = await promptFixBuildPermissions();\n if (shouldFix) {\n const success = await grantGcfArtifactsPermissions(config.project.gcpProjectId, config.project.region);\n if (success) {\n console.log(chalk.green('\\n Permissions granted!'));\n console.log(chalk.gray(' Waiting 30 seconds for IAM changes to propagate...\\n'));\n await sleep(30000);\n console.log(chalk.cyan(' Continuing deploy...\\n'));\n if (retryCount < MAX_RETRIES) {\n return runDeploy({ ...options, skipBuild: true }, retryCount + 1, { ...retryContext, grantedGcfArtifactsPermissions: true });\n }\n }\n } else {\n console.log(chalk.gray(' To fix manually, run these commands:\\n'));\n console.log(chalk.cyan(` PROJECT_NUMBER=$(gcloud projects describe ${config.project.gcpProjectId} --format=\"value(projectNumber)\")`));\n console.log(chalk.cyan(` gcloud artifacts repositories add-iam-policy-binding gcf-artifacts \\\\`));\n console.log(chalk.cyan(` --location=${config.project.region} --project=${config.project.gcpProjectId} \\\\`));\n console.log(chalk.cyan(` --member=\"serviceAccount:\\${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com\" \\\\`));\n console.log(chalk.cyan(` --role=\"roles/artifactregistry.writer\"\\n`));\n console.log(chalk.gray(' After granting, run `stacksolo deploy` again.\\n'));\n }\n } else if (result.error?.includes('One or more users named in the policy do not belong to a permitted customer')) {\n // Organization policy blocks allUsers - this is expected in some orgs\n console.log(chalk.yellow(' Organization policy prevents public access.\\n'));\n console.log(chalk.gray(' Your GCP organization has a policy that blocks granting access to \"allUsers\".\\n'));\n console.log(chalk.gray(' This means Cloud Functions cannot be made publicly accessible.\\n'));\n console.log(chalk.gray('\\n For Pub/Sub-triggered functions, this is not an issue.\\n'));\n console.log(chalk.gray(' For HTTP-triggered functions, you\\'ll need authenticated access or an org policy exception.\\n'));\n } else if (result.error?.includes('already exists') || result.error?.includes('Error 409')) {\n // Resource already exists - state mismatch\n // Parse all conflicting resources from the error\n const conflicts = parseConflictingResources(result.error);\n\n if (conflicts.length === 0) {\n console.log(chalk.yellow(' Resource conflict detected but could not parse resource names.\\n'));\n console.log(chalk.gray(' Check the error above for details.\\n'));\n } else {\n console.log(chalk.yellow(` ${conflicts.length} resource conflict(s) detected.\\n`));\n console.log(chalk.gray(' These resources exist in GCP but not in Pulumi state:\\n'));\n for (const conflict of conflicts) {\n console.log(chalk.gray(` - ${conflict.type}: ${conflict.name}`));\n }\n console.log('');\n\n // Check if we already handled these in this session\n const alreadyHandled = conflicts.every((c: ConflictingResource) => retryContext.deletedResources?.includes(c.name));\n if (alreadyHandled) {\n console.log(chalk.yellow(' Resources were already deleted but GCP is still propagating.\\n'));\n console.log(chalk.gray(' Some resources can take 1-2 minutes to fully delete.\\n'));\n console.log(chalk.gray(' Please wait a moment and run `stacksolo deploy` again.\\n'));\n return;\n }\n\n const resolution = await promptConflictResolution();\n if (resolution === 'force') {\n // Delete from GCP and remove from state\n console.log(chalk.gray('\\n Deleting conflicting resources in GCP...\\n'));\n\n const deletedResources: string[] = [...(retryContext.deletedResources || [])];\n let allDeleted = true;\n\n // Delete in reverse dependency order (forwarding rules → proxies → url maps, etc.)\n const sortedConflicts = sortResourcesForDeletion(conflicts);\n\n for (const conflict of sortedConflicts) {\n const success = await forceDeleteResource(conflict, config.project.gcpProjectId);\n if (success) {\n deletedResources.push(conflict.name);\n } else {\n allDeleted = false;\n }\n }\n\n // Also remove from state\n const projectName = `${config.project.name}-${config.project.gcpProjectId}`.toLowerCase().replace(/[^a-z0-9-]/g, '-');\n for (const conflict of conflicts) {\n await refreshPulumiState(projectName, conflict.name);\n }\n\n if (allDeleted || deletedResources.length > 0) {\n console.log(chalk.green(`\\n Deleted ${deletedResources.length} resource(s)!`));\n\n // Wait longer if we deleted a Cloud Function (they take 60-120 seconds to fully delete)\n const deletedFunction = sortedConflicts.some(c => c.type === 'functions' || c.type.includes('Function'));\n const waitTime = deletedFunction ? 60000 : 15000;\n const waitSeconds = waitTime / 1000;\n\n console.log(chalk.gray(` Waiting ${waitSeconds} seconds for deletion to propagate...\\n`));\n await sleep(waitTime);\n console.log(chalk.cyan(' Continuing deploy...\\n'));\n if (retryCount < MAX_RETRIES) {\n return runDeploy({ ...options, skipBuild: true }, retryCount + 1, { ...retryContext, deletedResources });\n }\n }\n } else {\n console.log(chalk.gray('\\n To fix manually, delete the resources in GCP Console'));\n console.log(chalk.gray(' or run `stacksolo destroy` first, then redeploy.\\n'));\n }\n }\n } else if (logs.length > 0) {\n console.log(chalk.gray(' Recent logs:'));\n // Show last 10 log lines\n const recentLogs = logs.slice(-10);\n for (const logLine of recentLogs) {\n console.log(chalk.gray(` ${logLine}`));\n }\n console.log('');\n }\n\n // Always show where to find the full debug log\n console.log(chalk.gray(` Full debug log: ${getLogPath()}\\n`));\n }\n}\n\nasync function promptReauth(): Promise<boolean> {\n const inquirer = await import('inquirer');\n const { reauth } = await inquirer.default.prompt([\n {\n type: 'confirm',\n name: 'reauth',\n message: 'Re-authenticate with GCP now?',\n default: true,\n },\n ]);\n return reauth;\n}\n\nasync function runGcloudAuth(): Promise<boolean> {\n console.log(chalk.gray('\\n Opening browser for GCP authentication...\\n'));\n\n return new Promise((resolve) => {\n const child = spawn('gcloud', ['auth', 'application-default', 'login'], {\n stdio: 'inherit',\n shell: true,\n });\n\n child.on('close', (code) => {\n resolve(code === 0);\n });\n\n child.on('error', () => {\n console.log(chalk.red(' Failed to run gcloud. Make sure gcloud CLI is installed.\\n'));\n resolve(false);\n });\n });\n}\n\nasync function promptFixBuildPermissions(): Promise<boolean> {\n const inquirer = await import('inquirer');\n const { fix } = await inquirer.default.prompt([\n {\n type: 'confirm',\n name: 'fix',\n message: 'Grant Cloud Build permissions now?',\n default: true,\n },\n ]);\n return fix;\n}\n\n/**\n * Check if Cloud Build permissions are already configured\n * Returns true if the key permissions exist (even if still propagating)\n */\nasync function checkCloudBuildPermissions(gcpProjectId: string): Promise<boolean> {\n try {\n // Get project number\n const { stdout: projectNumber } = await execAsync(\n `gcloud projects describe ${gcpProjectId} --format=\"value(projectNumber)\"`\n );\n const trimmedProjectNumber = projectNumber.trim();\n\n // Check if Cloud Build SA has storage.objectViewer role\n const { stdout: policy } = await execAsync(\n `gcloud projects get-iam-policy ${gcpProjectId} --format=\"json\" --flatten=\"bindings[].members\" --filter=\"bindings.members:${trimmedProjectNumber}@cloudbuild.gserviceaccount.com AND bindings.role:roles/storage.objectViewer\"`\n );\n\n // If we get output, the permission exists\n return policy.trim().length > 10;\n } catch {\n return false;\n }\n}\n\nasync function grantCloudBuildPermissions(gcpProjectId: string, region: string): Promise<boolean> {\n const spinner = ora('Getting project number...').start();\n\n try {\n // Get project number\n const { stdout: projectNumber } = await execAsync(\n `gcloud projects describe ${gcpProjectId} --format=\"value(projectNumber)\"`\n );\n const trimmedProjectNumber = projectNumber.trim();\n\n // Cloud Functions Gen2 requires permissions on BOTH:\n // 1. The Cloud Build service account (for building)\n // 2. The Cloud Functions service account (serverless-robot-prod) for deployment\n\n // Permissions for Cloud Build service account\n const cloudBuildRoles = [\n { role: 'roles/storage.objectViewer', name: 'Storage Object Viewer' },\n { role: 'roles/logging.logWriter', name: 'Logs Writer' },\n { role: 'roles/artifactregistry.writer', name: 'Artifact Registry Writer' },\n ];\n\n spinner.text = 'Granting permissions to Cloud Build service account...';\n for (const { role } of cloudBuildRoles) {\n await execAsync(\n `gcloud projects add-iam-policy-binding ${gcpProjectId} ` +\n `--member=\"serviceAccount:${trimmedProjectNumber}@cloudbuild.gserviceaccount.com\" ` +\n `--role=\"${role}\" --quiet`\n );\n }\n\n // Permissions for Cloud Functions service account (serverless-robot-prod)\n // This is the account that actually deploys the function\n const serverlessRobotRoles = [\n { role: 'roles/cloudbuild.builds.builder', name: 'Cloud Build Builder' },\n { role: 'roles/storage.objectAdmin', name: 'Storage Object Admin' },\n { role: 'roles/artifactregistry.reader', name: 'Artifact Registry Reader' },\n ];\n\n spinner.text = 'Granting permissions to Cloud Functions service account...';\n for (const { role } of serverlessRobotRoles) {\n await execAsync(\n `gcloud projects add-iam-policy-binding ${gcpProjectId} ` +\n `--member=\"serviceAccount:service-${trimmedProjectNumber}@serverless-robot-prod.iam.gserviceaccount.com\" ` +\n `--role=\"${role}\" --quiet`\n );\n }\n\n // Also grant permissions on gcf-artifacts if it exists\n spinner.text = 'Checking for gcf-artifacts repository...';\n try {\n await execAsync(`gcloud artifacts repositories describe gcf-artifacts --location=${region} --project=${gcpProjectId}`);\n // Repository exists, grant permissions\n await grantGcfArtifactsPermissions(gcpProjectId, region);\n } catch {\n // Repository doesn't exist yet, will be created on first function deploy\n }\n\n spinner.succeed('Permissions granted for Cloud Functions deployment');\n return true;\n } catch (error) {\n spinner.fail('Failed to grant permissions');\n console.log(chalk.red(`\\n ${error}\\n`));\n console.log(chalk.gray(' You may need to grant this permission manually in the GCP Console.\\n'));\n return false;\n }\n}\n\nasync function grantGcfArtifactsPermissions(gcpProjectId: string, region: string): Promise<boolean> {\n const spinner = ora('Granting gcf-artifacts permissions...').start();\n\n try {\n // Get project number\n const { stdout: projectNumber } = await execAsync(\n `gcloud projects describe ${gcpProjectId} --format=\"value(projectNumber)\"`\n );\n const trimmedProjectNumber = projectNumber.trim();\n\n // Service accounts that need access to gcf-artifacts\n const serviceAccounts = [\n `${trimmedProjectNumber}@cloudbuild.gserviceaccount.com`,\n `service-${trimmedProjectNumber}@serverless-robot-prod.iam.gserviceaccount.com`,\n `${trimmedProjectNumber}-compute@developer.gserviceaccount.com`,\n ];\n\n spinner.text = 'Granting artifactregistry.writer on gcf-artifacts...';\n for (const sa of serviceAccounts) {\n try {\n await execAsync(\n `gcloud artifacts repositories add-iam-policy-binding gcf-artifacts ` +\n `--location=${region} --project=${gcpProjectId} ` +\n `--member=\"serviceAccount:${sa}\" ` +\n `--role=\"roles/artifactregistry.writer\" --quiet`\n );\n } catch {\n // May fail if SA doesn't exist yet, continue with others\n }\n }\n\n spinner.succeed('Granted gcf-artifacts permissions');\n return true;\n } catch (error) {\n spinner.fail('Failed to grant gcf-artifacts permissions');\n console.log(chalk.red(`\\n ${error}\\n`));\n return false;\n }\n}\n\nasync function promptConflictResolution(): Promise<'force' | 'skip'> {\n const inquirer = await import('inquirer');\n const { resolution } = await inquirer.default.prompt([\n {\n type: 'list',\n name: 'resolution',\n message: 'How would you like to resolve this conflict?',\n choices: [\n {\n name: 'Delete and recreate (delete resources in GCP, let Pulumi recreate them)',\n value: 'force',\n },\n {\n name: 'Skip (show manual instructions)',\n value: 'skip',\n },\n ],\n default: 'force',\n },\n ]);\n return resolution;\n}\n\nasync function refreshPulumiState(projectName: string, resourceName?: string): Promise<boolean> {\n const spinner = ora('Cleaning Pulumi state...').start();\n const stateFile = path.join(STATE_DIR, '.pulumi', 'stacks', projectName, 'dev.json');\n\n try {\n // Read the state file\n const stateContent = await fs.readFile(stateFile, 'utf-8');\n const state = JSON.parse(stateContent);\n\n const resources = state.checkpoint?.latest?.resources || [];\n const originalCount = resources.length;\n\n if (resourceName) {\n // Remove specific resource from state\n state.checkpoint.latest.resources = resources.filter((r: { urn?: string }) => {\n const urn = r.urn || '';\n return !urn.includes(resourceName);\n });\n spinner.text = `Removing ${resourceName} from state...`;\n } else {\n // Just refresh - nothing to do, state is already current\n spinner.succeed('State is current');\n return true;\n }\n\n const newCount = state.checkpoint.latest.resources.length;\n const removed = originalCount - newCount;\n\n if (removed > 0) {\n // Backup and write new state\n await fs.writeFile(`${stateFile}.backup`, stateContent);\n await fs.writeFile(stateFile, JSON.stringify(state, null, 4));\n spinner.succeed(`Removed ${removed} resource(s) from state`);\n } else {\n spinner.succeed('No matching resources found in state');\n }\n\n return true;\n } catch (error) {\n spinner.fail('Failed to clean state');\n console.log(chalk.red(`\\n ${error}\\n`));\n return false;\n }\n}\n\nasync function forceDeleteResource(resource: ConflictingResource, gcpProjectId: string): Promise<boolean> {\n const spinner = ora(`Deleting ${resource.type}: ${resource.name}...`).start();\n const { type, name, fullPath } = resource;\n\n try {\n // Handle based on resource type\n switch (type) {\n // Artifact Registry\n case 'repositories':\n case 'artifactregistry/Repository': {\n // Get region from config or default\n const regionMatch = fullPath.match(/locations\\/([^/]+)/);\n const region = regionMatch ? regionMatch[1] : 'us-east1';\n spinner.text = `Deleting Artifact Registry ${name}...`;\n await execAsync(\n `gcloud artifacts repositories delete ${name} --location=${region} --project=${gcpProjectId} --quiet`\n );\n spinner.succeed(`Deleted Artifact Registry ${name}`);\n return true;\n }\n\n // Service Accounts\n case 'serviceAccounts':\n case 'serviceaccount/Account': {\n spinner.text = `Deleting Service Account ${name}...`;\n const email = name.includes('@') ? name : `${name}@${gcpProjectId}.iam.gserviceaccount.com`;\n await execAsync(\n `gcloud iam service-accounts delete ${email} --project=${gcpProjectId} --quiet`\n );\n spinner.succeed(`Deleted Service Account ${name}`);\n return true;\n }\n\n // Global Addresses\n case 'addresses':\n case 'globalAddresses':\n case 'compute/GlobalAddress': {\n spinner.text = `Deleting Global Address ${name}...`;\n await execAsync(\n `gcloud compute addresses delete ${name} --global --project=${gcpProjectId} --quiet`\n );\n spinner.succeed(`Deleted Global Address ${name}`);\n return true;\n }\n\n // URL Maps\n case 'urlMaps':\n case 'compute/URLMap': {\n spinner.text = `Deleting URL Map ${name}...`;\n // First check if there are dependent proxies\n const dependentProxies = await findDependentResources(name, 'url-map', gcpProjectId);\n if (dependentProxies.length > 0) {\n spinner.warn(`URL Map ${name} has dependencies that must be deleted first`);\n for (const dep of dependentProxies) {\n await forceDeleteResource(dep, gcpProjectId);\n }\n spinner.text = `Deleting URL Map ${name}...`;\n }\n await execAsync(\n `gcloud compute url-maps delete ${name} --global --project=${gcpProjectId} --quiet`\n );\n spinner.succeed(`Deleted URL Map ${name}`);\n return true;\n }\n\n // Target HTTP Proxies\n case 'targetHttpProxies':\n case 'compute/TargetHttpProxy': {\n spinner.text = `Deleting Target HTTP Proxy ${name}...`;\n // First check if there are dependent forwarding rules\n const dependentRules = await findDependentResources(name, 'http-proxy', gcpProjectId);\n if (dependentRules.length > 0) {\n spinner.warn(`Target HTTP Proxy ${name} has dependencies that must be deleted first`);\n for (const dep of dependentRules) {\n await forceDeleteResource(dep, gcpProjectId);\n }\n spinner.text = `Deleting Target HTTP Proxy ${name}...`;\n }\n await execAsync(\n `gcloud compute target-http-proxies delete ${name} --global --project=${gcpProjectId} --quiet`\n );\n spinner.succeed(`Deleted Target HTTP Proxy ${name}`);\n return true;\n }\n\n // Target HTTPS Proxies\n case 'targetHttpsProxies':\n case 'compute/TargetHttpsProxy': {\n spinner.text = `Deleting Target HTTPS Proxy ${name}...`;\n const dependentRules = await findDependentResources(name, 'https-proxy', gcpProjectId);\n if (dependentRules.length > 0) {\n for (const dep of dependentRules) {\n await forceDeleteResource(dep, gcpProjectId);\n }\n spinner.text = `Deleting Target HTTPS Proxy ${name}...`;\n }\n await execAsync(\n `gcloud compute target-https-proxies delete ${name} --global --project=${gcpProjectId} --quiet`\n );\n spinner.succeed(`Deleted Target HTTPS Proxy ${name}`);\n return true;\n }\n\n // Forwarding Rules\n case 'forwardingRules':\n case 'globalForwardingRules':\n case 'compute/GlobalForwardingRule': {\n spinner.text = `Deleting Forwarding Rule ${name}...`;\n await execAsync(\n `gcloud compute forwarding-rules delete ${name} --global --project=${gcpProjectId} --quiet`\n );\n spinner.succeed(`Deleted Forwarding Rule ${name}`);\n return true;\n }\n\n // Backend Services\n case 'backendServices':\n case 'compute/BackendService': {\n spinner.text = `Deleting Backend Service ${name}...`;\n await execAsync(\n `gcloud compute backend-services delete ${name} --global --project=${gcpProjectId} --quiet`\n );\n spinner.succeed(`Deleted Backend Service ${name}`);\n return true;\n }\n\n // Backend Buckets (for CDN)\n case 'backendBuckets':\n case 'compute/BackendBucket': {\n spinner.text = `Deleting Backend Bucket ${name}...`;\n await execAsync(\n `gcloud compute backend-buckets delete ${name} --project=${gcpProjectId} --quiet`\n );\n spinner.succeed(`Deleted Backend Bucket ${name}`);\n return true;\n }\n\n // Health Checks\n case 'healthChecks':\n case 'compute/HealthCheck': {\n spinner.text = `Deleting Health Check ${name}...`;\n await execAsync(\n `gcloud compute health-checks delete ${name} --global --project=${gcpProjectId} --quiet`\n );\n spinner.succeed(`Deleted Health Check ${name}`);\n return true;\n }\n\n // Network Endpoint Groups\n case 'networkEndpointGroups':\n case 'compute/RegionNetworkEndpointGroup': {\n const regionMatch = fullPath.match(/regions\\/([^/]+)/);\n const region = regionMatch ? regionMatch[1] : 'us-east1';\n spinner.text = `Deleting Network Endpoint Group ${name}...`;\n await execAsync(\n `gcloud compute network-endpoint-groups delete ${name} --region=${region} --project=${gcpProjectId} --quiet`\n );\n spinner.succeed(`Deleted Network Endpoint Group ${name}`);\n return true;\n }\n\n // VPC Networks\n case 'networks':\n case 'compute/Network': {\n spinner.text = `Deleting VPC Network ${name}...`;\n await execAsync(\n `gcloud compute networks delete ${name} --project=${gcpProjectId} --quiet`\n );\n spinner.succeed(`Deleted VPC Network ${name}`);\n return true;\n }\n\n // Cloud Functions\n case 'functions':\n case 'cloudfunctions/Function': {\n const locationMatch = fullPath.match(/locations\\/([^/]+)/);\n const location = locationMatch ? locationMatch[1] : 'us-east1';\n spinner.text = `Deleting Cloud Function ${name}...`;\n await execAsync(\n `gcloud functions delete ${name} --region=${location} --project=${gcpProjectId} --gen2 --quiet`\n );\n spinner.succeed(`Deleted Cloud Function ${name}`);\n return true;\n }\n\n // Cloud Run Services\n case 'services':\n case 'run/Service': {\n const locationMatch = fullPath.match(/locations\\/([^/]+)/);\n const location = locationMatch ? locationMatch[1] : 'us-east1';\n spinner.text = `Deleting Cloud Run service ${name}...`;\n await execAsync(\n `gcloud run services delete ${name} --region=${location} --project=${gcpProjectId} --quiet`\n );\n spinner.succeed(`Deleted Cloud Run service ${name}`);\n return true;\n }\n\n // Pub/Sub Topics\n case 'topics':\n case 'pubsub/Topic': {\n spinner.text = `Deleting Pub/Sub topic ${name}...`;\n await execAsync(`gcloud pubsub topics delete ${name} --project=${gcpProjectId} --quiet`);\n spinner.succeed(`Deleted Pub/Sub topic ${name}`);\n return true;\n }\n\n // SSL Certificates\n case 'sslCertificates':\n case 'compute/ManagedSslCertificate': {\n spinner.text = `Deleting SSL Certificate ${name}...`;\n // Check if there are dependent HTTPS proxies\n const dependentHttpsProxies = await findDependentResources(name, 'ssl-cert', gcpProjectId);\n if (dependentHttpsProxies.length > 0) {\n spinner.warn(`SSL Certificate ${name} has dependencies that must be deleted first`);\n for (const dep of dependentHttpsProxies) {\n await forceDeleteResource(dep, gcpProjectId);\n }\n spinner.text = `Deleting SSL Certificate ${name}...`;\n }\n await execAsync(\n `gcloud compute ssl-certificates delete ${name} --global --project=${gcpProjectId} --quiet`\n );\n spinner.succeed(`Deleted SSL Certificate ${name}`);\n return true;\n }\n\n // Storage Buckets\n case 'buckets':\n case 'storage/Bucket': {\n spinner.text = `Deleting Storage Bucket ${name}...`;\n await execAsync(`gcloud storage rm -r gs://${name} --project=${gcpProjectId}`);\n spinner.succeed(`Deleted Storage Bucket ${name}`);\n return true;\n }\n\n // VPC Access Connectors\n case 'connectors':\n case 'vpcaccess/Connector': {\n const regionMatch = fullPath.match(/locations\\/([^/]+)/);\n const region = regionMatch ? regionMatch[1] : 'us-east1';\n spinner.text = `Deleting VPC Connector ${name}...`;\n await execAsync(\n `gcloud compute networks vpc-access connectors delete ${name} --region=${region} --project=${gcpProjectId} --quiet`\n );\n spinner.succeed(`Deleted VPC Connector ${name}`);\n return true;\n }\n\n default: {\n // Try to infer from fullPath if type didn't match\n if (fullPath.includes('/functions/')) {\n return forceDeleteResource({ ...resource, type: 'functions' }, gcpProjectId);\n } else if (fullPath.includes('/services/')) {\n return forceDeleteResource({ ...resource, type: 'services' }, gcpProjectId);\n } else if (fullPath.includes('/topics/')) {\n return forceDeleteResource({ ...resource, type: 'topics' }, gcpProjectId);\n } else if (fullPath.includes('/buckets/')) {\n return forceDeleteResource({ ...resource, type: 'buckets' }, gcpProjectId);\n } else if (fullPath.includes('/addresses/')) {\n return forceDeleteResource({ ...resource, type: 'addresses' }, gcpProjectId);\n } else if (fullPath.includes('/urlMaps/')) {\n return forceDeleteResource({ ...resource, type: 'urlMaps' }, gcpProjectId);\n } else if (fullPath.includes('/targetHttpProxies/')) {\n return forceDeleteResource({ ...resource, type: 'targetHttpProxies' }, gcpProjectId);\n } else if (fullPath.includes('/forwardingRules/')) {\n return forceDeleteResource({ ...resource, type: 'forwardingRules' }, gcpProjectId);\n } else if (fullPath.includes('/connectors/') || type.includes('Connector')) {\n return forceDeleteResource({ ...resource, type: 'connectors' }, gcpProjectId);\n }\n\n spinner.fail(`Unknown resource type: ${type}`);\n console.log(chalk.yellow(`\\n Could not determine how to delete: ${name} (type: ${type})\\n`));\n console.log(chalk.gray(' Please delete the resource manually in the GCP Console.\\n'));\n return false;\n }\n }\n } catch (error) {\n spinner.fail(`Failed to delete ${name}`);\n const errorStr = String(error);\n\n // Check if resource is being used by another resource\n if (errorStr.includes('being used by')) {\n const usedByMatch = errorStr.match(/being used by '([^']+)'/);\n if (usedByMatch) {\n const dependency = usedByMatch[1];\n const depParts = dependency.split('/');\n const depName = depParts[depParts.length - 1];\n const depType = depParts[depParts.length - 2];\n\n console.log(chalk.yellow(`\\n ${name} is being used by ${depName}. Deleting dependency first...\\n`));\n\n const depResource: ConflictingResource = {\n type: depType,\n name: depName,\n fullPath: dependency,\n };\n\n const depSuccess = await forceDeleteResource(depResource, gcpProjectId);\n if (depSuccess) {\n // Retry deleting the original resource\n return forceDeleteResource(resource, gcpProjectId);\n }\n }\n }\n\n // Check for permission denied errors\n if (errorStr.includes('Permission') && errorStr.includes('denied')) {\n console.log(chalk.yellow('\\n Permission denied. Your account needs additional IAM roles.\\n'));\n\n const shouldFix = await promptFixIamPermissions();\n if (shouldFix) {\n const success = await grantResourceDeletePermissions(fullPath, gcpProjectId);\n if (success) {\n console.log(chalk.green('\\n Permissions granted! Retrying delete...\\n'));\n return forceDeleteResource(resource, gcpProjectId);\n }\n } else {\n console.log(chalk.gray(' Please delete the resource manually in the GCP Console.\\n'));\n }\n } else if (!errorStr.includes('being used by')) {\n console.log(chalk.red(`\\n ${error}\\n`));\n console.log(chalk.gray(' Please delete the resource manually in the GCP Console.\\n'));\n }\n return false;\n }\n}\n\n/**\n * Find resources that depend on a given resource\n * Used to handle deletion dependencies (forwarding rules → proxies → url maps)\n */\nasync function findDependentResources(\n resourceName: string,\n resourceType: 'url-map' | 'http-proxy' | 'https-proxy' | 'ssl-cert',\n gcpProjectId: string\n): Promise<ConflictingResource[]> {\n const dependencies: ConflictingResource[] = [];\n\n try {\n if (resourceType === 'url-map') {\n // Find HTTP proxies using this URL map\n const { stdout: httpProxies } = await execAsync(\n `gcloud compute target-http-proxies list --project=${gcpProjectId} --format=\"json\" 2>/dev/null || echo \"[]\"`\n );\n const proxies = JSON.parse(httpProxies);\n for (const proxy of proxies) {\n if (proxy.urlMap?.includes(resourceName)) {\n dependencies.push({\n type: 'targetHttpProxies',\n name: proxy.name,\n fullPath: proxy.selfLink || proxy.name,\n });\n }\n }\n\n // Find HTTPS proxies using this URL map\n const { stdout: httpsProxies } = await execAsync(\n `gcloud compute target-https-proxies list --project=${gcpProjectId} --format=\"json\" 2>/dev/null || echo \"[]\"`\n );\n const httpsProxyList = JSON.parse(httpsProxies);\n for (const proxy of httpsProxyList) {\n if (proxy.urlMap?.includes(resourceName)) {\n dependencies.push({\n type: 'targetHttpsProxies',\n name: proxy.name,\n fullPath: proxy.selfLink || proxy.name,\n });\n }\n }\n } else if (resourceType === 'http-proxy' || resourceType === 'https-proxy') {\n // Find forwarding rules using this proxy\n const { stdout: rules } = await execAsync(\n `gcloud compute forwarding-rules list --global --project=${gcpProjectId} --format=\"json\" 2>/dev/null || echo \"[]\"`\n );\n const ruleList = JSON.parse(rules);\n for (const rule of ruleList) {\n if (rule.target?.includes(resourceName)) {\n dependencies.push({\n type: 'forwardingRules',\n name: rule.name,\n fullPath: rule.selfLink || rule.name,\n });\n }\n }\n } else if (resourceType === 'ssl-cert') {\n // Find HTTPS proxies using this SSL certificate\n const { stdout: httpsProxies } = await execAsync(\n `gcloud compute target-https-proxies list --project=${gcpProjectId} --format=\"json\" 2>/dev/null || echo \"[]\"`\n );\n const proxyList = JSON.parse(httpsProxies);\n for (const proxy of proxyList) {\n // sslCertificates is an array of certificate URLs\n const certs = proxy.sslCertificates || [];\n if (certs.some((cert: string) => cert.includes(resourceName))) {\n dependencies.push({\n type: 'targetHttpsProxies',\n name: proxy.name,\n fullPath: proxy.selfLink || proxy.name,\n });\n }\n }\n }\n } catch {\n // Ignore errors when listing - we'll discover dependencies during deletion\n }\n\n return dependencies;\n}\n\nasync function promptFixIamPermissions(): Promise<boolean> {\n const inquirer = await import('inquirer');\n const { fix } = await inquirer.default.prompt([\n {\n type: 'confirm',\n name: 'fix',\n message: 'Grant yourself the required IAM permissions?',\n default: true,\n },\n ]);\n return fix;\n}\n\nasync function grantResourceDeletePermissions(resourcePath: string, gcpProjectId: string): Promise<boolean> {\n const inquirer = await import('inquirer');\n\n // Check current gcloud account\n let currentAccount = '';\n try {\n const { stdout } = await execAsync('gcloud config get-value account');\n currentAccount = stdout.trim();\n } catch {\n // Ignore\n }\n\n console.log(chalk.gray(`\\n Currently authenticated as: ${currentAccount || 'unknown'}\\n`));\n\n // Ask what to do\n const { action } = await inquirer.default.prompt([\n {\n type: 'list',\n name: 'action',\n message: 'How would you like to proceed?',\n choices: [\n {\n name: `Grant permissions to ${currentAccount || 'current account'}`,\n value: 'current',\n },\n {\n name: 'Switch to a different GCP account first',\n value: 'switch',\n },\n {\n name: 'Enter a different email to grant permissions to',\n value: 'other',\n },\n {\n name: 'Cancel',\n value: 'cancel',\n },\n ],\n },\n ]);\n\n if (action === 'cancel') {\n return false;\n }\n\n let email = currentAccount;\n\n if (action === 'switch') {\n console.log(chalk.gray('\\n Opening browser to switch GCP accounts...\\n'));\n try {\n await new Promise<void>((resolve, reject) => {\n const child = spawn('gcloud', ['auth', 'login'], {\n stdio: 'inherit',\n shell: true,\n });\n child.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error('Auth failed'));\n });\n child.on('error', reject);\n });\n\n // Get the new account\n const { stdout } = await execAsync('gcloud config get-value account');\n email = stdout.trim();\n console.log(chalk.green(`\\n Now authenticated as: ${email}\\n`));\n } catch (error) {\n console.log(chalk.red('\\n Failed to switch accounts.\\n'));\n return false;\n }\n } else if (action === 'other') {\n const { inputEmail } = await inquirer.default.prompt([\n {\n type: 'input',\n name: 'inputEmail',\n message: 'Enter the GCP account email to grant permissions to:',\n validate: (input: string) => {\n if (!input.includes('@')) {\n return 'Please enter a valid email address';\n }\n return true;\n },\n },\n ]);\n email = inputEmail;\n }\n\n if (!email) {\n console.log(chalk.red('\\n No email specified.\\n'));\n return false;\n }\n\n const spinner = ora('Granting IAM permissions...').start();\n\n try {\n // Determine which role to grant based on resource type\n let role: string;\n let roleName: string;\n\n if (resourcePath.includes('/functions/')) {\n role = 'roles/cloudfunctions.admin';\n roleName = 'Cloud Functions Admin';\n } else if (resourcePath.includes('/services/')) {\n role = 'roles/run.admin';\n roleName = 'Cloud Run Admin';\n } else if (resourcePath.includes('/topics/')) {\n role = 'roles/pubsub.admin';\n roleName = 'Pub/Sub Admin';\n } else if (resourcePath.includes('/buckets/')) {\n role = 'roles/storage.admin';\n roleName = 'Storage Admin';\n } else {\n role = 'roles/editor';\n roleName = 'Editor';\n }\n\n spinner.text = `Granting ${roleName} role to ${email}...`;\n\n await execAsync(\n `gcloud projects add-iam-policy-binding ${gcpProjectId} ` +\n `--member=\"user:${email}\" ` +\n `--role=\"${role}\" --quiet`\n );\n\n spinner.succeed(`Granted ${roleName} role to ${email}`);\n console.log(chalk.gray('\\n Note: It may take a minute for permissions to propagate.\\n'));\n return true;\n } catch (error) {\n spinner.fail('Failed to grant permissions');\n const errorStr = String(error);\n\n if (errorStr.includes('does not have permission')) {\n console.log(chalk.yellow('\\n Your current GCP account does not have permission to modify IAM.\\n'));\n console.log(chalk.gray(' You need to be a Project Owner or have the \"Project IAM Admin\" role.'));\n console.log(chalk.gray(' Ask a project owner to grant you permissions, or switch to an owner account.\\n'));\n } else {\n console.log(chalk.red(`\\n ${error}\\n`));\n }\n return false;\n }\n}\n","/**\n * CLI Deploy Service\n *\n * Standalone deployment using CDKTF (Terraform).\n * No API server required.\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport type { StackSoloConfig } from '@stacksolo/blueprint';\nimport { resolveConfig } from '@stacksolo/blueprint';\nimport { registry } from '@stacksolo/core';\nimport { gcpCdktfProvider } from '@stacksolo/plugin-gcp-cdktf';\n\nconst execAsync = promisify(exec);\n\n// Register providers\nregistry.registerProvider(gcpCdktfProvider);\n\nexport interface DeployResult {\n success: boolean;\n outputs: Record<string, unknown>;\n logs: string[];\n error?: string;\n}\n\nexport interface DeployOptions {\n onLog?: (message: string) => void;\n preview?: boolean;\n destroy?: boolean;\n}\n\n/**\n * Deploy infrastructure from a StackSolo config (CDKTF/Terraform)\n */\nexport async function deployConfig(\n config: StackSoloConfig,\n _stateDir: string, // Not used - CDKTF manages its own state\n options: DeployOptions = {}\n): Promise<DeployResult> {\n const { onLog = console.log, preview = false, destroy = false } = options;\n const logs: string[] = [];\n\n const log = (msg: string) => {\n logs.push(msg);\n onLog(msg);\n };\n\n try {\n // Resolve config to get resources\n const resolved = resolveConfig(config);\n\n log(`Resolved ${resolved.resources.length} resources (CDKTF backend)`);\n\n // CDKTF uses individual resources: vpc_network, vpc_connector, cloud_function, load_balancer, storage_website\n // Find all cloud function and UI resources\n const functionResources = resolved.resources.filter(r => r.type === 'gcp-cdktf:cloud_function');\n const uiResources = resolved.resources.filter(r => r.type === 'gcp-cdktf:storage_website');\n\n if (functionResources.length === 0 && uiResources.length === 0) {\n throw new Error('CDKTF backend requires at least one cloud_function or UI resource');\n }\n\n // Generate CDKTF code for all resources\n const allImports = new Set<string>();\n const allCode: string[] = [];\n const allOutputs: string[] = [];\n\n for (const resource of resolved.resources) {\n const resourceDef = registry.getResource(resource.type);\n if (!resourceDef) {\n log(`Warning: Unknown resource type: ${resource.type}`);\n continue;\n }\n\n const generated = resourceDef.generatePulumi(resource.config as { name: string; [key: string]: unknown });\n\n for (const imp of generated.imports || []) {\n allImports.add(imp);\n }\n allCode.push(`// ${resource.type}: ${resource.name}`);\n allCode.push(generated.code);\n allCode.push('');\n\n if (generated.outputs) {\n allOutputs.push(...generated.outputs);\n }\n }\n\n const generated = {\n imports: Array.from(allImports),\n code: allCode.join('\\n'),\n outputs: allOutputs,\n };\n\n log('Generated CDKTF code for all resources');\n\n // Use .stacksolo/cdktf directory for CDKTF work files\n const stacksoloDir = path.join(process.cwd(), '.stacksolo');\n const workDir = path.join(stacksoloDir, 'cdktf');\n await fs.mkdir(workDir, { recursive: true });\n\n // Create source zip for each function\n const sourceZips: { name: string; zipPath: string }[] = [];\n\n for (const fnResource of functionResources) {\n const fnName = fnResource.config.name as string;\n const sourceDir = path.resolve(process.cwd(), fnResource.config.sourceDir as string || `functions/${fnName}`);\n const sourceZipPath = path.join(workDir, `${fnName}-source.zip`);\n\n log(`Creating source archive for ${fnName} from ${sourceDir}...`);\n\n // Check if source directory exists\n try {\n await fs.access(sourceDir);\n } catch {\n throw new Error(`Source directory not found for function ${fnName}: ${sourceDir}`);\n }\n\n // Check if package.json exists and has a build script (TypeScript project)\n const packageJsonPath = path.join(sourceDir, 'package.json');\n let isTypeScriptProject = false;\n\n try {\n const packageJsonContent = await fs.readFile(packageJsonPath, 'utf-8');\n const packageJson = JSON.parse(packageJsonContent);\n\n // Install dependencies if node_modules doesn't exist\n const nodeModulesPath = path.join(sourceDir, 'node_modules');\n try {\n await fs.access(nodeModulesPath);\n } catch {\n log(`Installing dependencies for ${fnName}...`);\n await execAsync('npm install', { cwd: sourceDir, timeout: 120000 });\n }\n\n // Run build if script exists (TypeScript compilation)\n if (packageJson.scripts?.build) {\n log(`Building ${fnName} (TypeScript)...`);\n await execAsync('npm run build', { cwd: sourceDir, timeout: 60000 });\n isTypeScriptProject = true;\n }\n } catch {\n // No package.json or not a Node.js project - continue without build\n }\n\n // Create zip: for TypeScript, zip dist folder + package.json\n if (isTypeScriptProject) {\n const distDir = path.join(sourceDir, 'dist');\n const stagingDir = path.join(workDir, `staging-${fnName}`);\n await fs.mkdir(stagingDir, { recursive: true });\n\n // Copy dist contents to staging\n await execAsync(`cp -r \"${distDir}\"/* \"${stagingDir}\"/`, { timeout: 30000 });\n\n // Copy and fix package.json for deployment:\n // - Update main field since dist/ files are now at root\n // - Remove build script so Cloud Build doesn't try to recompile\n // - Remove devDependencies since code is already compiled\n const pkgContent = await fs.readFile(packageJsonPath, 'utf-8');\n const pkg = JSON.parse(pkgContent);\n if (pkg.main && pkg.main.startsWith('dist/')) {\n pkg.main = pkg.main.replace('dist/', '');\n }\n // Remove build-related scripts and devDependencies\n if (pkg.scripts) {\n delete pkg.scripts.build;\n delete pkg.scripts.typecheck;\n delete pkg.scripts.dev;\n }\n delete pkg.devDependencies;\n await fs.writeFile(path.join(stagingDir, 'package.json'), JSON.stringify(pkg, null, 2));\n\n // Create zip from staging\n await execAsync(`cd \"${stagingDir}\" && zip -r \"${sourceZipPath}\" .`, { timeout: 60000 });\n\n // Clean up staging\n await fs.rm(stagingDir, { recursive: true, force: true });\n } else {\n // Plain JS project - zip everything except node_modules\n await execAsync(`cd \"${sourceDir}\" && zip -r \"${sourceZipPath}\" . -x \"*.git*\" -x \"node_modules/*\"`, { timeout: 60000 });\n }\n\n sourceZips.push({ name: fnName, zipPath: sourceZipPath });\n }\n\n // State directory for Terraform (also in .stacksolo)\n const tfStateDir = path.join(\n stacksoloDir,\n 'terraform-state'\n );\n await fs.mkdir(tfStateDir, { recursive: true });\n\n // Generate main.ts with CDKTF code\n const mainTs = generateCdktfMain(config, generated);\n await fs.writeFile(path.join(workDir, 'main.ts'), mainTs);\n\n // Generate cdktf.json\n const cdktfJson = {\n language: 'typescript',\n app: 'npx ts-node main.ts',\n terraformProviders: ['hashicorp/google@~> 5.0'],\n output: 'cdktf.out',\n };\n await fs.writeFile(path.join(workDir, 'cdktf.json'), JSON.stringify(cdktfJson, null, 2));\n\n // Generate package.json\n const packageJson = {\n name: config.project.name,\n version: '1.0.0',\n main: 'main.ts',\n dependencies: {\n cdktf: '^0.20.0',\n 'cdktf-cli': '^0.20.0',\n constructs: '^10.0.0',\n '@cdktf/provider-google': '^14.0.0',\n },\n devDependencies: {\n typescript: '^5.0.0',\n 'ts-node': '^10.9.0',\n '@types/node': '^20.0.0',\n },\n };\n await fs.writeFile(path.join(workDir, 'package.json'), JSON.stringify(packageJson, null, 2));\n\n // Generate tsconfig.json\n const tsconfig = {\n compilerOptions: {\n target: 'ES2020',\n module: 'commonjs',\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n outDir: './dist',\n },\n };\n await fs.writeFile(path.join(workDir, 'tsconfig.json'), JSON.stringify(tsconfig, null, 2));\n\n // Install dependencies\n log('Installing npm dependencies...');\n await execAsync('npm install', { cwd: workDir, timeout: 120000 });\n\n // Synthesize CDKTF by running the main.ts directly\n // This uses the App.synth() call in main.ts to generate Terraform JSON\n log('Synthesizing Terraform configuration...');\n await execAsync('npx ts-node main.ts', { cwd: workDir, timeout: 60000 });\n\n // Run Terraform\n const stackDir = path.join(workDir, 'cdktf.out', 'stacks', 'main');\n\n // Copy source zips to the terraform stack directory (one per function)\n for (const { name, zipPath } of sourceZips) {\n await fs.copyFile(zipPath, path.join(stackDir, `${name}-source.zip`));\n }\n\n // Configure backend\n const backendTf = `\nterraform {\n backend \"local\" {\n path = \"${tfStateDir}/terraform.tfstate\"\n }\n}\n`;\n await fs.writeFile(path.join(stackDir, 'backend_override.tf'), backendTf);\n\n // Init\n log('Initializing Terraform...');\n await execAsync('terraform init', { cwd: stackDir });\n\n if (destroy) {\n log('Destroying resources...');\n await execAsync('terraform destroy -auto-approve', { cwd: stackDir });\n\n return {\n success: true,\n outputs: {},\n logs,\n };\n }\n\n if (preview) {\n log('Running terraform plan...');\n const { stdout } = await execAsync('terraform plan', { cwd: stackDir });\n log(stdout);\n\n return {\n success: true,\n outputs: {},\n logs,\n };\n }\n\n // Apply\n log('Applying Terraform...');\n await execAsync('terraform apply -auto-approve', { cwd: stackDir });\n\n // Get outputs\n const { stdout: outputJson } = await execAsync('terraform output -json', { cwd: stackDir });\n const outputs = JSON.parse(outputJson || '{}');\n\n const outputValues: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(outputs)) {\n outputValues[key] = (value as { value: unknown }).value;\n }\n\n // Build and upload UI assets to GCS buckets\n if (uiResources.length > 0) {\n log('Building and uploading UI assets...');\n\n for (const uiResource of uiResources) {\n const uiName = uiResource.config.name as string;\n const sourceDir = path.resolve(process.cwd(), uiResource.config.sourceDir as string || `apps/${uiName}`);\n const framework = uiResource.config.framework as string | undefined;\n const buildCommand = uiResource.config.buildCommand as string || 'npm run build';\n const buildOutputDir = uiResource.config.buildOutputDir as string;\n\n log(`Processing UI: ${uiName}`);\n\n // Check if source directory exists\n try {\n await fs.access(sourceDir);\n } catch {\n throw new Error(`UI source directory not found: ${sourceDir}`);\n }\n\n // Detect framework if not specified\n let detectedFramework = framework;\n if (!detectedFramework) {\n const packageJsonPath = path.join(sourceDir, 'package.json');\n try {\n const pkgContent = await fs.readFile(packageJsonPath, 'utf-8');\n const pkg = JSON.parse(pkgContent);\n if (pkg.dependencies?.['@sveltejs/kit'] || pkg.devDependencies?.['@sveltejs/kit']) {\n detectedFramework = 'sveltekit';\n } else if (pkg.dependencies?.vue || pkg.devDependencies?.vue) {\n detectedFramework = 'vue';\n } else if (pkg.dependencies?.react || pkg.devDependencies?.react) {\n detectedFramework = 'react';\n }\n } catch {\n // No package.json - assume plain HTML\n detectedFramework = 'html';\n }\n }\n\n // Determine build output directory based on framework\n let distPath: string;\n if (buildOutputDir) {\n distPath = path.join(sourceDir, buildOutputDir);\n } else if (detectedFramework === 'sveltekit') {\n distPath = path.join(sourceDir, 'build');\n } else {\n distPath = path.join(sourceDir, 'dist');\n }\n\n // Skip build for plain HTML\n if (detectedFramework !== 'html') {\n // Install dependencies\n const nodeModulesPath = path.join(sourceDir, 'node_modules');\n try {\n await fs.access(nodeModulesPath);\n } catch {\n log(`Installing dependencies for ${uiName}...`);\n await execAsync('npm install', { cwd: sourceDir, timeout: 120000 });\n }\n\n // Build the UI\n log(`Building ${uiName} (${detectedFramework})...`);\n await execAsync(buildCommand, { cwd: sourceDir, timeout: 120000 });\n } else {\n // For plain HTML, the source dir is the dist dir\n distPath = sourceDir;\n }\n\n // Get bucket name from Terraform output\n // The output name follows pattern: {varName}BucketName\n const varName = uiName.replace(/[^a-zA-Z0-9]/g, '_').replace(/^(\\d)/, '_$1');\n const bucketOutputKey = `${varName}BucketName`;\n const bucketName = outputValues[bucketOutputKey] as string;\n\n if (!bucketName) {\n log(`Warning: Could not find bucket name for ${uiName}, skipping upload`);\n continue;\n }\n\n // Upload to GCS using gsutil\n log(`Uploading ${uiName} to gs://${bucketName}...`);\n await execAsync(`gsutil -m rsync -r -d \"${distPath}\" gs://${bucketName}`, { timeout: 300000 });\n\n log(`UI ${uiName} deployed to gs://${bucketName}`);\n }\n }\n\n log('Deployment complete!');\n\n return {\n success: true,\n outputs: outputValues,\n logs,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log(`Error: ${errorMessage}`);\n\n return {\n success: false,\n outputs: {},\n logs,\n error: errorMessage,\n };\n }\n}\n\n/**\n * Generate CDKTF main.ts file\n */\nfunction generateCdktfMain(\n config: StackSoloConfig,\n generated: { imports: string[]; code: string; outputs?: string[] }\n): string {\n const lines: string[] = [];\n\n // Imports\n lines.push(\"import { App, TerraformStack, TerraformOutput } from 'cdktf';\");\n lines.push(\"import { Construct } from 'constructs';\");\n lines.push(\"import { GoogleProvider } from '@cdktf/provider-google/lib/provider';\");\n for (const imp of generated.imports) {\n lines.push(imp);\n }\n lines.push('');\n\n // Stack class\n lines.push('class MainStack extends TerraformStack {');\n lines.push(' constructor(scope: Construct, id: string) {');\n lines.push(' super(scope, id);');\n lines.push('');\n lines.push(' // Configure Google provider');\n lines.push(` new GoogleProvider(this, 'google', {`);\n lines.push(` project: '${config.project.gcpProjectId}',`);\n lines.push(` region: '${config.project.region}',`);\n lines.push(' });');\n lines.push('');\n lines.push(' // Resources (each function references its own source zip via __dirname)');\n lines.push(generated.code);\n lines.push('');\n\n // Outputs\n if (generated.outputs && generated.outputs.length > 0) {\n lines.push(' // Outputs');\n for (const output of generated.outputs) {\n // Convert Pulumi export to CDKTF TerraformOutput\n const match = output.match(/export const (\\w+) = (.+);/);\n if (match) {\n const [, name, value] = match;\n lines.push(` new TerraformOutput(this, '${name}', { value: ${value} });`);\n }\n }\n }\n\n lines.push(' }');\n lines.push('}');\n lines.push('');\n\n // App initialization\n lines.push(\"const app = new App();\");\n lines.push(\"new MainStack(app, 'main');\");\n lines.push(\"app.synth();\");\n lines.push('');\n\n return lines.join('\\n');\n}\n","import type {\n Provider,\n ResourceType,\n AppPattern,\n DefineProviderInput,\n DefineResourceInput,\n DefineAppPatternInput,\n} from './types';\n\n/**\n * Define a cloud provider plugin\n */\nexport function defineProvider(input: DefineProviderInput): Provider {\n return {\n id: input.id,\n name: input.name,\n icon: input.icon,\n auth: input.auth,\n resources: input.resources,\n };\n}\n\n/**\n * Define a resource type for a provider\n */\nexport function defineResource(input: DefineResourceInput): ResourceType {\n return {\n id: input.id,\n provider: input.provider,\n name: input.name,\n description: input.description,\n icon: input.icon,\n configSchema: input.configSchema,\n defaultConfig: input.defaultConfig,\n generate: input.generate,\n estimateCost: input.estimateCost,\n };\n}\n\n/**\n * Define an app pattern for composing infrastructure\n */\nexport function defineAppPattern(input: DefineAppPatternInput): AppPattern {\n return {\n id: input.id,\n name: input.name,\n description: input.description,\n icon: input.icon,\n provider: input.provider,\n detect: input.detect,\n prompts: input.prompts,\n infrastructure: input.infrastructure,\n build: input.build,\n env: input.env,\n };\n}\n","import type { Provider, ResourceType, AppPattern, Plugin } from './types';\n\n/**\n * Registry for providers and resource types\n */\nexport class PluginRegistry {\n private providers: Map<string, Provider> = new Map();\n private resources: Map<string, ResourceType> = new Map();\n private patterns: Map<string, AppPattern> = new Map();\n\n /**\n * Register a plugin (provider with its resources and patterns)\n */\n registerPlugin(plugin: Plugin): void {\n if (plugin.providers) {\n for (const provider of plugin.providers) {\n this.registerProvider(provider);\n }\n }\n if (plugin.resources) {\n for (const resource of plugin.resources) {\n this.registerResource(resource);\n }\n }\n if (plugin.patterns) {\n for (const pattern of plugin.patterns) {\n this.registerPattern(pattern);\n }\n }\n }\n\n /**\n * Register a provider\n */\n registerProvider(provider: Provider): void {\n if (this.providers.has(provider.id)) {\n throw new Error(`Provider already registered: ${provider.id}`);\n }\n this.providers.set(provider.id, provider);\n\n // Also register all resources from this provider\n for (const resource of provider.resources) {\n this.registerResource(resource);\n }\n }\n\n /**\n * Register a resource type\n */\n registerResource(resource: ResourceType): void {\n if (this.resources.has(resource.id)) {\n throw new Error(`Resource type already registered: ${resource.id}`);\n }\n this.resources.set(resource.id, resource);\n }\n\n /**\n * Get a provider by ID\n */\n getProvider(id: string): Provider | undefined {\n return this.providers.get(id);\n }\n\n /**\n * Get a resource type by ID\n */\n getResource(id: string): ResourceType | undefined {\n return this.resources.get(id);\n }\n\n /**\n * Get all registered providers\n */\n getAllProviders(): Provider[] {\n return Array.from(this.providers.values());\n }\n\n /**\n * Get all registered resource types\n */\n getAllResources(): ResourceType[] {\n return Array.from(this.resources.values());\n }\n\n /**\n * Get all resource types for a specific provider\n */\n getResourcesByProvider(providerId: string): ResourceType[] {\n return Array.from(this.resources.values()).filter(\n (r) => r.provider === providerId\n );\n }\n\n /**\n * Register an app pattern\n */\n registerPattern(pattern: AppPattern): void {\n if (this.patterns.has(pattern.id)) {\n throw new Error(`App pattern already registered: ${pattern.id}`);\n }\n this.patterns.set(pattern.id, pattern);\n }\n\n /**\n * Get an app pattern by ID\n */\n getPattern(id: string): AppPattern | undefined {\n return this.patterns.get(id);\n }\n\n /**\n * Get all registered app patterns\n */\n getAllPatterns(): AppPattern[] {\n return Array.from(this.patterns.values());\n }\n\n /**\n * Get all app patterns for a specific provider\n */\n getPatternsByProvider(providerId: string): AppPattern[] {\n return Array.from(this.patterns.values()).filter(\n (p) => p.provider === providerId\n );\n }\n\n /**\n * Detect applicable patterns for a project path\n */\n async detectPatterns(projectPath: string): Promise<AppPattern[]> {\n const detected: AppPattern[] = [];\n for (const pattern of this.patterns.values()) {\n try {\n if (await pattern.detect(projectPath)) {\n detected.push(pattern);\n }\n } catch {\n // Pattern detection failed, skip it\n }\n }\n return detected;\n }\n}\n\n// Global registry instance\nexport const registry = new PluginRegistry();\n","import { defineProvider } from '@stacksolo/core';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport { vpcNetwork, vpcConnector, cloudFunction, loadBalancer, storageWebsite } from './resources/index.js';\n\nconst execAsync = promisify(exec);\n\n/**\n * GCP CDKTF Provider\n *\n * This provider uses CDK for Terraform (CDKTF) for infrastructure deployment.\n * Supports function-api template (Cloud Function + Load Balancer) with\n * multi-function path-based routing.\n */\nexport const gcpCdktfProvider = defineProvider({\n id: 'gcp-cdktf',\n name: 'Google Cloud Platform (CDKTF)',\n icon: 'cloud',\n\n auth: {\n type: 'cli',\n command: 'gcloud',\n instructions: `\nTo authenticate with GCP for CDKTF deployment:\n\n1. Install the gcloud CLI: https://cloud.google.com/sdk/docs/install\n2. Run: gcloud auth login\n3. Run: gcloud auth application-default login\n4. Set your project: gcloud config set project YOUR_PROJECT_ID\n5. Install Terraform: https://developer.hashicorp.com/terraform/downloads\n `.trim(),\n\n validate: async (): Promise<boolean> => {\n try {\n // Check gcloud auth\n const { stdout: gcloudAuth } = await execAsync(\n 'gcloud auth list --filter=status:ACTIVE --format=\"value(account)\"'\n );\n if (!gcloudAuth.trim()) {\n return false;\n }\n\n // Check terraform is installed\n await execAsync('terraform version');\n return true;\n } catch {\n return false;\n }\n },\n },\n\n resources: [\n vpcNetwork,\n vpcConnector,\n cloudFunction,\n loadBalancer,\n storageWebsite,\n ],\n});\n","import { defineResource, type ResourceConfig } from '@stacksolo/core';\n\nfunction toVariableName(name: string): string {\n return name.replace(/[^a-zA-Z0-9]/g, '_').replace(/^(\\d)/, '_$1');\n}\n\nexport const vpcNetwork = defineResource({\n id: 'gcp-cdktf:vpc_network',\n provider: 'gcp-cdktf',\n name: 'VPC Network',\n description: 'Virtual Private Cloud network for isolating resources',\n icon: 'hub',\n\n configSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n title: 'Network Name',\n description: 'Unique name for the VPC network',\n minLength: 1,\n maxLength: 63,\n },\n description: {\n type: 'string',\n title: 'Description',\n description: 'Human-readable description',\n },\n autoCreateSubnetworks: {\n type: 'boolean',\n title: 'Auto Create Subnets',\n description: 'Automatically create subnets in each region',\n default: true,\n },\n },\n required: ['name'],\n },\n\n defaultConfig: {\n autoCreateSubnetworks: true,\n },\n\n generate: (config: ResourceConfig) => {\n const varName = toVariableName(config.name);\n const vpcConfig = config as {\n name: string;\n description?: string;\n autoCreateSubnetworks?: boolean;\n };\n\n const autoCreate = vpcConfig.autoCreateSubnetworks ?? true;\n\n const code = `const ${varName}Network = new ComputeNetwork(this, '${config.name}', {\n name: '${config.name}',\n autoCreateSubnetworks: ${autoCreate},\n});`;\n\n return {\n imports: [\n \"import { ComputeNetwork } from '@cdktf/provider-google/lib/compute-network';\",\n ],\n code,\n outputs: [\n `export const ${varName}NetworkName = ${varName}Network.name;`,\n `export const ${varName}NetworkId = ${varName}Network.id;`,\n `export const ${varName}NetworkSelfLink = ${varName}Network.selfLink;`,\n ],\n };\n },\n\n estimateCost: () => ({\n monthly: 0,\n currency: 'USD',\n breakdown: [\n { item: 'VPC network (no charge)', amount: 0 },\n ],\n }),\n});\n","import { defineResource, type ResourceConfig } from '@stacksolo/core';\n\nfunction toVariableName(name: string): string {\n return name.replace(/[^a-zA-Z0-9]/g, '_').replace(/^(\\d)/, '_$1');\n}\n\nexport const vpcConnector = defineResource({\n id: 'gcp-cdktf:vpc_connector',\n provider: 'gcp-cdktf',\n name: 'VPC Access Connector',\n description: 'Serverless VPC Access connector for Cloud Functions and Cloud Run',\n icon: 'link',\n\n configSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n title: 'Connector Name',\n description: 'Unique name for the VPC connector',\n minLength: 1,\n maxLength: 63,\n },\n network: {\n type: 'string',\n title: 'Network',\n description: 'VPC network to connect to',\n },\n region: {\n type: 'string',\n title: 'Region',\n description: 'GCP region for the connector',\n },\n ipCidrRange: {\n type: 'string',\n title: 'IP CIDR Range',\n description: 'IP range for the connector (e.g., 10.8.0.0/28)',\n default: '10.8.0.0/28',\n },\n minThroughput: {\n type: 'number',\n title: 'Min Throughput',\n description: 'Minimum throughput in Mbps',\n default: 200,\n },\n maxThroughput: {\n type: 'number',\n title: 'Max Throughput',\n description: 'Maximum throughput in Mbps',\n default: 300,\n },\n },\n required: ['name', 'network', 'region'],\n },\n\n defaultConfig: {\n ipCidrRange: '10.8.0.0/28',\n minThroughput: 200,\n maxThroughput: 300,\n },\n\n generate: (config: ResourceConfig) => {\n const varName = toVariableName(config.name);\n const connectorConfig = config as {\n name: string;\n network: string;\n region: string;\n ipCidrRange?: string;\n minThroughput?: number;\n maxThroughput?: number;\n existingNetwork?: boolean;\n };\n\n const ipCidr = connectorConfig.ipCidrRange || '10.8.0.0/28';\n const minThroughput = connectorConfig.minThroughput || 200;\n const maxThroughput = connectorConfig.maxThroughput || 300;\n const networkVar = toVariableName(connectorConfig.network);\n const useExistingNetwork = connectorConfig.existingNetwork === true;\n\n // If using existing network, reference by name string; otherwise reference the resource\n const networkRef = useExistingNetwork\n ? `'${connectorConfig.network}'`\n : `${networkVar}Network.id`;\n\n const code = `const ${varName}Connector = new VpcAccessConnector(this, '${config.name}', {\n name: '${config.name}',\n region: '${connectorConfig.region}',\n network: ${networkRef},\n ipCidrRange: '${ipCidr}',\n minThroughput: ${minThroughput},\n maxThroughput: ${maxThroughput},\n});`;\n\n return {\n imports: [\n \"import { VpcAccessConnector } from '@cdktf/provider-google/lib/vpc-access-connector';\",\n ],\n code,\n outputs: [\n `export const ${varName}ConnectorId = ${varName}Connector.id;`,\n `export const ${varName}ConnectorName = ${varName}Connector.name;`,\n ],\n };\n },\n\n estimateCost: () => ({\n monthly: 0,\n currency: 'USD',\n breakdown: [\n { item: 'VPC connector (billed per GB processed)', amount: 0 },\n ],\n }),\n});\n","import { defineResource, type ResourceConfig } from '@stacksolo/core';\n\nfunction toVariableName(name: string): string {\n return name.replace(/[^a-zA-Z0-9]/g, '_').replace(/^(\\d)/, '_$1');\n}\n\nexport const cloudFunction = defineResource({\n id: 'gcp-cdktf:cloud_function',\n provider: 'gcp-cdktf',\n name: 'Cloud Function',\n description: 'Serverless function (Gen2) that scales automatically',\n icon: 'functions',\n\n configSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n title: 'Function Name',\n description: 'Unique name for the function',\n minLength: 1,\n maxLength: 63,\n },\n location: {\n type: 'string',\n title: 'Region',\n description: 'GCP region to deploy the function',\n default: 'us-central1',\n },\n runtime: {\n type: 'string',\n title: 'Runtime',\n description: 'Function runtime environment',\n default: 'nodejs20',\n enum: ['nodejs20', 'nodejs18', 'python311', 'python310', 'go121', 'go120'],\n },\n entryPoint: {\n type: 'string',\n title: 'Entry Point',\n description: 'Function entry point name',\n default: 'api',\n },\n memory: {\n type: 'string',\n title: 'Memory',\n description: 'Memory allocated to the function',\n default: '256Mi',\n enum: ['128Mi', '256Mi', '512Mi', '1Gi', '2Gi', '4Gi'],\n },\n timeout: {\n type: 'number',\n title: 'Timeout',\n description: 'Function timeout in seconds',\n default: 60,\n },\n minInstances: {\n type: 'number',\n title: 'Min Instances',\n description: 'Minimum number of instances',\n default: 0,\n },\n maxInstances: {\n type: 'number',\n title: 'Max Instances',\n description: 'Maximum number of instances',\n default: 100,\n },\n vpcConnector: {\n type: 'string',\n title: 'VPC Connector',\n description: 'VPC connector name for network access',\n },\n allowUnauthenticated: {\n type: 'boolean',\n title: 'Allow Unauthenticated',\n description: 'Allow public access without authentication',\n default: true,\n },\n projectName: {\n type: 'string',\n title: 'Project Name',\n description: 'StackSolo project name (injected as STACKSOLO_PROJECT_NAME)',\n },\n gatewayUrl: {\n type: 'string',\n title: 'Gateway URL',\n description: 'URL for service-to-service calls (e.g., load balancer URL)',\n },\n environmentVariables: {\n type: 'object',\n title: 'Environment Variables',\n description: 'Additional environment variables for the function',\n additionalProperties: { type: 'string' },\n },\n },\n required: ['name', 'location'],\n },\n\n defaultConfig: {\n runtime: 'nodejs20',\n entryPoint: 'api',\n memory: '256Mi',\n timeout: 60,\n minInstances: 0,\n maxInstances: 100,\n allowUnauthenticated: true,\n },\n\n generate: (config: ResourceConfig) => {\n const varName = toVariableName(config.name);\n const fnConfig = config as {\n name: string;\n location: string;\n runtime?: string;\n entryPoint?: string;\n memory?: string;\n timeout?: number;\n minInstances?: number;\n maxInstances?: number;\n vpcConnector?: string;\n allowUnauthenticated?: boolean;\n projectId?: string;\n projectName?: string;\n gatewayUrl?: string;\n environmentVariables?: Record<string, string>;\n };\n\n const location = fnConfig.location;\n const runtime = fnConfig.runtime || 'nodejs20';\n const entryPoint = fnConfig.entryPoint || 'api';\n const memory = fnConfig.memory || '256Mi';\n const timeout = fnConfig.timeout || 60;\n const minInstances = fnConfig.minInstances ?? 0;\n const maxInstances = fnConfig.maxInstances ?? 100;\n const allowUnauthenticated = fnConfig.allowUnauthenticated ?? true;\n const projectId = fnConfig.projectId || '${var.project_id}';\n const projectName = fnConfig.projectName || '';\n const gatewayUrl = fnConfig.gatewayUrl || '';\n const additionalEnv = fnConfig.environmentVariables || {};\n\n // Source bucket and zip (each function has its own source zip)\n // Use relative path - the zip will be copied to the terraform stack directory\n const sourceZipFileName = `${config.name}-source.zip`;\n\n let code = `// Source bucket for function code\nconst ${varName}SourceBucket = new StorageBucket(this, '${config.name}-source', {\n name: '${projectId}-${config.name}-source',\n location: '${location}',\n uniformBucketLevelAccess: true,\n forceDestroy: true,\n});\n\n// Source zip object\nconst ${varName}SourceZip = new StorageBucketObject(this, '${config.name}-source-zip', {\n name: 'source.zip',\n bucket: ${varName}SourceBucket.name,\n source: './${sourceZipFileName}',\n});\n\n// Cloud Function Gen2\nconst ${varName}Function = new Cloudfunctions2Function(this, '${config.name}', {\n name: '${config.name}',\n location: '${location}',\n buildConfig: {\n runtime: '${runtime}',\n entryPoint: '${entryPoint}',\n source: {\n storageSource: {\n bucket: ${varName}SourceBucket.name,\n object: ${varName}SourceZip.name,\n },\n },\n },\n serviceConfig: {\n availableMemory: '${memory}',\n timeoutSeconds: ${timeout},\n maxInstanceCount: ${maxInstances},\n minInstanceCount: ${minInstances},\n ingressSettings: 'ALLOW_ALL',\n allTrafficOnLatestRevision: true,\n environmentVariables: {\n NODE_ENV: 'production',\n GCP_PROJECT_ID: '${projectId}',${projectName ? `\\n STACKSOLO_PROJECT_NAME: '${projectName}',` : ''}${gatewayUrl ? `\\n GATEWAY_URL: '${gatewayUrl}',` : ''}${Object.entries(additionalEnv).map(([k, v]) => `\\n ${k}: '${v}',`).join('')}\n },`;\n\n // Add VPC connector if specified\n if (fnConfig.vpcConnector) {\n const connectorVar = toVariableName(fnConfig.vpcConnector);\n code += `\n vpcConnector: ${connectorVar}Connector.id,`;\n }\n\n code += `\n },\n});`;\n\n // Add IAM binding for unauthenticated access (Gen2 functions need Cloud Run invoker)\n if (allowUnauthenticated) {\n code += `\n\n// Allow public access (allUsers) - Cloud Functions IAM\nnew Cloudfunctions2FunctionIamMember(this, '${config.name}-invoker', {\n project: ${varName}Function.project,\n location: ${varName}Function.location,\n cloudFunction: ${varName}Function.name,\n role: 'roles/cloudfunctions.invoker',\n member: 'allUsers',\n});\n\n// Allow public access (allUsers) - Cloud Run IAM (Gen2 functions run on Cloud Run)\nnew CloudRunServiceIamMember(this, '${config.name}-run-invoker', {\n project: ${varName}Function.project,\n location: ${varName}Function.location,\n service: ${varName}Function.name,\n role: 'roles/run.invoker',\n member: 'allUsers',\n});`;\n }\n\n return {\n imports: [\n \"import { Cloudfunctions2Function } from '@cdktf/provider-google/lib/cloudfunctions2-function';\",\n \"import { Cloudfunctions2FunctionIamMember } from '@cdktf/provider-google/lib/cloudfunctions2-function-iam-member';\",\n \"import { CloudRunServiceIamMember } from '@cdktf/provider-google/lib/cloud-run-service-iam-member';\",\n \"import { StorageBucket } from '@cdktf/provider-google/lib/storage-bucket';\",\n \"import { StorageBucketObject } from '@cdktf/provider-google/lib/storage-bucket-object';\",\n ],\n code,\n outputs: [\n `export const ${varName}FunctionUrl = ${varName}Function.url;`,\n `export const ${varName}FunctionName = ${varName}Function.name;`,\n ],\n };\n },\n\n estimateCost: (config: ResourceConfig) => {\n const fnConfig = config as { memory?: string };\n const memory = fnConfig.memory || '256Mi';\n\n const memoryPricing: Record<string, number> = {\n '128Mi': 0,\n '256Mi': 0,\n '512Mi': 5,\n '1Gi': 10,\n '2Gi': 20,\n '4Gi': 40,\n };\n\n const estimated = memoryPricing[memory] || 0;\n\n return {\n monthly: estimated,\n currency: 'USD',\n breakdown: [\n { item: 'Cloud Functions (first 2M invocations free)', amount: 0 },\n { item: 'Compute time (estimated)', amount: estimated },\n ],\n };\n },\n});\n","import { defineResource, type ResourceConfig } from '@stacksolo/core';\n\nfunction toVariableName(name: string): string {\n return name.replace(/[^a-zA-Z0-9]/g, '_').replace(/^(\\d)/, '_$1');\n}\n\ninterface RouteConfig {\n path: string;\n functionName?: string; // For Cloud Function backend\n uiName?: string; // For Storage bucket backend (static UI)\n}\n\nexport const loadBalancer = defineResource({\n id: 'gcp-cdktf:load_balancer',\n provider: 'gcp-cdktf',\n name: 'HTTP Load Balancer',\n description: 'Global HTTP load balancer for Cloud Functions (serverless NEG)',\n icon: 'dns',\n\n configSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n title: 'Load Balancer Name',\n description: 'Unique name for the load balancer',\n minLength: 1,\n maxLength: 63,\n },\n region: {\n type: 'string',\n title: 'Region',\n description: 'Region for the serverless NEG',\n },\n functionName: {\n type: 'string',\n title: 'Function Name',\n description: 'Default Cloud Function to route traffic to',\n },\n routes: {\n type: 'array',\n title: 'Routes',\n description: 'Path-based routing rules (array of {path, functionName})',\n items: {\n type: 'object',\n },\n },\n },\n required: ['name', 'region'],\n },\n\n defaultConfig: {},\n\n generate: (config: ResourceConfig) => {\n const varName = toVariableName(config.name);\n const lbConfig = config as {\n name: string;\n region: string;\n functionName?: string;\n routes?: RouteConfig[];\n };\n\n // Get routes (or use default function if specified)\n const routes = lbConfig.routes || (lbConfig.functionName ? [{ path: '/*', functionName: lbConfig.functionName }] : []);\n\n // Separate function and UI backends\n const functionRoutes = routes.filter(r => r.functionName);\n const uiRoutes = routes.filter(r => r.uiName);\n const uniqueFunctions = [...new Set(functionRoutes.map(r => r.functionName!))];\n const uniqueUIs = [...new Set(uiRoutes.map(r => r.uiName!))];\n\n // Generate NEG and Backend for each unique function\n const negBackendCode = uniqueFunctions.map(fnName => {\n const fnVar = toVariableName(fnName);\n return `// Serverless NEG for ${fnName}\nconst ${fnVar}Neg = new ComputeRegionNetworkEndpointGroup(this, '${fnName}-neg', {\n name: '${fnName}-neg',\n region: '${lbConfig.region}',\n networkEndpointType: 'SERVERLESS',\n cloudFunction: {\n function: ${fnVar}Function.name,\n },\n});\n\n// Backend service for ${fnName}\nconst ${fnVar}Backend = new ComputeBackendService(this, '${fnName}-backend', {\n name: '${fnName}-backend',\n protocol: 'HTTP',\n portName: 'http',\n timeoutSec: 30,\n backend: [{\n group: ${fnVar}Neg.selfLink,\n }],\n});`;\n }).join('\\n\\n');\n\n // Note: UI backend buckets are created by storage-website resource\n // We just reference them here by their variable name pattern: ${uiVar}BackendBucket\n\n // Helper to get backend reference for a route\n const getBackendRef = (route: RouteConfig): string => {\n if (route.functionName) {\n return `${toVariableName(route.functionName)}Backend.selfLink`;\n } else if (route.uiName) {\n return `${toVariableName(route.uiName)}BackendBucket.selfLink`;\n }\n return '';\n };\n\n // Find the default route (/*)\n const defaultRoute = routes.find(r => r.path === '/*');\n let defaultBackendRef: string;\n if (defaultRoute) {\n defaultBackendRef = getBackendRef(defaultRoute);\n } else if (uniqueFunctions.length > 0) {\n defaultBackendRef = `${toVariableName(uniqueFunctions[0])}Backend.selfLink`;\n } else if (uniqueUIs.length > 0) {\n defaultBackendRef = `${toVariableName(uniqueUIs[0])}BackendBucket.selfLink`;\n } else {\n defaultBackendRef = '';\n }\n\n // Generate path matchers for non-default routes\n const nonDefaultRoutes = routes.filter(r => r.path !== '/*');\n\n let urlMapConfig: string;\n if (nonDefaultRoutes.length === 0) {\n // Simple case: just one default route\n urlMapConfig = `// URL Map (Load Balancer routing)\nconst ${varName}UrlMap = new ComputeUrlMap(this, '${config.name}-urlmap', {\n name: '${config.name}',\n defaultService: ${defaultBackendRef},\n});`;\n } else {\n // Complex case: path-based routing\n // GCP URL maps require ONE path_matcher per host_rule, with all path rules inside\n const pathRulesCode = nonDefaultRoutes.map((route) => {\n const backendRef = getBackendRef(route);\n return ` {\n paths: ['${route.path}'],\n service: ${backendRef},\n }`;\n }).join(',\\n');\n\n urlMapConfig = `// URL Map with path-based routing\nconst ${varName}UrlMap = new ComputeUrlMap(this, '${config.name}-urlmap', {\n name: '${config.name}',\n defaultService: ${defaultBackendRef},\n hostRule: [{\n hosts: ['*'],\n pathMatcher: 'all-paths',\n }],\n pathMatcher: [{\n name: 'all-paths',\n defaultService: ${defaultBackendRef},\n pathRule: [\n${pathRulesCode},\n ],\n }],\n});`;\n }\n\n const code = `${negBackendCode}\n\n${urlMapConfig}\n\n// HTTP Proxy\nconst ${varName}HttpProxy = new ComputeTargetHttpProxy(this, '${config.name}-http-proxy', {\n name: '${config.name}-http-proxy',\n urlMap: ${varName}UrlMap.selfLink,\n});\n\n// Global IP Address\nconst ${varName}Ip = new ComputeGlobalAddress(this, '${config.name}-ip', {\n name: '${config.name}-ip',\n});\n\n// Forwarding Rule (routes traffic to HTTP proxy)\nnew ComputeGlobalForwardingRule(this, '${config.name}-http-rule', {\n name: '${config.name}-http-rule',\n target: ${varName}HttpProxy.selfLink,\n portRange: '80',\n ipAddress: ${varName}Ip.address,\n});`;\n\n return {\n imports: [\n \"import { ComputeGlobalAddress } from '@cdktf/provider-google/lib/compute-global-address';\",\n \"import { ComputeGlobalForwardingRule } from '@cdktf/provider-google/lib/compute-global-forwarding-rule';\",\n \"import { ComputeTargetHttpProxy } from '@cdktf/provider-google/lib/compute-target-http-proxy';\",\n \"import { ComputeUrlMap } from '@cdktf/provider-google/lib/compute-url-map';\",\n \"import { ComputeBackendService } from '@cdktf/provider-google/lib/compute-backend-service';\",\n \"import { ComputeRegionNetworkEndpointGroup } from '@cdktf/provider-google/lib/compute-region-network-endpoint-group';\",\n ],\n code,\n outputs: [\n `export const ${varName}LoadBalancerIp = ${varName}Ip.address;`,\n ],\n };\n },\n\n estimateCost: () => ({\n monthly: 18,\n currency: 'USD',\n breakdown: [\n { item: 'Forwarding rule', amount: 0 },\n { item: 'Data processing ($0.008/GB)', amount: 8 },\n { item: 'Backend service', amount: 10 },\n ],\n }),\n});\n","import { defineResource, type ResourceConfig } from '@stacksolo/core';\n\nfunction toVariableName(name: string): string {\n return name.replace(/[^a-zA-Z0-9]/g, '_').replace(/^(\\d)/, '_$1');\n}\n\nexport const storageWebsite = defineResource({\n id: 'gcp-cdktf:storage_website',\n provider: 'gcp-cdktf',\n name: 'Storage Website',\n description: 'Cloud Storage bucket configured for static website hosting with CDN',\n icon: 'web',\n\n configSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n title: 'Site Name',\n description: 'Unique name for the website bucket',\n minLength: 1,\n maxLength: 63,\n },\n location: {\n type: 'string',\n title: 'Location',\n description: 'GCP region/location for the bucket',\n default: 'US',\n },\n indexDocument: {\n type: 'string',\n title: 'Index Document',\n description: 'Main page to serve',\n default: 'index.html',\n },\n errorDocument: {\n type: 'string',\n title: 'Error Document',\n description: 'Page to serve for 404 errors (use index.html for SPA routing)',\n default: 'index.html',\n },\n enableCdn: {\n type: 'boolean',\n title: 'Enable CDN',\n description: 'Enable Cloud CDN for the backend bucket',\n default: true,\n },\n },\n required: ['name'],\n },\n\n defaultConfig: {\n location: 'US',\n indexDocument: 'index.html',\n errorDocument: 'index.html',\n enableCdn: true,\n },\n\n generate: (config: ResourceConfig) => {\n const varName = toVariableName(config.name);\n const uiConfig = config as {\n name: string;\n location?: string;\n indexDocument?: string;\n errorDocument?: string;\n enableCdn?: boolean;\n projectId?: string;\n };\n\n const location = uiConfig.location || 'US';\n const indexDocument = uiConfig.indexDocument || 'index.html';\n const errorDocument = uiConfig.errorDocument || 'index.html';\n const enableCdn = uiConfig.enableCdn ?? true;\n const projectId = uiConfig.projectId || '${var.project_id}';\n\n // Generate bucket name - must be globally unique\n const bucketName = `${projectId}-${config.name}`;\n\n const code = `// GCS bucket for static website: ${config.name}\nconst ${varName}Bucket = new StorageBucket(this, '${config.name}', {\n name: '${bucketName}',\n location: '${location}',\n uniformBucketLevelAccess: true,\n forceDestroy: true,\n website: {\n mainPageSuffix: '${indexDocument}',\n notFoundPage: '${errorDocument}',\n },\n});\n\n// Public access for website\nnew StorageBucketIamMember(this, '${config.name}-public', {\n bucket: ${varName}Bucket.name,\n role: 'roles/storage.objectViewer',\n member: 'allUsers',\n});\n\n// Backend bucket for load balancer (with CDN)\nconst ${varName}BackendBucket = new ComputeBackendBucket(this, '${config.name}-backend', {\n name: '${config.name}-backend',\n bucketName: ${varName}Bucket.name,\n enableCdn: ${enableCdn},\n});`;\n\n return {\n imports: [\n \"import { StorageBucket } from '@cdktf/provider-google/lib/storage-bucket';\",\n \"import { StorageBucketIamMember } from '@cdktf/provider-google/lib/storage-bucket-iam-member';\",\n \"import { ComputeBackendBucket } from '@cdktf/provider-google/lib/compute-backend-bucket';\",\n ],\n code,\n outputs: [\n `export const ${varName}BucketName = ${varName}Bucket.name;`,\n `export const ${varName}BucketUrl = ${varName}Bucket.url;`,\n `export const ${varName}WebsiteUrl = 'https://storage.googleapis.com/' + ${varName}Bucket.name;`,\n ],\n };\n },\n\n estimateCost: (config: ResourceConfig) => {\n // Cloud Storage is very cheap for static hosting\n // CDN costs depend on usage\n return {\n monthly: 1,\n currency: 'USD',\n breakdown: [\n { item: 'Cloud Storage (estimated 1GB)', amount: 0.02 },\n { item: 'Cloud CDN (estimated egress)', amount: 1 },\n ],\n };\n },\n});\n","import type { Plugin } from '@stacksolo/core';\nimport { gcpCdktfProvider } from './provider.js';\n\n// Export the provider\nexport { gcpCdktfProvider } from './provider.js';\n\n// Export individual resources\nexport { vpcNetwork } from './resources/vpc-network.js';\nexport { vpcConnector } from './resources/vpc-connector.js';\nexport { cloudFunction } from './resources/cloud-function.js';\nexport { loadBalancer } from './resources/load-balancer.js';\n\n// Export as plugin for auto-discovery\nconst plugin: Plugin = {\n providers: [gcpCdktfProvider],\n patterns: [],\n};\n\nexport default plugin;\n","/**\n * Debug logger for StackSolo CLI\n * Writes debug output to .stacksolo/debug.log\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { homedir } from 'os';\n\nconst STACKSOLO_DIR = '.stacksolo';\nconst DEBUG_LOG_FILE = 'debug.log';\nconst MAX_LOG_SIZE = 5 * 1024 * 1024; // 5MB\n\nlet logFilePath: string | null = null;\nlet sessionStarted = false;\n\n/**\n * Get the debug log file path\n */\nexport function getLogPath(): string {\n if (!logFilePath) {\n // Try local .stacksolo first, fall back to home directory\n const localDir = path.join(process.cwd(), STACKSOLO_DIR);\n const homeDir = path.join(homedir(), STACKSOLO_DIR);\n\n if (fs.existsSync(localDir)) {\n logFilePath = path.join(localDir, DEBUG_LOG_FILE);\n } else {\n // Ensure home directory exists\n if (!fs.existsSync(homeDir)) {\n fs.mkdirSync(homeDir, { recursive: true });\n }\n logFilePath = path.join(homeDir, DEBUG_LOG_FILE);\n }\n }\n return logFilePath;\n}\n\n/**\n * Initialize logging session with separator\n */\nfunction initSession(): void {\n if (sessionStarted) return;\n sessionStarted = true;\n\n const logPath = getLogPath();\n\n // Rotate log if too large\n try {\n if (fs.existsSync(logPath)) {\n const stats = fs.statSync(logPath);\n if (stats.size > MAX_LOG_SIZE) {\n const backupPath = logPath + '.old';\n if (fs.existsSync(backupPath)) {\n fs.unlinkSync(backupPath);\n }\n fs.renameSync(logPath, backupPath);\n }\n }\n } catch {\n // Ignore rotation errors\n }\n\n // Write session header\n const timestamp = new Date().toISOString();\n const separator = '='.repeat(80);\n const header = `\\n${separator}\\n[${timestamp}] StackSolo CLI Session Started\\n${separator}\\n`;\n\n try {\n fs.appendFileSync(logPath, header);\n } catch {\n // Ignore write errors\n }\n}\n\n/**\n * Format a log entry\n */\nfunction formatEntry(level: string, message: string, data?: unknown): string {\n const timestamp = new Date().toISOString();\n let entry = `[${timestamp}] [${level}] ${message}`;\n\n if (data !== undefined) {\n try {\n if (data instanceof Error) {\n entry += `\\n Error: ${data.message}`;\n if (data.stack) {\n entry += `\\n Stack: ${data.stack}`;\n }\n } else if (typeof data === 'object') {\n entry += `\\n Data: ${JSON.stringify(data, null, 2).split('\\n').join('\\n ')}`;\n } else {\n entry += `\\n Data: ${String(data)}`;\n }\n } catch {\n entry += `\\n Data: [Could not serialize]`;\n }\n }\n\n return entry + '\\n';\n}\n\n/**\n * Write to the debug log\n */\nfunction writeLog(level: string, message: string, data?: unknown): void {\n initSession();\n const entry = formatEntry(level, message, data);\n\n try {\n fs.appendFileSync(getLogPath(), entry);\n } catch {\n // Silently fail - don't interrupt CLI operation\n }\n}\n\n/**\n * Log an info message\n */\nexport function logInfo(message: string, data?: unknown): void {\n writeLog('INFO', message, data);\n}\n\n/**\n * Log a warning message\n */\nexport function logWarn(message: string, data?: unknown): void {\n writeLog('WARN', message, data);\n}\n\n/**\n * Log an error message\n */\nexport function logError(message: string, data?: unknown): void {\n writeLog('ERROR', message, data);\n}\n\n/**\n * Log a debug message (verbose)\n */\nexport function logDebug(message: string, data?: unknown): void {\n writeLog('DEBUG', message, data);\n}\n\n/**\n * Log command execution\n */\nexport function logCommand(command: string, args?: Record<string, unknown>): void {\n writeLog('CMD', `Executing: ${command}`, args);\n}\n\n/**\n * Log command output (stdout/stderr)\n */\nexport function logOutput(type: 'stdout' | 'stderr', output: string): void {\n if (output.trim()) {\n writeLog(type.toUpperCase(), output.trim());\n }\n}\n\n/**\n * Log a full error with context for debugging\n */\nexport function logFullError(\n context: string,\n error: unknown,\n additionalData?: Record<string, unknown>\n): void {\n const errorData: Record<string, unknown> = {\n context,\n ...additionalData,\n };\n\n if (error instanceof Error) {\n errorData.errorMessage = error.message;\n errorData.errorStack = error.stack;\n errorData.errorName = error.name;\n } else {\n errorData.rawError = String(error);\n }\n\n writeLog('ERROR', `Error in ${context}`, errorData);\n}\n\n/**\n * Create a logger for a specific command\n */\nexport function createCommandLogger(commandName: string) {\n return {\n info: (message: string, data?: unknown) => logInfo(`[${commandName}] ${message}`, data),\n warn: (message: string, data?: unknown) => logWarn(`[${commandName}] ${message}`, data),\n error: (message: string, data?: unknown) => logError(`[${commandName}] ${message}`, data),\n debug: (message: string, data?: unknown) => logDebug(`[${commandName}] ${message}`, data),\n command: (cmd: string, args?: Record<string, unknown>) =>\n logCommand(`[${commandName}] ${cmd}`, args),\n };\n}\n","/**\n * stacksolo destroy\n *\n * Destroy the infrastructure for the current project.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport inquirer from 'inquirer';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { api, checkApiConnection } from '../../api-client';\n\ninterface LocalConfig {\n projectId: string;\n patternId: string;\n gcpProject: string;\n region: string;\n}\n\nexport const destroyCommand = new Command('destroy')\n .description('Destroy infrastructure for the current project')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (options) => {\n const cwd = process.cwd();\n console.log(chalk.bold('\\n StackSolo Destroy\\n'));\n\n // Load local config\n const configPath = path.join(cwd, '.stacksolo', 'config.json');\n let config: LocalConfig;\n\n try {\n const configData = await fs.readFile(configPath, 'utf-8');\n config = JSON.parse(configData) as LocalConfig;\n } catch {\n console.log(chalk.red(' Not initialized. Run `stacksolo init` first.\\n'));\n return;\n }\n\n // Check API connection\n const apiConnected = await checkApiConnection();\n if (!apiConnected) {\n console.log(chalk.red(' StackSolo API not running.'));\n console.log(chalk.gray(' Start with: stacksolo serve\\n'));\n return;\n }\n\n // Confirm destruction\n if (!options.yes) {\n console.log(chalk.yellow(' Warning: This will destroy all infrastructure resources.'));\n console.log(chalk.yellow(' This action cannot be undone.\\n'));\n\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Are you sure you want to destroy?',\n default: false,\n },\n ]);\n\n if (!confirm) {\n console.log(chalk.gray('\\n Cancelled.\\n'));\n return;\n }\n }\n\n // Destroy infrastructure\n const destroySpinner = ora('Destroying infrastructure...').start();\n\n const destroyResult = await api.deployments.destroy(config.projectId);\n if (!destroyResult.success || !destroyResult.data) {\n destroySpinner.fail('Destroy failed to start');\n console.log(chalk.red(` ${destroyResult.error}\\n`));\n return;\n }\n\n // Poll for completion\n let deployment = destroyResult.data;\n const startTime = Date.now();\n\n while (deployment.status === 'pending' || deployment.status === 'running') {\n const elapsed = Math.round((Date.now() - startTime) / 1000);\n destroySpinner.text = `Destroying infrastructure... (${elapsed}s)`;\n\n await sleep(3000);\n const statusResult = await api.deployments.status(config.projectId);\n if (statusResult.success && statusResult.data) {\n deployment = statusResult.data;\n }\n }\n\n if (deployment.status === 'succeeded') {\n destroySpinner.succeed('Infrastructure destroyed');\n console.log(chalk.green('\\n All resources have been deleted.\\n'));\n } else {\n destroySpinner.fail('Destroy failed');\n console.log(chalk.red(`\\n ${deployment.error || 'Unknown error'}\\n`));\n\n if (deployment.logs) {\n console.log(chalk.gray(' Logs:'));\n console.log(chalk.gray(` ${deployment.logs.split('\\n').join('\\n ')}\\n`));\n }\n }\n });\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * API client for CLI to communicate with StackSolo API\n *\n * The CLI can work in two modes:\n * 1. Connected mode: API server running (desktop app or `stacksolo serve`)\n * 2. Standalone mode: Direct operations (future)\n */\n\nconst API_BASE = process.env.STACKSOLO_API_URL || 'http://localhost:4000';\n\nexport interface ApiResponse<T> {\n success: boolean;\n data?: T;\n error?: string;\n}\n\ninterface TrpcResponse<T> {\n result?: { data: T };\n error?: { message: string };\n}\n\nasync function callApi<T>(\n path: string,\n method: 'GET' | 'POST' = 'GET',\n body?: unknown\n): Promise<ApiResponse<T>> {\n try {\n const response = await fetch(`${API_BASE}${path}`, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const error = await response.text();\n return { success: false, error };\n }\n\n const json = await response.json() as TrpcResponse<T>;\n\n // tRPC wraps responses in { result: { data: ... } }\n if (json.result?.data !== undefined) {\n return { success: true, data: json.result.data };\n }\n\n if (json.error) {\n return { success: false, error: json.error.message };\n }\n\n return { success: true, data: json as unknown as T };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n// tRPC-style API calls\nexport const api = {\n projects: {\n list: () => callApi<Project[]>('/trpc/projects.list'),\n get: (id: string) => callApi<Project>(`/trpc/projects.get?input=${encodeURIComponent(JSON.stringify({ id }))}`),\n create: (data: CreateProjectInput) =>\n callApi<Project>('/trpc/projects.create', 'POST', data),\n },\n patterns: {\n list: () => callApi<PatternInfo[]>('/trpc/patterns.list'),\n detect: (path: string) =>\n callApi<PatternInfo[]>(`/trpc/patterns.detect?input=${encodeURIComponent(JSON.stringify({ path }))}`),\n },\n deployments: {\n deploy: (projectId: string) =>\n callApi<Deployment>('/trpc/deployments.deploy', 'POST', { projectId }),\n build: (projectId: string) =>\n callApi<Deployment>('/trpc/deployments.build', 'POST', { projectId }),\n destroy: (projectId: string) =>\n callApi<Deployment>('/trpc/deployments.destroy', 'POST', { projectId }),\n status: (projectId: string) =>\n callApi<Deployment>(`/trpc/deployments.status?input=${encodeURIComponent(JSON.stringify({ projectId }))}`),\n generateConfig: (projectId: string, resourceOutputs?: Record<string, Record<string, string>>) =>\n callApi<{ envPath: string; configPath: string }>(\n '/trpc/deployments.generateConfig',\n 'POST',\n { projectId, resourceOutputs }\n ),\n },\n};\n\n// Types (should match @stacksolo/shared)\ninterface Project {\n id: string;\n name: string;\n provider: string;\n providerConfig: Record<string, unknown>;\n patternId?: string;\n path?: string;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface CreateProjectInput {\n name: string;\n provider: string;\n providerConfig: Record<string, unknown>;\n patternId?: string;\n path?: string;\n}\n\ninterface PatternInfo {\n id: string;\n name: string;\n description: string;\n framework: string;\n confidence?: number;\n}\n\ninterface Deployment {\n id: string;\n projectId: string;\n status: 'pending' | 'running' | 'succeeded' | 'failed';\n startedAt: string;\n finishedAt?: string;\n logs?: string;\n error?: string;\n}\n\nexport async function checkApiConnection(): Promise<boolean> {\n try {\n const response = await fetch(`${API_BASE}/health`);\n return response.ok;\n } catch {\n return false;\n }\n}\n","/**\n * stacksolo status\n *\n * Show the status of the current project's deployment.\n * Uses the global registry at ~/.stacksolo/registry.db\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport * as path from 'path';\nimport { getRegistry } from '@stacksolo/registry';\nimport type { RegistryProject, RegistryResource, ProjectStatus, ResourceStatus } from '@stacksolo/registry';\n\nconst STACKSOLO_DIR = '.stacksolo';\nconst CONFIG_FILENAME = 'stacksolo.config.json';\n\nfunction getConfigPath(): string {\n return path.join(process.cwd(), STACKSOLO_DIR, CONFIG_FILENAME);\n}\n\n/**\n * Format project status with color\n */\nfunction formatStatus(status: ProjectStatus | ResourceStatus): string {\n switch (status) {\n case 'deployed':\n case 'ready':\n return chalk.green(status);\n case 'deploying':\n case 'creating':\n return chalk.yellow(status);\n case 'failed':\n return chalk.red(status);\n case 'destroyed':\n return chalk.gray(status);\n case 'pending':\n default:\n return chalk.gray(status);\n }\n}\n\n/**\n * Format date for display\n */\nfunction formatDate(date: Date | null): string {\n if (!date) return chalk.gray('never');\n return date.toLocaleString();\n}\n\nexport const statusCommand = new Command('status')\n .description('Show deployment status for the current project')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const configPath = getConfigPath();\n const registry = getRegistry();\n\n if (!options.json) {\n console.log(chalk.bold('\\n StackSolo Status\\n'));\n }\n\n // Find project by config path\n let project: RegistryProject | null = await registry.findProjectByPath(configPath);\n\n if (!project) {\n if (options.json) {\n console.log(JSON.stringify({ error: 'Project not registered' }));\n } else {\n console.log(chalk.yellow(' Project not registered in global registry.\\n'));\n console.log(chalk.gray(' Register with: stacksolo register'));\n console.log(chalk.gray(' Or deploy with: stacksolo deploy\\n'));\n }\n return;\n }\n\n // Get resources\n const resources: RegistryResource[] = await registry.findResourcesByProject(project.id);\n\n // Get latest deployment\n const latestDeployment = await registry.findLatestDeployment(project.id);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n project: {\n id: project.id,\n name: project.name,\n gcpProjectId: project.gcpProjectId,\n region: project.region,\n status: project.status,\n lastDeployedAt: project.lastDeployedAt,\n createdAt: project.createdAt,\n },\n resources: resources.map((r) => ({\n id: r.id,\n type: r.type,\n name: r.name,\n network: r.network,\n resourceType: r.resourceType,\n status: r.status,\n outputs: r.outputs,\n })),\n deployment: latestDeployment\n ? {\n id: latestDeployment.id,\n action: latestDeployment.action,\n status: latestDeployment.status,\n startedAt: latestDeployment.startedAt,\n completedAt: latestDeployment.completedAt,\n error: latestDeployment.error,\n }\n : null,\n },\n null,\n 2\n )\n );\n return;\n }\n\n // Display project info\n console.log(chalk.gray(' Project'));\n console.log(` Name: ${chalk.white(project.name)}`);\n console.log(` GCP Project: ${chalk.white(project.gcpProjectId)}`);\n console.log(` Region: ${chalk.white(project.region)}`);\n console.log(` Status: ${formatStatus(project.status)}`);\n console.log(` Last Deploy: ${formatDate(project.lastDeployedAt)}`);\n console.log(` Config: ${chalk.gray(project.configPath || 'N/A')}`);\n\n console.log('');\n\n // Display resources\n if (resources.length > 0) {\n console.log(chalk.gray(' Resources'));\n console.log(\n chalk.gray(' ') +\n chalk.gray('TYPE'.padEnd(12)) +\n chalk.gray('NAME'.padEnd(25)) +\n chalk.gray('STATUS')\n );\n console.log(chalk.gray(' ' + '-'.repeat(50)));\n\n for (const resource of resources) {\n const network = resource.network ? `${resource.network}/` : '';\n console.log(\n chalk.white(' ') +\n chalk.cyan(resource.type.padEnd(12)) +\n chalk.white((network + resource.name).padEnd(25)) +\n formatStatus(resource.status)\n );\n\n // Show URL output if available\n if (resource.outputs?.url) {\n console.log(chalk.gray(' ') + chalk.gray('url: ') + chalk.white(resource.outputs.url));\n }\n }\n } else {\n console.log(chalk.gray(' Resources'));\n console.log(chalk.gray(' No resources deployed yet.'));\n }\n\n console.log('');\n\n // Display latest deployment\n if (latestDeployment) {\n console.log(chalk.gray(' Latest Deployment'));\n console.log(` Action: ${chalk.cyan(latestDeployment.action)}`);\n console.log(` Status: ${formatStatus(latestDeployment.status as ProjectStatus)}`);\n console.log(` Started: ${formatDate(latestDeployment.startedAt)}`);\n if (latestDeployment.completedAt) {\n console.log(` Completed: ${formatDate(latestDeployment.completedAt)}`);\n }\n if (latestDeployment.error) {\n console.log(` Error: ${chalk.red(latestDeployment.error)}`);\n }\n }\n\n console.log('');\n });\n","/**\n * stacksolo output\n *\n * Get resource output values from the registry\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { getRegistry, ReferenceService } from '@stacksolo/registry';\n\nexport const outputCommand = new Command('output')\n .description('Get resource output value from the registry')\n .argument('<reference>', 'Resource reference (e.g., @project/resource.property)')\n .option('--json', 'Output as JSON')\n .action(async (reference, options) => {\n const registry = getRegistry();\n const refService = new ReferenceService(registry);\n\n // Validate reference format\n const parsed = refService.parseReference(reference);\n if (!parsed) {\n console.log(chalk.red(`\\n Error: Invalid reference format: ${reference}\\n`));\n console.log(chalk.gray(' Expected format:'));\n console.log(chalk.gray(' @project/resource.property'));\n console.log(chalk.gray(' @project/network/resource.property\\n'));\n console.log(chalk.gray(' Examples:'));\n console.log(chalk.gray(' @shared-infra/users-db.connectionString'));\n console.log(chalk.gray(' @shared-infra/main/api.url'));\n console.log(chalk.gray(' @my-project/uploads.name\\n'));\n process.exit(1);\n }\n\n try {\n const result = await refService.resolveWithResource(reference);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n reference,\n value: result.value,\n resource: {\n id: result.resource.id,\n name: result.resource.name,\n type: result.resource.type,\n network: result.resource.network,\n status: result.resource.status,\n },\n },\n null,\n 2\n )\n );\n } else {\n // Just output the value (useful for scripting)\n console.log(result.value);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.log(chalk.red(`\\n Error: ${message}\\n`));\n\n // Provide helpful hints\n if (message.includes('Project not found')) {\n console.log(chalk.gray(' Run `stacksolo list` to see registered projects.\\n'));\n } else if (message.includes('Resource not found')) {\n console.log(chalk.gray(` Run \\`stacksolo list ${parsed.projectName}\\` to see resources.\\n`));\n } else if (message.includes('not been deployed')) {\n console.log(chalk.gray(' Deploy the project first to populate outputs.\\n'));\n } else if (message.includes('not found in outputs')) {\n // Try to show available properties\n try {\n const project = await registry.findProjectByName(parsed.projectName);\n if (project) {\n const resource = await registry.findResourceByRef(\n project.id,\n parsed.resourceName,\n parsed.network\n );\n if (resource?.outputs) {\n const available = Object.keys(resource.outputs);\n console.log(chalk.gray(` Available properties: ${available.join(', ')}\\n`));\n }\n }\n } catch {\n // Ignore errors in hint generation\n }\n }\n\n process.exit(1);\n }\n });\n","/**\n * stacksolo logs\n *\n * View debug logs from CLI operations.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport * as fs from 'fs';\nimport { getLogPath } from '../../logger';\n\nexport const logsCommand = new Command('logs')\n .description('View debug logs from CLI operations')\n .option('-n, --lines <count>', 'Number of lines to show', '50')\n .option('--path', 'Show log file path only')\n .option('--clear', 'Clear the debug log')\n .action(async (options) => {\n const logPath = getLogPath();\n\n if (options.path) {\n console.log(logPath);\n return;\n }\n\n if (options.clear) {\n try {\n if (fs.existsSync(logPath)) {\n fs.unlinkSync(logPath);\n console.log(chalk.green(`\\n Cleared debug log: ${logPath}\\n`));\n } else {\n console.log(chalk.gray(`\\n No log file exists at: ${logPath}\\n`));\n }\n } catch (error) {\n console.log(chalk.red(`\\n Failed to clear log: ${error}\\n`));\n }\n return;\n }\n\n // Read and display log\n if (!fs.existsSync(logPath)) {\n console.log(chalk.gray(`\\n No debug log found at: ${logPath}\\n`));\n console.log(chalk.gray(' Logs are created when commands encounter errors.\\n'));\n return;\n }\n\n try {\n const content = fs.readFileSync(logPath, 'utf-8');\n const lines = content.split('\\n');\n const lineCount = parseInt(options.lines, 10) || 50;\n\n console.log(chalk.bold(`\\n Debug Log (last ${lineCount} lines)`));\n console.log(chalk.gray(` ${logPath}\\n`));\n console.log(chalk.gray('─'.repeat(80)));\n\n // Show last N lines\n const startIndex = Math.max(0, lines.length - lineCount);\n const displayLines = lines.slice(startIndex);\n\n for (const line of displayLines) {\n // Color-code based on log level\n if (line.includes('[ERROR]')) {\n console.log(chalk.red(line));\n } else if (line.includes('[WARN]')) {\n console.log(chalk.yellow(line));\n } else if (line.includes('[INFO]')) {\n console.log(chalk.cyan(line));\n } else if (line.includes('[DEBUG]')) {\n console.log(chalk.gray(line));\n } else if (line.startsWith('=')) {\n console.log(chalk.blue(line));\n } else {\n console.log(line);\n }\n }\n\n console.log(chalk.gray('─'.repeat(80)));\n console.log(chalk.gray(`\\n Total lines in log: ${lines.length}`));\n console.log(chalk.gray(` Use --lines <n> to see more, or --clear to reset.\\n`));\n } catch (error) {\n console.log(chalk.red(`\\n Failed to read log: ${error}\\n`));\n }\n });\n","/**\n * stacksolo reset\n *\n * Reset/clear Pulumi state for the current project.\n * Useful when state becomes corrupted or references wrong GCP project.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { homedir } from 'os';\nimport { parseConfig } from '@stacksolo/blueprint';\n\nconst STACKSOLO_DIR = '.stacksolo';\nconst CONFIG_FILENAME = 'stacksolo.config.json';\nconst STATE_DIR = path.join(homedir(), '.stacksolo', 'pulumi-state');\n\nfunction getConfigPath(): string {\n return path.join(process.cwd(), STACKSOLO_DIR, CONFIG_FILENAME);\n}\n\nexport const resetCommand = new Command('reset')\n .description('Reset Pulumi state for the current project')\n .option('-y, --yes', 'Skip confirmation prompt')\n .option('--all', 'Reset state for all projects (dangerous)')\n .action(async (options) => {\n console.log(chalk.bold('\\n StackSolo Reset\\n'));\n\n if (options.all) {\n // Reset all state\n if (!options.yes) {\n const inquirer = await import('inquirer');\n const { confirm } = await inquirer.default.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: chalk.red('This will delete ALL Pulumi state for ALL projects. Continue?'),\n default: false,\n },\n ]);\n\n if (!confirm) {\n console.log(chalk.gray('\\n Cancelled.\\n'));\n return;\n }\n }\n\n const spinner = ora('Deleting all Pulumi state...').start();\n try {\n const stacksDir = path.join(STATE_DIR, '.pulumi', 'stacks');\n await fs.rm(stacksDir, { recursive: true, force: true });\n spinner.succeed('All Pulumi state deleted');\n console.log(chalk.yellow('\\n Warning: You will need to redeploy all projects.\\n'));\n } catch (error) {\n spinner.fail('Failed to delete state');\n console.log(chalk.red(`\\n ${error}\\n`));\n }\n return;\n }\n\n // Load config to get project name\n const configPath = getConfigPath();\n let config;\n\n try {\n config = parseConfig(configPath);\n } catch {\n console.log(chalk.red(` Error: Could not read ${STACKSOLO_DIR}/${CONFIG_FILENAME}\\n`));\n console.log(chalk.gray(` Run 'stacksolo init' to create a project first.\\n`));\n return;\n }\n\n // Build the project name (must match deploy.service.ts logic)\n const projectName = `${config.project.name}-${config.project.gcpProjectId}`.toLowerCase().replace(/[^a-z0-9-]/g, '-');\n const stateDir = path.join(STATE_DIR, '.pulumi', 'stacks', projectName);\n\n // Check if state exists\n try {\n await fs.access(stateDir);\n } catch {\n // Also check old-style project name (without GCP project ID)\n const oldProjectName = config.project.name.toLowerCase().replace(/[^a-z0-9-]/g, '-');\n const oldStateDir = path.join(STATE_DIR, '.pulumi', 'stacks', oldProjectName);\n\n try {\n await fs.access(oldStateDir);\n console.log(chalk.yellow(` Found state at old location: ${oldProjectName}`));\n console.log(chalk.gray(` This may be from before the GCP project ID was included in state path.\\n`));\n\n if (!options.yes) {\n const inquirer = await import('inquirer');\n const { confirm } = await inquirer.default.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: `Delete old state for \"${oldProjectName}\"?`,\n default: true,\n },\n ]);\n\n if (!confirm) {\n console.log(chalk.gray('\\n Cancelled.\\n'));\n return;\n }\n }\n\n const spinner = ora('Deleting old Pulumi state...').start();\n await fs.rm(oldStateDir, { recursive: true, force: true });\n spinner.succeed(`Deleted state for ${oldProjectName}`);\n console.log(chalk.green('\\n State reset complete. Run `stacksolo deploy` to redeploy.\\n'));\n return;\n } catch {\n console.log(chalk.gray(` No Pulumi state found for this project.\\n`));\n console.log(chalk.gray(` State directory: ${stateDir}\\n`));\n return;\n }\n }\n\n console.log(chalk.cyan(' Project:'), config.project.name);\n console.log(chalk.cyan(' GCP Project:'), config.project.gcpProjectId);\n console.log(chalk.cyan(' State dir:'), stateDir);\n console.log('');\n\n if (!options.yes) {\n const inquirer = await import('inquirer');\n const { confirm } = await inquirer.default.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Delete Pulumi state for this project? (Resources in GCP will NOT be deleted)',\n default: false,\n },\n ]);\n\n if (!confirm) {\n console.log(chalk.gray('\\n Cancelled.\\n'));\n return;\n }\n }\n\n const spinner = ora('Deleting Pulumi state...').start();\n try {\n await fs.rm(stateDir, { recursive: true, force: true });\n spinner.succeed(`Deleted state for ${projectName}`);\n console.log(chalk.green('\\n State reset complete!'));\n console.log(chalk.gray('\\n Note: Resources in GCP were NOT deleted.'));\n console.log(chalk.gray(' Run `stacksolo deploy` to recreate state from your config.'));\n console.log(chalk.gray(' Run `stacksolo destroy` if you want to remove GCP resources.\\n'));\n } catch (error) {\n spinner.fail('Failed to delete state');\n console.log(chalk.red(`\\n ${error}\\n`));\n }\n });\n","/**\n * stacksolo infra\n *\n * Display an ASCII diagram of the infrastructure and resource names.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\ninterface FunctionConfig {\n name: string;\n sourceDir?: string;\n runtime?: string;\n memory?: string;\n entryPoint?: string;\n}\n\ninterface LoadBalancerConfig {\n name: string;\n routes?: Array<{ path: string; backend: string }>;\n}\n\ninterface NetworkConfig {\n name: string;\n existing?: boolean;\n loadBalancer?: LoadBalancerConfig;\n functions?: FunctionConfig[];\n}\n\ninterface ProjectConfig {\n name: string;\n gcpProjectId: string;\n region: string;\n backend?: string;\n networks?: NetworkConfig[];\n}\n\ninterface StackSoloConfig {\n project: ProjectConfig;\n}\n\nexport const infraCommand = new Command('infra')\n .description('Display ASCII infrastructure diagram')\n .option('--json', 'Output resource list as JSON')\n .action(async (options) => {\n const cwd = process.cwd();\n\n // Try to find stacksolo.config.json\n const configPath = path.join(cwd, '.stacksolo', 'stacksolo.config.json');\n let config: StackSoloConfig;\n\n try {\n const configData = await fs.readFile(configPath, 'utf-8');\n config = JSON.parse(configData) as StackSoloConfig;\n } catch {\n console.log(chalk.red('\\n No stacksolo.config.json found.'));\n console.log(chalk.gray(' Run `stacksolo init` first.\\n'));\n return;\n }\n\n const project = config.project;\n\n if (options.json) {\n // Output JSON list of resources\n const resources = extractResources(project);\n console.log(JSON.stringify(resources, null, 2));\n return;\n }\n\n // Print ASCII diagram\n console.log('');\n printInfraDiagram(project);\n console.log('');\n });\n\ninterface ResourceInfo {\n type: string;\n name: string;\n details?: string;\n}\n\nfunction extractResources(project: ProjectConfig): ResourceInfo[] {\n const resources: ResourceInfo[] = [];\n const prefix = project.name;\n\n for (const network of project.networks || []) {\n const networkName = network.existing ? network.name : `${prefix}-${network.name}`;\n\n // VPC Network\n if (!network.existing) {\n resources.push({\n type: 'vpc_network',\n name: networkName,\n details: 'VPC Network',\n });\n }\n\n // VPC Connector\n resources.push({\n type: 'vpc_connector',\n name: `${prefix}-connector`,\n details: `VPC Access Connector (${project.region})`,\n });\n\n // Functions\n for (const fn of network.functions || []) {\n resources.push({\n type: 'cloud_function',\n name: `${prefix}-${fn.name}`,\n details: `Cloud Function Gen2 (${fn.runtime || 'nodejs20'}, ${fn.memory || '256Mi'})`,\n });\n }\n\n // Load Balancer\n if (network.loadBalancer) {\n resources.push({\n type: 'load_balancer',\n name: `${prefix}-lb`,\n details: 'HTTP Load Balancer',\n });\n }\n }\n\n return resources;\n}\n\nfunction printInfraDiagram(project: ProjectConfig): void {\n const prefix = project.name;\n const region = project.region;\n const gcpProject = project.gcpProjectId;\n const backend = project.backend || 'pulumi';\n\n // Header\n console.log(chalk.bold.cyan(' Infrastructure Diagram'));\n console.log(chalk.gray(` Project: ${prefix} | GCP: ${gcpProject} | Region: ${region} | Backend: ${backend}`));\n console.log('');\n\n for (const network of project.networks || []) {\n const networkName = network.existing ? network.name : `${prefix}-${network.name}`;\n const hasLb = !!network.loadBalancer;\n const functions = network.functions || [];\n\n // Internet / Users\n console.log(chalk.gray(' ┌─────────────┐'));\n console.log(chalk.gray(' │ ') + chalk.white('Internet') + chalk.gray(' │'));\n console.log(chalk.gray(' └──────┬──────┘'));\n console.log(chalk.gray(' │'));\n\n if (hasLb) {\n // Load Balancer\n const lbName = `${prefix}-lb`;\n console.log(chalk.gray(' ▼'));\n console.log(chalk.yellow(' ┌────────────────────────┐'));\n console.log(chalk.yellow(' │ ') + chalk.white.bold('HTTP Load Balancer') + chalk.yellow(' │'));\n console.log(chalk.yellow(' │ ') + chalk.gray(lbName) + chalk.yellow(padRight('', 24 - lbName.length - 2) + '│'));\n console.log(chalk.yellow(' └───────────┬────────────┘'));\n console.log(chalk.gray(' │'));\n }\n\n // VPC Network box (outer)\n console.log(chalk.blue(' ┌─────────────────────────────────────────────────┐'));\n if (network.existing) {\n console.log(chalk.blue(' │ ') + chalk.white.bold('VPC Network') + chalk.gray(' (existing)') + chalk.blue(padRight('', 24) + '│'));\n } else {\n console.log(chalk.blue(' │ ') + chalk.white.bold('VPC Network') + chalk.blue(padRight('', 35) + '│'));\n }\n console.log(chalk.blue(' │ ') + chalk.gray(networkName) + chalk.blue(padRight('', 47 - networkName.length - 2) + '│'));\n console.log(chalk.blue(' │') + padRight('', 49) + chalk.blue('│'));\n\n // VPC Connector inside VPC\n const connectorName = `${prefix}-connector`;\n console.log(chalk.blue(' │ ') + chalk.magenta('┌────────────────────────────────────────┐') + chalk.blue(' │'));\n console.log(chalk.blue(' │ ') + chalk.magenta('│ ') + chalk.white('VPC Access Connector') + chalk.magenta(padRight('', 18) + '│') + chalk.blue(' │'));\n console.log(chalk.blue(' │ ') + chalk.magenta('│ ') + chalk.gray(connectorName) + chalk.magenta(padRight('', 38 - connectorName.length - 2) + '│') + chalk.blue(' │'));\n console.log(chalk.blue(' │ ') + chalk.magenta('└───────────────────┬────────────────────┘') + chalk.blue(' │'));\n console.log(chalk.blue(' │') + chalk.gray(padRight('', 23) + '│' + padRight('', 25)) + chalk.blue('│'));\n\n // Cloud Functions inside VPC\n for (let i = 0; i < functions.length; i++) {\n const fn = functions[i];\n const fnName = `${prefix}-${fn.name}`;\n const runtime = fn.runtime || 'nodejs20';\n const memory = fn.memory || '256Mi';\n const sourceDir = fn.sourceDir || `./functions/${fn.name}`;\n\n if (i === 0) {\n console.log(chalk.blue(' │') + chalk.gray(padRight('', 23) + '▼' + padRight('', 25)) + chalk.blue('│'));\n }\n\n console.log(chalk.blue(' │ ') + chalk.green('┌────────────────────────────────────────┐') + chalk.blue(' │'));\n console.log(chalk.blue(' │ ') + chalk.green('│ ') + chalk.white.bold('Cloud Function') + chalk.gray(' (Gen2)') + chalk.green(padRight('', 17) + '│') + chalk.blue(' │'));\n console.log(chalk.blue(' │ ') + chalk.green('│ ') + chalk.gray(fnName) + chalk.green(padRight('', 38 - fnName.length - 2) + '│') + chalk.blue(' │'));\n console.log(chalk.blue(' │ ') + chalk.green('│ ') + chalk.gray(`${runtime} | ${memory} | ${sourceDir}`) + chalk.green(padRight('', 38 - `${runtime} | ${memory} | ${sourceDir}`.length - 2) + '│') + chalk.blue(' │'));\n console.log(chalk.blue(' │ ') + chalk.green('└────────────────────────────────────────┘') + chalk.blue(' │'));\n }\n\n console.log(chalk.blue(' │') + padRight('', 49) + chalk.blue('│'));\n console.log(chalk.blue(' └─────────────────────────────────────────────────┘'));\n }\n\n // Summary\n console.log('');\n console.log(chalk.gray(' Resources:'));\n\n const resources = extractResources(project);\n for (const r of resources) {\n const icon = getResourceIcon(r.type);\n console.log(chalk.gray(` ${icon} ${r.name}`));\n }\n}\n\nfunction getResourceIcon(type: string): string {\n switch (type) {\n case 'vpc_network':\n return chalk.blue('◈');\n case 'vpc_connector':\n return chalk.magenta('◇');\n case 'cloud_function':\n return chalk.green('λ');\n case 'load_balancer':\n return chalk.yellow('⚡');\n default:\n return chalk.gray('•');\n }\n}\n\nfunction padRight(str: string, len: number): string {\n if (str.length >= len) return str;\n return str + ' '.repeat(len - str.length);\n}\n","/**\n * stacksolo list\n *\n * List all registered projects and their resources\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { getRegistry, getRegistryDbPath } from '@stacksolo/registry';\nimport type { RegistryProject, RegistryResource, ProjectStatus, ResourceStatus } from '@stacksolo/registry';\n\n/**\n * Format project status with color\n */\nfunction formatStatus(status: ProjectStatus | ResourceStatus): string {\n switch (status) {\n case 'deployed':\n case 'ready':\n return chalk.green(status);\n case 'deploying':\n case 'creating':\n return chalk.yellow(status);\n case 'failed':\n return chalk.red(status);\n case 'destroyed':\n return chalk.gray(status);\n case 'pending':\n default:\n return chalk.gray(status);\n }\n}\n\n/**\n * Format date for display\n */\nfunction formatDate(date: Date | null): string {\n if (!date) return chalk.gray('never');\n return chalk.gray(date.toLocaleDateString());\n}\n\n/**\n * List all projects\n */\nasync function listProjects(options: { json?: boolean }): Promise<void> {\n const registry = getRegistry();\n const projects = await registry.listProjects();\n\n if (options.json) {\n console.log(JSON.stringify(projects, null, 2));\n return;\n }\n\n if (projects.length === 0) {\n console.log(chalk.gray('\\n No projects registered.\\n'));\n console.log(chalk.cyan(' To register a project:'));\n console.log(chalk.gray(' cd /path/to/project'));\n console.log(chalk.gray(' stacksolo register\\n'));\n return;\n }\n\n console.log(chalk.bold('\\n Registered Projects\\n'));\n\n // Table header\n console.log(\n chalk.gray(' ') +\n chalk.gray('NAME'.padEnd(20)) +\n chalk.gray('GCP PROJECT'.padEnd(20)) +\n chalk.gray('STATUS'.padEnd(12)) +\n chalk.gray('DEPLOYED')\n );\n console.log(chalk.gray(' ' + '-'.repeat(60)));\n\n for (const project of projects) {\n const resources = await registry.findResourcesByProject(project.id);\n const resourceCount = resources.length;\n\n console.log(\n chalk.white(' ') +\n chalk.white(project.name.padEnd(20)) +\n chalk.gray(project.gcpProjectId.padEnd(20)) +\n formatStatus(project.status).padEnd(21) +\n formatDate(project.lastDeployedAt) +\n (resourceCount > 0 ? chalk.gray(` (${resourceCount} resources)`) : '')\n );\n }\n\n console.log('');\n}\n\n/**\n * List resources for a specific project\n */\nasync function listProjectResources(\n projectName: string,\n options: { json?: boolean }\n): Promise<void> {\n const registry = getRegistry();\n const project = await registry.findProjectByName(projectName);\n\n if (!project) {\n console.log(chalk.red(`\\n Error: Project \"${projectName}\" not found.\\n`));\n console.log(chalk.gray(' Run `stacksolo list` to see registered projects.\\n'));\n process.exit(1);\n }\n\n const resources = await registry.findResourcesByProject(project.id);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n project,\n resources,\n },\n null,\n 2\n )\n );\n return;\n }\n\n console.log(chalk.bold(`\\n Project: ${project.name}\\n`));\n console.log(chalk.gray(` GCP Project: ${project.gcpProjectId}`));\n console.log(chalk.gray(` Region: ${project.region}`));\n console.log(chalk.gray(` Status: `) + formatStatus(project.status));\n console.log(chalk.gray(` Config: ${project.configPath || 'N/A'}`));\n\n if (resources.length === 0) {\n console.log(chalk.gray('\\n No resources registered.\\n'));\n return;\n }\n\n console.log(chalk.bold('\\n Resources:\\n'));\n\n // Table header\n console.log(\n chalk.gray(' ') +\n chalk.gray('TYPE'.padEnd(12)) +\n chalk.gray('NAME'.padEnd(20)) +\n chalk.gray('RESOURCE TYPE'.padEnd(20)) +\n chalk.gray('STATUS')\n );\n console.log(chalk.gray(' ' + '-'.repeat(60)));\n\n for (const resource of resources) {\n const network = resource.network ? `${resource.network}/` : '';\n\n console.log(\n chalk.white(' ') +\n chalk.cyan(resource.type.padEnd(12)) +\n chalk.white((network + resource.name).padEnd(20)) +\n chalk.gray(resource.resourceType.padEnd(20)) +\n formatStatus(resource.status)\n );\n\n // Show key outputs if available\n if (resource.outputs && Object.keys(resource.outputs).length > 0) {\n const outputKeys = Object.keys(resource.outputs).slice(0, 3);\n outputKeys.forEach((key) => {\n const value = String(resource.outputs![key]);\n const displayValue =\n value.length > 40 ? value.substring(0, 37) + '...' : value;\n console.log(\n chalk.gray(' ') +\n chalk.gray(`${key}: `) +\n chalk.white(displayValue)\n );\n });\n }\n }\n\n console.log('');\n}\n\nexport const listCommand = new Command('list')\n .description('List all registered projects and resources')\n .argument('[project]', 'Project name to show details for')\n .option('--json', 'Output as JSON')\n .option('--path', 'Show registry database path')\n .action(async (projectName, options) => {\n if (options.path) {\n console.log(getRegistryDbPath());\n return;\n }\n\n if (projectName) {\n await listProjectResources(projectName, options);\n } else {\n await listProjects(options);\n }\n });\n","/**\n * stacksolo build\n *\n * Build Docker images and push to Artifact Registry.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { exec, spawn } from 'child_process';\nimport { promisify } from 'util';\nimport { parseConfig, resolveConfig } from '@stacksolo/blueprint';\n\nconst execAsync = promisify(exec);\n\nconst STACKSOLO_DIR = '.stacksolo';\nconst CONFIG_FILENAME = 'stacksolo.config.json';\n\nfunction getConfigPath(): string {\n return path.join(process.cwd(), STACKSOLO_DIR, CONFIG_FILENAME);\n}\n\ninterface ContainerInfo {\n name: string;\n network: string;\n sourceDir?: string;\n registryUrl: string;\n}\n\nexport const buildCommand = new Command('build')\n .description('Build and push container images to Artifact Registry')\n .argument('[service]', 'Service name to build (builds all if omitted)')\n .option('--tag <tag>', 'Image tag', 'latest')\n .option('--no-push', 'Skip pushing to registry')\n .option('--dockerfile <path>', 'Custom Dockerfile path')\n .action(async (service: string | undefined, options) => {\n console.log(chalk.bold('\\n StackSolo Build\\n'));\n\n // Load config\n const configPath = getConfigPath();\n let config;\n\n try {\n config = parseConfig(configPath);\n } catch (error) {\n console.log(chalk.red(` Error: Could not read ${STACKSOLO_DIR}/${CONFIG_FILENAME}\\n`));\n console.log(chalk.gray(` ${error}`));\n console.log(chalk.gray(`\\n Run 'stacksolo init' to create a project first.\\n`));\n return;\n }\n\n // Check if Docker is available\n try {\n await execAsync('docker --version');\n } catch {\n console.log(chalk.red(' Docker CLI not found.\\n'));\n console.log(chalk.gray(' Install Docker Desktop: https://www.docker.com/products/docker-desktop\\n'));\n return;\n }\n\n // Resolve config to find containers\n const resolved = resolveConfig(config);\n const containers: ContainerInfo[] = [];\n\n // Find all containers and their registries\n for (const resource of resolved.resources) {\n if (resource.type === 'gcp:cloud_run') {\n const networkName = resource.network || 'default';\n const registryUrl = `${config.project.region}-docker.pkg.dev/${config.project.gcpProjectId}/${networkName}-registry`;\n\n containers.push({\n name: resource.name,\n network: networkName,\n sourceDir: resource.config.sourceDir as string | undefined,\n registryUrl,\n });\n }\n }\n\n if (containers.length === 0) {\n console.log(chalk.yellow(' No containers found in config.\\n'));\n console.log(chalk.gray(' Add containers to your networks to use this command.\\n'));\n return;\n }\n\n // Filter to specific service if provided\n const targetContainers = service\n ? containers.filter((c) => c.name === service)\n : containers;\n\n if (service && targetContainers.length === 0) {\n console.log(chalk.red(` Container '${service}' not found.\\n`));\n console.log(chalk.gray(' Available containers:'));\n for (const c of containers) {\n console.log(chalk.gray(` - ${c.name} (${c.network})`));\n }\n console.log('');\n return;\n }\n\n // Configure Docker for Artifact Registry (once)\n if (options.push) {\n const authSpinner = ora('Configuring Docker authentication...').start();\n try {\n await execAsync(\n `gcloud auth configure-docker ${config.project.region}-docker.pkg.dev --quiet`\n );\n authSpinner.succeed('Docker authentication configured');\n } catch (error) {\n authSpinner.fail('Failed to configure Docker authentication');\n console.log(chalk.red(`\\n ${error}\\n`));\n console.log(chalk.gray(' Make sure you are logged in to gcloud:'));\n console.log(chalk.cyan(' gcloud auth login\\n'));\n return;\n }\n }\n\n // Build each container\n for (const container of targetContainers) {\n const imageTag = `${container.registryUrl}/${container.name}:${options.tag}`;\n const sourceDir = container.sourceDir\n ? path.resolve(process.cwd(), container.sourceDir)\n : path.resolve(process.cwd(), `containers/${container.name}`);\n\n // Find Dockerfile\n const dockerfilePath = options.dockerfile\n ? path.resolve(process.cwd(), options.dockerfile)\n : path.join(sourceDir, 'Dockerfile');\n\n try {\n await fs.access(dockerfilePath);\n } catch {\n console.log(chalk.yellow(` Dockerfile not found for '${container.name}': ${dockerfilePath}`));\n console.log(chalk.gray(` Skipping...\\n`));\n continue;\n }\n\n // Build\n const buildSpinner = ora(`Building ${container.name}...`).start();\n try {\n const buildCmd = `docker build -f \"${dockerfilePath}\" -t \"${imageTag}\" \"${sourceDir}\"`;\n await execAsync(buildCmd, { maxBuffer: 50 * 1024 * 1024 }); // 50MB buffer for build output\n buildSpinner.succeed(`Built ${container.name}`);\n } catch (error) {\n buildSpinner.fail(`Failed to build ${container.name}`);\n console.log(chalk.red(`\\n ${error}\\n`));\n continue;\n }\n\n // Push\n if (options.push) {\n const pushSpinner = ora(`Pushing ${container.name}...`).start();\n try {\n await execAsync(`docker push \"${imageTag}\"`);\n pushSpinner.succeed(`Pushed ${container.name}`);\n console.log(chalk.gray(` ${imageTag}\\n`));\n } catch (error) {\n pushSpinner.fail(`Failed to push ${container.name}`);\n console.log(chalk.red(`\\n ${error}\\n`));\n\n // Check for common errors\n const errorStr = String(error);\n if (errorStr.includes('denied') || errorStr.includes('unauthorized')) {\n console.log(chalk.yellow(' Authentication issue. Try:\\n'));\n console.log(chalk.cyan(` gcloud auth configure-docker ${config.project.region}-docker.pkg.dev\\n`));\n } else if (errorStr.includes('not found')) {\n console.log(chalk.yellow(' Registry not found. Deploy infrastructure first:\\n'));\n console.log(chalk.cyan(' stacksolo deploy\\n'));\n }\n continue;\n }\n } else {\n console.log(chalk.gray(` Built locally: ${imageTag}\\n`));\n }\n }\n\n console.log(chalk.green(' Build complete!\\n'));\n\n if (options.push) {\n console.log(chalk.gray(' Next steps:'));\n console.log(chalk.gray(' stacksolo deploy - Update Cloud Run with new images\\n'));\n } else {\n console.log(chalk.gray(' To push images, run without --no-push:\\n'));\n console.log(chalk.cyan(' stacksolo build\\n'));\n }\n });\n","/**\n * stacksolo dev\n *\n * Start a local Kubernetes development environment via OrbStack\n * that mirrors the production GCP stack.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { spawn, execSync, ChildProcess } from 'child_process';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { StackSoloConfig } from '@stacksolo/blueprint';\nimport { generateK8sManifests, writeK8sManifests } from '../../generators/k8s';\nimport { sanitizeNamespaceName } from '../../generators/k8s/namespace';\n\n// Track port-forward processes for cleanup\nconst portForwardProcesses: ChildProcess[] = [];\n\nconst K8S_OUTPUT_DIR = '.stacksolo/k8s';\nconst CONFIG_FILE = '.stacksolo/stacksolo.config.json';\n\nexport const devCommand = new Command('dev')\n .description('Start local Kubernetes development environment')\n .option('--stop', 'Stop and tear down the environment')\n .option('--status', 'Show status of running pods')\n .option('--describe [resource]', 'Describe K8s resources (pods, services, all)')\n .option('--logs [service]', 'Tail logs (all pods or specific service)')\n .option('--rebuild', 'Force regenerate manifests before starting')\n .option('--no-emulators', 'Skip Firebase/Pub/Sub emulators')\n .action(async (options) => {\n try {\n // Handle subcommands\n if (options.stop) {\n await stopEnvironment();\n return;\n }\n\n if (options.status) {\n await showStatus();\n return;\n }\n\n if (options.describe !== undefined) {\n const resource = typeof options.describe === 'string' ? options.describe : 'all';\n await describeResources(resource);\n return;\n }\n\n if (options.logs !== undefined) {\n const service = typeof options.logs === 'string' ? options.logs : undefined;\n await tailLogs(service);\n return;\n }\n\n // Start the environment\n await startEnvironment({\n rebuild: options.rebuild,\n includeEmulators: options.emulators !== false,\n });\n } catch (error) {\n console.error(chalk.red(`\\n Error: ${error instanceof Error ? error.message : error}\\n`));\n process.exit(1);\n }\n });\n\n/**\n * Check if required tools are available\n */\nasync function checkPrerequisites(): Promise<void> {\n const spinner = ora('Checking prerequisites...').start();\n\n // Check kubectl\n try {\n execSync('kubectl version --client --short 2>/dev/null || kubectl version --client', {\n stdio: 'pipe',\n });\n } catch {\n spinner.fail('kubectl not found');\n console.log(chalk.gray('\\n Install OrbStack: brew install orbstack'));\n console.log(chalk.gray(' Or install kubectl: brew install kubectl\\n'));\n throw new Error('kubectl is required but not found');\n }\n\n // Check if Kubernetes is available (OrbStack or other)\n try {\n execSync('kubectl cluster-info 2>/dev/null', { stdio: 'pipe' });\n } catch {\n spinner.fail('Kubernetes cluster not available');\n console.log(chalk.gray('\\n If using OrbStack, enable Kubernetes in preferences'));\n console.log(chalk.gray(' Settings → Kubernetes → Enable Kubernetes\\n'));\n throw new Error('Kubernetes cluster not available');\n }\n\n spinner.succeed('Prerequisites met');\n}\n\n/**\n * Load and validate config\n */\nasync function loadConfig(): Promise<StackSoloConfig> {\n const configPath = path.resolve(process.cwd(), CONFIG_FILE);\n\n try {\n const content = await fs.readFile(configPath, 'utf-8');\n return JSON.parse(content) as StackSoloConfig;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(`Config not found: ${CONFIG_FILE}\\n Run 'stacksolo init' first.`);\n }\n throw new Error(`Failed to parse config: ${error}`);\n }\n}\n\n/**\n * Validate source directories exist\n */\nasync function validateSourceDirs(config: StackSoloConfig): Promise<string[]> {\n const warnings: string[] = [];\n const projectRoot = process.cwd();\n\n for (const network of config.project.networks || []) {\n // Check function directories\n for (const func of network.functions || []) {\n const funcDir = path.join(projectRoot, 'functions', func.name);\n try {\n await fs.access(funcDir);\n } catch {\n warnings.push(`Function directory not found: functions/${func.name}/`);\n }\n }\n\n // Check UI directories\n for (const ui of network.uis || []) {\n const uiDir = path.join(projectRoot, 'ui', ui.name);\n try {\n await fs.access(uiDir);\n } catch {\n warnings.push(`UI directory not found: ui/${ui.name}/`);\n }\n }\n }\n\n return warnings;\n}\n\n/**\n * Start the development environment\n */\nasync function startEnvironment(options: {\n rebuild?: boolean;\n includeEmulators?: boolean;\n}): Promise<void> {\n console.log(chalk.bold('\\n StackSolo Dev Environment\\n'));\n\n // 1. Check prerequisites\n await checkPrerequisites();\n\n // 2. Load config\n const spinner = ora('Loading configuration...').start();\n const config = await loadConfig();\n const projectName = config.project.name;\n const namespace = sanitizeNamespaceName(projectName);\n spinner.succeed(`Project: ${projectName}`);\n\n // 3. Validate source directories\n const warnings = await validateSourceDirs(config);\n if (warnings.length > 0) {\n console.log(chalk.yellow('\\n Warnings:'));\n for (const warning of warnings) {\n console.log(chalk.yellow(` • ${warning}`));\n }\n console.log('');\n }\n\n // 4. Generate K8s manifests\n const genSpinner = ora('Generating Kubernetes manifests...').start();\n const outputDir = path.resolve(process.cwd(), K8S_OUTPUT_DIR);\n\n const result = generateK8sManifests({\n config,\n projectRoot: process.cwd(),\n includeEmulators: options.includeEmulators,\n });\n\n await writeK8sManifests(result.manifests, outputDir);\n genSpinner.succeed(`Generated ${result.manifests.length} manifests to ${K8S_OUTPUT_DIR}/`);\n\n if (result.warnings.length > 0) {\n for (const warning of result.warnings) {\n console.log(chalk.yellow(` ⚠ ${warning}`));\n }\n }\n\n // 5. Apply manifests (namespace first, then everything else)\n const applySpinner = ora('Applying Kubernetes manifests...').start();\n try {\n // Apply namespace first to ensure it exists\n execSync(`kubectl apply -f ${outputDir}/namespace.yaml`, { stdio: 'pipe' });\n // Then apply all other manifests\n execSync(`kubectl apply -f ${outputDir}`, { stdio: 'pipe' });\n applySpinner.succeed('Manifests applied');\n } catch (error) {\n applySpinner.fail('Failed to apply manifests');\n throw error;\n }\n\n // 6. Wait for pods to be ready\n const readySpinner = ora('Waiting for pods to be ready...').start();\n try {\n execSync(\n `kubectl wait --for=condition=ready pod --all -n ${namespace} --timeout=120s`,\n { stdio: 'pipe' }\n );\n readySpinner.succeed('All pods ready');\n } catch {\n readySpinner.warn('Some pods may not be ready yet');\n }\n\n // 7. Set up port forwarding\n const portForwardSpinner = ora('Setting up port forwarding...').start();\n const portMappings = await setupPortForwarding(namespace, config);\n portForwardSpinner.succeed('Port forwarding active');\n\n // 8. Print access information\n console.log(chalk.bold('\\n Services running:\\n'));\n\n // Get pod status\n try {\n const podStatus = execSync(\n `kubectl get pods -n ${namespace} -o wide --no-headers`,\n { encoding: 'utf-8' }\n );\n\n for (const line of podStatus.trim().split('\\n')) {\n const parts = line.split(/\\s+/);\n const name = parts[0];\n const status = parts[2];\n const statusColor = status === 'Running' ? chalk.green : chalk.yellow;\n console.log(` ${statusColor('●')} ${name.padEnd(30)} ${statusColor(status)}`);\n }\n } catch {\n console.log(chalk.gray(' Unable to get pod status'));\n }\n\n // Print access URLs\n console.log(chalk.bold('\\n Access:\\n'));\n for (const mapping of portMappings) {\n const url = mapping.protocol === 'http'\n ? `http://localhost:${mapping.localPort}`\n : `localhost:${mapping.localPort}`;\n console.log(` ${chalk.cyan(mapping.name.padEnd(20))} ${url}`);\n }\n\n console.log(chalk.bold('\\n Commands:\\n'));\n console.log(chalk.gray(' stacksolo dev --logs Tail all logs'));\n console.log(chalk.gray(' stacksolo dev --status Show pod status'));\n console.log(chalk.gray(' stacksolo dev --stop Stop environment'));\n\n console.log('');\n\n // Setup graceful shutdown\n const cleanup = async () => {\n console.log(chalk.gray('\\n Shutting down...\\n'));\n\n // Kill all port-forward processes\n for (const proc of portForwardProcesses) {\n try {\n proc.kill('SIGTERM');\n } catch {\n // Ignore\n }\n }\n\n try {\n execSync(`kubectl delete namespace ${namespace}`, { stdio: 'pipe' });\n console.log(chalk.green(' Environment stopped\\n'));\n } catch {\n // Ignore errors on cleanup\n }\n process.exit(0);\n };\n\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n\n // Keep process running\n console.log(chalk.gray(' Press Ctrl+C to stop\\n'));\n await new Promise(() => {\n // Keep alive\n });\n}\n\ninterface PortMapping {\n name: string;\n service: string;\n localPort: number;\n targetPort: number;\n protocol: 'http' | 'tcp';\n}\n\n/**\n * Set up port forwarding for all services\n */\nasync function setupPortForwarding(\n namespace: string,\n config: StackSoloConfig\n): Promise<PortMapping[]> {\n const portMappings: PortMapping[] = [];\n\n // Firebase emulator ports\n portMappings.push(\n { name: 'Firebase UI', service: 'firebase-emulator', localPort: 4000, targetPort: 4000, protocol: 'http' },\n { name: 'Firestore', service: 'firebase-emulator', localPort: 8080, targetPort: 8080, protocol: 'tcp' },\n { name: 'Firebase Auth', service: 'firebase-emulator', localPort: 9099, targetPort: 9099, protocol: 'tcp' }\n );\n\n // Pub/Sub emulator\n portMappings.push(\n { name: 'Pub/Sub', service: 'pubsub-emulator', localPort: 8085, targetPort: 8085, protocol: 'tcp' }\n );\n\n // Dynamic ports for functions and UIs from config\n let functionPort = 8081;\n let uiPort = 3000;\n\n for (const network of config.project.networks || []) {\n for (const func of network.functions || []) {\n portMappings.push({\n name: `Function: ${func.name}`,\n service: func.name.toLowerCase().replace(/[^a-z0-9-]/g, '-'),\n localPort: functionPort,\n targetPort: functionPort,\n protocol: 'http',\n });\n functionPort++;\n }\n\n for (const ui of network.uis || []) {\n portMappings.push({\n name: `UI: ${ui.name}`,\n service: ui.name.toLowerCase().replace(/[^a-z0-9-]/g, '-'),\n localPort: uiPort,\n targetPort: uiPort,\n protocol: 'http',\n });\n uiPort++;\n }\n }\n\n // Start port-forward for each service\n for (const mapping of portMappings) {\n try {\n const proc = spawn(\n 'kubectl',\n ['port-forward', '-n', namespace, `svc/${mapping.service}`, `${mapping.localPort}:${mapping.targetPort}`],\n { stdio: 'pipe', detached: false }\n );\n\n portForwardProcesses.push(proc);\n\n // Handle errors silently (service might not exist)\n proc.on('error', () => {});\n } catch {\n // Ignore errors for individual port forwards\n }\n }\n\n // Port-forward gateway for unified load balancer access\n const hasGateway = config.project.networks?.some((n) => n.loadBalancer?.routes);\n if (hasGateway) {\n try {\n const gatewayProc = spawn(\n 'kubectl',\n ['port-forward', '-n', namespace, 'svc/gateway', '8000:8000'],\n { stdio: 'pipe', detached: false }\n );\n portForwardProcesses.push(gatewayProc);\n gatewayProc.on('error', () => {});\n\n // Add gateway to the mappings for display\n portMappings.unshift({\n name: 'Load Balancer',\n service: 'gateway',\n localPort: 8000,\n targetPort: 8000,\n protocol: 'http',\n });\n } catch {\n // Gateway may not exist\n }\n }\n\n // Give port forwards a moment to establish\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n return portMappings;\n}\n\n/**\n * Stop and tear down the environment\n */\nasync function stopEnvironment(): Promise<void> {\n console.log(chalk.bold('\\n Stopping StackSolo Dev Environment\\n'));\n\n const config = await loadConfig();\n const namespace = sanitizeNamespaceName(config.project.name);\n\n const spinner = ora(`Deleting namespace ${namespace}...`).start();\n try {\n execSync(`kubectl delete namespace ${namespace}`, { stdio: 'pipe' });\n spinner.succeed('Environment stopped');\n } catch {\n spinner.warn('Namespace may not exist or already deleted');\n }\n\n console.log('');\n}\n\n/**\n * Show status of running pods\n */\nasync function showStatus(): Promise<void> {\n console.log(chalk.bold('\\n StackSolo Dev Status\\n'));\n\n const config = await loadConfig();\n const namespace = sanitizeNamespaceName(config.project.name);\n\n try {\n // Pods\n console.log(chalk.bold(' Pods:\\n'));\n const pods = execSync(`kubectl get pods -n ${namespace} -o wide`, { encoding: 'utf-8' });\n console.log(pods.split('\\n').map((l) => ' ' + l).join('\\n'));\n\n // Services\n console.log(chalk.bold('\\n Services:\\n'));\n const services = execSync(`kubectl get services -n ${namespace}`, { encoding: 'utf-8' });\n console.log(services.split('\\n').map((l) => ' ' + l).join('\\n'));\n\n // Ingress\n console.log(chalk.bold('\\n Ingress:\\n'));\n const ingress = execSync(`kubectl get ingress -n ${namespace}`, { encoding: 'utf-8' });\n console.log(ingress.split('\\n').map((l) => ' ' + l).join('\\n'));\n } catch {\n console.log(chalk.yellow(` No resources found in namespace ${namespace}`));\n console.log(chalk.gray(' Run \"stacksolo dev\" to start the environment\\n'));\n }\n\n console.log('');\n}\n\n/**\n * Describe K8s resources in detail\n */\nasync function describeResources(resource: string): Promise<void> {\n console.log(chalk.bold('\\n StackSolo Dev - Resource Details\\n'));\n\n const config = await loadConfig();\n const namespace = sanitizeNamespaceName(config.project.name);\n\n try {\n const indent = (text: string) => text.split('\\n').map((l) => ' ' + l).join('\\n');\n\n if (resource === 'all' || resource === 'pods') {\n console.log(chalk.bold.cyan(' ═══ Pods ═══\\n'));\n const pods = execSync(`kubectl describe pods -n ${namespace}`, { encoding: 'utf-8' });\n console.log(indent(pods));\n }\n\n if (resource === 'all' || resource === 'services') {\n console.log(chalk.bold.cyan('\\n ═══ Services ═══\\n'));\n const services = execSync(`kubectl describe services -n ${namespace}`, { encoding: 'utf-8' });\n console.log(indent(services));\n }\n\n if (resource === 'all' || resource === 'deployments') {\n console.log(chalk.bold.cyan('\\n ═══ Deployments ═══\\n'));\n const deployments = execSync(`kubectl describe deployments -n ${namespace}`, { encoding: 'utf-8' });\n console.log(indent(deployments));\n }\n\n if (resource === 'all' || resource === 'ingress') {\n console.log(chalk.bold.cyan('\\n ═══ Ingress ═══\\n'));\n try {\n const ingress = execSync(`kubectl describe ingress -n ${namespace}`, { encoding: 'utf-8' });\n console.log(indent(ingress));\n } catch {\n console.log(chalk.gray(' No ingress resources found'));\n }\n }\n\n if (resource === 'all' || resource === 'configmaps') {\n console.log(chalk.bold.cyan('\\n ═══ ConfigMaps ═══\\n'));\n const configmaps = execSync(`kubectl describe configmaps -n ${namespace}`, { encoding: 'utf-8' });\n console.log(indent(configmaps));\n }\n\n // If a specific pod/service name was given\n if (!['all', 'pods', 'services', 'deployments', 'ingress', 'configmaps'].includes(resource)) {\n console.log(chalk.bold.cyan(` ═══ ${resource} ═══\\n`));\n try {\n // Try as pod first\n const podDesc = execSync(`kubectl describe pod/${resource} -n ${namespace} 2>/dev/null || kubectl describe deployment/${resource} -n ${namespace} 2>/dev/null || kubectl describe service/${resource} -n ${namespace}`, { encoding: 'utf-8' });\n console.log(indent(podDesc));\n } catch {\n console.log(chalk.yellow(` Resource '${resource}' not found`));\n console.log(chalk.gray('\\n Available options: all, pods, services, deployments, ingress, configmaps'));\n console.log(chalk.gray(' Or specify a resource name like: --describe api'));\n }\n }\n } catch {\n console.log(chalk.yellow(` No resources found in namespace ${namespace}`));\n console.log(chalk.gray(' Run \"stacksolo dev\" to start the environment\\n'));\n }\n\n console.log('');\n}\n\n/**\n * Tail logs from pods\n */\nasync function tailLogs(service?: string): Promise<void> {\n const config = await loadConfig();\n const namespace = sanitizeNamespaceName(config.project.name);\n\n console.log(chalk.bold('\\n StackSolo Dev Logs\\n'));\n console.log(chalk.gray(' Press Ctrl+C to stop\\n'));\n\n const args = service\n ? ['logs', '-f', '-n', namespace, '-l', `app.kubernetes.io/name=${service}`]\n : ['logs', '-f', '-n', namespace, '--all-containers', '-l', 'app.kubernetes.io/managed-by=stacksolo'];\n\n const child = spawn('kubectl', args, { stdio: 'inherit' });\n\n process.on('SIGINT', () => {\n child.kill('SIGINT');\n process.exit(0);\n });\n\n child.on('exit', (code) => {\n process.exit(code || 0);\n });\n}\n","/**\n * YAML serialization utilities for K8s manifests\n * Generates YAML strings from K8s resource objects\n */\n\ntype YamlValue = string | number | boolean | null | YamlValue[] | { [key: string]: YamlValue };\n\n/**\n * Serialize a value to YAML string with proper indentation\n */\nexport function toYaml(obj: Record<string, YamlValue>, indent = 0): string {\n const lines: string[] = [];\n const prefix = ' '.repeat(indent);\n\n for (const [key, value] of Object.entries(obj)) {\n if (value === undefined) continue;\n\n if (value === null) {\n lines.push(`${prefix}${key}: null`);\n } else if (typeof value === 'string') {\n lines.push(`${prefix}${key}: ${formatYamlString(value)}`);\n } else if (typeof value === 'number' || typeof value === 'boolean') {\n lines.push(`${prefix}${key}: ${value}`);\n } else if (Array.isArray(value)) {\n if (value.length === 0) {\n lines.push(`${prefix}${key}: []`);\n } else {\n lines.push(`${prefix}${key}:`);\n for (const item of value) {\n if (typeof item === 'object' && item !== null && !Array.isArray(item)) {\n const itemLines = toYaml(item as Record<string, YamlValue>, 0).split('\\n');\n lines.push(`${prefix}- ${itemLines[0]}`);\n for (let i = 1; i < itemLines.length; i++) {\n if (itemLines[i].trim()) {\n lines.push(`${prefix} ${itemLines[i]}`);\n }\n }\n } else {\n lines.push(`${prefix}- ${formatYamlValue(item)}`);\n }\n }\n }\n } else if (typeof value === 'object') {\n if (Object.keys(value).length === 0) {\n lines.push(`${prefix}${key}: {}`);\n } else {\n lines.push(`${prefix}${key}:`);\n lines.push(toYaml(value as Record<string, YamlValue>, indent + 1));\n }\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format a string value for YAML, adding quotes if needed\n */\nfunction formatYamlString(value: string): string {\n // Check if the string needs quoting\n const needsQuotes =\n value === '' ||\n value.includes(':') ||\n value.includes('#') ||\n value.includes('\\n') ||\n value.includes('\"') ||\n value.includes(\"'\") ||\n value.startsWith(' ') ||\n value.endsWith(' ') ||\n value.startsWith('*') ||\n value.startsWith('&') ||\n value.startsWith('!') ||\n value.startsWith('{') ||\n value.startsWith('[') ||\n value.startsWith('@') ||\n value.startsWith('`') ||\n /^(true|false|yes|no|on|off|null|~)$/i.test(value) ||\n /^[0-9]/.test(value) ||\n /^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(value);\n\n if (needsQuotes) {\n // Use double quotes and escape internal quotes\n const escaped = value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n return `\"${escaped}\"`;\n }\n\n return value;\n}\n\n/**\n * Format any value for inline YAML\n */\nfunction formatYamlValue(value: YamlValue): string {\n if (value === null) return 'null';\n if (typeof value === 'string') return formatYamlString(value);\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (Array.isArray(value)) {\n return `[${value.map(formatYamlValue).join(', ')}]`;\n }\n return String(value);\n}\n\n/**\n * Generate a YAML document with header comment\n */\nexport function generateYamlDocument(\n resource: Record<string, YamlValue>,\n comment?: string\n): string {\n const lines: string[] = [];\n\n if (comment) {\n for (const line of comment.split('\\n')) {\n lines.push(`# ${line}`);\n }\n lines.push('');\n }\n\n lines.push(toYaml(resource));\n\n return lines.join('\\n') + '\\n';\n}\n\n/**\n * Combine multiple YAML documents into a single file\n */\nexport function combineYamlDocuments(documents: string[]): string {\n return documents.join('\\n---\\n');\n}\n","/**\n * Namespace manifest generator\n * Creates isolated K8s namespace for the project\n */\n\nimport type { K8sNamespace, GeneratedManifest } from './types';\nimport { generateYamlDocument } from './yaml';\n\n/**\n * Generate namespace manifest for a project\n */\nexport function generateNamespace(projectName: string): GeneratedManifest {\n const namespace: K8sNamespace = {\n apiVersion: 'v1',\n kind: 'Namespace',\n metadata: {\n name: sanitizeNamespaceName(projectName),\n labels: {\n 'app.kubernetes.io/managed-by': 'stacksolo',\n 'stacksolo.dev/project': projectName,\n },\n },\n };\n\n const content = generateYamlDocument(\n namespace as unknown as Record<string, unknown>,\n `StackSolo Namespace: ${projectName}\\nGenerated by: stacksolo dev`\n );\n\n return {\n filename: 'namespace.yaml',\n content,\n };\n}\n\n/**\n * Sanitize project name for K8s namespace\n * - Must be lowercase\n * - Must start with a letter\n * - Can only contain letters, numbers, and hyphens\n * - Max 63 characters\n */\nexport function sanitizeNamespaceName(name: string): string {\n let sanitized = name\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/--+/g, '-')\n .replace(/^-/, '')\n .replace(/-$/, '');\n\n // Ensure starts with a letter\n if (!/^[a-z]/.test(sanitized)) {\n sanitized = 'ns-' + sanitized;\n }\n\n // Truncate to 63 characters\n return sanitized.slice(0, 63);\n}\n","/**\n * ConfigMap manifest generator\n * Creates environment variable ConfigMap for emulator hosts\n */\n\nimport type { K8sConfigMap, GeneratedManifest } from './types';\nimport { generateYamlDocument } from './yaml';\nimport { sanitizeNamespaceName } from './namespace';\n\nexport interface ConfigMapOptions {\n projectName: string;\n gcpProjectId?: string;\n firestoreEmulatorHost?: string;\n authEmulatorHost?: string;\n pubsubEmulatorHost?: string;\n additionalEnv?: Record<string, string>;\n}\n\n/**\n * Generate ConfigMap manifest with emulator hosts\n */\nexport function generateConfigMap(options: ConfigMapOptions): GeneratedManifest {\n const namespace = sanitizeNamespaceName(options.projectName);\n\n const data: Record<string, string> = {\n NODE_ENV: 'development',\n // StackSolo runtime environment variables\n STACKSOLO_PROJECT_NAME: options.projectName,\n GATEWAY_URL: 'http://gateway:8000',\n GCP_PROJECT_ID: options.gcpProjectId || `demo-${options.projectName}`,\n };\n\n // Add emulator hosts with in-cluster service names\n if (options.firestoreEmulatorHost !== undefined) {\n data.FIRESTORE_EMULATOR_HOST = options.firestoreEmulatorHost;\n } else {\n data.FIRESTORE_EMULATOR_HOST = 'firebase-emulator:8080';\n }\n\n if (options.authEmulatorHost !== undefined) {\n data.FIREBASE_AUTH_EMULATOR_HOST = options.authEmulatorHost;\n } else {\n data.FIREBASE_AUTH_EMULATOR_HOST = 'firebase-emulator:9099';\n }\n\n if (options.pubsubEmulatorHost !== undefined) {\n data.PUBSUB_EMULATOR_HOST = options.pubsubEmulatorHost;\n } else {\n data.PUBSUB_EMULATOR_HOST = 'pubsub-emulator:8085';\n }\n\n // Add any additional environment variables\n if (options.additionalEnv) {\n Object.assign(data, options.additionalEnv);\n }\n\n const configMap: K8sConfigMap = {\n apiVersion: 'v1',\n kind: 'ConfigMap',\n metadata: {\n name: 'stacksolo-env',\n namespace,\n labels: {\n 'app.kubernetes.io/managed-by': 'stacksolo',\n 'stacksolo.dev/project': options.projectName,\n },\n },\n data,\n };\n\n const content = generateYamlDocument(\n configMap as unknown as Record<string, unknown>,\n `StackSolo Environment ConfigMap\\nGenerated by: stacksolo dev\\n\\nThis ConfigMap provides emulator hosts to all pods.`\n );\n\n return {\n filename: 'configmap.yaml',\n content,\n };\n}\n","/**\n * Runtime and framework detection utilities\n * Maps config runtime/framework to container images and commands\n */\n\nimport type { Runtime, RuntimeConfig, UIFramework, FrameworkConfig } from './types';\n\n/**\n * Get container configuration for a given runtime\n */\nexport function getRuntimeConfig(runtime: Runtime, entryPoint: string): RuntimeConfig {\n if (runtime.startsWith('nodejs')) {\n return {\n image: 'node:20-slim',\n command: [\n 'npx',\n '@google-cloud/functions-framework',\n `--target=${entryPoint}`,\n '--port=8080',\n ],\n };\n }\n\n if (runtime.startsWith('python')) {\n const pythonVersion = getPythonVersion(runtime);\n return {\n image: `python:${pythonVersion}-slim`,\n command: ['functions-framework', `--target=${entryPoint}`, '--port=8080'],\n };\n }\n\n // Default to Node.js\n return {\n image: 'node:20-slim',\n command: [\n 'npx',\n '@google-cloud/functions-framework',\n `--target=${entryPoint}`,\n '--port=8080',\n ],\n };\n}\n\n/**\n * Extract Python version from runtime string\n */\nfunction getPythonVersion(runtime: string): string {\n const match = runtime.match(/python(\\d+)/);\n if (!match) return '3.12';\n\n const version = match[1];\n if (version === '39') return '3.9';\n if (version === '310') return '3.10';\n if (version === '311') return '3.11';\n if (version === '312') return '3.12';\n\n return '3.12';\n}\n\n/**\n * Get dev server command for a UI framework\n */\nexport function getFrameworkConfig(framework: UIFramework): FrameworkConfig {\n switch (framework) {\n case 'vue':\n case 'nuxt':\n return {\n command: ['npm', 'run', 'dev', '--', '--host', '0.0.0.0'],\n };\n\n case 'react':\n case 'next':\n return {\n command: ['npm', 'run', 'dev', '--', '--hostname', '0.0.0.0'],\n };\n\n case 'svelte':\n case 'sveltekit':\n return {\n command: ['npm', 'run', 'dev', '--', '--host', '0.0.0.0'],\n };\n\n default:\n // Generic fallback\n return {\n command: ['npm', 'run', 'dev', '--', '--host', '0.0.0.0'],\n };\n }\n}\n\n/**\n * Check if a runtime is Node.js based\n */\nexport function isNodeRuntime(runtime: Runtime): boolean {\n return runtime.startsWith('nodejs');\n}\n\n/**\n * Check if a runtime is Python based\n */\nexport function isPythonRuntime(runtime: Runtime): boolean {\n return runtime.startsWith('python');\n}\n","/**\n * Function manifest generator\n * Creates Deployment and Service for Cloud Functions in local K8s\n */\n\nimport type {\n K8sDeployment,\n K8sService,\n GeneratedManifest,\n Runtime,\n} from './types';\nimport { generateYamlDocument, combineYamlDocuments } from './yaml';\nimport { sanitizeNamespaceName } from './namespace';\nimport { getRuntimeConfig, isPythonRuntime } from './runtime';\n\nexport interface FunctionConfig {\n name: string;\n runtime: Runtime;\n entryPoint: string;\n memory?: string;\n timeout?: number;\n}\n\nexport interface FunctionManifestOptions {\n projectName: string;\n function: FunctionConfig;\n sourceDir: string;\n port: number;\n}\n\n/**\n * Generate Deployment and Service manifests for a function\n */\nexport function generateFunctionManifests(options: FunctionManifestOptions): GeneratedManifest {\n const namespace = sanitizeNamespaceName(options.projectName);\n const functionName = sanitizeName(options.function.name);\n const runtimeConfig = getRuntimeConfig(options.function.runtime, options.function.entryPoint);\n const isPython = isPythonRuntime(options.function.runtime);\n\n // Build install + run command based on runtime\n const installCmd = isPython ? 'pip install -r requirements.txt 2>/dev/null || true && pip install functions-framework' : 'npm install';\n const runCmd = runtimeConfig.command.join(' ');\n const containerCommand = ['sh', '-c', `${installCmd} && ${runCmd}`];\n\n const labels = {\n 'app.kubernetes.io/name': functionName,\n 'app.kubernetes.io/component': 'function',\n 'app.kubernetes.io/managed-by': 'stacksolo',\n 'stacksolo.dev/project': options.projectName,\n };\n\n // Create Deployment\n const deployment: K8sDeployment = {\n apiVersion: 'apps/v1',\n kind: 'Deployment',\n metadata: {\n name: functionName,\n namespace,\n labels,\n },\n spec: {\n replicas: 1,\n selector: {\n matchLabels: {\n 'app.kubernetes.io/name': functionName,\n },\n },\n template: {\n metadata: {\n labels: {\n 'app.kubernetes.io/name': functionName,\n 'app.kubernetes.io/component': 'function',\n },\n },\n spec: {\n containers: [\n {\n name: functionName,\n image: runtimeConfig.image,\n command: containerCommand,\n ports: [\n {\n containerPort: 8080,\n name: 'http',\n },\n ],\n envFrom: [\n {\n configMapRef: { name: 'stacksolo-env' },\n },\n ],\n volumeMounts: [\n {\n name: 'source',\n mountPath: '/app',\n },\n ],\n workingDir: '/app',\n resources: {\n limits: {\n memory: options.function.memory || '256Mi',\n },\n requests: {\n memory: '128Mi',\n },\n },\n },\n ],\n volumes: [\n {\n name: 'source',\n hostPath: {\n path: options.sourceDir,\n type: 'DirectoryOrCreate',\n },\n },\n ],\n },\n },\n },\n };\n\n // Create Service\n const service: K8sService = {\n apiVersion: 'v1',\n kind: 'Service',\n metadata: {\n name: functionName,\n namespace,\n labels,\n },\n spec: {\n selector: {\n 'app.kubernetes.io/name': functionName,\n },\n ports: [\n {\n port: options.port,\n targetPort: 8080,\n name: 'http',\n },\n ],\n type: 'ClusterIP',\n },\n };\n\n const deploymentYaml = generateYamlDocument(\n deployment as unknown as Record<string, unknown>,\n `Function: ${options.function.name}\\nRuntime: ${options.function.runtime}\\nEntry point: ${options.function.entryPoint}`\n );\n\n const serviceYaml = generateYamlDocument(\n service as unknown as Record<string, unknown>\n );\n\n const content = combineYamlDocuments([deploymentYaml, serviceYaml]);\n\n return {\n filename: `function-${functionName}.yaml`,\n content,\n };\n}\n\n/**\n * Sanitize name for K8s resource naming\n */\nfunction sanitizeName(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/--+/g, '-')\n .replace(/^-/, '')\n .replace(/-$/, '')\n .slice(0, 63);\n}\n","/**\n * UI manifest generator\n * Creates Deployment and Service for UI applications in local K8s\n */\n\nimport type {\n K8sDeployment,\n K8sService,\n GeneratedManifest,\n UIFramework,\n} from './types';\nimport { generateYamlDocument, combineYamlDocuments } from './yaml';\nimport { sanitizeNamespaceName } from './namespace';\nimport { getFrameworkConfig } from './runtime';\n\nexport interface UIConfig {\n name: string;\n framework: UIFramework;\n}\n\nexport interface UIManifestOptions {\n projectName: string;\n ui: UIConfig;\n sourceDir: string;\n port: number;\n}\n\n/**\n * Generate Deployment and Service manifests for a UI application\n */\nexport function generateUIManifests(options: UIManifestOptions): GeneratedManifest {\n const namespace = sanitizeNamespaceName(options.projectName);\n const uiName = sanitizeName(options.ui.name);\n const frameworkConfig = getFrameworkConfig(options.ui.framework);\n\n const labels = {\n 'app.kubernetes.io/name': uiName,\n 'app.kubernetes.io/component': 'ui',\n 'app.kubernetes.io/managed-by': 'stacksolo',\n 'stacksolo.dev/project': options.projectName,\n };\n\n // Create Deployment\n const deployment: K8sDeployment = {\n apiVersion: 'apps/v1',\n kind: 'Deployment',\n metadata: {\n name: uiName,\n namespace,\n labels,\n },\n spec: {\n replicas: 1,\n selector: {\n matchLabels: {\n 'app.kubernetes.io/name': uiName,\n },\n },\n template: {\n metadata: {\n labels: {\n 'app.kubernetes.io/name': uiName,\n 'app.kubernetes.io/component': 'ui',\n },\n },\n spec: {\n containers: [\n {\n name: uiName,\n image: 'node:20-slim',\n command: ['sh', '-c', `npm install && ${frameworkConfig.command.join(' ')}`],\n ports: [\n {\n containerPort: options.port,\n name: 'http',\n },\n ],\n envFrom: [\n {\n configMapRef: { name: 'stacksolo-env' },\n },\n ],\n volumeMounts: [\n {\n name: 'source',\n mountPath: '/app',\n },\n ],\n workingDir: '/app',\n resources: {\n limits: {\n memory: '512Mi',\n },\n requests: {\n memory: '256Mi',\n },\n },\n },\n ],\n volumes: [\n {\n name: 'source',\n hostPath: {\n path: options.sourceDir,\n type: 'DirectoryOrCreate',\n },\n },\n ],\n },\n },\n },\n };\n\n // Create Service\n const service: K8sService = {\n apiVersion: 'v1',\n kind: 'Service',\n metadata: {\n name: uiName,\n namespace,\n labels,\n },\n spec: {\n selector: {\n 'app.kubernetes.io/name': uiName,\n },\n ports: [\n {\n port: options.port,\n targetPort: options.port,\n name: 'http',\n },\n ],\n type: 'ClusterIP',\n },\n };\n\n const deploymentYaml = generateYamlDocument(\n deployment as unknown as Record<string, unknown>,\n `UI: ${options.ui.name}\\nFramework: ${options.ui.framework}`\n );\n\n const serviceYaml = generateYamlDocument(\n service as unknown as Record<string, unknown>\n );\n\n const content = combineYamlDocuments([deploymentYaml, serviceYaml]);\n\n return {\n filename: `ui-${uiName}.yaml`,\n content,\n };\n}\n\n/**\n * Sanitize name for K8s resource naming\n */\nfunction sanitizeName(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/--+/g, '-')\n .replace(/^-/, '')\n .replace(/-$/, '')\n .slice(0, 63);\n}\n","/**\n * Emulator manifest generators\n * Creates Deployments and Services for Firebase and Pub/Sub emulators\n */\n\nimport type {\n K8sDeployment,\n K8sService,\n GeneratedManifest,\n} from './types';\nimport { generateYamlDocument, combineYamlDocuments } from './yaml';\nimport { sanitizeNamespaceName } from './namespace';\n\nexport interface EmulatorOptions {\n projectName: string;\n}\n\n/**\n * Generate Firebase emulator manifests (Firestore + Auth)\n */\nexport function generateFirebaseEmulator(options: EmulatorOptions): GeneratedManifest {\n const namespace = sanitizeNamespaceName(options.projectName);\n\n const labels = {\n 'app.kubernetes.io/name': 'firebase-emulator',\n 'app.kubernetes.io/component': 'emulator',\n 'app.kubernetes.io/managed-by': 'stacksolo',\n 'stacksolo.dev/project': options.projectName,\n };\n\n const deployment: K8sDeployment = {\n apiVersion: 'apps/v1',\n kind: 'Deployment',\n metadata: {\n name: 'firebase-emulator',\n namespace,\n labels,\n },\n spec: {\n replicas: 1,\n selector: {\n matchLabels: {\n 'app.kubernetes.io/name': 'firebase-emulator',\n },\n },\n template: {\n metadata: {\n labels: {\n 'app.kubernetes.io/name': 'firebase-emulator',\n 'app.kubernetes.io/component': 'emulator',\n },\n },\n spec: {\n containers: [\n {\n name: 'firebase',\n // Use andreysenov/firebase-tools which includes Node.js, Java, and firebase-tools\n image: 'andreysenov/firebase-tools:latest',\n command: [\n 'firebase',\n 'emulators:start',\n '--only',\n 'firestore,auth',\n '--project',\n 'demo-stacksolo',\n ],\n ports: [\n {\n containerPort: 8080,\n name: 'firestore',\n },\n {\n containerPort: 9099,\n name: 'auth',\n },\n {\n containerPort: 4000,\n name: 'ui',\n },\n ],\n resources: {\n limits: {\n memory: '1Gi',\n },\n requests: {\n memory: '512Mi',\n },\n },\n },\n ],\n },\n },\n },\n };\n\n const service: K8sService = {\n apiVersion: 'v1',\n kind: 'Service',\n metadata: {\n name: 'firebase-emulator',\n namespace,\n labels,\n },\n spec: {\n selector: {\n 'app.kubernetes.io/name': 'firebase-emulator',\n },\n ports: [\n {\n port: 8080,\n targetPort: 8080,\n name: 'firestore',\n },\n {\n port: 9099,\n targetPort: 9099,\n name: 'auth',\n },\n {\n port: 4000,\n targetPort: 4000,\n name: 'ui',\n },\n ],\n type: 'ClusterIP',\n },\n };\n\n const deploymentYaml = generateYamlDocument(\n deployment as unknown as Record<string, unknown>,\n `Firebase Emulator (Firestore + Auth)\\nPorts:\\n - Firestore: 8080\\n - Auth: 9099\\n - UI: 4000`\n );\n\n const serviceYaml = generateYamlDocument(\n service as unknown as Record<string, unknown>\n );\n\n const content = combineYamlDocuments([deploymentYaml, serviceYaml]);\n\n return {\n filename: 'firebase-emulator.yaml',\n content,\n };\n}\n\n/**\n * Generate Pub/Sub emulator manifests\n */\nexport function generatePubSubEmulator(options: EmulatorOptions): GeneratedManifest {\n const namespace = sanitizeNamespaceName(options.projectName);\n\n const labels = {\n 'app.kubernetes.io/name': 'pubsub-emulator',\n 'app.kubernetes.io/component': 'emulator',\n 'app.kubernetes.io/managed-by': 'stacksolo',\n 'stacksolo.dev/project': options.projectName,\n };\n\n const deployment: K8sDeployment = {\n apiVersion: 'apps/v1',\n kind: 'Deployment',\n metadata: {\n name: 'pubsub-emulator',\n namespace,\n labels,\n },\n spec: {\n replicas: 1,\n selector: {\n matchLabels: {\n 'app.kubernetes.io/name': 'pubsub-emulator',\n },\n },\n template: {\n metadata: {\n labels: {\n 'app.kubernetes.io/name': 'pubsub-emulator',\n 'app.kubernetes.io/component': 'emulator',\n },\n },\n spec: {\n containers: [\n {\n name: 'pubsub',\n image: 'gcr.io/google.com/cloudsdktool/google-cloud-cli:emulators',\n command: [\n 'gcloud',\n 'beta',\n 'emulators',\n 'pubsub',\n 'start',\n '--host-port=0.0.0.0:8085',\n ],\n ports: [\n {\n containerPort: 8085,\n name: 'pubsub',\n },\n ],\n resources: {\n limits: {\n memory: '256Mi',\n },\n requests: {\n memory: '128Mi',\n },\n },\n },\n ],\n },\n },\n },\n };\n\n const service: K8sService = {\n apiVersion: 'v1',\n kind: 'Service',\n metadata: {\n name: 'pubsub-emulator',\n namespace,\n labels,\n },\n spec: {\n selector: {\n 'app.kubernetes.io/name': 'pubsub-emulator',\n },\n ports: [\n {\n port: 8085,\n targetPort: 8085,\n name: 'pubsub',\n },\n ],\n type: 'ClusterIP',\n },\n };\n\n const deploymentYaml = generateYamlDocument(\n deployment as unknown as Record<string, unknown>,\n `Pub/Sub Emulator\\nPort: 8085`\n );\n\n const serviceYaml = generateYamlDocument(\n service as unknown as Record<string, unknown>\n );\n\n const content = combineYamlDocuments([deploymentYaml, serviceYaml]);\n\n return {\n filename: 'pubsub-emulator.yaml',\n content,\n };\n}\n","/**\n * Gateway manifest generator\n * Creates an nginx reverse proxy pod for path-based routing\n * Scoped to the project namespace for easy cleanup\n */\n\nimport type { K8sDeployment, K8sService, K8sConfigMap, GeneratedManifest } from './types';\nimport { generateYamlDocument, combineYamlDocuments } from './yaml';\nimport { sanitizeNamespaceName } from './namespace';\n\nexport interface RouteConfig {\n path: string;\n backend: string;\n}\n\nexport interface GatewayOptions {\n projectName: string;\n routes: RouteConfig[];\n servicePortMap: Record<string, number>;\n}\n\n/**\n * Generate Gateway (nginx reverse proxy) manifest\n */\nexport function generateGateway(options: GatewayOptions): GeneratedManifest {\n const namespace = sanitizeNamespaceName(options.projectName);\n\n const labels = {\n 'app.kubernetes.io/name': 'gateway',\n 'app.kubernetes.io/component': 'gateway',\n 'app.kubernetes.io/managed-by': 'stacksolo',\n 'stacksolo.dev/project': options.projectName,\n };\n\n // Sort routes: more specific paths first, catch-all last\n const sortedRoutes = [...options.routes].sort((a, b) => {\n if (a.path === '/*' || a.path === '/') return 1;\n if (b.path === '/*' || b.path === '/') return -1;\n return b.path.length - a.path.length;\n });\n\n // Generate nginx config\n const nginxConfig = generateNginxConfig(sortedRoutes, options.servicePortMap);\n\n // ConfigMap for nginx config\n const configMap: K8sConfigMap = {\n apiVersion: 'v1',\n kind: 'ConfigMap',\n metadata: {\n name: 'gateway-config',\n namespace,\n labels,\n },\n data: {\n 'nginx.conf': nginxConfig,\n },\n };\n\n // Deployment\n const deployment: K8sDeployment = {\n apiVersion: 'apps/v1',\n kind: 'Deployment',\n metadata: {\n name: 'gateway',\n namespace,\n labels,\n },\n spec: {\n replicas: 1,\n selector: {\n matchLabels: {\n 'app.kubernetes.io/name': 'gateway',\n },\n },\n template: {\n metadata: {\n labels: {\n 'app.kubernetes.io/name': 'gateway',\n 'app.kubernetes.io/component': 'gateway',\n },\n },\n spec: {\n containers: [\n {\n name: 'nginx',\n image: 'nginx:alpine',\n ports: [\n {\n containerPort: 8000,\n name: 'http',\n },\n ],\n volumeMounts: [\n {\n name: 'config',\n mountPath: '/etc/nginx/nginx.conf',\n subPath: 'nginx.conf',\n },\n ],\n resources: {\n limits: {\n memory: '64Mi',\n },\n requests: {\n memory: '32Mi',\n },\n },\n },\n ],\n volumes: [\n {\n name: 'config',\n configMap: {\n name: 'gateway-config',\n },\n },\n ],\n },\n },\n },\n };\n\n // Service\n const service: K8sService = {\n apiVersion: 'v1',\n kind: 'Service',\n metadata: {\n name: 'gateway',\n namespace,\n labels,\n },\n spec: {\n selector: {\n 'app.kubernetes.io/name': 'gateway',\n },\n ports: [\n {\n port: 8000,\n targetPort: 8000,\n name: 'http',\n },\n ],\n type: 'ClusterIP',\n },\n };\n\n // Build route table for documentation\n const routeTable = sortedRoutes\n .map((r) => ` ${r.path.padEnd(15)} → ${r.backend}`)\n .join('\\n');\n\n const configMapYaml = generateYamlDocument(\n configMap as unknown as Record<string, unknown>,\n 'Gateway nginx configuration'\n );\n\n const deploymentYaml = generateYamlDocument(\n deployment as unknown as Record<string, unknown>,\n `Gateway (Load Balancer)\\nRoutes:\\n${routeTable}`\n );\n\n const serviceYaml = generateYamlDocument(\n service as unknown as Record<string, unknown>\n );\n\n const content = combineYamlDocuments([configMapYaml, deploymentYaml, serviceYaml]);\n\n return {\n filename: 'gateway.yaml',\n content,\n };\n}\n\n/**\n * Generate nginx.conf for reverse proxy routing\n */\nfunction generateNginxConfig(\n routes: RouteConfig[],\n servicePortMap: Record<string, number>\n): string {\n const locations = routes.map((route) => {\n const serviceName = sanitizeName(route.backend);\n const servicePort = servicePortMap[route.backend] || 8080;\n const upstream = `http://${serviceName}:${servicePort}`;\n\n // Convert path pattern to nginx location\n if (route.path === '/*' || route.path === '/') {\n return `\n location / {\n proxy_pass ${upstream};\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection 'upgrade';\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_cache_bypass $http_upgrade;\n }`;\n }\n\n // Strip trailing /* for location matching\n const basePath = route.path.replace(/\\/?\\*$/, '');\n\n return `\n location ${basePath}/ {\n proxy_pass ${upstream}/;\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection 'upgrade';\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_cache_bypass $http_upgrade;\n }`;\n });\n\n return `\nevents {\n worker_connections 1024;\n}\n\nhttp {\n upstream_keepalive_timeout 60s;\n\n server {\n listen 8000;\n server_name _;\n\n # Health check endpoint\n location /healthz {\n return 200 'ok';\n add_header Content-Type text/plain;\n }\n${locations.join('\\n')}\n }\n}\n`;\n}\n\n/**\n * Sanitize name for K8s resource naming\n */\nfunction sanitizeName(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/--+/g, '-')\n .replace(/^-/, '')\n .replace(/-$/, '')\n .slice(0, 63);\n}\n","/**\n * Types for Kubernetes manifest generation\n * Used by stacksolo dev to create local K8s environment\n */\n\n// ============================================================================\n// K8s Resource Types\n// ============================================================================\n\nexport interface K8sMetadata {\n name: string;\n namespace?: string;\n labels?: Record<string, string>;\n annotations?: Record<string, string>;\n}\n\nexport interface K8sNamespace {\n apiVersion: 'v1';\n kind: 'Namespace';\n metadata: K8sMetadata;\n}\n\nexport interface K8sConfigMap {\n apiVersion: 'v1';\n kind: 'ConfigMap';\n metadata: K8sMetadata;\n data: Record<string, string>;\n}\n\nexport interface K8sContainerPort {\n containerPort: number;\n name?: string;\n protocol?: 'TCP' | 'UDP';\n}\n\nexport interface K8sEnvVar {\n name: string;\n value?: string;\n valueFrom?: {\n configMapKeyRef?: {\n name: string;\n key: string;\n };\n };\n}\n\nexport interface K8sVolumeMount {\n name: string;\n mountPath: string;\n subPath?: string;\n readOnly?: boolean;\n}\n\nexport interface K8sResourceRequirements {\n limits?: {\n cpu?: string;\n memory?: string;\n };\n requests?: {\n cpu?: string;\n memory?: string;\n };\n}\n\nexport interface K8sContainer {\n name: string;\n image: string;\n command?: string[];\n args?: string[];\n ports?: K8sContainerPort[];\n env?: K8sEnvVar[];\n envFrom?: Array<{\n configMapRef?: { name: string };\n }>;\n volumeMounts?: K8sVolumeMount[];\n workingDir?: string;\n resources?: K8sResourceRequirements;\n}\n\nexport interface K8sHostPathVolume {\n hostPath: {\n path: string;\n type?: 'Directory' | 'DirectoryOrCreate';\n };\n}\n\nexport interface K8sVolume {\n name: string;\n hostPath?: K8sHostPathVolume['hostPath'];\n emptyDir?: Record<string, never>;\n configMap?: {\n name: string;\n };\n}\n\nexport interface K8sPodSpec {\n containers: K8sContainer[];\n volumes?: K8sVolume[];\n restartPolicy?: 'Always' | 'OnFailure' | 'Never';\n}\n\nexport interface K8sDeployment {\n apiVersion: 'apps/v1';\n kind: 'Deployment';\n metadata: K8sMetadata;\n spec: {\n replicas: number;\n selector: {\n matchLabels: Record<string, string>;\n };\n template: {\n metadata: {\n labels: Record<string, string>;\n };\n spec: K8sPodSpec;\n };\n };\n}\n\nexport interface K8sServicePort {\n port: number;\n targetPort: number;\n name?: string;\n protocol?: 'TCP' | 'UDP';\n}\n\nexport interface K8sService {\n apiVersion: 'v1';\n kind: 'Service';\n metadata: K8sMetadata;\n spec: {\n selector: Record<string, string>;\n ports: K8sServicePort[];\n type?: 'ClusterIP' | 'NodePort' | 'LoadBalancer';\n };\n}\n\nexport interface K8sIngressPath {\n path: string;\n pathType: 'Prefix' | 'Exact' | 'ImplementationSpecific';\n backend: {\n service: {\n name: string;\n port: {\n number: number;\n };\n };\n };\n}\n\nexport interface K8sIngress {\n apiVersion: 'networking.k8s.io/v1';\n kind: 'Ingress';\n metadata: K8sMetadata;\n spec: {\n ingressClassName?: string;\n rules: Array<{\n host?: string;\n http: {\n paths: K8sIngressPath[];\n };\n }>;\n };\n}\n\n// ============================================================================\n// Generator Types\n// ============================================================================\n\nexport interface GeneratedManifest {\n filename: string;\n content: string;\n}\n\nexport interface K8sGeneratorResult {\n manifests: GeneratedManifest[];\n services: string[];\n warnings: string[];\n}\n\n// ============================================================================\n// Runtime & Framework Types\n// ============================================================================\n\nexport type NodeRuntime = 'nodejs18' | 'nodejs20';\nexport type PythonRuntime = 'python39' | 'python310' | 'python311' | 'python312';\nexport type Runtime = NodeRuntime | PythonRuntime;\n\nexport type UIFramework = 'vue' | 'nuxt' | 'react' | 'next' | 'svelte' | 'sveltekit';\n\nexport interface RuntimeConfig {\n image: string;\n command: string[];\n}\n\nexport interface FrameworkConfig {\n command: string[];\n}\n\n// ============================================================================\n// Port Assignment\n// ============================================================================\n\nexport interface PortAssignment {\n ingress: number;\n firestoreEmulator: number;\n authEmulator: number;\n pubsubEmulator: number;\n functionBasePort: number;\n uiBasePort: number;\n}\n\nexport const DEFAULT_PORTS: PortAssignment = {\n ingress: 8000,\n firestoreEmulator: 8080,\n authEmulator: 9099,\n pubsubEmulator: 8085,\n functionBasePort: 8081,\n uiBasePort: 3000,\n};\n","/**\n * Port assignment utilities\n * Manages predictable port allocation for K8s services\n */\n\nimport { DEFAULT_PORTS, type PortAssignment } from './types';\n\n/**\n * Port allocator for local K8s services\n */\nexport class PortAllocator {\n private functionIndex = 0;\n private uiIndex = 0;\n private ports: PortAssignment;\n\n constructor(ports: PortAssignment = DEFAULT_PORTS) {\n this.ports = ports;\n }\n\n /**\n * Get the next available function port\n */\n nextFunctionPort(): number {\n const port = this.ports.functionBasePort + this.functionIndex;\n this.functionIndex++;\n return port;\n }\n\n /**\n * Get the next available UI port\n */\n nextUiPort(): number {\n const port = this.ports.uiBasePort + this.uiIndex;\n this.uiIndex++;\n return port;\n }\n\n /**\n * Get ingress port\n */\n get ingressPort(): number {\n return this.ports.ingress;\n }\n\n /**\n * Get Firestore emulator port\n */\n get firestorePort(): number {\n return this.ports.firestoreEmulator;\n }\n\n /**\n * Get Firebase Auth emulator port\n */\n get authPort(): number {\n return this.ports.authEmulator;\n }\n\n /**\n * Get Pub/Sub emulator port\n */\n get pubsubPort(): number {\n return this.ports.pubsubEmulator;\n }\n\n /**\n * Reset allocator state\n */\n reset(): void {\n this.functionIndex = 0;\n this.uiIndex = 0;\n }\n}\n\n/**\n * Create a port allocator with default ports\n */\nexport function createPortAllocator(ports?: Partial<PortAssignment>): PortAllocator {\n return new PortAllocator({ ...DEFAULT_PORTS, ...ports });\n}\n","/**\n * K8s Manifest Generator\n * Main entry point for generating Kubernetes manifests from stacksolo.config.json\n */\n\nimport type { StackSoloConfig } from '@stacksolo/blueprint';\nimport type { GeneratedManifest, K8sGeneratorResult, Runtime, UIFramework } from './types';\nimport { generateNamespace } from './namespace';\nimport { generateConfigMap } from './configmap';\nimport { generateFunctionManifests } from './function';\nimport { generateUIManifests } from './ui';\nimport { generateFirebaseEmulator, generatePubSubEmulator } from './emulators';\nimport { generateGateway } from './gateway';\nimport { createPortAllocator } from './ports';\n\nexport * from './types';\nexport * from './namespace';\nexport * from './configmap';\nexport * from './function';\nexport * from './ui';\nexport * from './emulators';\nexport * from './gateway';\nexport * from './ports';\nexport * from './runtime';\nexport * from './yaml';\n\nexport interface GenerateK8sOptions {\n config: StackSoloConfig;\n projectRoot: string;\n includeEmulators?: boolean;\n}\n\n/**\n * Generate all K8s manifests from StackSolo config\n */\nexport function generateK8sManifests(options: GenerateK8sOptions): K8sGeneratorResult {\n const { config, projectRoot, includeEmulators = true } = options;\n const manifests: GeneratedManifest[] = [];\n const services: string[] = [];\n const warnings: string[] = [];\n\n const projectName = config.project.name;\n const portAllocator = createPortAllocator();\n\n // Track service ports for ingress\n const servicePortMap: Record<string, number> = {};\n\n // 1. Generate namespace\n manifests.push(generateNamespace(projectName));\n\n // 2. Generate ConfigMap\n manifests.push(generateConfigMap({ projectName }));\n\n // 3. Generate emulators (if enabled)\n if (includeEmulators) {\n manifests.push(generateFirebaseEmulator({ projectName }));\n manifests.push(generatePubSubEmulator({ projectName }));\n services.push('firebase-emulator', 'pubsub-emulator');\n }\n\n // 4. Process networks for functions and UIs\n for (const network of config.project.networks || []) {\n // Generate function manifests\n for (const func of network.functions || []) {\n const port = portAllocator.nextFunctionPort();\n const sourceDir = `${projectRoot}/functions/${func.name}`;\n\n try {\n const manifest = generateFunctionManifests({\n projectName,\n function: {\n name: func.name,\n runtime: (func.runtime || 'nodejs20') as Runtime,\n entryPoint: func.entryPoint || 'handler',\n memory: func.memory,\n timeout: func.timeout,\n },\n sourceDir,\n port,\n });\n\n manifests.push(manifest);\n services.push(func.name);\n servicePortMap[func.name] = port;\n } catch (error) {\n warnings.push(`Failed to generate manifest for function ${func.name}: ${error}`);\n }\n }\n\n // Generate UI manifests\n for (const ui of network.uis || []) {\n const port = portAllocator.nextUiPort();\n const sourceDir = `${projectRoot}/ui/${ui.name}`;\n\n try {\n const manifest = generateUIManifests({\n projectName,\n ui: {\n name: ui.name,\n framework: (ui.framework || 'vue') as UIFramework,\n },\n sourceDir,\n port,\n });\n\n manifests.push(manifest);\n services.push(ui.name);\n servicePortMap[ui.name] = port;\n } catch (error) {\n warnings.push(`Failed to generate manifest for UI ${ui.name}: ${error}`);\n }\n }\n\n // Generate gateway from load balancer routes\n if (network.loadBalancer?.routes) {\n const routes = network.loadBalancer.routes.map((r) => ({\n path: r.path,\n backend: r.backend,\n }));\n\n manifests.push(\n generateGateway({\n projectName,\n routes,\n servicePortMap,\n })\n );\n services.push('gateway');\n }\n }\n\n return {\n manifests,\n services,\n warnings,\n };\n}\n\n/**\n * Write generated manifests to disk\n */\nexport async function writeK8sManifests(\n manifests: GeneratedManifest[],\n outputDir: string\n): Promise<void> {\n const fs = await import('fs/promises');\n const path = await import('path');\n\n // Ensure output directory exists\n await fs.mkdir(outputDir, { recursive: true });\n\n // Write each manifest\n for (const manifest of manifests) {\n const filePath = path.join(outputDir, manifest.filename);\n await fs.writeFile(filePath, manifest.content, 'utf-8');\n }\n}\n","/**\n * stacksolo install\n *\n * Install dependencies for all resources in the project\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport { parseConfig } from '@stacksolo/blueprint';\n\nconst execAsync = promisify(exec);\n\nconst STACKSOLO_DIR = '.stacksolo';\nconst CONFIG_FILENAME = 'stacksolo.config.json';\n\nexport const installCommand = new Command('install')\n .description('Install dependencies for all resources')\n .option('-p, --parallel', 'Install dependencies in parallel')\n .action(async (options) => {\n const cwd = process.cwd();\n\n console.log(chalk.cyan('\\n StackSolo Install\\n'));\n\n // Load config\n const configPath = path.join(cwd, STACKSOLO_DIR, CONFIG_FILENAME);\n let config;\n try {\n config = parseConfig(configPath);\n } catch {\n console.log(chalk.red(' No config found. Run `stacksolo init` first.\\n'));\n return;\n }\n\n // Collect all resource directories\n const directories: { name: string; path: string; type: string }[] = [];\n\n for (const network of config.project.networks || []) {\n // Functions\n for (const fn of network.functions || []) {\n const sourceDir = fn.sourceDir?.replace(/^\\.\\//, '') || `functions/${fn.name}`;\n directories.push({\n name: fn.name,\n path: path.join(cwd, sourceDir),\n type: 'function',\n });\n }\n\n // Containers\n for (const container of network.containers || []) {\n const sourceDir = (container as { sourceDir?: string }).sourceDir?.replace(/^\\.\\//, '') || `containers/${container.name}`;\n directories.push({\n name: container.name,\n path: path.join(cwd, sourceDir),\n type: 'container',\n });\n }\n\n // UIs\n for (const ui of network.uis || []) {\n const sourceDir = ui.sourceDir?.replace(/^\\.\\//, '') || `apps/${ui.name}`;\n directories.push({\n name: ui.name,\n path: path.join(cwd, sourceDir),\n type: 'ui',\n });\n }\n }\n\n if (directories.length === 0) {\n console.log(chalk.yellow(' No resources found in config.\\n'));\n return;\n }\n\n console.log(chalk.gray(` Found ${directories.length} resource(s) to install:\\n`));\n\n // Filter to only directories with package.json\n const validDirs: typeof directories = [];\n for (const dir of directories) {\n try {\n await fs.access(path.join(dir.path, 'package.json'));\n validDirs.push(dir);\n console.log(chalk.gray(` - ${dir.name} (${dir.type})`));\n } catch {\n // No package.json, skip\n }\n }\n\n if (validDirs.length === 0) {\n console.log(chalk.yellow(' No resources with package.json found.\\n'));\n return;\n }\n\n console.log('');\n\n // Install dependencies\n const installDir = async (dir: typeof directories[0]) => {\n const spinner = ora(`Installing ${dir.name}...`).start();\n try {\n await execAsync('npm install', { cwd: dir.path, timeout: 120000 });\n spinner.succeed(`Installed ${dir.name}`);\n return { success: true, name: dir.name };\n } catch (error) {\n spinner.fail(`Failed to install ${dir.name}`);\n return { success: false, name: dir.name, error };\n }\n };\n\n let results: { success: boolean; name: string; error?: unknown }[];\n\n if (options.parallel) {\n // Install in parallel\n results = await Promise.all(validDirs.map(installDir));\n } else {\n // Install sequentially\n results = [];\n for (const dir of validDirs) {\n results.push(await installDir(dir));\n }\n }\n\n // Summary\n const succeeded = results.filter((r) => r.success).length;\n const failed = results.filter((r) => !r.success).length;\n\n console.log('');\n if (failed === 0) {\n console.log(chalk.green(` ✓ Installed dependencies for ${succeeded} resource(s)\\n`));\n } else {\n console.log(chalk.yellow(` Installed ${succeeded}, failed ${failed}\\n`));\n }\n });\n","/**\n * stacksolo serve\n *\n * Start the StackSolo API server (headless mode).\n * Used by the CLI when not running as a desktop app.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\n\nexport const serveCommand = new Command('serve')\n .description('Start the StackSolo API server')\n .option('-p, --port <port>', 'Port to listen on', '3000')\n .option('--host <host>', 'Host to bind to', 'localhost')\n .action(async (options) => {\n console.log(chalk.bold('\\n StackSolo Server\\n'));\n\n const port = parseInt(options.port, 10);\n const host = options.host;\n\n console.log(chalk.gray(` Starting API server on ${host}:${port}...`));\n\n // Dynamically import the API to avoid bundling it unnecessarily\n try {\n // The API package exports a startServer function we can call\n const { startServer } = await import('@stacksolo/api');\n await startServer({ port, host });\n } catch (error) {\n // Fallback: spawn as child process\n const { spawn } = await import('child_process');\n const path = await import('path');\n const { fileURLToPath } = await import('url');\n\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const apiPath = path.resolve(__dirname, '../../api/dist/index.js');\n\n console.log(chalk.gray(` Spawning API from ${apiPath}...\\n`));\n\n const child = spawn('node', [apiPath], {\n env: {\n ...process.env,\n PORT: String(port),\n HOST: host,\n },\n stdio: 'inherit',\n });\n\n child.on('error', (err) => {\n console.log(chalk.red(` Failed to start server: ${err.message}\\n`));\n process.exit(1);\n });\n\n child.on('exit', (code) => {\n process.exit(code || 0);\n });\n\n // Handle shutdown\n process.on('SIGINT', () => {\n child.kill('SIGINT');\n });\n\n process.on('SIGTERM', () => {\n child.kill('SIGTERM');\n });\n }\n });\n","/**\n * stacksolo config\n *\n * Commands for viewing and validating stacksolo.config.json\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { parseConfig, validateConfig } from '@stacksolo/blueprint';\nimport { resolveConfig, topologicalSort } from '@stacksolo/blueprint';\nimport { parseReference } from '@stacksolo/blueprint';\nimport type { StackSoloConfig, NetworkConfig } from '@stacksolo/blueprint';\n\nconst STACKSOLO_DIR = '.stacksolo';\nconst CONFIG_FILENAME = 'stacksolo.config.json';\n\nfunction getConfigPath(): string {\n return path.join(process.cwd(), STACKSOLO_DIR, CONFIG_FILENAME);\n}\n\nasync function loadConfig(configPath: string): Promise<StackSoloConfig | null> {\n try {\n return parseConfig(configPath);\n } catch (error) {\n console.log(chalk.red(`\\n Error: Could not read ${STACKSOLO_DIR}/${CONFIG_FILENAME}\\n`));\n console.log(chalk.gray(` ${error}`));\n return null;\n }\n}\n\n// ============================================================================\n// config show - Pretty-print the config\n// ============================================================================\n\nconst showCommand = new Command('show')\n .description('Display the current configuration')\n .option('-r, --raw', 'Output raw JSON without formatting')\n .action(async (options) => {\n const configPath = getConfigPath();\n\n const config = await loadConfig(configPath);\n if (!config) return;\n\n if (options.raw) {\n console.log(JSON.stringify(config, null, 2));\n return;\n }\n\n console.log(chalk.bold('\\n StackSolo Configuration\\n'));\n\n // Project info\n console.log(chalk.cyan(' Project:'));\n console.log(chalk.white(` Name: ${config.project.name}`));\n console.log(chalk.white(` Region: ${config.project.region}`));\n console.log(chalk.white(` GCP Project: ${config.project.gcpProjectId}`));\n\n // Global resources\n const { buckets, secrets, topics, queues, crons } = config.project;\n\n if (buckets?.length) {\n console.log(chalk.cyan('\\n Buckets:'));\n buckets.forEach((b) => {\n console.log(chalk.white(` - ${b.name}`) + chalk.gray(` (${b.storageClass || 'STANDARD'})`));\n });\n }\n\n if (secrets?.length) {\n console.log(chalk.cyan('\\n Secrets:'));\n secrets.forEach((s) => {\n console.log(chalk.white(` - ${s.name}`));\n });\n }\n\n if (topics?.length) {\n console.log(chalk.cyan('\\n Topics:'));\n topics.forEach((t) => {\n console.log(chalk.white(` - ${t.name}`));\n });\n }\n\n if (queues?.length) {\n console.log(chalk.cyan('\\n Queues:'));\n queues.forEach((q) => {\n console.log(chalk.white(` - ${q.name}`));\n });\n }\n\n if (crons?.length) {\n console.log(chalk.cyan('\\n Scheduled Jobs:'));\n crons.forEach((c) => {\n console.log(chalk.white(` - ${c.name}`) + chalk.gray(` (${c.schedule})`));\n });\n }\n\n // Networks and their resources\n const networks = config.project.networks || [];\n if (networks.length) {\n networks.forEach((network: NetworkConfig) => {\n console.log(chalk.cyan(`\\n Network: ${network.name}`));\n\n if (network.subnets?.length) {\n console.log(chalk.gray(' Subnets:'));\n network.subnets.forEach((s) => {\n console.log(chalk.white(` - ${s.name}`) + chalk.gray(` (${s.ipCidrRange})`));\n });\n }\n\n if (network.containers?.length) {\n console.log(chalk.gray(' Containers:'));\n network.containers.forEach((c) => {\n console.log(chalk.white(` - ${c.name}`) + chalk.gray(` (${c.memory || '256Mi'})`));\n });\n }\n\n if (network.functions?.length) {\n console.log(chalk.gray(' Functions:'));\n network.functions.forEach((f) => {\n console.log(chalk.white(` - ${f.name}`) + chalk.gray(` (${f.runtime || 'nodejs20'})`));\n });\n }\n\n if (network.databases?.length) {\n console.log(chalk.gray(' Databases:'));\n network.databases.forEach((d) => {\n console.log(chalk.white(` - ${d.name}`) + chalk.gray(` (${d.databaseVersion || 'POSTGRES_15'})`));\n });\n }\n\n if (network.caches?.length) {\n console.log(chalk.gray(' Caches:'));\n network.caches.forEach((c) => {\n console.log(chalk.white(` - ${c.name}`) + chalk.gray(` (${c.memorySizeGb || 1}GB)`));\n });\n }\n });\n }\n\n console.log('');\n });\n\n// ============================================================================\n// config resources - List all resources that will be created\n// ============================================================================\n\nconst resourcesCommand = new Command('resources')\n .description('List all resources that will be created')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const configPath = getConfigPath();\n\n const config = await loadConfig(configPath);\n if (!config) return;\n\n try {\n const resolved = resolveConfig(config);\n const order = topologicalSort(resolved.resources);\n\n if (options.json) {\n console.log(JSON.stringify(resolved.resources, null, 2));\n return;\n }\n\n console.log(chalk.bold('\\n Resources to Create\\n'));\n console.log(chalk.gray(` Order of creation (${order.length} resources):\\n`));\n\n order.forEach((id, index) => {\n const resource = resolved.resources.find((r) => r.id === id);\n if (!resource) return;\n\n const deps = resource.dependsOn.length\n ? chalk.gray(` → depends on: ${resource.dependsOn.join(', ')}`)\n : '';\n\n console.log(\n chalk.white(` ${String(index + 1).padStart(2)}. `) +\n chalk.cyan(resource.type) +\n chalk.white(` \"${resource.name}\"`) +\n deps\n );\n });\n\n console.log('');\n } catch (error) {\n console.log(chalk.red(`\\n Error resolving config: ${error}\\n`));\n }\n });\n\n// ============================================================================\n// config validate - Check if config is valid\n// ============================================================================\n\nconst validateCommand = new Command('validate')\n .description('Validate the configuration file')\n .action(async () => {\n const configPath = getConfigPath();\n\n const config = await loadConfig(configPath);\n if (!config) return;\n\n const result = validateConfig(config);\n\n if (result.valid) {\n console.log(chalk.green('\\n ✓ Configuration is valid\\n'));\n\n // Also try to resolve to catch dependency issues\n try {\n const resolved = resolveConfig(config);\n const order = topologicalSort(resolved.resources);\n console.log(chalk.gray(` ${resolved.resources.length} resources defined`));\n console.log(chalk.gray(` No circular dependencies detected\\n`));\n } catch (error) {\n console.log(chalk.yellow(`\\n ⚠ Warning: ${error}\\n`));\n }\n } else {\n console.log(chalk.red('\\n ✗ Configuration has errors:\\n'));\n result.errors.forEach((err) => {\n console.log(chalk.red(` - ${err.path}: ${err.message}`));\n if (err.value !== undefined) {\n console.log(chalk.gray(` value: ${JSON.stringify(err.value)}`));\n }\n });\n console.log('');\n process.exit(1);\n }\n });\n\n// ============================================================================\n// config references - Show all @type/name references\n// ============================================================================\n\nconst referencesCommand = new Command('references')\n .description('Show all resource references in the configuration')\n .action(async () => {\n const configPath = getConfigPath();\n\n const config = await loadConfig(configPath);\n if (!config) return;\n\n console.log(chalk.bold('\\n Resource References\\n'));\n\n const allReferences: Array<{\n location: string;\n envVar: string;\n reference: string;\n parsed: ReturnType<typeof parseReference>;\n }> = [];\n\n // Collect references from networks\n const networks = config.project.networks || [];\n networks.forEach((network: NetworkConfig) => {\n // Check containers\n network.containers?.forEach((container) => {\n if (container.env) {\n Object.entries(container.env).forEach(([key, value]) => {\n if (value.startsWith('@')) {\n allReferences.push({\n location: `${network.name}/${container.name}`,\n envVar: key,\n reference: value,\n parsed: parseReference(value),\n });\n }\n });\n }\n });\n\n // Check functions\n network.functions?.forEach((func) => {\n if (func.env) {\n Object.entries(func.env).forEach(([key, value]) => {\n if (value.startsWith('@')) {\n allReferences.push({\n location: `${network.name}/${func.name}`,\n envVar: key,\n reference: value,\n parsed: parseReference(value),\n });\n }\n });\n }\n });\n });\n\n if (allReferences.length === 0) {\n console.log(chalk.gray(' No references found.\\n'));\n return;\n }\n\n // Group by type\n const byType = new Map<string, typeof allReferences>();\n allReferences.forEach((ref) => {\n const type = ref.parsed?.type || 'unknown';\n if (!byType.has(type)) {\n byType.set(type, []);\n }\n byType.get(type)!.push(ref);\n });\n\n byType.forEach((refs, type) => {\n console.log(chalk.cyan(` @${type}:`));\n refs.forEach((ref) => {\n const property = ref.parsed?.property ? `.${ref.parsed.property}` : '';\n console.log(\n chalk.white(` ${ref.reference}`) +\n chalk.gray(` → ${ref.location}.env.${ref.envVar}`)\n );\n });\n console.log('');\n });\n });\n\n// ============================================================================\n// Main config command\n// ============================================================================\n\nexport const configCommand = new Command('config')\n .description('View and validate configuration')\n .addCommand(showCommand)\n .addCommand(resourcesCommand)\n .addCommand(validateCommand)\n .addCommand(referencesCommand);\n\n// Default action when just running `stacksolo config`\nconfigCommand.action(() => {\n configCommand.outputHelp();\n});\n","/**\n * stacksolo env\n *\n * Generate environment configuration files from deployed resources.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { api, checkApiConnection } from '../../api-client';\n\ninterface LocalConfig {\n projectId: string;\n patternId: string;\n gcpProject: string;\n region: string;\n}\n\nexport const envCommand = new Command('env')\n .description('Generate environment configuration files')\n .option('--stdout', 'Print to stdout instead of writing files')\n .option('--format <format>', 'Output format: dotenv, json, typescript', 'dotenv')\n .action(async (options) => {\n const cwd = process.cwd();\n console.log(chalk.bold('\\n StackSolo Env\\n'));\n\n // Load local config\n const configPath = path.join(cwd, '.stacksolo', 'config.json');\n let config: LocalConfig;\n\n try {\n const configData = await fs.readFile(configPath, 'utf-8');\n config = JSON.parse(configData) as LocalConfig;\n } catch {\n console.log(chalk.red(' Not initialized. Run `stacksolo init` first.\\n'));\n return;\n }\n\n // Check API connection\n const apiConnected = await checkApiConnection();\n if (!apiConnected) {\n console.log(chalk.red(' StackSolo API not running.'));\n console.log(chalk.gray(' Start with: stacksolo serve\\n'));\n return;\n }\n\n // Check deployment status\n const spinner = ora('Checking deployment...').start();\n const statusResult = await api.deployments.status(config.projectId);\n\n if (!statusResult.success || !statusResult.data) {\n spinner.fail('Could not get deployment status');\n console.log(chalk.gray('\\n Deploy first with: stacksolo deploy\\n'));\n return;\n }\n\n if (statusResult.data.status !== 'succeeded') {\n spinner.fail('No successful deployment');\n console.log(chalk.gray(`\\n Current status: ${statusResult.data.status}`));\n console.log(chalk.gray(' Deploy first with: stacksolo deploy\\n'));\n return;\n }\n\n spinner.text = 'Generating configuration...';\n\n // Generate config via API\n const configResult = await api.deployments.generateConfig(config.projectId);\n\n if (!configResult.success || !configResult.data) {\n spinner.fail('Failed to generate config');\n console.log(chalk.red(` ${configResult.error}\\n`));\n return;\n }\n\n spinner.succeed('Configuration generated');\n\n // Read generated files\n const envPath = configResult.data.envPath;\n const tsConfigPath = configResult.data.configPath;\n\n if (options.stdout) {\n // Print to stdout\n try {\n console.log(chalk.gray('\\n .env.local:'));\n const envContent = await fs.readFile(envPath, 'utf-8');\n console.log(envContent);\n\n console.log(chalk.gray('\\n stacksolo.config.ts:'));\n const tsContent = await fs.readFile(tsConfigPath, 'utf-8');\n console.log(tsContent);\n } catch (error) {\n console.log(chalk.red(` Error reading files: ${error}\\n`));\n }\n } else {\n console.log(chalk.green('\\n Files generated:'));\n console.log(chalk.gray(` ${envPath}`));\n console.log(chalk.gray(` ${tsConfigPath}`));\n console.log('');\n\n // Show usage hint\n console.log(chalk.gray(' Add to .gitignore:'));\n console.log(chalk.gray(' .env.local'));\n console.log('');\n\n console.log(chalk.gray(' Usage in your app:'));\n console.log(chalk.gray(\" import { config } from './stacksolo.config';\"));\n console.log(chalk.gray(' const dbUrl = config.database?.url;\\n'));\n }\n });\n","/**\n * stacksolo register\n *\n * Register the current project in the global registry\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport * as path from 'path';\nimport { parseConfig } from '@stacksolo/blueprint';\nimport { getRegistry } from '@stacksolo/registry';\n\nconst STACKSOLO_DIR = '.stacksolo';\nconst CONFIG_FILENAME = 'stacksolo.config.json';\n\nfunction getConfigPath(): string {\n return path.join(process.cwd(), STACKSOLO_DIR, CONFIG_FILENAME);\n}\n\nexport const registerCommand = new Command('register')\n .description('Register the current project in the global registry')\n .option('-f, --force', 'Overwrite existing registration')\n .action(async (options) => {\n const configPath = getConfigPath();\n\n // Load config\n let config;\n try {\n config = parseConfig(configPath);\n } catch (error) {\n console.log(chalk.red(`\\n Error: Could not read ${STACKSOLO_DIR}/${CONFIG_FILENAME}\\n`));\n console.log(chalk.gray(` ${error}`));\n console.log(chalk.gray(`\\n Run 'stacksolo init' to create a project first.\\n`));\n process.exit(1);\n }\n\n const registry = getRegistry();\n\n // Check if already registered\n const existingByPath = await registry.findProjectByPath(configPath);\n if (existingByPath) {\n if (options.force) {\n await registry.unregisterProject(existingByPath.id);\n console.log(chalk.yellow(` Updating registration for \"${existingByPath.name}\"...`));\n } else {\n console.log(chalk.yellow(`\\n Project already registered as \"${existingByPath.name}\"`));\n console.log(chalk.gray(` Use --force to update the registration.\\n`));\n return;\n }\n }\n\n // Check if name is taken by another project\n const existingByName = await registry.findProjectByName(config.project.name);\n if (existingByName && existingByName.configPath !== configPath) {\n console.log(chalk.red(`\\n Error: Project name \"${config.project.name}\" is already registered`));\n console.log(chalk.gray(` Registered path: ${existingByName.configPath}`));\n console.log(chalk.gray(` Choose a different project name in stacksolo.config.json\\n`));\n process.exit(1);\n }\n\n // Register the project\n const project = await registry.registerProject({\n name: config.project.name,\n gcpProjectId: config.project.gcpProjectId,\n region: config.project.region,\n configPath: configPath,\n });\n\n console.log(chalk.green(`\\n ✓ Project registered: ${project.name}\\n`));\n console.log(chalk.gray(` GCP Project: ${project.gcpProjectId}`));\n console.log(chalk.gray(` Region: ${project.region}`));\n console.log(chalk.gray(` Config: ${project.configPath}`));\n console.log('');\n\n console.log(chalk.cyan(' Next steps:'));\n console.log(chalk.gray(' stacksolo list # View all registered projects'));\n console.log(chalk.gray(' stacksolo deploy # Deploy the project'));\n console.log('');\n });\n","/**\n * stacksolo unregister\n *\n * Remove a project from the global registry\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport { getRegistry } from '@stacksolo/registry';\n\nexport const unregisterCommand = new Command('unregister')\n .description('Remove a project from the global registry')\n .argument('<project>', 'Project name to unregister')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (projectName, options) => {\n const registry = getRegistry();\n\n // Find the project\n const project = await registry.findProjectByName(projectName);\n if (!project) {\n console.log(chalk.red(`\\n Error: Project \"${projectName}\" not found.\\n`));\n console.log(chalk.gray(' Run `stacksolo list` to see registered projects.\\n'));\n process.exit(1);\n }\n\n // Get resource count for warning\n const resources = await registry.findResourcesByProject(project.id);\n\n // Confirm unless --yes\n if (!options.yes) {\n console.log(chalk.yellow(`\\n Warning: This will remove \"${projectName}\" from the registry.`));\n\n if (resources.length > 0) {\n console.log(chalk.yellow(` This project has ${resources.length} registered resource(s).`));\n }\n\n console.log(chalk.gray('\\n Note: This does NOT destroy deployed cloud resources.'));\n console.log(chalk.gray(' To destroy resources, run `stacksolo destroy` first.\\n'));\n\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Continue with unregistration?',\n default: false,\n },\n ]);\n\n if (!confirm) {\n console.log(chalk.gray('\\n Cancelled.\\n'));\n return;\n }\n }\n\n // Unregister\n await registry.unregisterProject(project.id);\n\n console.log(chalk.green(`\\n ✓ Project \"${projectName}\" removed from registry.\\n`));\n\n if (project.configPath) {\n console.log(chalk.gray(` Config file still exists at: ${project.configPath}`));\n console.log(chalk.gray(' Run `stacksolo register` to re-register this project.\\n'));\n }\n });\n"],"mappings":"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","names":["Command","path","exec","promisify","execAsync","api","execAsync","exec","promisify","execAsync","exec","promisify","execAsync","join","crypto","existsSync","existsSync","registry","currentProject","api","registry","Command","chalk","ora","path","readFileSync","existsSync","existsSync","readFileSync","path","path","fs","path","generateTsConfig","generateGitignore","STACKSOLO_DIR","Command","ora","chalk","Command","chalk","ora","path","fs","homedir","exec","promisify","fs","path","exec","promisify","exec","promisify","toVariableName","defineResource","execAsync","promisify","exec","execAsync","promisify","exec","generated","packageJson","buildCommand","fs","path","homedir","STACKSOLO_DIR","execAsync","promisify","exec","STACKSOLO_DIR","resolve","CONFIG_FILENAME","homedir","getConfigPath","Command","chalk","inquirer","ora","registry","spinner","Command","chalk","ora","inquirer","fs","path","path","Command","chalk","inquirer","ora","sleep","resolve","Command","chalk","path","STACKSOLO_DIR","CONFIG_FILENAME","getConfigPath","chalk","Command","registry","Command","chalk","Command","registry","chalk","Command","chalk","fs","Command","chalk","Command","chalk","ora","fs","path","homedir","STACKSOLO_DIR","CONFIG_FILENAME","STATE_DIR","homedir","getConfigPath","Command","chalk","inquirer","spinner","ora","Command","chalk","fs","path","Command","chalk","formatStatus","chalk","formatDate","listProjects","registry","Command","Command","chalk","ora","path","fs","exec","promisify","execAsync","promisify","exec","STACKSOLO_DIR","CONFIG_FILENAME","getConfigPath","Command","chalk","ora","Command","chalk","ora","spawn","fs","path","sanitizeName","sanitizeName","fs","path","Command","chalk","ora","spawn","resolve","Command","chalk","ora","path","fs","exec","promisify","execAsync","promisify","exec","STACKSOLO_DIR","CONFIG_FILENAME","Command","chalk","ora","Command","chalk","spawn","path","Command","chalk","path","STACKSOLO_DIR","CONFIG_FILENAME","getConfigPath","loadConfig","chalk","Command","Command","chalk","ora","fs","path","Command","chalk","ora","Command","chalk","path","STACKSOLO_DIR","CONFIG_FILENAME","getConfigPath","Command","chalk","registry","Command","chalk","inquirer","Command","registry","chalk","inquirer","Command"]}