@stacksolo/cli 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +308 -48
- package/dist/index.js +11691 -4605
- package/dist/index.js.map +1 -1
- package/package.json +5 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +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"]}
|
|
1
|
+
{"version":3,"sources":["../src/services/plugin-loader.service.ts","../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/repositories/session.repository.ts","../../registry/src/repositories/event.repository.ts","../../registry/src/services/registry.service.ts","../../registry/src/services/reference.service.ts","../../registry/src/services/event-log.service.ts","../src/services/template.service.ts","../src/services/github.service.ts","../src/commands/project/scaffold.ts","../../blueprint/src/parser.ts","../../blueprint/src/naming.ts","../../blueprint/src/resolver.ts","../../blueprint/src/references.ts","../../blueprint/src/dependencies.ts","../../blueprint/src/merge/naming.ts","../../blueprint/src/merge/conflicts.ts","../../blueprint/src/merge/merger.ts","../../blueprint/src/merge/validation.ts","../../blueprint/src/index.ts","../src/scaffold/generators/index.ts","../src/scaffold/generators/env.ts","../src/scaffold/generators/resources/container.ts","../src/scaffold/generators/resources/function.ts","../src/scaffold/generators/resources/ui.ts","../src/scaffold/generators/resources/kernel.ts","../src/scaffold/generators/services.ts","../src/commands/project/clone.ts","../src/commands/infra/deploy.ts","../src/services/deploy.service.ts","../src/services/k8s-deploy.service.ts","../src/generators/k8s/yaml.ts","../src/logger.ts","../src/services/preflight.service.ts","../src/services/terraform-state.service.ts","../src/services/gcp-scanner.service.ts","../src/services/terraform-import.service.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/infra/events.ts","../src/commands/infra/inventory.ts","../src/commands/infra/doctor.ts","../src/commands/infra/merge.ts","../src/commands/dev/build.ts","../src/commands/dev/dev.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/kernel.ts","../src/generators/k8s/gcp-kernel.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 * Plugin Loader Service\n *\n * Dynamically loads plugins from config and registers them with the registry.\n * Supports:\n * - NPM packages (from node_modules)\n * - Monorepo detection (builds from source in development)\n * - Auto-installation of missing plugins\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { execSync } from 'child_process';\nimport type { Plugin, PluginService, OutputFormatter } from '@stacksolo/core';\nimport { registry } from '@stacksolo/core';\n\n/** Default plugins that are always loaded */\nconst DEFAULT_PLUGINS = ['@stacksolo/plugin-gcp-cdktf'];\n\n/** Loaded plugins cache */\nconst loadedPlugins = new Map<string, Plugin>();\n\n/**\n * Check if we're running inside the stacksolo monorepo\n */\nexport function isMonorepo(): boolean {\n // Check for monorepo indicators\n const cwd = process.cwd();\n\n // Look for pnpm-workspace.yaml or packages/cli directory\n const indicators = [\n path.join(cwd, 'pnpm-workspace.yaml'),\n path.join(cwd, 'packages', 'cli'),\n path.join(cwd, 'plugins', 'kernel'),\n ];\n\n return indicators.some((p) => fs.existsSync(p));\n}\n\n/**\n * Get the monorepo root directory\n */\nexport function getMonorepoRoot(): string | null {\n let dir = process.cwd();\n\n while (dir !== path.dirname(dir)) {\n if (fs.existsSync(path.join(dir, 'pnpm-workspace.yaml'))) {\n return dir;\n }\n dir = path.dirname(dir);\n }\n\n return null;\n}\n\n/**\n * Load a single plugin by name\n */\nexport async function loadPlugin(pluginName: string): Promise<Plugin> {\n // Check cache\n if (loadedPlugins.has(pluginName)) {\n return loadedPlugins.get(pluginName)!;\n }\n\n let plugin: Plugin;\n\n // Check if we're in monorepo and the plugin exists locally\n const monorepoRoot = getMonorepoRoot();\n if (monorepoRoot) {\n const localPluginPath = resolveLocalPlugin(monorepoRoot, pluginName);\n if (localPluginPath) {\n console.log(`Loading plugin ${pluginName} from monorepo: ${localPluginPath}`);\n plugin = await importPlugin(localPluginPath);\n loadedPlugins.set(pluginName, plugin);\n return plugin;\n }\n }\n\n // Try to load from node_modules\n try {\n plugin = await importPlugin(pluginName);\n loadedPlugins.set(pluginName, plugin);\n return plugin;\n } catch (error) {\n throw new Error(\n `Failed to load plugin ${pluginName}: ${error instanceof Error ? error.message : error}\\n` +\n `Make sure the plugin is installed: npm install ${pluginName}`\n );\n }\n}\n\n/**\n * Resolve local plugin path in monorepo\n */\nfunction resolveLocalPlugin(monorepoRoot: string, pluginName: string): string | null {\n // Map plugin names to local paths\n const pluginPaths: Record<string, string> = {\n '@stacksolo/plugin-gcp-cdktf': 'plugins/gcp-cdktf',\n '@stacksolo/plugin-kernel': 'plugins/kernel',\n '@stacksolo/plugin-gcp-kernel': 'plugins/gcp-kernel',\n '@stacksolo/plugin-zero-trust': 'plugins/zero-trust',\n '@stacksolo/plugin-zero-trust-auth': 'plugins/zero-trust-auth',\n '@stacksolo/plugin-helm': 'plugins/helm',\n };\n\n const relativePath = pluginPaths[pluginName];\n if (!relativePath) {\n return null;\n }\n\n const fullPath = path.join(monorepoRoot, relativePath);\n if (fs.existsSync(fullPath)) {\n // Return the dist/index.js path for the built plugin\n const distPath = path.join(fullPath, 'dist', 'index.js');\n if (fs.existsSync(distPath)) {\n return distPath;\n }\n // Fall back to src if dist doesn't exist (dev mode)\n return fullPath;\n }\n\n return null;\n}\n\n/**\n * Import a plugin module\n */\nasync function importPlugin(pathOrName: string): Promise<Plugin> {\n let modulePath = pathOrName;\n\n // If it's a package name (not a path), resolve from project's node_modules\n if (!pathOrName.startsWith('/') && !pathOrName.startsWith('.')) {\n const projectNodeModules = path.join(process.cwd(), 'node_modules', pathOrName);\n if (fs.existsSync(projectNodeModules)) {\n // ESM requires explicit path to entry file, read from package.json\n const pkgJsonPath = path.join(projectNodeModules, 'package.json');\n if (fs.existsSync(pkgJsonPath)) {\n const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));\n // Use exports['.'].import, main, or default to dist/index.js\n const entryPoint =\n pkgJson.exports?.['.']?.import ||\n pkgJson.main ||\n './dist/index.js';\n modulePath = path.join(projectNodeModules, entryPoint);\n }\n }\n }\n\n const module = await import(modulePath);\n // Support both default export and named 'plugin' export\n return module.default || module.plugin;\n}\n\n/**\n * Check if a plugin is installed in node_modules\n */\nfunction isPluginInstalled(pluginName: string): boolean {\n try {\n // Check in current working directory's node_modules\n const modulePath = path.join(process.cwd(), 'node_modules', pluginName);\n return fs.existsSync(modulePath);\n } catch {\n return false;\n }\n}\n\n/**\n * Install a plugin from npm\n */\nfunction installPlugin(pluginName: string): void {\n console.log(`Installing plugin ${pluginName}...`);\n\n const cwd = process.cwd();\n\n // Check if package.json exists, create minimal one if not\n const packageJsonPath = path.join(cwd, 'package.json');\n if (!fs.existsSync(packageJsonPath)) {\n const minimalPackageJson = {\n name: path.basename(cwd),\n version: '1.0.0',\n private: true,\n dependencies: {},\n };\n fs.writeFileSync(packageJsonPath, JSON.stringify(minimalPackageJson, null, 2));\n }\n\n // Install the plugin\n try {\n execSync(`npm install ${pluginName}`, {\n cwd,\n stdio: 'inherit',\n });\n console.log(`Successfully installed ${pluginName}`);\n } catch (error) {\n throw new Error(\n `Failed to install plugin ${pluginName}: ${error instanceof Error ? error.message : error}`\n );\n }\n}\n\n/**\n * Ensure a plugin is installed, installing it if necessary\n */\nasync function ensurePluginInstalled(pluginName: string): Promise<void> {\n // Skip if in monorepo (plugins loaded from source)\n if (getMonorepoRoot()) {\n return;\n }\n\n if (!isPluginInstalled(pluginName)) {\n installPlugin(pluginName);\n }\n}\n\n/**\n * Load all plugins from config\n */\nexport async function loadPlugins(configPlugins?: string[]): Promise<Plugin[]> {\n const pluginNames = new Set<string>([\n ...DEFAULT_PLUGINS,\n ...(configPlugins || []),\n ]);\n\n const plugins: Plugin[] = [];\n\n for (const pluginName of pluginNames) {\n try {\n // Auto-install plugin if not present (only for user projects, not monorepo)\n await ensurePluginInstalled(pluginName);\n\n const plugin = await loadPlugin(pluginName);\n plugins.push(plugin);\n\n // Register providers from the plugin\n if (plugin.providers) {\n for (const provider of plugin.providers) {\n try {\n registry.registerProvider(provider);\n } catch {\n // Already registered, skip\n }\n }\n }\n\n // Register standalone resources\n if (plugin.resources) {\n for (const resource of plugin.resources) {\n try {\n registry.registerResource(resource);\n } catch {\n // Already registered, skip\n }\n }\n }\n\n // Register output formatters\n if (plugin.outputFormatters) {\n for (const formatter of plugin.outputFormatters) {\n try {\n registry.registerFormatter(formatter);\n } catch {\n // Already registered, skip\n }\n }\n }\n } catch (error) {\n console.error(`Warning: Failed to load plugin ${pluginName}:`, error);\n }\n }\n\n return plugins;\n}\n\n/**\n * Get all services from loaded plugins\n */\nexport function getPluginServices(): PluginService[] {\n const services: PluginService[] = [];\n\n for (const plugin of loadedPlugins.values()) {\n if (plugin.services) {\n services.push(...plugin.services);\n }\n }\n\n return services;\n}\n\n/**\n * Get a specific service by name\n */\nexport function getPluginService(serviceName: string): PluginService | undefined {\n for (const plugin of loadedPlugins.values()) {\n const service = plugin.services?.find((s) => s.name === serviceName);\n if (service) {\n return service;\n }\n }\n return undefined;\n}\n\n/**\n * Get the source path for a plugin service (for local dev builds)\n */\nexport function getServiceSourcePath(service: PluginService): string | null {\n if (!service.sourcePath) {\n return null;\n }\n\n // Find which plugin owns this service\n for (const [pluginName, plugin] of loadedPlugins.entries()) {\n if (plugin.services?.includes(service)) {\n // First try monorepo path\n const monorepoRoot = getMonorepoRoot();\n if (monorepoRoot) {\n const localPath = resolveLocalPlugin(monorepoRoot, pluginName);\n if (localPath) {\n // localPath points to dist/index.js or the plugin dir\n const pluginDir = localPath.endsWith('.js')\n ? path.dirname(path.dirname(localPath))\n : localPath;\n return path.join(pluginDir, service.sourcePath);\n }\n }\n\n // Fall back to node_modules (handles file: references and symlinks)\n const nodeModulesPath = path.join(process.cwd(), 'node_modules', pluginName);\n if (fs.existsSync(nodeModulesPath)) {\n // Resolve symlinks to get the real path\n const realPath = fs.realpathSync(nodeModulesPath);\n const servicePath = path.join(realPath, service.sourcePath);\n if (fs.existsSync(servicePath)) {\n return servicePath;\n }\n }\n }\n }\n\n return null;\n}\n\n/**\n * Get all output formatters from loaded plugins\n */\nexport function getPluginFormatters(): OutputFormatter[] {\n const formatters: OutputFormatter[] = [];\n\n for (const plugin of loadedPlugins.values()) {\n if (plugin.outputFormatters) {\n formatters.push(...plugin.outputFormatters);\n }\n }\n\n return formatters;\n}\n\n/**\n * Get a specific output formatter by ID\n */\nexport function getPluginFormatter(formatterId: string): OutputFormatter | undefined {\n for (const plugin of loadedPlugins.values()) {\n const formatter = plugin.outputFormatters?.find((f) => f.id === formatterId);\n if (formatter) {\n return formatter;\n }\n }\n return undefined;\n}\n\n/**\n * Clear the plugin cache (useful for testing)\n */\nexport function clearPluginCache(): void {\n loadedPlugins.clear();\n}\n","/**\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 cloneCommand,\n // Infrastructure commands\n deployCommand,\n destroyCommand,\n statusCommand,\n outputCommand,\n logsCommand,\n resetCommand,\n infraCommand,\n listCommand,\n eventsCommand,\n inventoryCommand,\n doctorCommand,\n mergeCommand,\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);\nprogram.addCommand(cloneCommand);\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);\nprogram.addCommand(eventsCommand);\nprogram.addCommand(inventoryCommand);\nprogram.addCommand(doctorCommand);\nprogram.addCommand(mergeCommand);\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';\nimport {\n listTemplates,\n getTemplateMetadata,\n initFromTemplate,\n isRemoteTemplate,\n type TemplateInfo,\n type TemplateVariables,\n} from '../../services/template.service';\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\n/**\n * Handle remote template initialization\n */\nasync function handleRemoteTemplate(\n cwd: string,\n options: {\n template: string;\n name?: string;\n projectId?: string;\n region?: string;\n yes?: boolean;\n skipOrgPolicy?: boolean;\n skipApis?: boolean;\n }\n): Promise<void> {\n // Print banner\n console.log(chalk.cyan(BANNER));\n console.log(chalk.bold(` Initializing from template: ${options.template}\\n`));\n console.log(chalk.gray('─'.repeat(75)));\n\n // Fetch template metadata\n const spinner = ora('Fetching template info...').start();\n const metadata = await getTemplateMetadata(options.template);\n\n if (!metadata) {\n spinner.fail(`Template not found: ${options.template}`);\n console.log(chalk.yellow('\\n Run ') + chalk.white('stacksolo init --list-templates') + chalk.yellow(' to see available templates.\\n'));\n return;\n }\n\n spinner.succeed(`Found template: ${metadata.name}`);\n\n // =========================================\n // Step 1: Check gcloud CLI\n // =========================================\n console.log(chalk.gray('\\n─'.repeat(75)));\n console.log(chalk.cyan.bold('\\n Step 1: GCP Authentication\\n'));\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 2: Select GCP Project\n // =========================================\n console.log(chalk.gray('\\n─'.repeat(75)));\n console.log(chalk.cyan.bold('\\n Step 2: 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: 'Enter manually', value: '__manual__' },\n ],\n default: currentProject || projects[0]?.projectId,\n pageSize: 15,\n },\n ]);\n\n 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 console.log(chalk.gray(` Using project: ${chalk.white(projectId)}`));\n\n // =========================================\n // Step 3: Select Framework Variant\n // =========================================\n console.log(chalk.gray('\\n─'.repeat(75)));\n console.log(chalk.cyan.bold('\\n Step 3: Select Framework\\n'));\n\n let selectedVariant = metadata.variants[0];\n\n if (metadata.variants.length > 1 && !options.yes) {\n const { variant } = await inquirer.prompt([\n {\n type: 'list',\n name: 'variant',\n message: 'Which framework?',\n choices: metadata.variants.map((v) => ({\n name: `${v.name}\\n ${chalk.gray(v.description)}`,\n value: v.id,\n short: v.name,\n })),\n default: metadata.variants[0].id,\n },\n ]);\n\n selectedVariant = metadata.variants.find((v) => v.id === variant) || metadata.variants[0];\n }\n\n console.log(chalk.gray(` Using: ${chalk.white(selectedVariant.name)}`));\n\n // =========================================\n // Step 4: Project Details\n // =========================================\n console.log(chalk.gray('\\n─'.repeat(75)));\n console.log(chalk.cyan.bold('\\n Step 4: 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 5: Apply Template\n // =========================================\n console.log(chalk.gray('\\n─'.repeat(75)));\n console.log(chalk.cyan.bold('\\n Step 5: Creating project files...\\n'));\n\n const variables: TemplateVariables = {\n projectName,\n gcpProjectId: projectId,\n region,\n uiFramework: selectedVariant.id,\n };\n\n const applySpinner = ora('Downloading template...').start();\n\n try {\n const result = await initFromTemplate(\n cwd,\n options.template,\n selectedVariant.id,\n variables,\n (message) => {\n applySpinner.text = message;\n }\n );\n\n applySpinner.succeed('Template applied successfully');\n\n console.log(chalk.green('\\n Created files:'));\n console.log(chalk.green(' ✓ .stacksolo/stacksolo.config.json'));\n\n // Group files by directory for cleaner output\n const dirs = new Set<string>();\n for (const file of result.filesCreated) {\n const dir = path.dirname(file).split('/')[0];\n dirs.add(dir);\n }\n\n for (const dir of dirs) {\n const count = result.filesCreated.filter((f) => f.startsWith(dir)).length;\n console.log(chalk.green(` ✓ ${dir}/ (${count} files)`));\n }\n\n // Register project\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 const existing = await registry.findProjectByName(projectName);\n if (existing) {\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 {\n registrySpinner.warn('Could not register in global registry (non-blocking)');\n }\n\n // Done\n console.log(chalk.gray('\\n─'.repeat(75)));\n console.log(chalk.bold.green('\\n Done! Your Firebase app is ready.\\n'));\n\n console.log(chalk.gray(' Next steps:\\n'));\n console.log(chalk.white(' 1. cd into the project and install dependencies:'));\n console.log(chalk.cyan(' npm install'));\n console.log(chalk.white(' 2. Start local development:'));\n console.log(chalk.cyan(' stacksolo dev'));\n console.log(chalk.white(' 3. Deploy to GCP:'));\n console.log(chalk.cyan(' stacksolo deploy'));\n console.log('');\n } catch (error) {\n applySpinner.fail('Failed to apply template');\n const message = error instanceof Error ? error.message : String(error);\n console.log(chalk.red(`\\n ${message}\\n`));\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, firebase-app, etc.)')\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 .option('--list-templates', 'List available remote templates')\n .action(async (options) => {\n const cwd = process.cwd();\n\n // =========================================\n // Handle --list-templates\n // =========================================\n if (options.listTemplates) {\n const spinner = ora('Fetching available templates...').start();\n try {\n const templates = await listTemplates();\n spinner.stop();\n\n if (templates.length === 0) {\n console.log(chalk.yellow('\\n No remote templates available yet.\\n'));\n console.log(chalk.gray(' Use built-in templates: function-api, container-api, ui-api, ui-only\\n'));\n return;\n }\n\n console.log(chalk.bold('\\n Available Templates\\n'));\n console.log(chalk.gray('─'.repeat(75)));\n\n for (const template of templates) {\n console.log('');\n console.log(chalk.cyan(` ${template.name}`) + chalk.gray(` (${template.id})`));\n console.log(chalk.white(` ${template.description}`));\n console.log(chalk.gray(` Difficulty: ${template.difficulty} | Tags: ${template.tags.join(', ')}`));\n }\n\n console.log(chalk.gray('\\n─'.repeat(75)));\n console.log(chalk.gray('\\n Usage: ') + chalk.white('stacksolo init --template <template-id>\\n'));\n } catch (error) {\n spinner.fail('Failed to fetch templates');\n const message = error instanceof Error ? error.message : String(error);\n console.log(chalk.red(`\\n ${message}\\n`));\n }\n return;\n }\n\n // =========================================\n // Handle remote templates (firebase-app, etc.)\n // =========================================\n if (options.template && isRemoteTemplate(options.template)) {\n return await handleRemoteTemplate(cwd, options);\n }\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 // Create sessions table for event logging\n await db.schema\n .createTable('sessions')\n .ifNotExists()\n .addColumn('id', 'text', (col) => col.primaryKey())\n .addColumn('started_at', 'text', (col) => col.notNull())\n .addColumn('finished_at', 'text')\n .addColumn('command', 'text', (col) => col.notNull())\n .addColumn('args', 'text')\n .addColumn('config_hash', 'text')\n .addColumn('project_name', 'text')\n .addColumn('gcp_project_id', 'text')\n .addColumn('exit_code', 'integer')\n .execute();\n\n // Create events table for high resolution event stream\n await db.schema\n .createTable('events')\n .ifNotExists()\n .addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())\n .addColumn('session_id', 'text', (col) =>\n col.notNull().references('sessions.id').onDelete('cascade')\n )\n .addColumn('timestamp', 'text', (col) => col.notNull())\n .addColumn('seq', 'integer', (col) => col.notNull())\n .addColumn('project', 'text')\n .addColumn('category', 'text', (col) => col.notNull())\n .addColumn('event_type', 'text', (col) => col.notNull())\n .addColumn('resource_type', 'text')\n .addColumn('resource_name', 'text')\n .addColumn('terraform_address', 'text')\n .addColumn('data', 'text', (col) => col.notNull())\n .addColumn('parent_event_id', 'integer')\n .addColumn('correlation_id', 'text')\n .execute();\n\n // Create indexes for event queries\n await db.schema\n .createIndex('idx_events_session')\n .ifNotExists()\n .on('events')\n .columns(['session_id', 'seq'])\n .execute();\n\n await db.schema\n .createIndex('idx_events_timestamp')\n .ifNotExists()\n .on('events')\n .column('timestamp')\n .execute();\n\n await db.schema\n .createIndex('idx_events_resource')\n .ifNotExists()\n .on('events')\n .column('resource_name')\n .execute();\n\n await db.schema\n .createIndex('idx_events_correlation')\n .ifNotExists()\n .on('events')\n .column('correlation_id')\n .execute();\n\n await db.schema\n .createIndex('idx_events_type')\n .ifNotExists()\n .on('events')\n .columns(['category', 'event_type'])\n .execute();\n\n await db.schema\n .createIndex('idx_events_project')\n .ifNotExists()\n .on('events')\n .column('project')\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 * Session repository - CRUD operations for deploy sessions in the registry\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport { getDb } from '../db.js';\nimport type { Session, CreateSessionInput } from '../event-log.types.js';\n\n/**\n * Convert database row to Session\n */\nfunction toSession(row: {\n id: string;\n started_at: string;\n finished_at: string | null;\n command: string;\n args: string | null;\n config_hash: string | null;\n project_name: string | null;\n gcp_project_id: string | null;\n exit_code: number | null;\n}): Session {\n return {\n id: row.id,\n startedAt: new Date(row.started_at),\n finishedAt: row.finished_at ? new Date(row.finished_at) : null,\n command: row.command,\n args: row.args,\n configHash: row.config_hash,\n projectName: row.project_name,\n gcpProjectId: row.gcp_project_id,\n exitCode: row.exit_code,\n };\n}\n\nexport class SessionRepository {\n /**\n * Create a new session\n */\n async create(input: CreateSessionInput): Promise<Session> {\n const db = getDb();\n const now = new Date().toISOString();\n const id = uuidv4();\n\n const row = {\n id,\n started_at: now,\n finished_at: null,\n command: input.command,\n args: input.args ?? null,\n config_hash: input.configHash ?? null,\n project_name: input.projectName ?? null,\n gcp_project_id: input.gcpProjectId ?? null,\n exit_code: null,\n };\n\n await db.insertInto('sessions').values(row).execute();\n\n return toSession(row);\n }\n\n /**\n * Find a session by ID\n */\n async findById(id: string): Promise<Session | null> {\n const db = getDb();\n const row = await db\n .selectFrom('sessions')\n .selectAll()\n .where('id', '=', id)\n .executeTakeFirst();\n\n return row ? toSession(row) : null;\n }\n\n /**\n * Find session by ID prefix (first 8 chars)\n */\n async findByPrefix(prefix: string): Promise<Session | null> {\n const db = getDb();\n const rows = await db\n .selectFrom('sessions')\n .selectAll()\n .orderBy('started_at', 'desc')\n .limit(100)\n .execute();\n\n const match = rows.find((row) => row.id.startsWith(prefix));\n return match ? toSession(match) : null;\n }\n\n /**\n * Find the most recent session\n */\n async findLatest(): Promise<Session | null> {\n const db = getDb();\n const row = await db\n .selectFrom('sessions')\n .selectAll()\n .orderBy('started_at', 'desc')\n .limit(1)\n .executeTakeFirst();\n\n return row ? toSession(row) : null;\n }\n\n /**\n * Find all sessions with limit\n */\n async findAll(limit = 10): Promise<Session[]> {\n const db = getDb();\n const rows = await db\n .selectFrom('sessions')\n .selectAll()\n .orderBy('started_at', 'desc')\n .limit(limit)\n .execute();\n\n return rows.map(toSession);\n }\n\n /**\n * Find sessions by project name\n */\n async findByProjectName(projectName: string, limit = 10): Promise<Session[]> {\n const db = getDb();\n const rows = await db\n .selectFrom('sessions')\n .selectAll()\n .where('project_name', '=', projectName)\n .orderBy('started_at', 'desc')\n .limit(limit)\n .execute();\n\n return rows.map(toSession);\n }\n\n /**\n * End a session with exit code\n */\n async end(id: string, exitCode: number): Promise<void> {\n const db = getDb();\n const now = new Date().toISOString();\n\n await db\n .updateTable('sessions')\n .set({\n finished_at: now,\n exit_code: exitCode,\n })\n .where('id', '=', id)\n .execute();\n }\n\n /**\n * Update session project info\n */\n async updateProjectInfo(\n id: string,\n projectName: string,\n gcpProjectId: string\n ): Promise<void> {\n const db = getDb();\n\n await db\n .updateTable('sessions')\n .set({\n project_name: projectName,\n gcp_project_id: gcpProjectId,\n })\n .where('id', '=', id)\n .execute();\n }\n\n /**\n * Delete a session (cascades to events)\n */\n async delete(id: string): Promise<void> {\n const db = getDb();\n await db.deleteFrom('sessions').where('id', '=', id).execute();\n }\n\n /**\n * Delete old sessions (cleanup)\n */\n async deleteOlderThan(date: Date): Promise<number> {\n const db = getDb();\n const result = await db\n .deleteFrom('sessions')\n .where('started_at', '<', date.toISOString())\n .executeTakeFirst();\n\n return Number(result.numDeletedRows);\n }\n}\n","/**\n * Event repository - CRUD operations for deploy events in the registry\n */\n\nimport { getDb } from '../db.js';\nimport type {\n Event,\n CreateEventInput,\n EventCategory,\n EventType,\n EventFilters,\n} from '../event-log.types.js';\n\n/**\n * Convert database row to Event\n */\nfunction toEvent(row: {\n id: number;\n session_id: string;\n timestamp: string;\n seq: number;\n project: string | null;\n category: string;\n event_type: string;\n resource_type: string | null;\n resource_name: string | null;\n terraform_address: string | null;\n data: string;\n parent_event_id: number | null;\n correlation_id: string | null;\n}): Event {\n return {\n id: row.id,\n sessionId: row.session_id,\n timestamp: new Date(row.timestamp),\n seq: row.seq,\n project: row.project,\n category: row.category as EventCategory,\n eventType: row.event_type as EventType,\n resourceType: row.resource_type,\n resourceName: row.resource_name,\n terraformAddress: row.terraform_address,\n data: JSON.parse(row.data),\n parentEventId: row.parent_event_id,\n correlationId: row.correlation_id,\n };\n}\n\nexport class EventRepository {\n // Sequence counter per session (in-memory for performance)\n private seqCounters = new Map<string, number>();\n\n /**\n * Get the next sequence number for a session\n */\n private getNextSeq(sessionId: string): number {\n const current = this.seqCounters.get(sessionId) || 0;\n const next = current + 1;\n this.seqCounters.set(sessionId, next);\n return next;\n }\n\n /**\n * Reset sequence counter for a session\n */\n resetSeq(sessionId: string): void {\n this.seqCounters.delete(sessionId);\n }\n\n /**\n * Create a new event\n */\n async create(input: CreateEventInput): Promise<Event> {\n const db = getDb();\n const now = new Date().toISOString();\n const seq = this.getNextSeq(input.sessionId);\n\n const result = await db\n .insertInto('events')\n .values({\n session_id: input.sessionId,\n timestamp: now,\n seq,\n project: input.project || null,\n category: input.category,\n event_type: input.eventType,\n resource_type: input.resourceType || null,\n resource_name: input.resourceName || null,\n terraform_address: input.terraformAddress || null,\n data: JSON.stringify(input.data),\n parent_event_id: input.parentEventId || null,\n correlation_id: input.correlationId || null,\n })\n .returning(['id'])\n .executeTakeFirst();\n\n const id = result?.id ?? 0;\n\n return {\n id,\n sessionId: input.sessionId,\n timestamp: new Date(now),\n seq,\n project: input.project || null,\n category: input.category,\n eventType: input.eventType,\n resourceType: input.resourceType || null,\n resourceName: input.resourceName || null,\n terraformAddress: input.terraformAddress || null,\n data: input.data,\n parentEventId: input.parentEventId || null,\n correlationId: input.correlationId || null,\n };\n }\n\n /**\n * Find an event by ID\n */\n async findById(id: number): Promise<Event | null> {\n const db = getDb();\n const row = await db\n .selectFrom('events')\n .selectAll()\n .where('id', '=', id)\n .executeTakeFirst();\n\n return row ? toEvent(row) : null;\n }\n\n /**\n * Find events by session ID with optional filters\n */\n async findBySessionId(sessionId: string, filters?: EventFilters): Promise<Event[]> {\n const db = getDb();\n\n let query = db\n .selectFrom('events')\n .selectAll()\n .where('session_id', '=', sessionId)\n .orderBy('seq', 'asc');\n\n if (filters?.category) {\n query = query.where('category', '=', filters.category);\n }\n\n if (filters?.eventType) {\n query = query.where('event_type', '=', filters.eventType);\n }\n\n if (filters?.resourceName) {\n query = query.where('resource_name', '=', filters.resourceName);\n }\n\n if (filters?.correlationId) {\n query = query.where('correlation_id', '=', filters.correlationId);\n }\n\n if (filters?.since) {\n query = query.where('timestamp', '>=', filters.since.toISOString());\n }\n\n if (filters?.limit) {\n query = query.limit(filters.limit);\n }\n\n const rows = await query.execute();\n return rows.map(toEvent);\n }\n\n /**\n * Find events by resource name across all sessions\n */\n async findByResourceName(resourceName: string, limit = 100): Promise<Event[]> {\n const db = getDb();\n\n const rows = await db\n .selectFrom('events')\n .selectAll()\n .where('resource_name', '=', resourceName)\n .orderBy('timestamp', 'desc')\n .limit(limit)\n .execute();\n\n return rows.map(toEvent);\n }\n\n /**\n * Find events by project name\n */\n async findByProject(project: string, limit = 100): Promise<Event[]> {\n const db = getDb();\n\n const rows = await db\n .selectFrom('events')\n .selectAll()\n .where('project', '=', project)\n .orderBy('timestamp', 'desc')\n .limit(limit)\n .execute();\n\n return rows.map(toEvent);\n }\n\n /**\n * Find events by correlation ID\n */\n async findByCorrelationId(correlationId: string): Promise<Event[]> {\n const db = getDb();\n\n const rows = await db\n .selectFrom('events')\n .selectAll()\n .where('correlation_id', '=', correlationId)\n .orderBy('seq', 'asc')\n .execute();\n\n return rows.map(toEvent);\n }\n\n /**\n * Count events for a session\n */\n async countBySessionId(sessionId: string): Promise<number> {\n const db = getDb();\n\n const result = await db\n .selectFrom('events')\n .select(db.fn.count<number>('id').as('count'))\n .where('session_id', '=', sessionId)\n .executeTakeFirst();\n\n return result?.count ?? 0;\n }\n\n /**\n * Delete events for a session\n */\n async deleteBySessionId(sessionId: string): Promise<number> {\n const db = getDb();\n const result = await db\n .deleteFrom('events')\n .where('session_id', '=', sessionId)\n .executeTakeFirst();\n\n this.resetSeq(sessionId);\n return Number(result.numDeletedRows);\n }\n\n /**\n * Delete old events (cleanup)\n */\n async deleteOlderThan(date: Date): Promise<number> {\n const db = getDb();\n const result = await db\n .deleteFrom('events')\n .where('timestamp', '<', date.toISOString())\n .executeTakeFirst();\n\n return Number(result.numDeletedRows);\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 * Event Log Service\n *\n * High-resolution event logging for deploy operations.\n * Provides full observability of every operation during deployment.\n *\n * Uses SessionRepository and EventRepository for data access.\n */\n\nimport { SessionRepository } from '../repositories/session.repository.js';\nimport { EventRepository } from '../repositories/event.repository.js';\nimport type {\n Session,\n Event,\n CreateSessionInput,\n CreateEventInput,\n EventFilters,\n} from '../event-log.types.js';\n\n// Singleton repository instances\nconst sessionRepo = new SessionRepository();\nconst eventRepo = new EventRepository();\n\n// =============================================================================\n// Session Operations\n// =============================================================================\n\n/**\n * Start a new deploy session\n */\nexport async function startSession(input: CreateSessionInput): Promise<string> {\n const session = await sessionRepo.create(input);\n\n // Log session start event\n await logEvent({\n sessionId: session.id,\n category: 'internal',\n eventType: 'session_start',\n data: {\n command: input.command,\n args: input.args,\n projectName: input.projectName,\n gcpProjectId: input.gcpProjectId,\n },\n });\n\n return session.id;\n}\n\n/**\n * End a deploy session\n */\nexport async function endSession(sessionId: string, exitCode: number): Promise<void> {\n // Log session end event first\n await logEvent({\n sessionId,\n category: 'internal',\n eventType: 'session_end',\n data: { exitCode },\n });\n\n await sessionRepo.end(sessionId, exitCode);\n\n // Clean up sequence counter\n eventRepo.resetSeq(sessionId);\n}\n\n/**\n * Get a session by ID\n */\nexport async function getSession(sessionId: string): Promise<Session | null> {\n return sessionRepo.findById(sessionId);\n}\n\n/**\n * Get the most recent session\n */\nexport async function getLatestSession(): Promise<Session | null> {\n return sessionRepo.findLatest();\n}\n\n/**\n * List recent sessions\n */\nexport async function listSessions(limit = 10): Promise<Session[]> {\n return sessionRepo.findAll(limit);\n}\n\n// =============================================================================\n// Event Operations\n// =============================================================================\n\n/**\n * Log an event to the current session\n */\nexport async function logEvent(input: CreateEventInput): Promise<number> {\n const event = await eventRepo.create(input);\n return event.id;\n}\n\n/**\n * Get events for a session with optional filters\n */\nexport async function getSessionEvents(\n sessionId: string,\n filters?: EventFilters\n): Promise<Event[]> {\n return eventRepo.findBySessionId(sessionId, filters);\n}\n\n/**\n * Get events by resource name across all sessions\n */\nexport async function getEventsByResource(resourceName: string, limit = 100): Promise<Event[]> {\n return eventRepo.findByResourceName(resourceName, limit);\n}\n\n/**\n * Get event count for a session\n */\nexport async function getEventCount(sessionId: string): Promise<number> {\n return eventRepo.countBySessionId(sessionId);\n}\n\n// =============================================================================\n// Helper Functions for Common Event Types\n// =============================================================================\n\n/**\n * Log a phase start event\n */\nexport async function logPhaseStart(\n sessionId: string,\n phase: string,\n options?: { project?: string; correlationId?: string }\n): Promise<number> {\n return logEvent({\n sessionId,\n project: options?.project,\n category: 'internal',\n eventType: 'phase_start',\n data: { phase },\n correlationId: options?.correlationId,\n });\n}\n\n/**\n * Log a phase end event\n */\nexport async function logPhaseEnd(\n sessionId: string,\n phase: string,\n options?: { project?: string; correlationId?: string }\n): Promise<number> {\n return logEvent({\n sessionId,\n project: options?.project,\n category: 'internal',\n eventType: 'phase_end',\n data: { phase },\n correlationId: options?.correlationId,\n });\n}\n\n/**\n * Log a terraform event\n */\nexport async function logTerraformEvent(\n sessionId: string,\n eventType: 'init_start' | 'init_end' | 'plan_start' | 'plan_end' | 'apply_start' | 'apply_end',\n data: Record<string, unknown>,\n options?: { project?: string; correlationId?: string }\n): Promise<number> {\n return logEvent({\n sessionId,\n project: options?.project,\n category: 'terraform',\n eventType,\n data,\n correlationId: options?.correlationId,\n });\n}\n\n/**\n * Log a terraform resource event\n */\nexport async function logTerraformResourceEvent(\n sessionId: string,\n eventType:\n | 'resource_creating'\n | 'resource_created'\n | 'resource_updating'\n | 'resource_updated'\n | 'resource_destroying'\n | 'resource_destroyed'\n | 'resource_error',\n address: string,\n data: Record<string, unknown>,\n correlationId?: string\n): Promise<number> {\n // Parse address to extract type and name (e.g., google_storage_bucket.web)\n const [resourceType, resourceName] = address.split('.');\n\n return logEvent({\n sessionId,\n category: 'terraform',\n eventType,\n resourceType,\n resourceName,\n terraformAddress: address,\n data: { address, ...data },\n correlationId,\n });\n}\n\n/**\n * Log a file write event\n */\nexport async function logFileWrite(\n sessionId: string,\n path: string,\n size: number,\n hash?: string\n): Promise<number> {\n return logEvent({\n sessionId,\n category: 'file',\n eventType: 'write',\n data: { path, size, hash },\n });\n}\n\n/**\n * Log a gcloud command event\n */\nexport async function logGcloudCommand(\n sessionId: string,\n eventType: 'command_start' | 'command_end',\n data: Record<string, unknown>,\n correlationId?: string\n): Promise<number> {\n return logEvent({\n sessionId,\n category: 'gcloud',\n eventType,\n data,\n correlationId,\n });\n}\n\n/**\n * Log a conflict detection event\n */\nexport async function logConflictDetected(\n sessionId: string,\n resources: Array<{ type: string; name: string; address?: string }>\n): Promise<number> {\n return logEvent({\n sessionId,\n category: 'internal',\n eventType: 'conflict_detected',\n data: { resources, count: resources.length },\n });\n}\n\n/**\n * Log a user prompt/response event\n */\nexport async function logUserPrompt(\n sessionId: string,\n question: string,\n choices?: string[]\n): Promise<number> {\n return logEvent({\n sessionId,\n category: 'internal',\n eventType: 'user_prompt',\n data: { question, choices },\n });\n}\n\nexport async function logUserResponse(sessionId: string, choice: string): Promise<number> {\n return logEvent({\n sessionId,\n category: 'internal',\n eventType: 'user_response',\n data: { choice },\n });\n}\n\n// =============================================================================\n// Repository Access (for advanced usage)\n// =============================================================================\n\n/**\n * Get the session repository instance\n */\nexport function getSessionRepository(): SessionRepository {\n return sessionRepo;\n}\n\n/**\n * Get the event repository instance\n */\nexport function getEventRepository(): EventRepository {\n return eventRepo;\n}\n\n// =============================================================================\n// Singleton Service\n// =============================================================================\n\nexport const EventLogService = {\n // Session operations\n startSession,\n endSession,\n getSession,\n getLatestSession,\n listSessions,\n\n // Event operations\n logEvent,\n getSessionEvents,\n getEventsByResource,\n getEventCount,\n\n // Helper functions\n logPhaseStart,\n logPhaseEnd,\n logTerraformEvent,\n logTerraformResourceEvent,\n logFileWrite,\n logGcloudCommand,\n logConflictDetected,\n logUserPrompt,\n logUserResponse,\n\n // Repository access\n getSessionRepository,\n getEventRepository,\n};\n","/**\n * Remote Template Service\n *\n * Fetches and applies templates from the stacksolo-architectures repository.\n * Templates are full project scaffolds with source code (React/Vue apps with auth, etc.)\n *\n * Uses the unified GitHub service for all remote operations.\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport {\n fetchRaw,\n fetchJson,\n downloadDirectory,\n substituteVariables,\n substituteVariablesInDirectory,\n parseRepo,\n type RepoConfig,\n} from './github.service';\n\n// GitHub repository configuration\nconst REPO = parseRepo('monkeybarrels/stacksolo-architectures', 'main');\n\n/**\n * Template manifest structure (templates.json)\n */\nexport interface TemplateManifest {\n version: string;\n templates: TemplateInfo[];\n}\n\nexport interface TemplateInfo {\n id: string;\n name: string;\n description: string;\n tags: string[];\n difficulty: 'beginner' | 'intermediate' | 'advanced';\n path: string;\n variants?: string[];\n}\n\n/**\n * Template metadata (template.json in each template folder)\n */\nexport interface TemplateMetadata {\n id: string;\n name: string;\n description: string;\n variables: TemplateVariable[];\n variants: TemplateVariant[];\n dependencies?: string[];\n}\n\nexport interface TemplateVariable {\n name: string;\n description: string;\n type: 'string' | 'boolean' | 'select';\n default?: string;\n required?: boolean;\n options?: string[];\n}\n\nexport interface TemplateVariant {\n id: string;\n name: string;\n description: string;\n filesDir: string;\n}\n\n/**\n * List all available templates\n */\nexport async function listTemplates(): Promise<TemplateInfo[]> {\n try {\n const manifest = await fetchJson<TemplateManifest>('templates.json', REPO);\n return manifest.templates;\n } catch (error) {\n // If templates.json doesn't exist yet, return empty array\n if (error instanceof Error && error.message.includes('404')) {\n return [];\n }\n throw error;\n }\n}\n\n/**\n * Get template metadata\n */\nexport async function getTemplateMetadata(templateId: string): Promise<TemplateMetadata | null> {\n const templates = await listTemplates();\n const template = templates.find((t) => t.id === templateId);\n\n if (!template) {\n return null;\n }\n\n try {\n return await fetchJson<TemplateMetadata>(`${template.path}/template.json`, REPO);\n } catch {\n return null;\n }\n}\n\n/**\n * Fetch template config.json (stacksolo.config.json template)\n */\nexport async function getTemplateConfig(templateId: string): Promise<Record<string, unknown> | null> {\n const templates = await listTemplates();\n const template = templates.find((t) => t.id === templateId);\n\n if (!template) {\n return null;\n }\n\n try {\n return await fetchJson<Record<string, unknown>>(`${template.path}/config.json`, REPO);\n } catch {\n return null;\n }\n}\n\n/**\n * Variable substitution options\n */\nexport interface TemplateVariables {\n projectName: string;\n gcpProjectId: string;\n region: string;\n [key: string]: string | boolean;\n}\n\n/**\n * Apply template config to target directory\n */\nexport async function applyTemplateConfig(\n targetDir: string,\n templateId: string,\n variables: TemplateVariables\n): Promise<void> {\n const config = await getTemplateConfig(templateId);\n\n if (!config) {\n throw new Error(`Template config not found: ${templateId}`);\n }\n\n // Substitute variables in the config\n const configStr = JSON.stringify(config, null, 2);\n const processedConfig = substituteVariables(configStr, variables);\n\n // Write to .stacksolo/stacksolo.config.json\n const stacksoloDir = path.join(targetDir, '.stacksolo');\n await fs.mkdir(stacksoloDir, { recursive: true });\n\n const configPath = path.join(stacksoloDir, 'stacksolo.config.json');\n await fs.writeFile(configPath, processedConfig, 'utf-8');\n}\n\n/**\n * Check if a template ID refers to a remote template\n * (as opposed to a built-in project type)\n */\nexport function isRemoteTemplate(templateId: string): boolean {\n const builtInTypes = [\n 'function-api',\n 'container-api',\n 'ui-api',\n 'ui-only',\n 'function-cron',\n 'static-api',\n ];\n\n return !builtInTypes.includes(templateId);\n}\n\n/**\n * Full template application workflow\n * Uses tarball download for efficiency\n */\nexport async function initFromTemplate(\n targetDir: string,\n templateId: string,\n variantId: string,\n variables: TemplateVariables,\n onProgress?: (message: string) => void\n): Promise<{ configCreated: boolean; filesCreated: string[] }> {\n const log = onProgress || (() => {});\n\n log(`Fetching template: ${templateId}...`);\n\n // Get template info\n const templates = await listTemplates();\n const template = templates.find((t) => t.id === templateId);\n\n if (!template) {\n throw new Error(`Template not found: ${templateId}`);\n }\n\n const metadata = await getTemplateMetadata(templateId);\n if (!metadata) {\n throw new Error(`Template metadata not found: ${templateId}`);\n }\n\n const variant = metadata.variants.find((v) => v.id === variantId);\n if (!variant) {\n throw new Error(`Variant not found: ${variantId}`);\n }\n\n // Download the variant files directory using tarball\n const filesPath = `${template.path}/${variant.filesDir}`;\n log('Downloading template files...');\n\n await downloadDirectory(filesPath, targetDir, REPO, {\n onProgress: log,\n });\n\n // Apply variable substitutions to all downloaded files\n log('Applying variable substitutions...');\n await substituteVariablesInDirectory(targetDir, variables);\n\n // Apply template config\n log('Creating configuration...');\n await applyTemplateConfig(targetDir, templateId, variables);\n\n // Get list of created files\n const createdFiles = await listFilesRecursive(targetDir);\n\n return {\n configCreated: true,\n filesCreated: createdFiles,\n };\n}\n\n/**\n * List all files in a directory recursively\n */\nasync function listFilesRecursive(dir: string, basePath: string = ''): Promise<string[]> {\n const files: string[] = [];\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const relativePath = basePath ? `${basePath}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n const subFiles = await listFilesRecursive(path.join(dir, entry.name), relativePath);\n files.push(...subFiles);\n } else {\n files.push(relativePath);\n }\n }\n\n return files;\n}\n\n// Re-export for convenience\nexport { substituteVariables } from './github.service';\n","/**\n * Unified GitHub Service\n *\n * A single, consistent approach for fetching content from GitHub repositories.\n * Used by templates, stacks, and architectures.\n *\n * Strategy:\n * - For indexes/metadata: Raw file fetch (fast, no API rate limits)\n * - For full directories: Tarball download + selective extraction (single HTTP request)\n * - Unified caching with configurable TTL\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { spawn } from 'child_process';\nimport * as os from 'os';\n\n// Default repository configuration\nconst DEFAULT_REPO = 'monkeybarrels/stacksolo-architectures';\nconst DEFAULT_BRANCH = 'main';\n\n// Cache configuration\nconst cache = new Map<string, { data: unknown; timestamp: number }>();\nconst CACHE_TTL = 15 * 60 * 1000; // 15 minutes\n\n/**\n * Repository configuration\n */\nexport interface RepoConfig {\n owner: string;\n repo: string;\n branch: string;\n}\n\n/**\n * Parse a repo string into owner/repo/branch\n */\nexport function parseRepo(repoStr: string = DEFAULT_REPO, branch: string = DEFAULT_BRANCH): RepoConfig {\n const parts = repoStr.split('/');\n return {\n owner: parts[0],\n repo: parts[1],\n branch,\n };\n}\n\n/**\n * Get raw GitHub URL for a file\n */\nfunction getRawUrl(repo: RepoConfig, filePath: string): string {\n return `https://raw.githubusercontent.com/${repo.owner}/${repo.repo}/${repo.branch}/${filePath}`;\n}\n\n/**\n * Get tarball URL for a repository\n */\nfunction getTarballUrl(repo: RepoConfig): string {\n return `https://github.com/${repo.owner}/${repo.repo}/archive/refs/heads/${repo.branch}.tar.gz`;\n}\n\n/**\n * Fetch raw content from GitHub (for single files)\n */\nexport async function fetchRaw(\n filePath: string,\n repo: RepoConfig = parseRepo()\n): Promise<string> {\n const url = getRawUrl(repo, filePath);\n const cacheKey = `raw:${url}`;\n\n const cached = cache.get(cacheKey);\n if (cached && Date.now() - cached.timestamp < CACHE_TTL) {\n return cached.data as string;\n }\n\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch ${filePath}: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.text();\n cache.set(cacheKey, { data, timestamp: Date.now() });\n return data;\n}\n\n/**\n * Fetch JSON from GitHub\n */\nexport async function fetchJson<T>(\n filePath: string,\n repo: RepoConfig = parseRepo()\n): Promise<T> {\n const content = await fetchRaw(filePath, repo);\n return JSON.parse(content) as T;\n}\n\n/**\n * Check if a file exists in the repository\n */\nexport async function fileExists(\n filePath: string,\n repo: RepoConfig = parseRepo()\n): Promise<boolean> {\n try {\n const url = getRawUrl(repo, filePath);\n const response = await fetch(url, { method: 'HEAD' });\n return response.ok;\n } catch {\n return false;\n }\n}\n\n/**\n * Exclude patterns for directory downloads\n */\nconst DEFAULT_EXCLUDE_PATTERNS = ['node_modules', '.git', 'dist', '.DS_Store', '__pycache__', '.pyc'];\n\n/**\n * Download and extract a directory from the repository\n * Uses tarball download for efficiency (single HTTP request)\n */\nexport async function downloadDirectory(\n dirPath: string,\n outputDir: string,\n repo: RepoConfig = parseRepo(),\n options: {\n excludePatterns?: string[];\n onProgress?: (message: string) => void;\n } = {}\n): Promise<boolean> {\n const { excludePatterns = DEFAULT_EXCLUDE_PATTERNS, onProgress } = options;\n const log = onProgress || (() => {});\n\n const tempDir = path.join(os.tmpdir(), `stacksolo-${Date.now()}`);\n const tarballUrl = getTarballUrl(repo);\n\n try {\n // Create temp directory\n await fs.mkdir(tempDir, { recursive: true });\n\n // Download tarball\n log('Downloading...');\n const tarballPath = path.join(tempDir, 'repo.tar.gz');\n const response = await fetch(tarballUrl);\n\n if (!response.ok) {\n throw new Error(`Failed to download tarball: ${response.status}`);\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n await fs.writeFile(tarballPath, buffer);\n\n // Extract tarball\n log('Extracting...');\n await runCommand('tar', ['-xzf', tarballPath, '-C', tempDir], tempDir);\n\n // Find the extracted directory (named {repo}-{branch})\n const extractedRoot = path.join(tempDir, `${repo.repo}-${repo.branch}`);\n const sourceDir = path.join(extractedRoot, dirPath);\n\n // Check if the directory exists\n try {\n await fs.access(sourceDir);\n } catch {\n throw new Error(`Directory \"${dirPath}\" not found in repository`);\n }\n\n // Copy files to output directory\n log('Copying files...');\n await copyDirectory(sourceDir, outputDir, excludePatterns);\n\n // Clean up\n await fs.rm(tempDir, { recursive: true, force: true });\n\n return true;\n } catch (error) {\n // Clean up on error\n await fs.rm(tempDir, { recursive: true, force: true }).catch(() => {});\n throw error;\n }\n}\n\n/**\n * Download multiple directories from the repository (more efficient than multiple calls)\n */\nexport async function downloadDirectories(\n dirPaths: string[],\n outputDirs: string[],\n repo: RepoConfig = parseRepo(),\n options: {\n excludePatterns?: string[];\n onProgress?: (message: string) => void;\n } = {}\n): Promise<Map<string, boolean>> {\n if (dirPaths.length !== outputDirs.length) {\n throw new Error('dirPaths and outputDirs must have the same length');\n }\n\n const { excludePatterns = DEFAULT_EXCLUDE_PATTERNS, onProgress } = options;\n const log = onProgress || (() => {});\n const results = new Map<string, boolean>();\n\n const tempDir = path.join(os.tmpdir(), `stacksolo-${Date.now()}`);\n const tarballUrl = getTarballUrl(repo);\n\n try {\n await fs.mkdir(tempDir, { recursive: true });\n\n // Download tarball once\n log('Downloading repository...');\n const tarballPath = path.join(tempDir, 'repo.tar.gz');\n const response = await fetch(tarballUrl);\n\n if (!response.ok) {\n throw new Error(`Failed to download tarball: ${response.status}`);\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n await fs.writeFile(tarballPath, buffer);\n\n // Extract once\n log('Extracting...');\n await runCommand('tar', ['-xzf', tarballPath, '-C', tempDir], tempDir);\n\n const extractedRoot = path.join(tempDir, `${repo.repo}-${repo.branch}`);\n\n // Copy each directory\n for (let i = 0; i < dirPaths.length; i++) {\n const dirPath = dirPaths[i];\n const outputDir = outputDirs[i];\n const sourceDir = path.join(extractedRoot, dirPath);\n\n try {\n await fs.access(sourceDir);\n log(`Copying ${dirPath}...`);\n await copyDirectory(sourceDir, outputDir, excludePatterns);\n results.set(dirPath, true);\n } catch {\n results.set(dirPath, false);\n }\n }\n\n // Clean up\n await fs.rm(tempDir, { recursive: true, force: true });\n\n return results;\n } catch (error) {\n await fs.rm(tempDir, { recursive: true, force: true }).catch(() => {});\n throw error;\n }\n}\n\n/**\n * Run a shell command\n */\nfunction runCommand(cmd: string, args: string[], cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const proc = spawn(cmd, args, { cwd, stdio: 'pipe' });\n let stderr = '';\n proc.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n proc.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`${cmd} failed: ${stderr}`));\n });\n proc.on('error', reject);\n });\n}\n\n/**\n * Copy directory recursively, excluding specified patterns\n */\nasync function copyDirectory(\n srcDir: string,\n destDir: string,\n excludePatterns: string[]\n): Promise<void> {\n await fs.mkdir(destDir, { recursive: true });\n const entries = await fs.readdir(srcDir, { withFileTypes: true });\n\n for (const entry of entries) {\n // Skip excluded patterns\n if (excludePatterns.some((p) => entry.name === p || entry.name.startsWith(p + '/'))) {\n continue;\n }\n\n const srcPath = path.join(srcDir, entry.name);\n const destPath = path.join(destDir, entry.name);\n\n if (entry.isDirectory()) {\n await copyDirectory(srcPath, destPath, excludePatterns);\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n}\n\n/**\n * Variable substitution in content\n * Pattern: {{variableName}}\n */\nexport function substituteVariables(\n content: string,\n variables: Record<string, string | boolean | number>\n): string {\n let result = content;\n\n for (const [key, value] of Object.entries(variables)) {\n const pattern = new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g');\n result = result.replace(pattern, String(value));\n }\n\n return result;\n}\n\n/**\n * Apply variable substitution to all files in a directory\n */\nexport async function substituteVariablesInDirectory(\n dirPath: string,\n variables: Record<string, string | boolean | number>,\n fileExtensions: string[] = ['.json', '.ts', '.js', '.md', '.yaml', '.yml', '.html', '.css']\n): Promise<void> {\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n await substituteVariablesInDirectory(fullPath, variables, fileExtensions);\n } else if (fileExtensions.some((ext) => entry.name.endsWith(ext))) {\n const content = await fs.readFile(fullPath, 'utf-8');\n const substituted = substituteVariables(content, variables);\n if (content !== substituted) {\n await fs.writeFile(fullPath, substituted, 'utf-8');\n }\n }\n }\n}\n\n/**\n * Clear the cache (useful for testing)\n */\nexport function clearCache(): void {\n cache.clear();\n}\n\n// ============================================================================\n// Index Types - Unified structure for templates, stacks, and architectures\n// ============================================================================\n\n/**\n * Base metadata for all repository content types\n */\nexport interface ContentMetadata {\n id: string;\n name: string;\n description: string;\n tags: string[];\n difficulty: 'beginner' | 'intermediate' | 'advanced';\n path: string;\n}\n\n/**\n * Template metadata (full source code scaffolds)\n */\nexport interface TemplateMetadata extends ContentMetadata {\n variants?: string[];\n framework?: string;\n}\n\n/**\n * Stack metadata (complete deployable applications)\n */\nexport interface StackMetadata extends ContentMetadata {\n version: string;\n variables: Record<\n string,\n {\n description: string;\n required?: boolean;\n default?: string;\n }\n >;\n}\n\n/**\n * Architecture metadata (config-only patterns)\n */\nexport interface ArchitectureMetadata extends ContentMetadata {\n community?: boolean;\n}\n\n/**\n * Index file structure\n */\nexport interface ContentIndex<T extends ContentMetadata> {\n version: string;\n lastUpdated?: string;\n items: T[];\n}\n\n/**\n * Fetch an index file\n */\nexport async function fetchIndex<T extends ContentMetadata>(\n indexPath: string,\n repo: RepoConfig = parseRepo()\n): Promise<ContentIndex<T>> {\n return fetchJson<ContentIndex<T>>(indexPath, repo);\n}\n\n/**\n * List items from an index with optional filtering\n */\nexport async function listFromIndex<T extends ContentMetadata>(\n indexPath: string,\n filters?: {\n tag?: string;\n difficulty?: 'beginner' | 'intermediate' | 'advanced';\n },\n repo: RepoConfig = parseRepo()\n): Promise<T[]> {\n const index = await fetchIndex<T>(indexPath, repo);\n let items = index.items;\n\n if (filters?.tag) {\n items = items.filter((item) =>\n item.tags.some((t) => t.toLowerCase().includes(filters.tag!.toLowerCase()))\n );\n }\n\n if (filters?.difficulty) {\n items = items.filter((item) => item.difficulty === filters.difficulty);\n }\n\n return items;\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 * Centralized naming utilities for infrastructure resources.\n *\n * All resource naming should go through these functions to ensure\n * consistency across the resolver, plugins, and deploy service.\n */\n\nexport interface NamingContext {\n projectName: string;\n networkName?: string;\n}\n\n/**\n * Get the load balancer name.\n * Pattern: ${projectName}-lb\n */\nexport function getLoadBalancerName(ctx: NamingContext): string {\n return `${ctx.projectName}-lb`;\n}\n\n/**\n * Get a backend service name for a Cloud Run container or Cloud Function.\n * Pattern: ${lbName}-${projectName}-${backendName}-backend\n */\nexport function getBackendServiceName(ctx: NamingContext, backendName: string): string {\n const lbName = getLoadBalancerName(ctx);\n return `${lbName}-${ctx.projectName}-${backendName}-backend`;\n}\n\n/**\n * Get a serverless NEG name.\n * Pattern: ${serviceName}-neg\n */\nexport function getNegName(serviceName: string): string {\n return `${serviceName}-neg`;\n}\n\n/**\n * Get a Cloud Run service name.\n * Pattern: ${projectName}-${containerName}\n */\nexport function getCloudRunServiceName(ctx: NamingContext, containerName: string): string {\n return `${ctx.projectName}-${containerName}`;\n}\n\n/**\n * Get a Cloud Function name.\n * Pattern: ${projectName}-${functionName}\n */\nexport function getCloudFunctionName(ctx: NamingContext, functionName: string): string {\n return `${ctx.projectName}-${functionName}`;\n}\n\n/**\n * Get a VPC network name.\n * Pattern: ${projectName}-${networkName}\n */\nexport function getVpcNetworkName(ctx: NamingContext): string {\n return `${ctx.projectName}-${ctx.networkName || 'main'}`;\n}\n\n/**\n * Get a VPC connector name.\n * Pattern: ${projectName}-connector\n */\nexport function getVpcConnectorName(ctx: NamingContext): string {\n return `${ctx.projectName}-connector`;\n}\n\n/**\n * Get an artifact registry name.\n * Pattern: ${projectName}-registry\n */\nexport function getArtifactRegistryName(ctx: NamingContext): string {\n return `${ctx.projectName}-registry`;\n}\n\n/**\n * Get a storage bucket name for website/UI.\n * Pattern: ${gcpProjectId}-${projectName}-${uiName}\n */\nexport function getWebsiteBucketName(gcpProjectId: string, ctx: NamingContext, uiName: string): string {\n return `${gcpProjectId}-${ctx.projectName}-${uiName}`;\n}\n\n/**\n * Get a backend bucket name for static content.\n * Pattern: ${projectName}-${uiName}-backend\n */\nexport function getBackendBucketName(ctx: NamingContext, uiName: string): string {\n return `${ctx.projectName}-${uiName}-backend`;\n}\n\n/**\n * Get SSL certificate name.\n * Pattern: ${lbName}-ssl-cert\n */\nexport function getSslCertificateName(ctx: NamingContext): string {\n const lbName = getLoadBalancerName(ctx);\n return `${lbName}-ssl-cert`;\n}\n\n/**\n * Get static IP address name.\n * Pattern: ${lbName}-ip\n */\nexport function getStaticIpName(ctx: NamingContext): string {\n const lbName = getLoadBalancerName(ctx);\n return `${lbName}-ip`;\n}\n\n/**\n * Get HTTP proxy name.\n * Pattern: ${lbName}-http-proxy\n */\nexport function getHttpProxyName(ctx: NamingContext): string {\n const lbName = getLoadBalancerName(ctx);\n return `${lbName}-http-proxy`;\n}\n\n/**\n * Get HTTPS proxy name.\n * Pattern: ${lbName}-https-proxy\n */\nexport function getHttpsProxyName(ctx: NamingContext): string {\n const lbName = getLoadBalancerName(ctx);\n return `${lbName}-https-proxy`;\n}\n\n/**\n * Get URL map name.\n * Pattern: ${lbName}\n */\nexport function getUrlMapName(ctx: NamingContext): string {\n return getLoadBalancerName(ctx);\n}\n\n/**\n * Get HTTP forwarding rule name.\n * Pattern: ${lbName}-http-rule\n */\nexport function getHttpForwardingRuleName(ctx: NamingContext): string {\n const lbName = getLoadBalancerName(ctx);\n return `${lbName}-http-rule`;\n}\n\n/**\n * Get HTTPS forwarding rule name.\n * Pattern: ${lbName}-https-rule\n */\nexport function getHttpsForwardingRuleName(ctx: NamingContext): string {\n const lbName = getLoadBalancerName(ctx);\n return `${lbName}-https-rule`;\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 KubernetesConfig,\n} from './schema.js';\n\nimport {\n getLoadBalancerName,\n getBackendServiceName,\n type NamingContext,\n} from './naming.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 // Route to backend-specific resolvers\n if (project.backend === 'kubernetes') {\n return resolveKubernetesConfig(config, projectInfo);\n }\n\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 containers = network.containers || [];\n const uis = network.uis || [];\n const hasKernelConfig = !!project.kernel;\n const hasGcpKernelConfig = !!project.gcpKernel;\n\n if (functions.length === 0 && containers.length === 0 && uis.length === 0 && !hasKernelConfig && !hasGcpKernelConfig) {\n throw new Error('CDKTF backend requires at least one function, container, kernel, gcpKernel, or UI');\n }\n\n // Can't use both kernel types\n if (hasKernelConfig && hasGcpKernelConfig) {\n throw new Error('Cannot use both `kernel` and `gcpKernel`. Choose one: NATS-based (kernel) or GCP-native (gcpKernel).');\n }\n\n // Check for unsupported resources\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 // Validate IAP requires HTTPS (domain + enableHttps)\n if (project.zeroTrust?.iapWebBackends?.length) {\n const lbConfig = network.loadBalancer;\n if (!lbConfig?.domain || !lbConfig?.enableHttps) {\n throw new Error(\n 'IAP (Identity-Aware Proxy) requires HTTPS. Please configure loadBalancer with:\\n' +\n ' - domain: your domain (e.g., \"app.example.com\")\\n' +\n ' - enableHttps: true\\n' +\n ' - redirectHttpToHttps: true (recommended)\\n\\n' +\n 'Example:\\n' +\n ' loadBalancer:\\n' +\n ' name: my-lb\\n' +\n ' domain: app.example.com\\n' +\n ' enableHttps: true\\n' +\n ' redirectHttpToHttps: true\\n' +\n ' routes: [...]\\n\\n' +\n 'Note: DNS for the domain must point to the load balancer IP after deployment.'\n );\n }\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 // Use centralized naming for load balancer\n const namingCtx: NamingContext = { projectName: projectInfo.name, networkName: network.name };\n const lbName = getLoadBalancerName(namingCtx);\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. Artifact Registry (if containers or NATS kernel exist - GCP kernel doesn't need registry)\n const registryName = `${projectInfo.name}-registry`;\n const registryId = `registry-${network.name}`;\n const hasKernel = !!project.kernel;\n const hasGcpKernel = !!project.gcpKernel;\n\n if (containers.length > 0 || hasKernel) {\n resources.push({\n id: registryId,\n type: 'gcp-cdktf:artifact_registry',\n name: registryName,\n config: {\n name: registryName,\n location: projectInfo.region,\n format: 'DOCKER',\n description: `Container registry for ${projectInfo.name}`,\n projectId: projectInfo.gcpProjectId,\n },\n dependsOn: [],\n network: network.name,\n });\n }\n\n // 4. Kernel (special container at project level)\n const kernelIds: string[] = [];\n const kernelNames: string[] = [];\n let kernelBucketName: string | undefined;\n let kernelBucketId: string | undefined;\n\n if (project.kernel) {\n const kernelName = `${projectInfo.name}-${project.kernel.name}`;\n const kernelId = `kernel-${project.kernel.name}`;\n kernelIds.push(kernelId);\n kernelNames.push(kernelName);\n\n // Auto-create a bucket for kernel file operations if not specified\n kernelBucketName = project.kernel.gcsBucket || `${projectInfo.gcpProjectId}-${projectInfo.name}-kernel-files`;\n kernelBucketId = `bucket-kernel-files`;\n\n // Only create the bucket if not explicitly specified (user may have existing bucket)\n if (!project.kernel.gcsBucket) {\n resources.push({\n id: kernelBucketId,\n type: 'gcp-cdktf:storage_bucket',\n name: kernelBucketName,\n config: {\n name: kernelBucketName,\n location: projectInfo.region,\n storageClass: 'STANDARD',\n uniformBucketLevelAccess: true,\n versioning: false,\n cors: [{\n origin: ['*'],\n method: ['GET', 'PUT', 'POST', 'DELETE', 'OPTIONS'],\n responseHeader: ['Content-Type', 'Authorization'],\n maxAgeSeconds: 3600,\n }],\n projectId: projectInfo.gcpProjectId,\n },\n dependsOn: [],\n network: network.name,\n });\n }\n\n // Build image URL from Artifact Registry\n const imageUrl = `${projectInfo.region}-docker.pkg.dev/${projectInfo.gcpProjectId}/${registryName}/${project.kernel.name}:latest`;\n\n // Kernel environment variables\n const kernelEnv: Record<string, string> = {\n FIREBASE_PROJECT_ID: project.kernel.firebaseProjectId || projectInfo.gcpProjectId,\n GCS_BUCKET: kernelBucketName,\n GCP_PROJECT_ID: projectInfo.gcpProjectId,\n STACKSOLO_PROJECT_NAME: projectInfo.name,\n ...project.kernel.env,\n };\n\n resources.push({\n id: kernelId,\n type: 'gcp-cdktf:cloud_run',\n name: kernelName,\n config: {\n name: kernelName,\n location: projectInfo.region,\n image: imageUrl,\n port: 8090, // Kernel default port\n memory: project.kernel.memory || '512Mi',\n cpu: project.kernel.cpu || '1',\n minInstances: project.kernel.minInstances ?? 0,\n maxInstances: project.kernel.maxInstances ?? 100,\n concurrency: 80,\n timeout: '300s',\n vpcConnector: connectorName,\n allowUnauthenticated: true,\n environmentVariables: kernelEnv,\n projectId: projectInfo.gcpProjectId,\n projectName: projectInfo.name,\n },\n dependsOn: project.kernel.gcsBucket\n ? [connectorId, registryId]\n : [connectorId, registryId, kernelBucketId],\n network: network.name,\n });\n }\n\n // 4b. GCP Kernel (serverless Cloud Run + Pub/Sub - no NATS)\n if (hasGcpKernel && project.gcpKernel) {\n const gcpKernelName = `${projectInfo.name}-${project.gcpKernel.name}`;\n const gcpKernelId = `gcp-kernel-${project.gcpKernel.name}`;\n kernelIds.push(gcpKernelId);\n kernelNames.push(gcpKernelName);\n\n resources.push({\n id: gcpKernelId,\n type: 'gcp-kernel:gcp_kernel',\n name: gcpKernelName,\n config: {\n name: project.gcpKernel.name,\n location: projectInfo.region,\n memory: project.gcpKernel.memory || '512Mi',\n cpu: project.gcpKernel.cpu || '1',\n minInstances: project.gcpKernel.minInstances ?? 0,\n maxInstances: project.gcpKernel.maxInstances ?? 10,\n firebaseProjectId: project.gcpKernel.firebaseProjectId,\n storageBucket: project.gcpKernel.storageBucket,\n eventRetentionDays: project.gcpKernel.eventRetentionDays ?? 7,\n projectId: projectInfo.gcpProjectId,\n },\n dependsOn: [connectorId],\n network: network.name,\n });\n }\n\n // 5. Cloud Run containers\n const containerIds: string[] = [];\n const containerNames: string[] = [];\n\n // Determine KERNEL_URL if zeroTrustAuth is configured\n // The kernel URL is needed for containers using the zero-trust-auth runtime\n let kernelUrl: string | undefined;\n if (project.zeroTrustAuth && hasGcpKernel && project.gcpKernel) {\n // The kernel variable name is derived from gcpKernel.name using toVariableName()\n // e.g., \"kernel\" -> \"kernelService\", \"my-kernel\" -> \"my_kernelService\"\n const kernelVarName = project.gcpKernel.name.replace(/[^a-zA-Z0-9]/g, '_').replace(/^(\\d)/, '_$1');\n // Use CDKTF reference to the kernel service URI\n kernelUrl = `\\${${kernelVarName}Service.uri}`;\n }\n\n for (const container of containers) {\n const containerName = `${projectInfo.name}-${container.name}`;\n const containerId = `container-${container.name}`;\n containerIds.push(containerId);\n containerNames.push(containerName);\n\n // Build image URL from Artifact Registry\n const imageUrl = container.image ||\n `${projectInfo.region}-docker.pkg.dev/${projectInfo.gcpProjectId}/${registryName}/${container.name}:latest`;\n\n // Merge container env with kernel URL if zeroTrustAuth is configured\n const containerEnv = { ...container.env };\n if (kernelUrl) {\n containerEnv.KERNEL_URL = kernelUrl;\n }\n\n // Container depends on kernel if zeroTrustAuth is configured\n const containerDeps = [connectorId, registryId];\n if (project.zeroTrustAuth && hasGcpKernel) {\n containerDeps.push(`gcp-kernel-${project.gcpKernel?.name}`);\n }\n\n resources.push({\n id: containerId,\n type: 'gcp-cdktf:cloud_run',\n name: containerName,\n config: {\n name: containerName,\n location: projectInfo.region,\n image: imageUrl,\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 vpcConnector: connectorName,\n allowUnauthenticated: container.allowUnauthenticated ?? true,\n environmentVariables: containerEnv,\n projectId: projectInfo.gcpProjectId,\n projectName: projectInfo.name,\n },\n dependsOn: containerDeps,\n network: network.name,\n });\n }\n\n // 5. 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 projectName: projectInfo.name,\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 // 7. Load Balancer (HTTP) - routes to functions, containers, 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 (containers.length > 0) {\n // Default to first container if no explicit routes\n routes = [{ path: '/*', backend: containers[0].name }];\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 function, container, 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 // Check if backend is a container\n const isContainer = containers.some(c => c.name === r.backend);\n if (isContainer) {\n return {\n path: r.path,\n containerName: `${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 // Get HTTPS configuration from loadBalancer config\n const lbHttpsConfig = network.loadBalancer as { domain?: string; enableHttps?: boolean; redirectHttpToHttps?: boolean } | undefined;\n\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 // HTTPS configuration\n domain: lbHttpsConfig?.domain,\n enableHttps: lbHttpsConfig?.enableHttps,\n redirectHttpToHttps: lbHttpsConfig?.redirectHttpToHttps,\n },\n dependsOn: [...kernelIds, ...containerIds, ...functionIds, ...uiIds],\n network: network.name,\n });\n }\n\n // 8. Zero Trust IAP Web Backends (depends on load balancer backend services)\n if (project.zeroTrust?.iapWebBackends) {\n for (const iapConfig of project.zeroTrust.iapWebBackends) {\n // Use centralized naming utility for consistent backend service names\n const backendServiceName = getBackendServiceName(namingCtx, iapConfig.backend);\n\n resources.push({\n id: `iap-web-backend-${iapConfig.name}`,\n type: 'zero-trust:iap_web_backend',\n name: iapConfig.name,\n config: {\n name: iapConfig.name,\n backendService: backendServiceName,\n allowedMembers: iapConfig.allowedMembers,\n supportEmail: iapConfig.supportEmail,\n applicationTitle: iapConfig.applicationTitle || `${projectInfo.name} - ${iapConfig.name}`,\n projectId: projectInfo.gcpProjectId,\n },\n dependsOn: [loadBalancerId],\n network: network.name,\n });\n }\n }\n\n return {\n project: projectInfo,\n resources,\n order: resources.map((r) => r.id),\n };\n}\n\n// =============================================================================\n// Kubernetes Backend Resolution\n// =============================================================================\n\n/**\n * Resolve config for Kubernetes backend\n * Creates K8s resources: Namespace, ConfigMap, Deployments, Services, Ingress\n */\nfunction resolveKubernetesConfig(\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 kubernetes config is present\n if (!project.kubernetes) {\n throw new Error('Kubernetes backend requires kubernetes configuration with registry settings');\n }\n\n const k8sConfig = project.kubernetes;\n const namespace = k8sConfig.namespace || project.name;\n\n // Validate we have at least one network with deployable resources\n const network = project.networks?.[0];\n if (!network) {\n throw new Error('Kubernetes backend requires at least one network with containers or functions');\n }\n\n const containers = network.containers || [];\n const functions = network.functions || [];\n const uis = network.uis || [];\n const hasKernel = !!project.kernel;\n\n if (containers.length === 0 && functions.length === 0 && uis.length === 0 && !hasKernel) {\n throw new Error('Kubernetes backend requires at least one container, function, UI, or kernel');\n }\n\n // Kubernetes doesn't support GCP-native features\n if (project.gcpKernel) {\n throw new Error('Kubernetes backend uses kernel (NATS-based), not gcpKernel. Remove gcpKernel or use backend: \"cdktf\"');\n }\n if (project.crons?.length) {\n throw new Error('Kubernetes backend does not support crons. Use CronJob resources directly or backend: \"cdktf\"');\n }\n\n // 1. Namespace\n const namespaceId = 'k8s-namespace';\n resources.push({\n id: namespaceId,\n type: 'k8s:namespace',\n name: namespace,\n config: {\n name: namespace,\n labels: {\n 'app.kubernetes.io/managed-by': 'stacksolo',\n 'stacksolo.dev/project': project.name,\n },\n },\n dependsOn: [],\n });\n\n // 2. ConfigMap for environment variables\n const configMapId = 'k8s-configmap';\n const configMapEnv: Record<string, string> = {\n STACKSOLO_PROJECT_NAME: project.name,\n GCP_PROJECT_ID: project.gcpProjectId,\n };\n resources.push({\n id: configMapId,\n type: 'k8s:configmap',\n name: `${project.name}-config`,\n config: {\n name: `${project.name}-config`,\n namespace,\n data: configMapEnv,\n },\n dependsOn: [namespaceId],\n });\n\n // 3. Kernel (if configured)\n const kernelIds: string[] = [];\n if (project.kernel) {\n const kernelName = `${project.name}-${project.kernel.name}`;\n const kernelId = `k8s-kernel-${project.kernel.name}`;\n kernelIds.push(kernelId);\n\n resources.push({\n id: kernelId,\n type: 'k8s:deployment',\n name: kernelName,\n config: {\n name: kernelName,\n namespace,\n image: `${k8sConfig.registry.url}/${project.kernel.name}:latest`,\n port: 8090,\n replicas: k8sConfig.replicas || 1,\n memory: project.kernel.memory || '512Mi',\n cpu: project.kernel.cpu || '500m',\n env: {\n ...configMapEnv,\n ...project.kernel.env,\n },\n imagePullSecret: k8sConfig.registry.authSecret,\n resourceDefaults: k8sConfig.resources,\n },\n dependsOn: [namespaceId, configMapId],\n network: network.name,\n });\n\n // Kernel Service\n resources.push({\n id: `k8s-service-${project.kernel.name}`,\n type: 'k8s:service',\n name: kernelName,\n config: {\n name: kernelName,\n namespace,\n port: 8090,\n targetPort: 8090,\n selector: kernelName,\n },\n dependsOn: [kernelId],\n network: network.name,\n });\n }\n\n // 4. Containers\n const containerIds: string[] = [];\n for (const container of containers) {\n const containerName = `${project.name}-${container.name}`;\n const containerId = `k8s-deployment-${container.name}`;\n containerIds.push(containerId);\n\n resources.push({\n id: containerId,\n type: 'k8s:deployment',\n name: containerName,\n config: {\n name: containerName,\n namespace,\n image: container.image || `${k8sConfig.registry.url}/${container.name}:latest`,\n port: container.port || 8080,\n replicas: container.minInstances || k8sConfig.replicas || 1,\n memory: container.memory || k8sConfig.resources?.defaultMemoryLimit || '512Mi',\n cpu: container.cpu || k8sConfig.resources?.defaultCpuLimit || '500m',\n env: container.env || {},\n imagePullSecret: k8sConfig.registry.authSecret,\n resourceDefaults: k8sConfig.resources,\n },\n dependsOn: [namespaceId, configMapId, ...kernelIds],\n network: network.name,\n });\n\n // Container Service\n resources.push({\n id: `k8s-service-${container.name}`,\n type: 'k8s:service',\n name: containerName,\n config: {\n name: containerName,\n namespace,\n port: 80,\n targetPort: container.port || 8080,\n selector: containerName,\n },\n dependsOn: [containerId],\n network: network.name,\n });\n }\n\n // 5. Functions (as Deployments using functions-framework image)\n const functionIds: string[] = [];\n for (const fn of functions) {\n const functionName = `${project.name}-${fn.name}`;\n const functionId = `k8s-deployment-fn-${fn.name}`;\n functionIds.push(functionId);\n\n resources.push({\n id: functionId,\n type: 'k8s:deployment',\n name: functionName,\n config: {\n name: functionName,\n namespace,\n image: `${k8sConfig.registry.url}/${fn.name}:latest`,\n port: 8080,\n replicas: fn.minInstances || k8sConfig.replicas || 1,\n memory: fn.memory || k8sConfig.resources?.defaultMemoryLimit || '256Mi',\n cpu: k8sConfig.resources?.defaultCpuLimit || '250m',\n env: {\n FUNCTION_TARGET: fn.entryPoint || fn.name,\n ...fn.env,\n },\n imagePullSecret: k8sConfig.registry.authSecret,\n resourceDefaults: k8sConfig.resources,\n sourceDir: fn.sourceDir || `functions/${fn.name}`,\n runtime: fn.runtime || 'nodejs20',\n },\n dependsOn: [namespaceId, configMapId],\n network: network.name,\n });\n\n // Function Service\n resources.push({\n id: `k8s-service-fn-${fn.name}`,\n type: 'k8s:service',\n name: functionName,\n config: {\n name: functionName,\n namespace,\n port: 80,\n targetPort: 8080,\n selector: functionName,\n },\n dependsOn: [functionId],\n network: network.name,\n });\n }\n\n // 6. UIs (as Deployments serving static files via nginx)\n const uiIds: string[] = [];\n for (const ui of uis) {\n const uiName = `${project.name}-${ui.name}`;\n const uiId = `k8s-deployment-ui-${ui.name}`;\n uiIds.push(uiId);\n\n resources.push({\n id: uiId,\n type: 'k8s:deployment',\n name: uiName,\n config: {\n name: uiName,\n namespace,\n image: `${k8sConfig.registry.url}/${ui.name}:latest`,\n port: 80,\n replicas: k8sConfig.replicas || 1,\n memory: k8sConfig.resources?.defaultMemoryLimit || '128Mi',\n cpu: k8sConfig.resources?.defaultCpuLimit || '100m',\n imagePullSecret: k8sConfig.registry.authSecret,\n resourceDefaults: k8sConfig.resources,\n sourceDir: ui.sourceDir || `ui/${ui.name}`,\n framework: ui.framework,\n buildCommand: ui.buildCommand,\n buildOutputDir: ui.buildOutputDir,\n },\n dependsOn: [namespaceId],\n network: network.name,\n });\n\n // UI Service\n resources.push({\n id: `k8s-service-ui-${ui.name}`,\n type: 'k8s:service',\n name: uiName,\n config: {\n name: uiName,\n namespace,\n port: 80,\n targetPort: 80,\n selector: uiName,\n },\n dependsOn: [uiId],\n network: network.name,\n });\n }\n\n // 7. Ingress (if routes are configured)\n if (network.loadBalancer?.routes && k8sConfig.ingress) {\n const ingressId = 'k8s-ingress';\n const routes = network.loadBalancer.routes.map((route) => {\n // Determine service name based on backend type\n let serviceName = `${project.name}-${route.backend}`;\n return {\n path: route.path,\n serviceName,\n servicePort: 80,\n };\n });\n\n resources.push({\n id: ingressId,\n type: 'k8s:ingress',\n name: `${project.name}-ingress`,\n config: {\n name: `${project.name}-ingress`,\n namespace,\n className: k8sConfig.ingress.className || 'nginx',\n host: k8sConfig.ingress.host,\n tlsSecretName: k8sConfig.ingress.tlsSecretName,\n annotations: k8sConfig.ingress.annotations,\n routes,\n },\n dependsOn: [...containerIds, ...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 'gcp-kernel': {\n default: 'url',\n url: 'url',\n authUrl: 'authUrl',\n filesUrl: 'filesUrl',\n eventsUrl: 'eventsUrl',\n eventsTopic: 'eventsTopic',\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', 'gcp-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 * Naming utilities for merged projects\n * Handles prefixing and GCP naming constraints\n */\n\nconst MAX_GCP_NAME_LENGTH = 63;\n\n/**\n * Prefix a resource name with the project name\n * Ensures the result fits within GCP's 63 character limit\n */\nexport function prefixResourceName(projectName: string, resourceName: string): string {\n const prefixed = `${projectName}-${resourceName}`;\n\n if (prefixed.length <= MAX_GCP_NAME_LENGTH) {\n return prefixed;\n }\n\n // Truncate but keep recognizable\n // Keep first 20 chars of project name + hash + resource name\n const projectPrefix = projectName.slice(0, 20);\n const hash = simpleHash(projectName).slice(0, 4);\n const remaining = MAX_GCP_NAME_LENGTH - projectPrefix.length - hash.length - 2; // 2 for dashes\n const truncatedResource = resourceName.slice(0, remaining);\n\n return `${projectPrefix}-${hash}-${truncatedResource}`;\n}\n\n/**\n * Prefix a bucket name (globally unique)\n * Buckets have different rules: 3-63 chars, can have underscores\n */\nexport function prefixBucketName(projectName: string, bucketName: string): string {\n const prefixed = `${projectName}-${bucketName}`;\n\n if (prefixed.length <= MAX_GCP_NAME_LENGTH) {\n return prefixed;\n }\n\n // Use a hash to ensure uniqueness while fitting length\n const hash = simpleHash(`${projectName}:${bucketName}`).slice(0, 8);\n const remaining = MAX_GCP_NAME_LENGTH - hash.length - 1;\n const truncated = bucketName.slice(0, remaining);\n\n return `${truncated}-${hash}`;\n}\n\n/**\n * Prefix a path for load balancer routing\n * e.g., \"/api/*\" becomes \"/users-api/api/*\"\n */\nexport function prefixRoutePath(projectName: string, path: string): string {\n // Handle root path\n if (path === '/*' || path === '/') {\n return `/${projectName}/*`;\n }\n\n // Handle paths like \"/api/*\"\n const normalized = path.startsWith('/') ? path : `/${path}`;\n return `/${projectName}${normalized}`;\n}\n\n/**\n * Update a source directory path to be relative from the merged output\n * e.g., \"./functions/api\" from \"./users-api\" becomes \"../users-api/functions/api\"\n */\nexport function relativeSourceDir(\n sourceProjectPath: string,\n sourceDir: string,\n outputDir: string\n): string {\n // Calculate relative path from output dir to source project\n const path = require('path');\n const relativeToSource = path.relative(outputDir, sourceProjectPath);\n\n // Combine with the source dir\n const normalized = sourceDir.startsWith('./') ? sourceDir.slice(2) : sourceDir;\n return path.join(relativeToSource, normalized);\n}\n\n/**\n * Simple hash function for creating short unique identifiers\n */\nfunction simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return Math.abs(hash).toString(36);\n}\n\n/**\n * Extract the original resource name from a prefixed name\n */\nexport function extractOriginalName(prefixedName: string, projectName: string): string | null {\n const prefix = `${projectName}-`;\n if (prefixedName.startsWith(prefix)) {\n return prefixedName.slice(prefix.length);\n }\n return null;\n}\n\n/**\n * Check if a name is already prefixed with a project name\n */\nexport function isPrefixed(name: string, projectName: string): boolean {\n return name.startsWith(`${projectName}-`);\n}\n","/**\n * Conflict detection for merged projects\n */\n\nimport type { StackSoloConfig } from '../schema.js';\n\nexport interface Conflict {\n type: 'error' | 'warning';\n category: 'gcp_project' | 'region' | 'resource_name' | 'bucket_name' | 'backend';\n message: string;\n sources: string[]; // Project names involved\n resource?: string; // Resource name if applicable\n}\n\nexport interface ConflictResult {\n hasErrors: boolean;\n conflicts: Conflict[];\n}\n\n/**\n * Detect conflicts between multiple project configs\n */\nexport function detectConflicts(\n configs: Array<{ name: string; config: StackSoloConfig }>\n): ConflictResult {\n const conflicts: Conflict[] = [];\n\n // Check GCP project IDs match\n const gcpProjects = new Map<string, string[]>();\n for (const { name, config } of configs) {\n const gcpId = config.project.gcpProjectId;\n if (!gcpProjects.has(gcpId)) {\n gcpProjects.set(gcpId, []);\n }\n gcpProjects.get(gcpId)!.push(name);\n }\n\n if (gcpProjects.size > 1) {\n conflicts.push({\n type: 'error',\n category: 'gcp_project',\n message: `All projects must use the same GCP project ID. Found: ${Array.from(gcpProjects.keys()).join(', ')}`,\n sources: configs.map(c => c.name),\n });\n }\n\n // Check regions match\n const regions = new Map<string, string[]>();\n for (const { name, config } of configs) {\n const region = config.project.region;\n if (!regions.has(region)) {\n regions.set(region, []);\n }\n regions.get(region)!.push(name);\n }\n\n if (regions.size > 1) {\n conflicts.push({\n type: 'warning',\n category: 'region',\n message: `Projects use different regions: ${Array.from(regions.entries()).map(([r, ps]) => `${r} (${ps.join(', ')})`).join('; ')}. Resources will be deployed to their original regions.`,\n sources: configs.map(c => c.name),\n });\n }\n\n // Check backends match\n const backends = new Map<string, string[]>();\n for (const { name, config } of configs) {\n const backend = config.project.backend || 'cdktf';\n if (!backends.has(backend)) {\n backends.set(backend, []);\n }\n backends.get(backend)!.push(name);\n }\n\n if (backends.size > 1) {\n conflicts.push({\n type: 'error',\n category: 'backend',\n message: `All projects must use the same backend. Found: ${Array.from(backends.entries()).map(([b, ps]) => `${b} (${ps.join(', ')})`).join('; ')}`,\n sources: configs.map(c => c.name),\n });\n }\n\n // Check for bucket name conflicts (globally unique)\n const buckets = new Map<string, string[]>();\n for (const { name, config } of configs) {\n for (const bucket of config.project.buckets || []) {\n if (!buckets.has(bucket.name)) {\n buckets.set(bucket.name, []);\n }\n buckets.get(bucket.name)!.push(name);\n }\n }\n\n for (const [bucketName, sources] of buckets) {\n if (sources.length > 1) {\n conflicts.push({\n type: 'error',\n category: 'bucket_name',\n message: `Bucket name \"${bucketName}\" is used by multiple projects`,\n sources,\n resource: bucketName,\n });\n }\n }\n\n // Check for secret name conflicts\n const secrets = new Map<string, string[]>();\n for (const { name, config } of configs) {\n for (const secret of config.project.secrets || []) {\n if (!secrets.has(secret.name)) {\n secrets.set(secret.name, []);\n }\n secrets.get(secret.name)!.push(name);\n }\n }\n\n for (const [secretName, sources] of secrets) {\n if (sources.length > 1) {\n conflicts.push({\n type: 'warning',\n category: 'resource_name',\n message: `Secret name \"${secretName}\" is used by multiple projects. Will be prefixed.`,\n sources,\n resource: secretName,\n });\n }\n }\n\n // Check for topic name conflicts\n const topics = new Map<string, string[]>();\n for (const { name, config } of configs) {\n for (const topic of config.project.topics || []) {\n if (!topics.has(topic.name)) {\n topics.set(topic.name, []);\n }\n topics.get(topic.name)!.push(name);\n }\n }\n\n for (const [topicName, sources] of topics) {\n if (sources.length > 1) {\n conflicts.push({\n type: 'warning',\n category: 'resource_name',\n message: `Topic name \"${topicName}\" is used by multiple projects. Will be prefixed.`,\n sources,\n resource: topicName,\n });\n }\n }\n\n return {\n hasErrors: conflicts.some(c => c.type === 'error'),\n conflicts,\n };\n}\n\n/**\n * Format conflicts for display\n */\nexport function formatConflicts(result: ConflictResult): string {\n const lines: string[] = [];\n\n const errors = result.conflicts.filter(c => c.type === 'error');\n const warnings = result.conflicts.filter(c => c.type === 'warning');\n\n if (errors.length > 0) {\n lines.push('Errors:');\n for (const error of errors) {\n lines.push(` - ${error.message}`);\n }\n }\n\n if (warnings.length > 0) {\n lines.push('Warnings:');\n for (const warning of warnings) {\n lines.push(` - ${warning.message}`);\n }\n }\n\n return lines.join('\\n');\n}\n","/**\n * Core merge logic for combining multiple StackSolo projects\n */\n\nimport type {\n StackSoloConfig,\n ProjectConfig,\n NetworkConfig,\n BucketConfig,\n SecretConfig,\n TopicConfig,\n QueueConfig,\n CronConfig,\n ContainerConfig,\n FunctionConfig,\n DatabaseConfig,\n CacheConfig,\n UIConfig,\n LoadBalancerConfig,\n LoadBalancerRouteConfig,\n} from '../schema.js';\n\nimport { prefixResourceName, prefixBucketName, prefixRoutePath, relativeSourceDir } from './naming.js';\nimport { detectConflicts, type ConflictResult } from './conflicts.js';\n\n/**\n * Merge metadata stored in the output config\n */\nexport interface MergeMetadata {\n sources: Array<{\n name: string;\n path: string;\n originalGcpProjectId: string;\n originalRegion: string;\n }>;\n timestamp: string;\n version: string;\n}\n\n/**\n * Options for merging configs\n */\nexport interface MergeOptions {\n /** Name for the merged project */\n name: string;\n /** Output directory for merged config */\n outputDir: string;\n /** Use a shared VPC (name of existing VPC or 'auto' to create) */\n sharedVpc?: string;\n /** Use a shared artifact registry */\n sharedRegistry?: boolean;\n /** Dry run - don't write files */\n dryRun?: boolean;\n}\n\n/**\n * Input for a single project to merge\n */\nexport interface MergeInput {\n name: string;\n path: string;\n config: StackSoloConfig;\n}\n\n/**\n * Result of merging configs\n */\nexport interface MergeResult {\n success: boolean;\n conflicts: ConflictResult;\n config?: StackSoloConfig & { _merge?: MergeMetadata };\n errors: string[];\n}\n\n/**\n * Merge multiple StackSolo project configs into one\n */\nexport function mergeConfigs(inputs: MergeInput[], options: MergeOptions): MergeResult {\n const errors: string[] = [];\n\n // Validate inputs\n if (inputs.length === 0) {\n return {\n success: false,\n conflicts: { hasErrors: true, conflicts: [] },\n errors: ['No projects provided to merge'],\n };\n }\n\n // Detect conflicts\n const conflictInputs = inputs.map(i => ({ name: i.name, config: i.config }));\n const conflicts = detectConflicts(conflictInputs);\n\n if (conflicts.hasErrors) {\n return {\n success: false,\n conflicts,\n errors: ['Cannot merge due to conflicts'],\n };\n }\n\n // Use first project's GCP settings (validated to be the same)\n const firstProject = inputs[0].config.project;\n const gcpProjectId = firstProject.gcpProjectId;\n const region = firstProject.region;\n const backend = firstProject.backend || 'cdktf';\n\n // Build merged config\n const mergedConfig: StackSoloConfig & { _merge?: MergeMetadata } = {\n $schema: 'https://stacksolo.dev/schema/config.json',\n project: {\n name: options.name,\n region,\n gcpProjectId,\n backend,\n buckets: [],\n secrets: [],\n topics: [],\n queues: [],\n crons: [],\n networks: [],\n },\n _merge: {\n sources: inputs.map(i => ({\n name: i.name,\n path: i.path,\n originalGcpProjectId: i.config.project.gcpProjectId,\n originalRegion: i.config.project.region,\n })),\n timestamp: new Date().toISOString(),\n version: '1.0.0',\n },\n };\n\n // Merge global resources from all projects\n for (const input of inputs) {\n const project = input.config.project;\n\n // Merge buckets\n for (const bucket of project.buckets || []) {\n const mergedBucket = mergeBucket(bucket, input.name);\n mergedConfig.project.buckets!.push(mergedBucket);\n }\n\n // Merge secrets\n for (const secret of project.secrets || []) {\n const mergedSecret = mergeSecret(secret, input.name);\n mergedConfig.project.secrets!.push(mergedSecret);\n }\n\n // Merge topics\n for (const topic of project.topics || []) {\n const mergedTopic = mergeTopic(topic, input.name);\n mergedConfig.project.topics!.push(mergedTopic);\n }\n\n // Merge queues\n for (const queue of project.queues || []) {\n const mergedQueue = mergeQueue(queue, input.name);\n mergedConfig.project.queues!.push(mergedQueue);\n }\n\n // Merge crons\n for (const cron of project.crons || []) {\n const mergedCron = mergeCron(cron, input.name);\n mergedConfig.project.crons!.push(mergedCron);\n }\n }\n\n // Merge networks\n if (options.sharedVpc) {\n // Create a single shared network\n const sharedNetwork = createSharedNetwork(inputs, options);\n mergedConfig.project.networks = [sharedNetwork];\n } else {\n // Keep separate networks (prefixed)\n for (const input of inputs) {\n for (const network of input.config.project.networks || []) {\n const mergedNetwork = mergeNetwork(network, input, options);\n mergedConfig.project.networks!.push(mergedNetwork);\n }\n }\n }\n\n // Remove empty arrays\n if (mergedConfig.project.buckets?.length === 0) delete mergedConfig.project.buckets;\n if (mergedConfig.project.secrets?.length === 0) delete mergedConfig.project.secrets;\n if (mergedConfig.project.topics?.length === 0) delete mergedConfig.project.topics;\n if (mergedConfig.project.queues?.length === 0) delete mergedConfig.project.queues;\n if (mergedConfig.project.crons?.length === 0) delete mergedConfig.project.crons;\n\n return {\n success: true,\n conflicts,\n config: mergedConfig,\n errors,\n };\n}\n\n/**\n * Merge a bucket config with prefixing\n */\nfunction mergeBucket(bucket: BucketConfig, projectName: string): BucketConfig & { _source?: string } {\n return {\n ...bucket,\n name: prefixBucketName(projectName, bucket.name),\n _source: projectName,\n };\n}\n\n/**\n * Merge a secret config with prefixing\n */\nfunction mergeSecret(secret: SecretConfig, projectName: string): SecretConfig & { _source?: string } {\n return {\n ...secret,\n name: prefixResourceName(projectName, secret.name),\n _source: projectName,\n };\n}\n\n/**\n * Merge a topic config with prefixing\n */\nfunction mergeTopic(topic: TopicConfig, projectName: string): TopicConfig & { _source?: string } {\n return {\n ...topic,\n name: prefixResourceName(projectName, topic.name),\n _source: projectName,\n };\n}\n\n/**\n * Merge a queue config with prefixing\n */\nfunction mergeQueue(queue: QueueConfig, projectName: string): QueueConfig & { _source?: string } {\n return {\n ...queue,\n name: prefixResourceName(projectName, queue.name),\n _source: projectName,\n };\n}\n\n/**\n * Merge a cron config with prefixing\n */\nfunction mergeCron(cron: CronConfig, projectName: string): CronConfig & { _source?: string } {\n // Update target reference to use prefixed name\n let target = cron.target;\n if (target.startsWith('@')) {\n // Convert @container/api to @container/projectName-api\n const match = target.match(/^@(\\w+)\\/([^.]+)(\\..*)?$/);\n if (match) {\n const [, type, name, property = ''] = match;\n target = `@${type}/${prefixResourceName(projectName, name)}${property}`;\n }\n }\n\n return {\n ...cron,\n name: prefixResourceName(projectName, cron.name),\n target,\n _source: projectName,\n };\n}\n\n/**\n * Merge a network config with prefixing\n */\nfunction mergeNetwork(\n network: NetworkConfig,\n input: MergeInput,\n options: MergeOptions\n): NetworkConfig & { _source?: string } {\n const projectName = input.name;\n\n const merged: NetworkConfig & { _source?: string } = {\n ...network,\n name: prefixResourceName(projectName, network.name),\n _source: projectName,\n };\n\n // Merge containers\n if (network.containers) {\n merged.containers = network.containers.map(c =>\n mergeContainer(c, projectName, input.path, options.outputDir)\n );\n }\n\n // Merge functions\n if (network.functions) {\n merged.functions = network.functions.map(f =>\n mergeFunction(f, projectName, input.path, options.outputDir)\n );\n }\n\n // Merge databases\n if (network.databases) {\n merged.databases = network.databases.map(d => mergeDatabase(d, projectName));\n }\n\n // Merge caches\n if (network.caches) {\n merged.caches = network.caches.map(c => mergeCache(c, projectName));\n }\n\n // Merge UIs\n if (network.uis) {\n merged.uis = network.uis.map(u =>\n mergeUI(u, projectName, input.path, options.outputDir)\n );\n }\n\n // Merge load balancer routes\n if (network.loadBalancer) {\n merged.loadBalancer = mergeLoadBalancer(network.loadBalancer, projectName);\n }\n\n return merged;\n}\n\n/**\n * Create a single shared network from all projects\n */\nfunction createSharedNetwork(inputs: MergeInput[], options: MergeOptions): NetworkConfig {\n const sharedNetwork: NetworkConfig = {\n name: options.sharedVpc === 'auto' ? 'shared' : options.sharedVpc!,\n existing: options.sharedVpc !== 'auto',\n containers: [],\n functions: [],\n databases: [],\n caches: [],\n uis: [],\n };\n\n // Collect all routes for a combined load balancer\n const allRoutes: LoadBalancerRouteConfig[] = [];\n\n for (const input of inputs) {\n const projectName = input.name;\n\n for (const network of input.config.project.networks || []) {\n // Merge containers\n for (const container of network.containers || []) {\n sharedNetwork.containers!.push(\n mergeContainer(container, projectName, input.path, options.outputDir)\n );\n }\n\n // Merge functions\n for (const fn of network.functions || []) {\n sharedNetwork.functions!.push(\n mergeFunction(fn, projectName, input.path, options.outputDir)\n );\n }\n\n // Merge databases\n for (const db of network.databases || []) {\n sharedNetwork.databases!.push(mergeDatabase(db, projectName));\n }\n\n // Merge caches\n for (const cache of network.caches || []) {\n sharedNetwork.caches!.push(mergeCache(cache, projectName));\n }\n\n // Merge UIs\n for (const ui of network.uis || []) {\n sharedNetwork.uis!.push(\n mergeUI(ui, projectName, input.path, options.outputDir)\n );\n }\n\n // Collect load balancer routes\n if (network.loadBalancer?.routes) {\n for (const route of network.loadBalancer.routes) {\n allRoutes.push({\n path: prefixRoutePath(projectName, route.path),\n backend: prefixResourceName(projectName, route.backend),\n });\n }\n }\n }\n }\n\n // Create combined load balancer if there are routes\n if (allRoutes.length > 0) {\n sharedNetwork.loadBalancer = {\n name: 'merged-lb',\n routes: allRoutes,\n };\n }\n\n // Remove empty arrays\n if (sharedNetwork.containers?.length === 0) delete sharedNetwork.containers;\n if (sharedNetwork.functions?.length === 0) delete sharedNetwork.functions;\n if (sharedNetwork.databases?.length === 0) delete sharedNetwork.databases;\n if (sharedNetwork.caches?.length === 0) delete sharedNetwork.caches;\n if (sharedNetwork.uis?.length === 0) delete sharedNetwork.uis;\n\n return sharedNetwork;\n}\n\n/**\n * Merge a container config\n */\nfunction mergeContainer(\n container: ContainerConfig,\n projectName: string,\n sourcePath: string,\n outputDir: string\n): ContainerConfig & { _source?: string } {\n const merged: ContainerConfig & { _source?: string } = {\n ...container,\n name: prefixResourceName(projectName, container.name),\n _source: projectName,\n };\n\n // Update source dir if present\n if (container.image && !container.image.includes('/')) {\n // Local image reference - update path\n const defaultSourceDir = `containers/${container.name}`;\n merged.image = undefined; // Will be built from source\n }\n\n // Update env references\n if (container.env) {\n merged.env = prefixEnvReferences(container.env, projectName);\n }\n\n // Update secrets references\n if (container.secrets) {\n merged.secrets = prefixEnvReferences(container.secrets, projectName);\n }\n\n return merged;\n}\n\n/**\n * Merge a function config\n */\nfunction mergeFunction(\n fn: FunctionConfig,\n projectName: string,\n sourcePath: string,\n outputDir: string\n): FunctionConfig & { _source?: string } {\n const merged: FunctionConfig & { _source?: string } = {\n ...fn,\n name: prefixResourceName(projectName, fn.name),\n _source: projectName,\n };\n\n // Update source dir\n const originalSourceDir = fn.sourceDir || `functions/${fn.name}`;\n merged.sourceDir = relativeSourceDir(sourcePath, originalSourceDir, outputDir);\n\n // Update env references\n if (fn.env) {\n merged.env = prefixEnvReferences(fn.env, projectName);\n }\n\n // Update secrets references\n if (fn.secrets) {\n merged.secrets = prefixEnvReferences(fn.secrets, projectName);\n }\n\n // Update trigger references\n if (fn.trigger) {\n if (fn.trigger.topic) {\n merged.trigger = {\n ...fn.trigger,\n topic: prefixResourceName(projectName, fn.trigger.topic),\n };\n }\n if (fn.trigger.bucket) {\n merged.trigger = {\n ...fn.trigger,\n bucket: prefixBucketName(projectName, fn.trigger.bucket),\n };\n }\n }\n\n return merged;\n}\n\n/**\n * Merge a database config\n */\nfunction mergeDatabase(\n db: DatabaseConfig,\n projectName: string\n): DatabaseConfig & { _source?: string } {\n return {\n ...db,\n name: prefixResourceName(projectName, db.name),\n _source: projectName,\n };\n}\n\n/**\n * Merge a cache config\n */\nfunction mergeCache(\n cache: CacheConfig,\n projectName: string\n): CacheConfig & { _source?: string } {\n return {\n ...cache,\n name: prefixResourceName(projectName, cache.name),\n _source: projectName,\n };\n}\n\n/**\n * Merge a UI config\n */\nfunction mergeUI(\n ui: UIConfig,\n projectName: string,\n sourcePath: string,\n outputDir: string\n): UIConfig & { _source?: string } {\n const merged: UIConfig & { _source?: string } = {\n ...ui,\n name: prefixResourceName(projectName, ui.name),\n _source: projectName,\n };\n\n // Update source dir\n const originalSourceDir = ui.sourceDir || `ui/${ui.name}`;\n merged.sourceDir = relativeSourceDir(sourcePath, originalSourceDir, outputDir);\n\n return merged;\n}\n\n/**\n * Merge a load balancer config\n */\nfunction mergeLoadBalancer(\n lb: LoadBalancerConfig,\n projectName: string\n): LoadBalancerConfig {\n const merged: LoadBalancerConfig = {\n ...lb,\n name: prefixResourceName(projectName, lb.name),\n };\n\n // Update routes\n if (lb.routes) {\n merged.routes = lb.routes.map(route => ({\n path: prefixRoutePath(projectName, route.path),\n backend: prefixResourceName(projectName, route.backend),\n }));\n }\n\n return merged;\n}\n\n/**\n * Prefix environment variable references\n */\nfunction prefixEnvReferences(\n env: Record<string, string>,\n projectName: string\n): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(env)) {\n if (value.startsWith('@')) {\n // Parse and prefix the reference\n const match = value.match(/^@(\\w+)\\/([^.]+)(\\..*)?$/);\n if (match) {\n const [, type, name, property = ''] = match;\n result[key] = `@${type}/${prefixResourceName(projectName, name)}${property}`;\n } else {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n","/**\n * Validation for merged configs\n */\n\nimport type { StackSoloConfig, ValidationResult } from '../schema.js';\nimport { validateConfig } from '../parser.js';\n\nexport interface MergeValidationResult extends ValidationResult {\n warnings: string[];\n}\n\n/**\n * Validate a merged config\n */\nexport function validateMergedConfig(config: StackSoloConfig): MergeValidationResult {\n const warnings: string[] = [];\n\n // Run standard validation\n const baseResult = validateConfig(config);\n\n // Additional merge-specific validation\n const project = config.project;\n\n // Check for very long resource names (approaching 63 char limit)\n const checkNameLength = (name: string, path: string) => {\n if (name.length > 50) {\n warnings.push(`${path}: name \"${name}\" is ${name.length} chars (max 63). Consider shorter names.`);\n }\n };\n\n // Check buckets\n for (const bucket of project.buckets || []) {\n checkNameLength(bucket.name, `bucket ${bucket.name}`);\n }\n\n // Check secrets\n for (const secret of project.secrets || []) {\n checkNameLength(secret.name, `secret ${secret.name}`);\n }\n\n // Check network resources\n for (const network of project.networks || []) {\n checkNameLength(network.name, `network ${network.name}`);\n\n for (const container of network.containers || []) {\n checkNameLength(container.name, `container ${container.name}`);\n }\n\n for (const fn of network.functions || []) {\n checkNameLength(fn.name, `function ${fn.name}`);\n }\n\n for (const db of network.databases || []) {\n checkNameLength(db.name, `database ${db.name}`);\n }\n\n for (const cache of network.caches || []) {\n checkNameLength(cache.name, `cache ${cache.name}`);\n }\n\n for (const ui of network.uis || []) {\n checkNameLength(ui.name, `ui ${ui.name}`);\n }\n }\n\n // Check load balancer route conflicts\n const routePaths = new Map<string, string[]>();\n for (const network of project.networks || []) {\n if (network.loadBalancer?.routes) {\n for (const route of network.loadBalancer.routes) {\n if (!routePaths.has(route.path)) {\n routePaths.set(route.path, []);\n }\n routePaths.get(route.path)!.push(route.backend);\n }\n }\n }\n\n for (const [path, backends] of routePaths) {\n if (backends.length > 1) {\n warnings.push(`Route path \"${path}\" is used by multiple backends: ${backends.join(', ')}`);\n }\n }\n\n return {\n ...baseResult,\n warnings,\n };\n}\n\n/**\n * Validate cross-project references in a merged config\n */\nexport function validateCrossProjectReferences(\n config: StackSoloConfig,\n sourceProjects: string[]\n): string[] {\n const errors: string[] = [];\n\n // Collect all resource names with their types\n const resources = new Map<string, Set<string>>(); // type -> Set<name>\n\n // Add global resources\n for (const bucket of config.project.buckets || []) {\n if (!resources.has('bucket')) resources.set('bucket', new Set());\n resources.get('bucket')!.add(bucket.name);\n }\n\n for (const secret of config.project.secrets || []) {\n if (!resources.has('secret')) resources.set('secret', new Set());\n resources.get('secret')!.add(secret.name);\n }\n\n for (const topic of config.project.topics || []) {\n if (!resources.has('topic')) resources.set('topic', new Set());\n resources.get('topic')!.add(topic.name);\n }\n\n // Add network resources\n for (const network of config.project.networks || []) {\n for (const container of network.containers || []) {\n if (!resources.has('container')) resources.set('container', new Set());\n resources.get('container')!.add(container.name);\n }\n\n for (const fn of network.functions || []) {\n if (!resources.has('function')) resources.set('function', new Set());\n resources.get('function')!.add(fn.name);\n }\n\n for (const db of network.databases || []) {\n if (!resources.has('database')) resources.set('database', new Set());\n resources.get('database')!.add(db.name);\n }\n\n for (const cache of network.caches || []) {\n if (!resources.has('cache')) resources.set('cache', new Set());\n resources.get('cache')!.add(cache.name);\n }\n }\n\n // Check all references resolve\n const checkReference = (ref: string, context: string) => {\n if (!ref.startsWith('@')) return;\n\n // Parse reference: @type/name or @project/type/name\n const projectMatch = ref.match(/^@([a-z0-9-]+)\\/(\\w+)\\/([^.]+)/);\n const simpleMatch = ref.match(/^@(\\w+)\\/([^.]+)/);\n\n if (projectMatch) {\n // Cross-project reference: @project/type/name\n const [, projectName, type, name] = projectMatch;\n if (!sourceProjects.includes(projectName)) {\n errors.push(`${context}: reference \"${ref}\" refers to unknown project \"${projectName}\"`);\n }\n // Can't validate cross-project resource existence without the full config\n } else if (simpleMatch) {\n // Simple reference: @type/name\n const [, type, name] = simpleMatch;\n const typeResources = resources.get(type);\n if (!typeResources?.has(name)) {\n errors.push(`${context}: reference \"${ref}\" refers to non-existent ${type} \"${name}\"`);\n }\n }\n };\n\n // Check env references in all resources\n for (const network of config.project.networks || []) {\n for (const container of network.containers || []) {\n for (const [key, value] of Object.entries(container.env || {})) {\n checkReference(value, `container ${container.name}.env.${key}`);\n }\n for (const [key, value] of Object.entries(container.secrets || {})) {\n checkReference(value, `container ${container.name}.secrets.${key}`);\n }\n }\n\n for (const fn of network.functions || []) {\n for (const [key, value] of Object.entries(fn.env || {})) {\n checkReference(value, `function ${fn.name}.env.${key}`);\n }\n for (const [key, value] of Object.entries(fn.secrets || {})) {\n checkReference(value, `function ${fn.name}.secrets.${key}`);\n }\n }\n }\n\n // Check cron targets\n for (const cron of config.project.crons || []) {\n checkReference(cron.target, `cron ${cron.name}.target`);\n }\n\n return errors;\n}\n","/**\n * @stacksolo/blueprint\n * Config parser and code generator for StackSolo infrastructure\n */\n\n// Schema types\nexport type {\n StackSoloConfig,\n ProjectConfig,\n NetworkConfig,\n ContainerConfig,\n FunctionConfig,\n DatabaseConfig,\n CacheConfig,\n BucketConfig,\n SecretConfig,\n TopicConfig,\n QueueConfig,\n CronConfig,\n KernelConfig,\n UIConfig,\n WebAdminConfig,\n ServiceAccountConfig,\n SubnetConfig,\n FirewallRuleConfig,\n LoadBalancerConfig,\n LoadBalancerRouteConfig,\n ResolvedResource,\n ResolvedConfig,\n Reference,\n ReferenceType,\n ValidationResult,\n ValidationError,\n} from './schema.js';\n\n// Parser\nexport {\n findConfigFile,\n parseConfig,\n parseConfigFromDir,\n validateConfig,\n} from './parser.js';\n\n// Resolver\nexport {\n resolveConfig,\n getResourceIds,\n findResource,\n findResourcesByType,\n findResourcesByNetwork,\n} from './resolver.js';\n\n// References\nexport {\n parseReference,\n isReference,\n getReferenceResourceId,\n getReferenceOutputName,\n resolveReferenceToPulumi,\n resolveReference,\n findEnvReferences,\n resolveEnvReferences,\n extractDependencies,\n validateReferences,\n} from './references.js';\n\n// Dependencies\nexport {\n buildDependencyGraph,\n detectCycles,\n topologicalSort,\n getResourcesInOrder,\n getParallelBatches,\n getDependencies,\n getDependents,\n getTransitiveDependencies,\n resolveWithOrder,\n} from './dependencies.js';\n\n// Generator\nexport {\n generateFromConfig,\n generatePulumiProgram,\n generatePulumiYaml,\n type GeneratedCode,\n} from './generator.js';\n\n// Naming utilities\nexport {\n getLoadBalancerName,\n getBackendServiceName,\n getNegName,\n getCloudRunServiceName,\n getCloudFunctionName,\n getVpcNetworkName,\n getVpcConnectorName,\n getArtifactRegistryName,\n getWebsiteBucketName,\n getBackendBucketName,\n getSslCertificateName,\n getStaticIpName,\n getHttpProxyName,\n getHttpsProxyName,\n getUrlMapName,\n getHttpForwardingRuleName,\n getHttpsForwardingRuleName,\n type NamingContext,\n} from './naming.js';\n\n// Merge utilities\nexport {\n mergeConfigs,\n detectConflicts,\n formatConflicts,\n prefixResourceName,\n prefixBucketName,\n prefixRoutePath,\n validateMergedConfig,\n validateCrossProjectReferences,\n type MergeMetadata,\n type MergeOptions,\n type MergeInput,\n type MergeResult,\n type Conflict,\n type ConflictResult,\n type MergeValidationResult,\n} from './merge/index.js';\n\n// =============================================================================\n// Convenience Functions\n// =============================================================================\n\nimport { parseConfig, validateConfig } from './parser.js';\nimport { resolveConfig } from './resolver.js';\nimport { resolveWithOrder } from './dependencies.js';\nimport { generatePulumiProgram, generatePulumiYaml } from './generator.js';\nimport type { ValidationResult, ValidationError, StackSoloConfig } from './schema.js';\n\n/**\n * Load and validate a config file\n * Returns a result object with success, config, and errors\n */\nexport function loadConfig(configPath: string): {\n success: boolean;\n config?: StackSoloConfig;\n errors?: ValidationError[];\n} {\n try {\n const config = parseConfig(configPath);\n const validation = validateConfig(config);\n\n if (!validation.valid) {\n return {\n success: false,\n errors: validation.errors,\n };\n }\n\n return {\n success: true,\n config,\n };\n } catch (error) {\n return {\n success: false,\n errors: [{ path: '', message: (error as Error).message }],\n };\n }\n}\n\n/**\n * Full pipeline: parse, validate, resolve, generate\n */\nexport function processConfig(configPath: string): {\n valid: boolean;\n errors: string[];\n code?: string;\n yaml?: string;\n} {\n // Parse\n const config = parseConfig(configPath);\n\n // Validate\n const validation = validateConfig(config);\n if (!validation.valid) {\n return {\n valid: false,\n errors: validation.errors.map(e => `${e.path}: ${e.message}`),\n };\n }\n\n // Resolve\n const resolved = resolveConfig(config);\n const withOrder = resolveWithOrder(resolved);\n\n // Generate\n const code = generatePulumiProgram(withOrder);\n const yaml = generatePulumiYaml(withOrder);\n\n return {\n valid: true,\n errors: [],\n code,\n yaml,\n };\n}\n\n/**\n * Validate a config file without generating code\n */\nexport function validateConfigFile(configPath: string): ValidationResult {\n const config = parseConfig(configPath);\n return validateConfig(config);\n}\n\n/**\n * Preview what resources will be created from a config\n */\nexport function previewConfig(configPath: string): {\n valid: boolean;\n errors: string[];\n resources?: Array<{ id: string; type: string; name: string; dependsOn: string[] }>;\n} {\n const config = parseConfig(configPath);\n const validation = validateConfig(config);\n\n if (!validation.valid) {\n return {\n valid: false,\n errors: validation.errors.map(e => `${e.path}: ${e.message}`),\n };\n }\n\n const resolved = resolveConfig(config);\n const withOrder = resolveWithOrder(resolved);\n\n return {\n valid: true,\n errors: [],\n resources: withOrder.resources.map(r => ({\n id: r.id,\n type: r.type,\n name: r.name,\n dependsOn: r.dependsOn,\n })),\n };\n}\n","/**\n * Scaffold generators orchestrator\n * Coordinates generation of env files and service directories\n *\n * Note: Runtime artifacts like K8s manifests are generated by `stacksolo dev`,\n * not by scaffold. Scaffold only generates source code that developers maintain.\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { StackSoloConfig } from '@stacksolo/blueprint';\nimport { generateEnvFiles } from './env';\nimport { generateServiceScaffolds } from './services';\nimport type { ScaffoldOptions, ScaffoldResult, GeneratedFile } from './types';\n\nexport { generateEnvFiles } from './env';\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 serviceDirectoryCount = 0;\n let uiDirectoryCount = 0;\n\n const generateEnv = !options.servicesOnly;\n const generateServices = !options.envOnly;\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 // 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: 0, // No longer generated by scaffold\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} 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 // Kernel config (if present)\n if (config.project.kernel) {\n const kernel = config.project.kernel;\n sections.push({\n header: 'Kernel',\n variables: [\n { name: 'KERNEL_URL', value: 'http://localhost:8090', comment: 'Kernel HTTP endpoint' },\n { name: 'NATS_URL', value: 'nats://localhost:4222', comment: 'Kernel NATS endpoint' },\n {\n name: 'FIREBASE_PROJECT_ID',\n value: kernel.firebaseProjectId || `demo-${config.project.gcpProjectId}`,\n comment: 'Firebase project for auth validation',\n },\n ...(kernel.gcsBucket\n ? [{ name: 'GCS_BUCKET', value: kernel.gcsBucket, comment: 'GCS bucket for file storage' }]\n : []),\n ],\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' || sectionName === 'kernel') {\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 * 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: \"tsup src/index.ts --format esm --target node20 --watch --onSuccess 'functions-framework --source=dist --target=handler'\",\n build: 'tsup src/index.ts --format esm --target node20',\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 tsup: '^8.0.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 ui/<name>\n // This matches the K8s generator default path\n const uiPath = ui.sourceDir?.replace(/^\\.\\//, '') || `ui/${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 * Kernel scaffolder\n * Generates directory structure and starter code for kernel service (HTTP + NATS)\n */\n\nimport type { StackSoloConfig, KernelConfig } from '@stacksolo/blueprint';\nimport type { ServiceScaffold, GeneratedFile } from '../types';\n\nexport function generateKernelScaffold(\n kernel: KernelConfig,\n config: StackSoloConfig\n): ServiceScaffold {\n const servicePath = `containers/${kernel.name}`;\n const files: GeneratedFile[] = [];\n\n // Dockerfile\n files.push({\n path: `${servicePath}/Dockerfile`,\n content: generateDockerfile(),\n });\n\n // package.json\n files.push({\n path: `${servicePath}/package.json`,\n content: generatePackageJson(kernel, config),\n });\n\n // tsconfig.json\n files.push({\n path: `${servicePath}/tsconfig.json`,\n content: generateTsConfig(),\n });\n\n // start.sh\n files.push({\n path: `${servicePath}/start.sh`,\n content: generateStartScript(),\n });\n\n // src/index.ts\n files.push({\n path: `${servicePath}/src/index.ts`,\n content: generateEntrypoint(),\n });\n\n // src/config.ts\n files.push({\n path: `${servicePath}/src/config.ts`,\n content: generateConfig(),\n });\n\n // src/http/index.ts\n files.push({\n path: `${servicePath}/src/http/index.ts`,\n content: generateHttpIndex(),\n });\n\n // src/http/auth.ts\n files.push({\n path: `${servicePath}/src/http/auth.ts`,\n content: generateHttpAuth(),\n });\n\n // src/http/health.ts\n files.push({\n path: `${servicePath}/src/http/health.ts`,\n content: generateHttpHealth(),\n });\n\n // src/nats/index.ts\n files.push({\n path: `${servicePath}/src/nats/index.ts`,\n content: generateNatsIndex(),\n });\n\n // src/nats/files.ts\n files.push({\n path: `${servicePath}/src/nats/files.ts`,\n content: generateNatsFiles(),\n });\n\n // src/setup/streams.ts\n files.push({\n path: `${servicePath}/src/setup/streams.ts`,\n content: generateStreamsSetup(),\n });\n\n // .gitignore\n files.push({\n path: `${servicePath}/.gitignore`,\n content: generateGitignore(),\n });\n\n return {\n name: kernel.name,\n type: 'container',\n files,\n };\n}\n\nfunction generateDockerfile(): string {\n return `FROM node:20-alpine\n\n# Install NATS server\nRUN apk add --no-cache curl && \\\\\n curl -L https://github.com/nats-io/nats-server/releases/download/v2.10.24/nats-server-v2.10.24-linux-amd64.tar.gz | tar xz && \\\\\n mv nats-server-*/nats-server /usr/local/bin/ && \\\\\n rm -rf nats-server-* && \\\\\n apk del curl\n\n# Create app directory\nWORKDIR /app\n\n# Copy package files\nCOPY package*.json ./\n\n# Install production dependencies\nRUN npm ci --only=production\n\n# Copy compiled source\nCOPY dist/ ./dist/\n\n# Copy start script\nCOPY start.sh ./\nRUN chmod +x start.sh\n\n# Create data directory for JetStream\nRUN mkdir -p /data\n\n# Expose ports\nEXPOSE 4222 8080\n\n# Health check\nHEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \\\\\n CMD wget --no-verbose --tries=1 --spider http://localhost:8080/health || exit 1\n\n# Start NATS + Node service\nCMD [\"./start.sh\"]\n`;\n}\n\nfunction generatePackageJson(kernel: KernelConfig, config: StackSoloConfig): string {\n const pkg = {\n name: `@${config.project.name}/${kernel.name}`,\n version: '0.1.0',\n description: 'Kernel service - HTTP + NATS hybrid',\n type: 'module',\n main: 'dist/index.js',\n scripts: {\n build: 'tsup src/index.ts --format esm --target node20 --dts',\n dev: 'tsx watch src/index.ts',\n start: 'node dist/index.js',\n },\n dependencies: {\n nats: '^2.18.0',\n 'firebase-admin': '^12.0.0',\n '@google-cloud/storage': '^7.0.0',\n express: '^4.18.0',\n cors: '^2.8.5',\n },\n devDependencies: {\n '@types/express': '^4.17.21',\n '@types/cors': '^2.8.17',\n '@types/node': '^20.0.0',\n tsup: '^8.0.0',\n tsx: '^4.0.0',\n typescript: '^5.0.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 generateStartScript(): string {\n return `#!/bin/sh\nset -e\n\necho \"Starting NATS server...\"\nnats-server --jetstream --store_dir /data &\nNATS_PID=$!\n\n# Wait for NATS to be ready\necho \"Waiting for NATS to start...\"\nsleep 2\n\n# Check if NATS is running\nif ! kill -0 $NATS_PID 2>/dev/null; then\n echo \"NATS failed to start\"\n exit 1\nfi\n\necho \"NATS server started (PID: $NATS_PID)\"\n\n# Start Node.js service\necho \"Starting kernel service...\"\nexec node dist/index.js\n`;\n}\n\nfunction generateEntrypoint(): string {\n return `/**\n * Kernel Service\n *\n * Hybrid HTTP + NATS shared infrastructure:\n * - HTTP: /auth/validate (public), /health\n * - NATS: kernel.files.*, kernel.events.* (internal)\n */\n\nimport { startHttpServer, setNatsConnection } from './http/index';\nimport { startNatsHandlers, closeNatsConnection } from './nats/index';\nimport { setupStreams } from './setup/streams';\nimport { config, validateConfig } from './config';\n\nasync function main(): Promise<void> {\n console.log('Starting kernel service...');\n\n // Validate configuration\n validateConfig();\n\n // Start HTTP server (auth, health)\n const http = await startHttpServer(config.httpPort);\n console.log(\\`HTTP server listening on port \\${config.httpPort}\\`);\n\n // Connect to NATS and setup handlers\n const nc = await startNatsHandlers(config.natsUrl);\n setNatsConnection(nc);\n console.log(\\`NATS handlers connected to \\${config.natsUrl}\\`);\n\n // Setup JetStream streams\n try {\n await setupStreams(nc);\n console.log('JetStream streams configured');\n } catch (error) {\n console.error('Failed to setup JetStream streams:', error);\n // Continue - streams might already exist or JetStream isn't enabled\n }\n\n console.log('Kernel service started successfully');\n\n // Graceful shutdown\n const shutdown = async (signal: string): Promise<void> => {\n console.log(\\`Received \\${signal}, shutting down...\\`);\n\n // Close NATS connection\n await closeNatsConnection();\n console.log('NATS connection closed');\n\n // Close HTTP server\n http.close(() => {\n console.log('HTTP server closed');\n process.exit(0);\n });\n\n // Force exit after 10 seconds\n setTimeout(() => {\n console.error('Forced shutdown after timeout');\n process.exit(1);\n }, 10000);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n}\n\nmain().catch((error) => {\n console.error('Failed to start kernel service:', error);\n process.exit(1);\n});\n`;\n}\n\nfunction generateConfig(): string {\n return `/**\n * Kernel Service Configuration\n * Reads from environment variables\n */\n\nexport const config = {\n /** NATS server port */\n natsPort: parseInt(process.env.NATS_PORT || '4222', 10),\n\n /** HTTP server port */\n httpPort: parseInt(process.env.HTTP_PORT || '8080', 10),\n\n /** NATS connection URL (local server) */\n natsUrl: process.env.NATS_URL || 'nats://localhost:4222',\n\n /** Firebase project ID for auth validation */\n firebaseProjectId: process.env.FIREBASE_PROJECT_ID || '',\n\n /** GCS bucket for file uploads */\n gcsBucket: process.env.GCS_BUCKET || '',\n\n /** Comma-separated list of allowed caller service accounts */\n allowedCallers: (process.env.ALLOWED_CALLERS || '')\n .split(',')\n .map(s => s.trim())\n .filter(Boolean),\n\n /** Signed URL expiration in seconds */\n signedUrlExpiration: parseInt(process.env.SIGNED_URL_EXPIRATION || '3600', 10),\n};\n\n/**\n * Validate required configuration\n */\nexport function validateConfig(): void {\n const missing: string[] = [];\n\n if (!config.firebaseProjectId) {\n missing.push('FIREBASE_PROJECT_ID');\n }\n if (!config.gcsBucket) {\n missing.push('GCS_BUCKET');\n }\n\n if (missing.length > 0) {\n console.warn(\\`Warning: Missing environment variables: \\${missing.join(', ')}\\`);\n }\n}\n`;\n}\n\nfunction generateHttpIndex(): string {\n return `/**\n * HTTP Server\n * Express app with auth and health routes\n */\n\nimport express from 'express';\nimport cors from 'cors';\nimport type { Server } from 'http';\nimport type { NatsConnection } from 'nats';\nimport { authRouter } from './auth';\nimport { createHealthRouter } from './health';\n\nlet natsConnection: NatsConnection | null = null;\n\n/**\n * Set the NATS connection for health checks\n */\nexport function setNatsConnection(nc: NatsConnection): void {\n natsConnection = nc;\n}\n\n/**\n * Start the HTTP server\n */\nexport function startHttpServer(port: number): Promise<Server> {\n return new Promise((resolve) => {\n const app = express();\n\n // Middleware\n app.use(express.json());\n\n // CORS for auth routes (browser access)\n app.use('/auth', cors({\n origin: true,\n credentials: true,\n }));\n\n // Routes\n app.use('/', createHealthRouter(() => natsConnection));\n app.use('/auth', authRouter);\n\n // 404 handler\n app.use((_req, res) => {\n res.status(404).json({ error: 'Not found' });\n });\n\n // Error handler\n app.use((err: Error, _req: express.Request, res: express.Response, _next: express.NextFunction) => {\n console.error('HTTP error:', err);\n res.status(500).json({ error: 'Internal server error' });\n });\n\n const server = app.listen(port, () => {\n resolve(server);\n });\n });\n}\n`;\n}\n\nfunction generateHttpAuth(): string {\n return `/**\n * Auth Routes\n * POST /auth/validate - Validate Firebase ID token\n */\n\nimport { Router } from 'express';\nimport { initializeApp, getApps } from 'firebase-admin/app';\nimport { getAuth } from 'firebase-admin/auth';\nimport { config } from '../config';\n\n// Initialize Firebase Admin SDK once\nif (getApps().length === 0) {\n initializeApp({\n projectId: config.firebaseProjectId,\n });\n}\n\nexport const authRouter = Router();\n\ninterface ValidateRequest {\n token: string;\n}\n\ninterface ValidateSuccessResponse {\n valid: true;\n uid: string;\n email?: string;\n claims: Record<string, unknown>;\n}\n\ninterface ValidateErrorResponse {\n valid: false;\n error: string;\n code: string;\n}\n\n/**\n * POST /auth/validate\n * Validates a Firebase ID token and returns user claims\n */\nauthRouter.post('/validate', async (req, res) => {\n try {\n const { token } = req.body as ValidateRequest;\n\n if (!token) {\n const response: ValidateErrorResponse = {\n valid: false,\n error: 'Token is required',\n code: 'MISSING_TOKEN',\n };\n res.status(400).json(response);\n return;\n }\n\n const decodedToken = await getAuth().verifyIdToken(token);\n\n const response: ValidateSuccessResponse = {\n valid: true,\n uid: decodedToken.uid,\n email: decodedToken.email,\n claims: decodedToken,\n };\n\n res.json(response);\n } catch (error) {\n const firebaseError = error as { code?: string; message?: string };\n\n let code = 'INVALID_TOKEN';\n let message = 'Invalid token';\n\n if (firebaseError.code === 'auth/id-token-expired') {\n code = 'TOKEN_EXPIRED';\n message = 'Token has expired';\n } else if (firebaseError.code === 'auth/id-token-revoked') {\n code = 'TOKEN_REVOKED';\n message = 'Token has been revoked';\n } else if (firebaseError.code === 'auth/argument-error') {\n code = 'MALFORMED_TOKEN';\n message = 'Token is malformed';\n }\n\n const response: ValidateErrorResponse = {\n valid: false,\n error: message,\n code,\n };\n\n res.status(401).json(response);\n }\n});\n`;\n}\n\nfunction generateHttpHealth(): string {\n return `/**\n * Health Check Route\n * GET /health - Returns service health status\n */\n\nimport { Router } from 'express';\nimport type { NatsConnection } from 'nats';\n\nexport function createHealthRouter(getNatsConnection: () => NatsConnection | null): Router {\n const router = Router();\n\n router.get('/health', (_req, res) => {\n const nc = getNatsConnection();\n const natsStatus = nc && !nc.isClosed() ? 'connected' : 'disconnected';\n\n res.json({\n status: 'ok',\n nats: natsStatus,\n timestamp: new Date().toISOString(),\n });\n });\n\n return router;\n}\n`;\n}\n\nfunction generateNatsIndex(): string {\n return `/**\n * NATS Connection and Handlers\n */\n\nimport { connect, type NatsConnection } from 'nats';\nimport { config } from '../config';\nimport { setupFilesHandlers } from './files';\n\nlet natsConnection: NatsConnection | null = null;\n\n/**\n * Connect to NATS server and setup handlers\n */\nexport async function startNatsHandlers(natsUrl: string): Promise<NatsConnection> {\n // Connect to NATS\n natsConnection = await connect({\n servers: natsUrl,\n name: 'kernel-service',\n reconnect: true,\n maxReconnectAttempts: -1, // Unlimited reconnects\n reconnectTimeWait: 1000,\n });\n\n console.log(\\`Connected to NATS at \\${natsUrl}\\`);\n\n // Setup connection status logging\n (async () => {\n for await (const status of natsConnection!.status()) {\n console.log(\\`NATS status: \\${status.type}\\`, status.data);\n }\n })();\n\n // Setup handlers\n const filesSubs = setupFilesHandlers(natsConnection);\n console.log(\\`Registered \\${filesSubs.length} files handlers\\`);\n\n return natsConnection;\n}\n\n/**\n * Get the current NATS connection\n */\nexport function getNatsConnection(): NatsConnection | null {\n return natsConnection;\n}\n\n/**\n * Gracefully drain and close NATS connection\n */\nexport async function closeNatsConnection(): Promise<void> {\n if (natsConnection) {\n await natsConnection.drain();\n natsConnection = null;\n }\n}\n`;\n}\n\nfunction generateNatsFiles(): string {\n return `/**\n * Files NATS Handlers\n * kernel.files.upload-url - Generate signed upload URL\n * kernel.files.download-url - Generate signed download URL\n */\n\nimport { Storage } from '@google-cloud/storage';\nimport type { NatsConnection, Subscription } from 'nats';\nimport { StringCodec } from 'nats';\nimport { config } from '../config';\n\nconst storage = new Storage();\nconst sc = StringCodec();\n\ninterface UploadUrlRequest {\n path: string;\n contentType: string;\n metadata?: Record<string, string>;\n}\n\ninterface UploadUrlResponse {\n uploadUrl: string;\n path: string;\n expiresAt: string;\n}\n\ninterface DownloadUrlRequest {\n path: string;\n}\n\ninterface DownloadUrlResponse {\n downloadUrl: string;\n path: string;\n expiresAt: string;\n}\n\ninterface ErrorResponse {\n error: string;\n code: string;\n}\n\n/**\n * Validate file path - prevent path traversal attacks\n */\nfunction validatePath(path: string): { valid: boolean; error?: string } {\n if (!path) {\n return { valid: false, error: 'Path is required' };\n }\n\n if (path.startsWith('/')) {\n return { valid: false, error: 'Path must not start with /' };\n }\n\n if (path.includes('..')) {\n return { valid: false, error: 'Path must not contain ..' };\n }\n\n if (path.includes('//')) {\n return { valid: false, error: 'Path must not contain //' };\n }\n\n return { valid: true };\n}\n\n/**\n * Setup files NATS handlers\n */\nexport function setupFilesHandlers(nc: NatsConnection): Subscription[] {\n const subscriptions: Subscription[] = [];\n\n // kernel.files.upload-url - Generate signed PUT URL\n const uploadSub = nc.subscribe('kernel.files.upload-url', {\n callback: async (err, msg) => {\n if (err) {\n console.error('NATS subscription error:', err);\n return;\n }\n\n try {\n const request: UploadUrlRequest = JSON.parse(sc.decode(msg.data));\n\n // Validate path\n const validation = validatePath(request.path);\n if (!validation.valid) {\n const response: ErrorResponse = {\n error: validation.error!,\n code: 'INVALID_PATH',\n };\n msg.respond(sc.encode(JSON.stringify(response)));\n return;\n }\n\n // Validate content type\n if (!request.contentType) {\n const response: ErrorResponse = {\n error: 'Content type is required',\n code: 'MISSING_CONTENT_TYPE',\n };\n msg.respond(sc.encode(JSON.stringify(response)));\n return;\n }\n\n // Generate signed URL\n const bucket = storage.bucket(config.gcsBucket);\n const file = bucket.file(request.path);\n\n const expiresAt = new Date(Date.now() + config.signedUrlExpiration * 1000);\n\n const [uploadUrl] = await file.getSignedUrl({\n version: 'v4',\n action: 'write',\n expires: expiresAt,\n contentType: request.contentType,\n });\n\n const response: UploadUrlResponse = {\n uploadUrl,\n path: request.path,\n expiresAt: expiresAt.toISOString(),\n };\n\n msg.respond(sc.encode(JSON.stringify(response)));\n } catch (error) {\n console.error('Error handling upload-url request:', error);\n const response: ErrorResponse = {\n error: 'Failed to generate upload URL',\n code: 'INTERNAL_ERROR',\n };\n msg.respond(sc.encode(JSON.stringify(response)));\n }\n },\n });\n\n subscriptions.push(uploadSub);\n\n // kernel.files.download-url - Generate signed GET URL\n const downloadSub = nc.subscribe('kernel.files.download-url', {\n callback: async (err, msg) => {\n if (err) {\n console.error('NATS subscription error:', err);\n return;\n }\n\n try {\n const request: DownloadUrlRequest = JSON.parse(sc.decode(msg.data));\n\n // Validate path\n const validation = validatePath(request.path);\n if (!validation.valid) {\n const response: ErrorResponse = {\n error: validation.error!,\n code: 'INVALID_PATH',\n };\n msg.respond(sc.encode(JSON.stringify(response)));\n return;\n }\n\n // Generate signed URL\n const bucket = storage.bucket(config.gcsBucket);\n const file = bucket.file(request.path);\n\n // Check if file exists\n const [exists] = await file.exists();\n if (!exists) {\n const response: ErrorResponse = {\n error: 'File not found',\n code: 'NOT_FOUND',\n };\n msg.respond(sc.encode(JSON.stringify(response)));\n return;\n }\n\n const expiresAt = new Date(Date.now() + config.signedUrlExpiration * 1000);\n\n const [downloadUrl] = await file.getSignedUrl({\n version: 'v4',\n action: 'read',\n expires: expiresAt,\n });\n\n const response: DownloadUrlResponse = {\n downloadUrl,\n path: request.path,\n expiresAt: expiresAt.toISOString(),\n };\n\n msg.respond(sc.encode(JSON.stringify(response)));\n } catch (error) {\n console.error('Error handling download-url request:', error);\n const response: ErrorResponse = {\n error: 'Failed to generate download URL',\n code: 'INTERNAL_ERROR',\n };\n msg.respond(sc.encode(JSON.stringify(response)));\n }\n },\n });\n\n subscriptions.push(downloadSub);\n\n return subscriptions;\n}\n`;\n}\n\nfunction generateStreamsSetup(): string {\n return `/**\n * JetStream Setup\n * Creates KERNEL_EVENTS stream for durable event logging\n */\n\nimport type { NatsConnection } from 'nats';\nimport { RetentionPolicy, StorageType, DiscardPolicy } from 'nats';\n\nconst KERNEL_EVENTS_STREAM = 'KERNEL_EVENTS';\n\n/**\n * Setup JetStream streams\n */\nexport async function setupStreams(nc: NatsConnection): Promise<void> {\n const jsm = await nc.jetstreamManager();\n\n // Check if stream already exists\n try {\n await jsm.streams.info(KERNEL_EVENTS_STREAM);\n console.log(\\`Stream \\${KERNEL_EVENTS_STREAM} already exists\\`);\n return;\n } catch {\n // Stream doesn't exist, create it\n }\n\n // Create KERNEL_EVENTS stream\n await jsm.streams.add({\n name: KERNEL_EVENTS_STREAM,\n subjects: ['kernel.events.>'],\n retention: RetentionPolicy.Limits,\n max_age: 7 * 24 * 60 * 60 * 1000 * 1000000, // 7 days in nanoseconds\n max_bytes: 1024 * 1024 * 1024, // 1GB\n storage: StorageType.File,\n num_replicas: 1,\n discard: DiscardPolicy.Old,\n });\n\n console.log(\\`Created stream \\${KERNEL_EVENTS_STREAM}\\`);\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 * Service scaffolder\n * Orchestrates scaffolding for containers, functions, UIs, and kernel\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';\nimport { generateKernelScaffold } from './resources/kernel';\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 // Generate kernel scaffold if configured (project-level)\n if (config.project.kernel) {\n const scaffold = generateKernelScaffold(config.project.kernel, config);\n services.push(scaffold);\n allFiles.push(...scaffold.files);\n }\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 clone\n *\n * Bootstrap a new StackSolo project from:\n * 1. A remote stack (e.g., `stacksolo clone rag-platform my-project`)\n * 2. An existing local project (e.g., `stacksolo clone ../other-project`)\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { loadConfig, type StackSoloConfig } from '@stacksolo/blueprint';\nimport {\n createStacksoloDir,\n createConfigFile,\n} from '../../templates';\nimport { getRegistry } from '@stacksolo/registry';\nimport {\n fetchJson,\n downloadDirectory,\n substituteVariablesInDirectory,\n parseRepo,\n} from '../../services/github.service';\n\n// GitHub repository configuration\nconst REPO = parseRepo('monkeybarrels/stacksolo-architectures', 'main');\n\n/**\n * Stack metadata from stack.json\n */\ninterface StackMetadata {\n id: string;\n name: string;\n description: string;\n version: string;\n tags: string[];\n difficulty: string;\n variables: Record<string, {\n description: string;\n required?: boolean;\n default?: string;\n }>;\n}\n\n/**\n * Stacks index structure\n */\ninterface StacksIndex {\n version: string;\n stacks: Array<{\n id: string;\n name: string;\n description: string;\n tags: string[];\n difficulty: string;\n path: string;\n }>;\n}\n\n/**\n * Fetch the stacks index from the repository\n */\nasync function fetchStacksIndex(): Promise<StacksIndex> {\n return fetchJson<StacksIndex>('stacks.json', REPO);\n}\n\n/**\n * Check if the source is a known remote stack by looking up in the index\n * then fetching its stack.json for full metadata\n */\nasync function fetchStackMetadata(stackId: string): Promise<StackMetadata | null> {\n try {\n // First check if it's in the index\n const index = await fetchStacksIndex();\n const stackInfo = index.stacks.find(s => s.id === stackId);\n\n if (!stackInfo) {\n return null;\n }\n\n // Fetch the full metadata from stack.json\n const metadata = await fetchJson<StackMetadata>(`${stackInfo.path}/stack.json`, REPO);\n return metadata;\n } catch {\n return null;\n }\n}\n\n/**\n * Download and extract a stack from the GitHub repository\n * Uses the unified GitHub service for tarball download\n */\nasync function cloneRemoteStack(\n stackId: string,\n outputDir: string,\n spinner: ReturnType<typeof ora>\n): Promise<boolean> {\n try {\n // Get the stack path from the index\n const index = await fetchStacksIndex();\n const stackInfo = index.stacks.find(s => s.id === stackId);\n\n if (!stackInfo) {\n spinner.fail(`Stack \"${stackId}\" not found in repository`);\n return false;\n }\n\n // Use the unified download service\n await downloadDirectory(stackInfo.path, outputDir, REPO, {\n onProgress: (msg) => { spinner.text = msg; },\n });\n\n return true;\n } catch (error) {\n throw error;\n }\n}\n\n/**\n * Clone a remote stack to the local filesystem\n */\nasync function cloneStack(\n stackId: string,\n destination: string | undefined,\n metadata: StackMetadata,\n options: { name?: string; yes?: boolean },\n cwd: string\n): Promise<void> {\n console.log(chalk.cyan.bold('\\n StackSolo Stack Clone\\n'));\n console.log(chalk.gray(` ${metadata.description}\\n`));\n console.log(chalk.gray('─'.repeat(60)));\n\n // Determine output directory\n let projectName = destination || options.name;\n\n if (!projectName && !options.yes) {\n const { name } = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'Project directory name:',\n default: stackId,\n validate: (input: string) => {\n if (!input) return 'Directory 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\n projectName = projectName || stackId;\n const outputDir = path.join(cwd, projectName);\n\n // Check if directory exists\n try {\n await fs.access(outputDir);\n console.log(chalk.red(`\\n Error: Directory \"${projectName}\" already exists.\\n`));\n return;\n } catch {\n // Directory doesn't exist, good to proceed\n }\n\n // Collect variable values\n console.log(chalk.cyan.bold('\\n Configuration\\n'));\n\n const variables: Record<string, string> = {};\n const varEntries = Object.entries(metadata.variables || {});\n\n if (varEntries.length > 0 && !options.yes) {\n for (const [key, spec] of varEntries) {\n let defaultValue = spec.default || '';\n\n // Smart defaults\n if (key === 'projectName') defaultValue = projectName;\n\n const { value } = await inquirer.prompt([\n {\n type: 'input',\n name: 'value',\n message: `${spec.description}:`,\n default: defaultValue,\n validate: (input: string) => {\n if (spec.required && !input) return `${key} is required`;\n return true;\n },\n },\n ]);\n variables[key] = value;\n }\n } else {\n // Use defaults\n for (const [key, spec] of varEntries) {\n if (key === 'projectName') {\n variables[key] = projectName;\n } else if (spec.default) {\n variables[key] = spec.default;\n }\n }\n }\n\n // Clone the stack\n console.log(chalk.cyan.bold('\\n Cloning Stack\\n'));\n const cloneSpinner = ora('Cloning stack...').start();\n\n try {\n await fs.mkdir(outputDir, { recursive: true });\n const success = await cloneRemoteStack(stackId, outputDir, cloneSpinner);\n\n if (!success) {\n await fs.rm(outputDir, { recursive: true, force: true }).catch(() => {});\n return;\n }\n\n cloneSpinner.succeed('Stack cloned successfully');\n\n // Apply variable substitutions to config\n const configPath = path.join(outputDir, 'infrastructure', 'config.json');\n try {\n let configContent = await fs.readFile(configPath, 'utf-8');\n\n // Replace {{variable}} placeholders\n for (const [key, value] of Object.entries(variables)) {\n const placeholder = new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g');\n configContent = configContent.replace(placeholder, value);\n }\n\n await fs.writeFile(configPath, configContent);\n\n // Also copy to .stacksolo/stacksolo.config.json for CLI compatibility\n const stacksoloDir = path.join(outputDir, '.stacksolo');\n await fs.mkdir(stacksoloDir, { recursive: true });\n await fs.writeFile(path.join(stacksoloDir, 'stacksolo.config.json'), configContent);\n\n console.log(chalk.green(' ✓ Configuration applied'));\n } catch {\n console.log(chalk.yellow(' ⚠ Could not apply configuration (apply manually)'));\n }\n\n // Summary\n console.log(chalk.gray('\\n─'.repeat(60)));\n console.log(chalk.bold.green('\\n Done! Stack cloned successfully.\\n'));\n console.log(chalk.gray(' Location: ') + chalk.white(outputDir));\n console.log(chalk.gray(' Stack: ') + chalk.white(`${metadata.name} v${metadata.version}`));\n\n console.log(chalk.gray('\\n Next steps:\\n'));\n console.log(chalk.white(` cd ${projectName}`));\n console.log(chalk.white(' npm install'));\n console.log(chalk.white(' npm run dev'));\n console.log('');\n console.log(chalk.gray(' To deploy:'));\n console.log(chalk.cyan(' stacksolo deploy'));\n console.log('');\n\n } catch (error) {\n cloneSpinner.fail('Failed to clone stack');\n console.log(chalk.red(`\\n ${error instanceof Error ? error.message : error}\\n`));\n await fs.rm(outputDir, { recursive: true, force: true }).catch(() => {});\n }\n}\n\ninterface SharedResources {\n vpc?: {\n name: string;\n subnets?: Array<{ name: string; ipCidrRange: string }>;\n };\n buckets?: Array<{ name: string; storageClass?: string }>;\n registry?: {\n name: string;\n format?: string;\n };\n}\n\n/**\n * Extract shared resources from a source config.\n * These will be marked with existing: true in the new project.\n */\nfunction extractSharedResources(config: StackSoloConfig): SharedResources {\n const shared: SharedResources = {};\n const project = config.project;\n\n // Extract VPC from first network (the main shared infrastructure)\n if (project.networks && project.networks.length > 0) {\n const network = project.networks[0];\n shared.vpc = {\n name: network.name,\n subnets: network.subnets?.map(s => ({\n name: s.name,\n ipCidrRange: s.ipCidrRange,\n })),\n };\n }\n\n // Extract buckets (globally unique, so we reference by name)\n if (project.buckets && project.buckets.length > 0) {\n shared.buckets = project.buckets.map(b => ({\n name: b.name,\n storageClass: b.storageClass,\n }));\n }\n\n // Extract artifact registry\n if (project.artifactRegistry) {\n shared.registry = {\n name: project.artifactRegistry.name,\n format: project.artifactRegistry.format,\n };\n }\n\n return shared;\n}\n\n/**\n * Generate a new config that references shared resources with existing: true\n */\nfunction generateClonedConfig(\n newProjectName: string,\n sourceConfig: StackSoloConfig,\n shared: SharedResources,\n options: {\n shareBuckets: boolean;\n shareRegistry: boolean;\n }\n): StackSoloConfig {\n const source = sourceConfig.project;\n\n const newConfig: StackSoloConfig = {\n project: {\n name: newProjectName,\n region: source.region,\n gcpProjectId: source.gcpProjectId,\n backend: source.backend,\n // Empty network with shared VPC\n networks: [],\n },\n };\n\n // Add shared VPC with existing: true\n if (shared.vpc) {\n newConfig.project.networks = [{\n name: shared.vpc.name,\n existing: true,\n // Subnets are part of the existing VPC\n subnets: shared.vpc.subnets,\n // Empty arrays for user to add their own resources\n functions: [],\n containers: [],\n uis: [],\n }];\n }\n\n // Add shared buckets with existing: true\n if (options.shareBuckets && shared.buckets && shared.buckets.length > 0) {\n newConfig.project.buckets = shared.buckets.map(b => ({\n ...b,\n existing: true,\n }));\n }\n\n // Add shared artifact registry with existing: true\n if (options.shareRegistry && shared.registry) {\n newConfig.project.artifactRegistry = {\n ...shared.registry,\n existing: true,\n };\n }\n\n return newConfig;\n}\n\nexport const cloneCommand = new Command('clone')\n .description('Clone a stack or project (e.g., stacksolo clone rag-platform my-app)')\n .argument('[source]', 'Stack ID (e.g., rag-platform) or path to local project')\n .argument('[destination]', 'Directory name for new project')\n .option('-n, --name <name>', 'Name for the new project')\n .option('-o, --output <dir>', 'Output directory (default: current directory)')\n .option('--no-vpc', 'Do not share the VPC (local clone only)')\n .option('--no-buckets', 'Do not share storage buckets (local clone only)')\n .option('--no-registry', 'Do not share artifact registry (local clone only)')\n .option('-y, --yes', 'Skip prompts and use defaults')\n .option('--list', 'List available stacks')\n .action(async (source, destination, options) => {\n const cwd = process.cwd();\n\n // Handle --list flag or no source provided\n if (options.list || !source) {\n console.log(chalk.cyan.bold('\\n Available Stacks\\n'));\n console.log(chalk.gray(' Fetching from stacksolo-architectures...\\n'));\n\n const spinner = ora('Loading stacks...').start();\n\n try {\n // Fetch from the stacks index\n const index = await fetchStacksIndex();\n spinner.stop();\n\n if (index.stacks.length === 0) {\n console.log(chalk.yellow(' No stacks available yet.\\n'));\n } else {\n for (const stack of index.stacks) {\n console.log(chalk.green(` ${stack.id}`));\n console.log(chalk.gray(` ${stack.description}`));\n console.log(chalk.gray(` Tags: ${stack.tags.join(', ')}`));\n console.log('');\n }\n }\n } catch (error) {\n spinner.fail('Failed to fetch stacks');\n console.log(chalk.red(` ${error instanceof Error ? error.message : error}\\n`));\n }\n\n console.log(chalk.gray(' Usage: stacksolo clone <stack-id> <project-name>\\n'));\n return;\n }\n\n // =========================================\n // Check if source is a remote stack\n // =========================================\n const stackSpinner = ora('Checking for remote stack...').start();\n const stackMetadata = await fetchStackMetadata(source);\n\n if (stackMetadata) {\n // This is a remote stack - clone it\n stackSpinner.succeed(`Found stack: ${chalk.green(stackMetadata.name)}`);\n await cloneStack(source, destination, stackMetadata, options, cwd);\n return;\n }\n\n stackSpinner.text = 'Not a remote stack, checking local path...';\n\n // =========================================\n // Fall back to local project clone\n // =========================================\n const outputDir = options.output ? path.resolve(cwd, options.output) : cwd;\n\n console.log(chalk.cyan.bold('\\n StackSolo Clone\\n'));\n console.log(chalk.gray(' Bootstrap a new project from an existing one.\\n'));\n console.log(chalk.gray('─'.repeat(60)));\n\n // =========================================\n // Step 1: Load source project config\n // =========================================\n console.log(chalk.cyan.bold('\\n Step 1: Load Source Project\\n'));\n\n const sourceSpinner = ora('Loading source project...').start();\n stackSpinner.stop();\n\n // Resolve source path\n let sourcePath = path.resolve(cwd, source);\n let configPath: string;\n\n try {\n const stat = await fs.stat(sourcePath);\n if (stat.isDirectory()) {\n // Look for config in .stacksolo directory\n configPath = path.join(sourcePath, '.stacksolo', 'stacksolo.config.json');\n } else {\n configPath = sourcePath;\n }\n } catch {\n sourceSpinner.fail(`Source not found: ${source}`);\n console.log(chalk.gray('\\n Hint: Use --list to see available remote stacks\\n'));\n return;\n }\n\n // Load and validate config\n let sourceConfig: StackSoloConfig;\n try {\n const result = loadConfig(configPath);\n if (!result.success || !result.config) {\n sourceSpinner.fail('Invalid source config');\n if (result.errors) {\n for (const err of result.errors) {\n console.log(chalk.red(` - ${err.message}`));\n }\n }\n return;\n }\n sourceConfig = result.config;\n } catch (error) {\n sourceSpinner.fail(`Failed to load config: ${configPath}`);\n console.log(chalk.red(` ${error}`));\n return;\n }\n\n sourceSpinner.succeed(`Loaded: ${chalk.green(sourceConfig.project.name)}`);\n\n // =========================================\n // Step 2: Extract shared resources\n // =========================================\n console.log(chalk.cyan.bold('\\n Step 2: Identify Shared Resources\\n'));\n\n const shared = extractSharedResources(sourceConfig);\n\n console.log(' Found shareable resources:');\n if (shared.vpc) {\n console.log(chalk.green(` ✓ VPC: ${shared.vpc.name}`));\n if (shared.vpc.subnets) {\n for (const subnet of shared.vpc.subnets) {\n console.log(chalk.gray(` Subnet: ${subnet.name} (${subnet.ipCidrRange})`));\n }\n }\n }\n if (shared.buckets && shared.buckets.length > 0) {\n for (const bucket of shared.buckets) {\n console.log(chalk.green(` ✓ Bucket: ${bucket.name}`));\n }\n }\n if (shared.registry) {\n console.log(chalk.green(` ✓ Artifact Registry: ${shared.registry.name}`));\n }\n\n if (!shared.vpc && !shared.buckets?.length && !shared.registry) {\n console.log(chalk.yellow(' No shareable resources found in source project.'));\n console.log(chalk.gray(' Consider running stacksolo init instead.\\n'));\n return;\n }\n\n // =========================================\n // Step 3: Configure new project\n // =========================================\n console.log(chalk.gray('\\n─'.repeat(60)));\n console.log(chalk.cyan.bold('\\n Step 3: Configure New Project\\n'));\n\n let projectName = options.name;\n let shareBuckets = options.buckets !== false;\n let shareRegistry = options.registry !== false;\n let shareVpc = options.vpc !== false;\n\n if (!options.yes) {\n // Get project name\n if (!projectName) {\n const defaultName = path.basename(outputDir).toLowerCase().replace(/[^a-z0-9-]/g, '-');\n const { name } = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'New 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 if (input === sourceConfig.project.name) {\n return 'New project must have a different name';\n }\n return true;\n },\n },\n ]);\n projectName = name;\n }\n\n // Select which resources to share\n const resourceChoices = [];\n if (shared.vpc) {\n resourceChoices.push({ name: `VPC: ${shared.vpc.name}`, value: 'vpc', checked: true });\n }\n if (shared.buckets && shared.buckets.length > 0) {\n resourceChoices.push({\n name: `Buckets: ${shared.buckets.map(b => b.name).join(', ')}`,\n value: 'buckets',\n checked: true,\n });\n }\n if (shared.registry) {\n resourceChoices.push({\n name: `Artifact Registry: ${shared.registry.name}`,\n value: 'registry',\n checked: true,\n });\n }\n\n if (resourceChoices.length > 1) {\n const { selectedResources } = await inquirer.prompt([\n {\n type: 'checkbox',\n name: 'selectedResources',\n message: 'Which resources should the new project share?',\n choices: resourceChoices,\n },\n ]);\n\n shareVpc = selectedResources.includes('vpc');\n shareBuckets = selectedResources.includes('buckets');\n shareRegistry = selectedResources.includes('registry');\n }\n }\n\n projectName = projectName || `${sourceConfig.project.name}-clone`;\n\n if (!shareVpc) {\n console.log(chalk.yellow('\\n Warning: Not sharing VPC. A new VPC will be created.'));\n console.log(chalk.gray(' This counts against your VPC quota (default: 5 per project).\\n'));\n }\n\n // =========================================\n // Step 4: Generate new project config\n // =========================================\n console.log(chalk.gray('\\n─'.repeat(60)));\n console.log(chalk.cyan.bold('\\n Step 4: Generate Project Files\\n'));\n\n const generateSpinner = ora('Generating configuration...').start();\n\n // Generate config with shared resources\n const newConfig = generateClonedConfig(\n projectName,\n sourceConfig,\n shareVpc ? shared : { ...shared, vpc: undefined },\n { shareBuckets, shareRegistry }\n );\n\n // If not sharing VPC, create an empty network\n if (!shareVpc) {\n newConfig.project.networks = [{\n name: 'main',\n subnets: [{\n name: 'private',\n ipCidrRange: '10.0.1.0/24',\n }],\n functions: [],\n containers: [],\n uis: [],\n }];\n }\n\n // Create output directory if needed\n try {\n await fs.mkdir(outputDir, { recursive: true });\n } catch {\n // Directory exists\n }\n\n // Create .stacksolo directory\n await createStacksoloDir(outputDir, {\n gcpProjectId: sourceConfig.project.gcpProjectId,\n clonedFrom: sourceConfig.project.name,\n });\n generateSpinner.text = 'Created .stacksolo/';\n\n // Write config file\n await createConfigFile(outputDir, newConfig);\n generateSpinner.succeed('Project files created');\n\n // =========================================\n // Step 5: Register in global registry\n // =========================================\n const registrySpinner = ora('Registering project...').start();\n try {\n const registry = getRegistry();\n const newConfigPath = path.join(outputDir, '.stacksolo', 'stacksolo.config.json');\n\n const existing = await registry.findProjectByName(projectName);\n if (existing) {\n await registry.updateProject(existing.id, {\n gcpProjectId: sourceConfig.project.gcpProjectId,\n region: sourceConfig.project.region,\n configPath: newConfigPath,\n });\n registrySpinner.succeed('Updated project in registry');\n } else {\n await registry.registerProject({\n name: projectName,\n gcpProjectId: sourceConfig.project.gcpProjectId,\n region: sourceConfig.project.region,\n configPath: newConfigPath,\n });\n registrySpinner.succeed('Registered project in global registry');\n }\n } catch {\n registrySpinner.warn('Could not register in global registry (non-blocking)');\n }\n\n // =========================================\n // Summary\n // =========================================\n console.log(chalk.gray('\\n─'.repeat(60)));\n console.log(chalk.bold.green('\\n Done! New project created.\\n'));\n\n console.log(chalk.gray(' Project: ') + chalk.white(projectName));\n console.log(chalk.gray(' Location: ') + chalk.white(outputDir));\n console.log(chalk.gray(' GCP Project: ') + chalk.white(sourceConfig.project.gcpProjectId));\n console.log(chalk.gray(' Region: ') + chalk.white(sourceConfig.project.region));\n\n console.log(chalk.gray('\\n Shared resources (existing: true):'));\n if (shareVpc && shared.vpc) {\n console.log(chalk.green(` ✓ VPC: ${shared.vpc.name}`));\n }\n if (shareBuckets && shared.buckets?.length) {\n for (const b of shared.buckets) {\n console.log(chalk.green(` ✓ Bucket: ${b.name}`));\n }\n }\n if (shareRegistry && shared.registry) {\n console.log(chalk.green(` ✓ Registry: ${shared.registry.name}`));\n }\n\n console.log(chalk.gray('\\n Next steps:\\n'));\n console.log(chalk.white(' 1. Add your functions, containers, or UIs to the config'));\n console.log(chalk.white(' 2. Run: ') + chalk.cyan('stacksolo scaffold'));\n console.log(chalk.white(' 3. Write your code'));\n console.log(chalk.white(' 4. Run: ') + chalk.cyan('stacksolo deploy'));\n console.log('');\n\n // Show example of adding a function\n console.log(chalk.gray(' Example - add a function to .stacksolo/stacksolo.config.json:'));\n console.log(chalk.gray(''));\n console.log(chalk.cyan(' \"functions\": ['));\n console.log(chalk.cyan(' {'));\n console.log(chalk.cyan(' \"name\": \"api\",'));\n console.log(chalk.cyan(' \"runtime\": \"nodejs20\",'));\n console.log(chalk.cyan(' \"entryPoint\": \"handler\"'));\n console.log(chalk.cyan(' }'));\n console.log(chalk.cyan(' ]'));\n console.log('');\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 {\n getRegistry,\n initRegistry,\n startSession,\n endSession,\n logPhaseStart,\n logPhaseEnd,\n logConflictDetected,\n logUserPrompt,\n logUserResponse,\n logTerraformEvent,\n logEvent,\n} from '@stacksolo/registry';\nimport { deployConfig } from '../../services/deploy.service';\nimport {\n deployToKubernetes,\n buildAndPushImages,\n checkKubernetesConnection,\n} from '../../services/k8s-deploy.service';\nimport { createCommandLogger, logFullError, getLogPath } from '../../logger';\nimport {\n runPreflightCheck,\n promptConflictResolution as promptPreflightResolution,\n executeResolution,\n PreflightResult,\n runKernelPreflightCheck,\n displayKernelPreflightResults,\n ensureCloudFunctionsPrerequisites,\n} from '../../services/preflight.service';\nimport { getPluginFormatter, loadPlugins } from '../../services/plugin-loader.service';\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 .option('--skip-preflight', 'Skip pre-flight conflict detection')\n .option('--import-conflicts', 'Automatically import conflicting resources')\n .option('--delete-conflicts', 'Automatically delete conflicting resources')\n .option('-v, --verbose', 'Show real-time Terraform and Docker output')\n .option('--helm', 'Generate Helm chart instead of raw K8s manifests (kubernetes backend only)')\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 skipPreflight?: boolean;\n importConflicts?: boolean;\n deleteConflicts?: boolean;\n verbose?: boolean;\n helm?: boolean;\n}\n\ninterface RetryContext {\n grantedBuildPermissions?: boolean;\n grantedGcfArtifactsPermissions?: boolean;\n deletedResource?: string;\n deletedResources?: string[];\n refreshedState?: boolean;\n}\n\n/**\n * Phase progress tracker for deploy operations\n */\nclass DeployProgress {\n private currentStep = 0;\n private totalSteps = 0;\n private phases: string[] = [];\n\n configure(phases: string[]) {\n this.phases = phases;\n this.totalSteps = phases.length;\n this.currentStep = 0;\n }\n\n next(): string {\n this.currentStep++;\n const phase = this.phases[this.currentStep - 1] || 'Processing';\n return chalk.cyan(` [${this.currentStep}/${this.totalSteps}] ${phase}`);\n }\n\n stepLabel(): string {\n return `[${this.currentStep}/${this.totalSteps}]`;\n }\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(\n options: DeployOptions,\n retryCount = 0,\n retryContext: RetryContext = {},\n sessionId?: string\n): Promise<void> {\n const MAX_RETRIES = 3;\n const log = createCommandLogger('deploy');\n\n log.info('Starting deploy', { options, retryCount, retryContext });\n\n // Initialize event logging on first attempt\n if (retryCount === 0) {\n await initRegistry();\n const command = options.destroy ? 'destroy' : options.preview ? 'preview' : 'deploy';\n sessionId = await startSession({\n command,\n args: JSON.stringify(options),\n });\n }\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\n // Update session with project info\n if (sessionId) {\n await logEvent({\n sessionId,\n category: 'internal',\n eventType: 'session_start',\n data: {\n projectName: config.project.name,\n gcpProjectId: config.project.gcpProjectId,\n region: config.project.region,\n },\n });\n }\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 if (sessionId) await endSession(sessionId, 1);\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 // Calculate phases for progress tracking (only on first attempt)\n const progress = new DeployProgress();\n if (retryCount === 0) {\n const phases: string[] = [];\n const hasCloudFunctions = resolved.resources.some((r) => r.type === 'gcp-cdktf:cloud_function');\n const hasContainers = resolved.resources.some((r) => r.type === 'gcp:cloud_run');\n const hasGcpKernel = resolved.resources.some((r) => r.type === 'gcp-kernel:gcp_kernel');\n\n if (!options.destroy && !options.skipPreflight && !options.force) {\n phases.push('Pre-flight checks');\n }\n if (hasCloudFunctions && !options.destroy && !options.preview && !options.skipPreflight) {\n phases.push('Cloud Functions setup');\n }\n if ((hasContainers || hasGcpKernel) && !options.preview && !options.destroy && !options.skipBuild) {\n phases.push('Building containers');\n }\n phases.push(options.destroy ? 'Destroying infrastructure' : options.preview ? 'Previewing changes' : 'Deploying infrastructure');\n\n progress.configure(phases);\n }\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 // Pre-flight conflict detection (only on first attempt, not destroy, not force)\n if (!options.destroy && !options.skipPreflight && !options.force && retryCount === 0) {\n console.log(progress.next());\n if (sessionId) await logPhaseStart(sessionId, 'preflight', { project: config.project.name });\n const preflightSpinner = ora('Checking for resource conflicts...').start();\n\n try {\n const preflightResult = await runPreflightCheck(\n {\n project: {\n name: config.project.name,\n gcpProjectId: config.project.gcpProjectId,\n region: config.project.region,\n },\n },\n process.cwd()\n );\n\n if (preflightResult.hasConflicts) {\n preflightSpinner.warn(`Found ${preflightResult.conflicts.length} resource conflict(s)`);\n\n // Log conflicts\n if (sessionId) {\n await logConflictDetected(\n sessionId,\n preflightResult.conflicts.map((c: { resourceType: string; resourceName: string; address?: string }) => ({\n type: c.resourceType,\n name: c.resourceName,\n address: c.address,\n }))\n );\n }\n\n // Handle auto-import or auto-delete options\n if (options.importConflicts) {\n const importResult = await executeResolution(\n { action: 'import_all' },\n preflightResult.conflicts,\n {\n project: {\n name: config.project.name,\n gcpProjectId: config.project.gcpProjectId,\n region: config.project.region,\n },\n },\n process.cwd()\n );\n if (!importResult.success) {\n console.log(chalk.yellow(`\\n ${importResult.message}\\n`));\n console.log(chalk.gray(' Continuing with deploy anyway...\\n'));\n }\n } else if (options.deleteConflicts) {\n console.log(chalk.yellow('\\n Auto-delete requires --force flag for safety.\\n'));\n console.log(chalk.gray(' Use: stacksolo deploy --force --delete-conflicts\\n'));\n return;\n } else {\n // Interactive prompt\n const resolution = await promptPreflightResolution(preflightResult.conflicts);\n\n if (resolution.action === 'cancel') {\n console.log(chalk.gray('\\n Deploy cancelled.\\n'));\n return;\n }\n\n if (resolution.action === 'list_details') {\n // Show details and re-prompt\n await executeResolution(\n resolution,\n preflightResult.conflicts,\n {\n project: {\n name: config.project.name,\n gcpProjectId: config.project.gcpProjectId,\n region: config.project.region,\n },\n },\n process.cwd()\n );\n const newResolution = await promptPreflightResolution(preflightResult.conflicts);\n if (newResolution.action === 'cancel') {\n console.log(chalk.gray('\\n Deploy cancelled.\\n'));\n return;\n }\n if (newResolution.action === 'change_prefix') {\n await executeResolution(\n newResolution,\n preflightResult.conflicts,\n {\n project: {\n name: config.project.name,\n gcpProjectId: config.project.gcpProjectId,\n region: config.project.region,\n },\n },\n process.cwd()\n );\n return;\n }\n await executeResolution(\n newResolution,\n preflightResult.conflicts,\n {\n project: {\n name: config.project.name,\n gcpProjectId: config.project.gcpProjectId,\n region: config.project.region,\n },\n },\n process.cwd()\n );\n } else if (resolution.action === 'change_prefix') {\n await executeResolution(\n resolution,\n preflightResult.conflicts,\n {\n project: {\n name: config.project.name,\n gcpProjectId: config.project.gcpProjectId,\n region: config.project.region,\n },\n },\n process.cwd()\n );\n return;\n } else {\n // import_all or delete_all\n const result = await executeResolution(\n resolution,\n preflightResult.conflicts,\n {\n project: {\n name: config.project.name,\n gcpProjectId: config.project.gcpProjectId,\n region: config.project.region,\n },\n },\n process.cwd()\n );\n if (!result.success && resolution.action !== 'import_all') {\n console.log(chalk.red(`\\n ${result.message}\\n`));\n return;\n }\n }\n }\n } else {\n preflightSpinner.succeed('No resource conflicts detected');\n }\n\n // Show any scan errors as warnings\n if (preflightResult.errors.length > 0) {\n console.log(chalk.yellow('\\n Some resource scans failed (non-critical):'));\n for (const err of preflightResult.errors) {\n console.log(chalk.gray(` - ${err}`));\n }\n console.log();\n }\n } catch (error) {\n preflightSpinner.warn('Could not complete pre-flight check (continuing anyway)');\n console.log(chalk.gray(` ${error}\\n`));\n }\n\n if (sessionId) await logPhaseEnd(sessionId, 'preflight', { project: config.project.name });\n }\n\n // GCP Kernel preflight checks (only on first attempt, not destroy, not preview)\n const hasGcpKernel = resolved.resources.some((r) => r.type === 'gcp-kernel:gcp_kernel');\n if (hasGcpKernel && !options.destroy && !options.preview && !options.skipPreflight && retryCount === 0) {\n const kernelSpinner = ora('Running GCP Kernel preflight checks...').start();\n\n try {\n const kernelResult = await runKernelPreflightCheck(\n config.project.gcpProjectId,\n process.cwd()\n );\n\n if (kernelResult.success) {\n kernelSpinner.succeed('GCP Kernel preflight checks passed');\n } else {\n kernelSpinner.fail('GCP Kernel preflight checks failed');\n displayKernelPreflightResults(kernelResult);\n\n // Ask if user wants to continue despite failures\n const inquirer = await import('inquirer');\n const { continueAnyway } = await inquirer.default.prompt([\n {\n type: 'confirm',\n name: 'continueAnyway',\n message: 'Continue with deploy anyway? (may fail)',\n default: false,\n },\n ]);\n\n if (!continueAnyway) {\n console.log(chalk.gray('\\n Deploy cancelled. Fix the issues above and try again.\\n'));\n return;\n }\n }\n\n // Show warnings even on success\n if (kernelResult.warnings.length > 0 && kernelResult.success) {\n console.log(chalk.yellow(' Warnings (will attempt auto-fix during deploy):'));\n for (const warning of kernelResult.warnings) {\n console.log(chalk.gray(` - ${warning}`));\n }\n console.log();\n }\n } catch (error) {\n kernelSpinner.warn('Could not complete GCP Kernel preflight check (continuing anyway)');\n console.log(chalk.gray(` ${error}\\n`));\n }\n }\n\n // Cloud Functions Gen2 preflight setup (only on first attempt, not destroy, not preview)\n const hasCloudFunctions = resolved.resources.some((r) => r.type === 'gcp-cdktf:cloud_function');\n if (hasCloudFunctions && !options.destroy && !options.preview && !options.skipPreflight && retryCount === 0) {\n console.log(progress.next());\n const cfSpinner = ora('Setting up Cloud Functions prerequisites...').start();\n\n try {\n const cfResult = await ensureCloudFunctionsPrerequisites(\n config.project.gcpProjectId,\n config.project.region\n );\n\n if (cfResult.success) {\n if (cfResult.actionsPerformed.length > 0) {\n cfSpinner.succeed(`Cloud Functions setup complete (${cfResult.actionsPerformed.length} actions)`);\n } else {\n cfSpinner.succeed('Cloud Functions prerequisites already configured');\n }\n } else {\n cfSpinner.warn('Some Cloud Functions setup steps had issues (continuing anyway)');\n for (const error of cfResult.errors) {\n console.log(chalk.yellow(` - ${error}`));\n }\n }\n } catch (error) {\n cfSpinner.warn('Could not complete Cloud Functions setup (continuing anyway)');\n console.log(chalk.gray(` ${error}\\n`));\n }\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(progress.next());\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 phase = options.destroy ? 'destroy' : options.preview ? 'preview' : 'apply';\n const projectName = config.project.name;\n\n // Show progress step (only on first attempt)\n if (retryCount === 0) {\n console.log(progress.next());\n }\n\n if (sessionId) await logPhaseStart(sessionId, phase, { project: projectName });\n\n // In verbose mode, we don't use a spinner - we show real-time output\n const spinner = options.verbose ? null : ora(`${action} infrastructure...`).start();\n const startTime = Date.now();\n const logs: string[] = [];\n\n if (options.verbose) {\n console.log(chalk.cyan(`\\n ${action} infrastructure (verbose mode)...\\n`));\n }\n\n // Log terraform start\n if (sessionId) {\n await logTerraformEvent(sessionId, 'apply_start', {\n preview: options.preview,\n destroy: options.destroy,\n resourceCount: resolved.resources.length,\n }, { project: projectName });\n }\n\n // Handle Kubernetes backend\n if (config.project.backend === 'kubernetes') {\n const k8sConfig = config.project.kubernetes!;\n\n // Handle --helm flag: generate Helm chart instead of raw manifests\n if (options.helm) {\n if (spinner) spinner.text = 'Loading Helm plugin...';\n\n // Load plugins including helm\n const plugins = config.project.plugins || [];\n if (!plugins.includes('@stacksolo/plugin-helm')) {\n plugins.push('@stacksolo/plugin-helm');\n }\n await loadPlugins(plugins);\n\n // Get the helm formatter\n const helmFormatter = getPluginFormatter('helm');\n if (!helmFormatter) {\n if (spinner) spinner.fail('Helm plugin not found');\n console.log(chalk.red('\\n Error: @stacksolo/plugin-helm not installed'));\n console.log(chalk.gray(' Add \"@stacksolo/plugin-helm\" to your plugins array in stacksolo.config.json\\n'));\n if (sessionId) await endSession(sessionId, 1);\n return;\n }\n\n if (spinner) spinner.text = 'Generating Helm chart...';\n\n // Generate helm chart\n const helmOutputDir = path.join(process.cwd(), '.stacksolo', 'helm-chart');\n const helmConfig = k8sConfig.helm || {};\n\n const helmFiles = helmFormatter.generate({\n projectName: config.project.name,\n resources: resolved.resources.map(r => ({\n id: r.id,\n type: r.type,\n name: r.name,\n config: r.config,\n dependsOn: r.dependsOn,\n network: r.network,\n })),\n config: {\n chartVersion: helmConfig.chartVersion || '0.1.0',\n appVersion: options.tag || helmConfig.appVersion || 'latest',\n ...helmConfig.values,\n },\n outputDir: helmOutputDir,\n });\n\n // Create output directories\n await fs.mkdir(path.join(helmOutputDir, 'templates'), { recursive: true });\n\n // Write all helm files\n for (const file of helmFiles) {\n const filePath = path.join(helmOutputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content);\n }\n\n if (spinner) spinner.succeed('Helm chart generated');\n\n console.log(chalk.cyan('\\n Chart:'), config.project.name);\n console.log(chalk.cyan(' Location:'), '.stacksolo/helm-chart/');\n console.log(chalk.cyan(' Files:'), helmFiles.length);\n\n if (!options.preview) {\n // Deploy with helm\n if (spinner) spinner.text = 'Deploying with Helm...';\n const namespace = k8sConfig.namespace || config.project.name;\n const releaseName = config.project.name;\n\n try {\n await execAsync(\n `helm upgrade --install ${releaseName} ${helmOutputDir} --namespace ${namespace} --create-namespace`\n );\n console.log(chalk.green('\\n Deployed successfully with Helm!'));\n console.log(chalk.gray(`\\n Release: ${releaseName}`));\n console.log(chalk.gray(` Namespace: ${namespace}\\n`));\n } catch (error) {\n console.log(chalk.red(`\\n Helm deployment failed: ${error}`));\n if (sessionId) await endSession(sessionId, 1);\n return;\n }\n } else {\n console.log(chalk.gray('\\n Preview mode - chart generated but not deployed'));\n console.log(chalk.gray('\\n To deploy manually:'));\n console.log(chalk.cyan(` helm install ${config.project.name} .stacksolo/helm-chart -n ${k8sConfig.namespace || config.project.name}`));\n console.log(chalk.gray('\\n For different environments:'));\n console.log(chalk.cyan(` helm install ${config.project.name}-dev .stacksolo/helm-chart -f values-dev.yaml`));\n console.log(chalk.cyan(` helm install ${config.project.name}-staging .stacksolo/helm-chart -f values-staging.yaml`));\n console.log(chalk.cyan(` helm install ${config.project.name}-prod .stacksolo/helm-chart -f values-prod.yaml\\n`));\n }\n\n if (sessionId) {\n await logPhaseEnd(sessionId, phase, { project: projectName });\n await endSession(sessionId, 0);\n }\n\n return;\n }\n\n // Check kubernetes connection (skip for preview - just generate manifests)\n if (!options.preview) {\n const connCheck = await checkKubernetesConnection(k8sConfig.context, k8sConfig.kubeconfig);\n if (!connCheck.connected) {\n if (spinner) spinner.fail('Cannot connect to Kubernetes cluster');\n console.log(chalk.red(`\\n Error: ${connCheck.error}`));\n console.log(chalk.gray('\\n Make sure kubectl is configured and can access your cluster.\\n'));\n if (sessionId) await endSession(sessionId, 1);\n return;\n }\n }\n\n // Build and push images (unless preview or skip-build)\n if (!options.preview && !options.skipBuild && !options.destroy) {\n if (spinner) spinner.text = 'Building container images...';\n const buildResult = await buildAndPushImages(\n config,\n resolved.resources,\n options.tag || 'latest',\n {\n onLog: (msg) => {\n logs.push(msg);\n if (options.verbose) console.log(chalk.gray(` ${msg}`));\n },\n onVerbose: (msg) => {\n if (options.verbose) console.log(chalk.gray(` ${msg}`));\n },\n verbose: options.verbose,\n }\n );\n\n if (!buildResult.success) {\n if (spinner) spinner.fail('Image build failed');\n console.log(chalk.red(`\\n Error: ${buildResult.error}`));\n if (sessionId) await endSession(sessionId, 1);\n return;\n }\n\n if (buildResult.images.length > 0) {\n logs.push(`Built ${buildResult.images.length} images`);\n }\n }\n\n // Deploy to Kubernetes\n if (spinner) spinner.text = `${action} to Kubernetes...`;\n const k8sResult = await deployToKubernetes({\n config,\n resources: resolved.resources,\n imageTag: options.tag || 'latest',\n dryRun: options.preview,\n verbose: options.verbose,\n onLog: (msg) => {\n logs.push(msg);\n if (options.verbose) console.log(chalk.gray(` ${msg}`));\n },\n onVerbose: (msg) => {\n if (options.verbose) console.log(chalk.gray(` ${msg}`));\n },\n });\n\n if (k8sResult.success) {\n const successMsg = options.preview ? 'Preview complete' : 'Deployed to Kubernetes successfully';\n if (spinner) {\n spinner.succeed(successMsg);\n } else {\n console.log(chalk.green(`\\n ✓ ${successMsg}`));\n }\n\n // Show outputs\n console.log(chalk.cyan('\\n Namespace:'), k8sResult.outputs.namespace);\n if (k8sResult.outputs.ingressUrl) {\n console.log(chalk.cyan(' Ingress URL:'), k8sResult.outputs.ingressUrl);\n }\n console.log(chalk.cyan(' Services:'), Object.keys(k8sResult.outputs.services).length);\n\n if (sessionId) {\n await logPhaseEnd(sessionId, phase, { project: projectName });\n await endSession(sessionId, 0);\n }\n\n console.log(chalk.gray(`\\n Manifests written to: .stacksolo/k8s-prod/\\n`));\n } else {\n if (spinner) spinner.fail('Kubernetes deployment failed');\n console.log(chalk.red(`\\n Error: ${k8sResult.error}`));\n if (sessionId) await endSession(sessionId, 1);\n }\n\n return;\n }\n\n // CDKTF/Terraform deploy (existing logic)\n const result = await deployConfig(config, STATE_DIR, {\n preview: options.preview,\n destroy: options.destroy,\n verbose: options.verbose,\n onLog: (msg) => {\n logs.push(msg);\n // Update spinner with elapsed time (only if not verbose)\n if (spinner) {\n const elapsed = Math.round((Date.now() - startTime) / 1000);\n spinner.text = `${action} infrastructure... (${elapsed}s)`;\n }\n },\n onVerbose: (msg) => {\n // Show real-time Terraform output in verbose mode\n console.log(chalk.gray(` ${msg}`));\n },\n });\n\n if (result.success) {\n const successMsg = `${options.destroy ? 'Destroyed' : options.preview ? 'Preview complete' : 'Deployed'} successfully`;\n if (spinner) {\n spinner.succeed(successMsg);\n } else {\n console.log(chalk.green(`\\n ✓ ${successMsg}`));\n }\n\n // Log success\n const durationMs = Date.now() - startTime;\n if (sessionId) {\n await logTerraformEvent(sessionId, 'apply_end', {\n exitCode: 0,\n durationMs,\n resourceCount: resolved.resources.length,\n }, { project: projectName });\n await logPhaseEnd(sessionId, phase, { project: projectName });\n await endSession(sessionId, 0);\n }\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 const failMsg = `${action} failed`;\n if (spinner) {\n spinner.fail(failMsg);\n } else {\n console.log(chalk.red(`\\n ✗ ${failMsg}`));\n }\n console.log(chalk.red(`\\n ${result.error}\\n`));\n\n // Log failure\n const durationMs = Date.now() - startTime;\n if (sessionId) {\n await logTerraformEvent(sessionId, 'apply_end', {\n exitCode: 1,\n durationMs,\n error: result.error?.slice(0, 500), // Truncate long errors\n }, { project: projectName });\n await logPhaseEnd(sessionId, phase, { project: projectName });\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, sessionId);\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, sessionId);\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 }, sessionId);\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, sessionId);\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 }, sessionId);\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 }, sessionId);\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 }, sessionId);\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 // End session with failure if we didn't already (via retry)\n if (sessionId) await endSession(sessionId, 1);\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, spawn } from 'child_process';\nimport { promisify } from 'util';\nimport type { StackSoloConfig } from '@stacksolo/blueprint';\nimport { resolveConfig } from '@stacksolo/blueprint';\nimport { registry } from '@stacksolo/core';\nimport { loadPlugins } from './plugin-loader.service';\n\nconst execAsync = promisify(exec);\n\n/**\n * Execute a command with real-time output streaming\n */\nasync function execStreaming(\n command: string,\n options: { cwd?: string; onOutput?: (line: string) => void; timeout?: number } = {}\n): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n return new Promise((resolve, reject) => {\n const { cwd, onOutput, timeout = 300000 } = options;\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n\n const child = spawn('sh', ['-c', command], {\n cwd,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n const timer = setTimeout(() => {\n timedOut = true;\n child.kill('SIGTERM');\n }, timeout);\n\n child.stdout?.on('data', (data: Buffer) => {\n const text = data.toString();\n stdout += text;\n if (onOutput) {\n const lines = text.split('\\n').filter((l) => l.trim());\n lines.forEach((line) => onOutput(line));\n }\n });\n\n child.stderr?.on('data', (data: Buffer) => {\n const text = data.toString();\n stderr += text;\n if (onOutput) {\n const lines = text.split('\\n').filter((l) => l.trim());\n lines.forEach((line) => onOutput(line));\n }\n });\n\n child.on('close', (code) => {\n clearTimeout(timer);\n if (timedOut) {\n reject(new Error(`Command timed out after ${timeout}ms`));\n } else {\n resolve({ stdout, stderr, exitCode: code ?? 0 });\n }\n });\n\n child.on('error', (err) => {\n clearTimeout(timer);\n reject(err);\n });\n });\n}\n\n/** Flag to track if plugins have been loaded */\nlet pluginsLoaded = false;\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 onVerbose?: (message: string) => void;\n preview?: boolean;\n destroy?: boolean;\n verbose?: 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, onVerbose, preview = false, destroy = false, verbose = false } = options;\n const logs: string[] = [];\n\n const log = (msg: string) => {\n logs.push(msg);\n onLog(msg);\n };\n\n // Verbose output handler for streaming command output\n const verboseLog = (msg: string) => {\n if (verbose && onVerbose) {\n onVerbose(msg);\n }\n };\n\n try {\n // Load plugins from config (registers providers/resources with registry)\n if (!pluginsLoaded) {\n await loadPlugins(config.project.plugins);\n pluginsLoaded = true;\n }\n\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, cloud_run, load_balancer, storage_website\n // Find all deployable resources\n const functionResources = resolved.resources.filter(r => r.type === 'gcp-cdktf:cloud_function');\n const containerResources = resolved.resources.filter(r => r.type === 'gcp-cdktf:cloud_run');\n const uiResources = resolved.resources.filter(r => r.type === 'gcp-cdktf:storage_website');\n const gcpKernelResources = resolved.resources.filter(r => r.type === 'gcp-kernel:gcp_kernel');\n\n if (functionResources.length === 0 && containerResources.length === 0 && uiResources.length === 0 && gcpKernelResources.length === 0) {\n throw new Error('CDKTF backend requires at least one cloud_function, cloud_run, gcp_kernel, 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.generate(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 // Note: Container builds are deferred until after Terraform creates the Artifact Registry\n // See the container build section after the first Terraform apply below\n const containersToBuild = !preview && containerResources.length > 0;\n\n // Build and push GCP Kernel image if configured (skip during preview)\n if (!preview && gcpKernelResources.length > 0) {\n // Configure Docker authentication for GCR (kernel uses gcr.io)\n log(`Configuring Docker authentication for gcr.io...`);\n try {\n await execAsync(`gcloud auth configure-docker gcr.io --quiet`, { timeout: 30000 });\n } catch (error) {\n log(`Warning: Failed to configure Docker auth for GCR: ${error instanceof Error ? error.message : error}`);\n }\n\n for (const kernelResource of gcpKernelResources) {\n const kernelProjectId = kernelResource.config.projectId as string || config.project.gcpProjectId;\n const kernelImage = `gcr.io/${kernelProjectId}/stacksolo-gcp-kernel:latest`;\n\n log(`Building GCP Kernel service...`);\n\n // Find the kernel service source in monorepo or node_modules\n const { getServiceSourcePath, getPluginService } = await import('./plugin-loader.service');\n const kernelService = getPluginService('gcp-kernel-service');\n let kernelSourceDir: string | null = null;\n\n if (kernelService) {\n kernelSourceDir = getServiceSourcePath(kernelService);\n }\n\n // Fall back to monorepo path if not found via plugin\n if (!kernelSourceDir) {\n const monorepoKernelPath = path.resolve(process.cwd(), '../stacksolo/plugins/gcp-kernel/service');\n try {\n await fs.access(path.join(monorepoKernelPath, 'Dockerfile'));\n kernelSourceDir = monorepoKernelPath;\n } catch {\n // Try relative to stacksolo install\n const nodeModulesPath = path.resolve(process.cwd(), 'node_modules/@stacksolo/plugin-gcp-kernel/service');\n try {\n await fs.access(path.join(nodeModulesPath, 'Dockerfile'));\n kernelSourceDir = nodeModulesPath;\n } catch {\n log(`Warning: Could not find GCP Kernel service source. Skipping build.`);\n log(`Expected at: ${monorepoKernelPath} or ${nodeModulesPath}`);\n continue;\n }\n }\n }\n\n log(`Found kernel service at: ${kernelSourceDir}`);\n\n // Build TypeScript\n const packageJsonPath = path.join(kernelSourceDir, 'package.json');\n try {\n const packageJsonContent = await fs.readFile(packageJsonPath, 'utf-8');\n const pkg = JSON.parse(packageJsonContent);\n\n // Install dependencies\n const nodeModulesPath = path.join(kernelSourceDir, 'node_modules');\n try {\n await fs.access(nodeModulesPath);\n } catch {\n log(`Installing dependencies for GCP Kernel...`);\n await execAsync('npm install', { cwd: kernelSourceDir, timeout: 120000 });\n }\n\n // Run build if script exists\n if (pkg.scripts?.build) {\n log(`Building GCP Kernel TypeScript...`);\n await execAsync('npm run build', { cwd: kernelSourceDir, timeout: 60000 });\n }\n } catch (buildError) {\n log(`Warning: Could not build kernel TypeScript: ${buildError instanceof Error ? buildError.message : buildError}`);\n }\n\n // Build Docker image with platform flag for Apple Silicon compatibility\n log(`Building Docker image: ${kernelImage}`);\n if (verbose) {\n const buildResult = await execStreaming(\n `docker build --platform linux/amd64 -t \"${kernelImage}\" .`,\n { cwd: kernelSourceDir, onOutput: verboseLog, timeout: 300000 }\n );\n if (buildResult.exitCode !== 0) {\n throw new Error(buildResult.stderr || 'Docker build failed');\n }\n } else {\n await execAsync(`docker build --platform linux/amd64 -t \"${kernelImage}\" .`, { cwd: kernelSourceDir, timeout: 300000 });\n }\n\n // Push to GCR\n log(`Pushing Docker image: ${kernelImage}`);\n if (verbose) {\n const pushResult = await execStreaming(`docker push \"${kernelImage}\"`, {\n onOutput: verboseLog,\n timeout: 300000,\n });\n if (pushResult.exitCode !== 0) {\n throw new Error(pushResult.stderr || 'Docker push failed');\n }\n } else {\n await execAsync(`docker push \"${kernelImage}\"`, { timeout: 300000 });\n }\n\n log(`GCP Kernel built and pushed successfully`);\n }\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 if (verbose) {\n await execStreaming('terraform init', { cwd: stackDir, onOutput: verboseLog });\n } else {\n await execAsync('terraform init', { cwd: stackDir });\n }\n\n if (destroy) {\n log('Destroying resources...');\n if (verbose) {\n const result = await execStreaming('terraform destroy -auto-approve', {\n cwd: stackDir,\n onOutput: verboseLog,\n timeout: 600000,\n });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || 'Terraform destroy failed');\n }\n } else {\n await execAsync('terraform destroy -auto-approve', { cwd: stackDir });\n }\n\n return {\n success: true,\n outputs: {},\n logs,\n };\n }\n\n if (preview) {\n log('Running terraform plan...');\n if (verbose) {\n await execStreaming('terraform plan', { cwd: stackDir, onOutput: verboseLog });\n } else {\n const { stdout } = await execAsync('terraform plan', { cwd: stackDir });\n log(stdout);\n }\n\n return {\n success: true,\n outputs: {},\n logs,\n };\n }\n\n // ==========================================================================\n // TWO-PHASE TERRAFORM APPLY FOR FRESH DEPLOYS\n // ==========================================================================\n // CRITICAL ORDERING: Container images need Artifact Registry to exist before\n // they can be pushed, but Cloud Run needs images to exist before it can start.\n //\n // Solution for fresh deploys:\n // 1. First terraform apply - Creates Artifact Registry (and other infra)\n // - This may fail on Cloud Run with \"Image not found\" error\n // 2. Build and push container images to the now-existing registry\n // 3. Second terraform apply - Updates Cloud Run with the available images\n //\n // Error patterns to catch (allow first apply to continue):\n // - \"Image 'xxx' not found\" - Image doesn't exist yet in registry\n // - \"Revision 'xxx' is not ready\" - Cloud Run can't start without image\n // ==========================================================================\n\n log('Applying Terraform...');\n let firstApplyFailed = false;\n try {\n if (verbose) {\n const result = await execStreaming('terraform apply -auto-approve', {\n cwd: stackDir,\n onOutput: verboseLog,\n timeout: 600000,\n });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || 'Terraform apply failed');\n }\n } else {\n await execAsync('terraform apply -auto-approve', { cwd: stackDir });\n }\n } catch (applyError) {\n // First apply may fail if Cloud Run references container images that don't exist yet\n // This is expected for fresh deploys - we'll build containers and apply again\n const errorStr = String(applyError);\n const isImageNotFoundError =\n (errorStr.includes('Image') && errorStr.includes('not found')) ||\n (errorStr.includes('Revision') && errorStr.includes('is not ready'));\n\n if (containersToBuild && isImageNotFoundError) {\n log('First apply partially completed - container images needed');\n firstApplyFailed = true;\n } else {\n throw applyError;\n }\n }\n\n // Build and push Docker images for each container (after registry exists)\n if (containersToBuild) {\n // Configure Docker authentication for Artifact Registry\n const region = config.project.region;\n log(`Configuring Docker authentication for ${region}-docker.pkg.dev...`);\n try {\n await execAsync(`gcloud auth configure-docker ${region}-docker.pkg.dev --quiet`, { timeout: 30000 });\n } catch (error) {\n log(`Warning: Failed to configure Docker auth: ${error instanceof Error ? error.message : error}`);\n log('You may need to run: gcloud auth configure-docker ' + region + '-docker.pkg.dev');\n }\n\n for (const containerResource of containerResources) {\n const containerName = containerResource.config.name as string;\n const image = containerResource.config.image as string;\n\n // Extract registry info from image URL\n // Format: {region}-docker.pkg.dev/{project}/{registry}/{image}:{tag}\n const imageMatch = image.match(/^(.+-docker\\.pkg\\.dev\\/[^/]+\\/[^/]+)\\//);\n if (!imageMatch) {\n log(`Skipping container ${containerName} - using pre-built image: ${image}`);\n continue;\n }\n\n // Find the source directory for the container\n // Default to containers/{short-name} where short-name is the name without project prefix\n const shortName = containerName.replace(`${config.project.name}-`, '');\n const sourceDir = path.resolve(process.cwd(), `containers/${shortName}`);\n\n // Check if source directory and Dockerfile exist\n try {\n await fs.access(path.join(sourceDir, 'Dockerfile'));\n } catch {\n log(`Skipping container ${containerName} - no Dockerfile found at ${sourceDir}`);\n continue;\n }\n\n log(`Building Docker image for ${containerName}...`);\n\n // Build the TypeScript code first\n const packageJsonPath = path.join(sourceDir, 'package.json');\n try {\n const packageJsonContent = await fs.readFile(packageJsonPath, 'utf-8');\n const pkg = JSON.parse(packageJsonContent);\n\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 ${containerName}...`);\n await execAsync('npm install', { cwd: sourceDir, timeout: 120000 });\n }\n\n // Run build if script exists\n if (pkg.scripts?.build) {\n log(`Building ${containerName}...`);\n await execAsync('npm run build', { cwd: sourceDir, timeout: 60000 });\n }\n } catch {\n // No package.json - continue with Docker build\n }\n\n // Build Docker image\n log(`Building Docker image: ${image}`);\n if (verbose) {\n const buildResult = await execStreaming(`docker build -t \"${image}\" .`, {\n cwd: sourceDir,\n onOutput: verboseLog,\n timeout: 300000,\n });\n if (buildResult.exitCode !== 0) {\n throw new Error(buildResult.stderr || 'Docker build failed');\n }\n } else {\n await execAsync(`docker build -t \"${image}\" .`, { cwd: sourceDir, timeout: 300000 });\n }\n\n // Push to Artifact Registry\n log(`Pushing Docker image: ${image}`);\n if (verbose) {\n const pushResult = await execStreaming(`docker push \"${image}\"`, {\n onOutput: verboseLog,\n timeout: 300000,\n });\n if (pushResult.exitCode !== 0) {\n throw new Error(pushResult.stderr || 'Docker push failed');\n }\n } else {\n await execAsync(`docker push \"${image}\"`, { timeout: 300000 });\n }\n\n log(`Container ${containerName} built and pushed successfully`);\n }\n\n // Apply Terraform again to update Cloud Run with the new images\n if (firstApplyFailed) {\n log('Re-applying Terraform with container images...');\n if (verbose) {\n const result = await execStreaming('terraform apply -auto-approve', {\n cwd: stackDir,\n onOutput: verboseLog,\n timeout: 600000,\n });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || 'Terraform re-apply failed');\n }\n } else {\n await execAsync('terraform apply -auto-approve', { cwd: stackDir });\n }\n }\n }\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 // Auto-enable IAP and set IAM bindings on backend services if zeroTrust is configured\n const iapResources = resolved.resources.filter(r => r.type === 'zero-trust:iap_web_backend');\n if (iapResources.length > 0) {\n log('Configuring IAP on backend services...');\n const gcpProjectId = config.project.gcpProjectId;\n\n // Step 0: Provision IAP service agent identity (required for IAP to invoke Cloud Run)\n // This creates service-{PROJECT_NUMBER}@gcp-sa-iap.iam.gserviceaccount.com\n log('Provisioning IAP service agent...');\n let iapServiceAccount: string | null = null;\n try {\n const { stdout: identityOutput } = await execAsync(\n `gcloud beta services identity create --service=iap.googleapis.com --project=${gcpProjectId} 2>&1`,\n { timeout: 60000 }\n );\n // Extract service account from output: \"Service identity created: service-xxx@gcp-sa-iap.iam.gserviceaccount.com\"\n const match = identityOutput.match(/service-\\d+@gcp-sa-iap\\.iam\\.gserviceaccount\\.com/);\n if (match) {\n iapServiceAccount = match[0];\n log(`IAP service agent: ${iapServiceAccount}`);\n }\n } catch (identityError) {\n const errMsg = identityError instanceof Error ? identityError.message : String(identityError);\n // Service account might already exist - try to extract from error or fetch project number\n if (errMsg.includes('already exists') || errMsg.includes('service-')) {\n const match = errMsg.match(/service-\\d+@gcp-sa-iap\\.iam\\.gserviceaccount\\.com/);\n if (match) {\n iapServiceAccount = match[0];\n log(`IAP service agent (existing): ${iapServiceAccount}`);\n }\n } else {\n log(`Warning: Failed to provision IAP service agent: ${errMsg}`);\n }\n }\n\n for (const iapResource of iapResources) {\n const backendServiceName = iapResource.config.backendService as string;\n const allowedMembers = iapResource.config.allowedMembers as string[];\n\n // Determine if this IAP config protects a Cloud Run service\n // The backend name follows pattern: {projectName}-lb-{projectName}-{serviceName}-backend\n // We need to extract the service name and check if it's a Cloud Run container\n const backendMatch = backendServiceName.match(/-([^-]+)-backend$/);\n const serviceName = backendMatch ? backendMatch[1] : null;\n const cloudRunService = serviceName\n ? containerResources.find(r => (r.config.name as string).endsWith(`-${serviceName}`))\n : null;\n\n // Grant IAP service account Cloud Run Invoker role if this protects a Cloud Run service\n if (iapServiceAccount && cloudRunService) {\n const cloudRunServiceName = cloudRunService.config.name as string;\n const region = config.project.region;\n log(`Granting IAP service account invoker role on Cloud Run: ${cloudRunServiceName}`);\n try {\n await execAsync(\n `gcloud run services add-iam-policy-binding ${cloudRunServiceName} --region=${region} --project=${gcpProjectId} --member=\"serviceAccount:${iapServiceAccount}\" --role=\"roles/run.invoker\"`,\n { timeout: 60000 }\n );\n } catch (invokerError) {\n const invokerErrMsg = invokerError instanceof Error ? invokerError.message : String(invokerError);\n if (!invokerErrMsg.includes('already exists')) {\n log(`Warning: Failed to grant invoker role: ${invokerErrMsg}`);\n }\n }\n }\n\n log(`Enabling IAP on backend: ${backendServiceName}`);\n\n try {\n // Step 1: Enable IAP on the backend service\n await execAsync(\n `gcloud compute backend-services update ${backendServiceName} --global --project=${gcpProjectId} --iap=enabled`,\n { timeout: 60000 }\n );\n log(`IAP enabled on ${backendServiceName}`);\n\n // Step 2: Set IAM policy for who can access via IAP\n // We need to add the IAP accessor role to each allowed member\n for (const member of allowedMembers) {\n log(`Granting IAP access to: ${member}`);\n try {\n await execAsync(\n `gcloud iap web add-iam-policy-binding --resource-type=backend-services --service=${backendServiceName} --project=${gcpProjectId} --member=\"${member}\" --role=\"roles/iap.httpsResourceAccessor\"`,\n { timeout: 60000 }\n );\n } catch (iamError) {\n // Try alternative approach - this handles both new and existing bindings\n const iamErrorMsg = iamError instanceof Error ? iamError.message : String(iamError);\n if (!iamErrorMsg.includes('already exists')) {\n log(`Warning: Failed to add IAP access for ${member}: ${iamErrorMsg}`);\n }\n }\n }\n log(`IAP configured on ${backendServiceName}`);\n } catch (iapError) {\n // Log warning but don't fail deployment - IAP can be enabled manually\n const iapErrorMsg = iapError instanceof Error ? iapError.message : String(iapError);\n log(`Warning: Failed to enable IAP on ${backendServiceName}: ${iapErrorMsg}`);\n log(`You can manually enable IAP: gcloud compute backend-services update ${backendServiceName} --global --iap=enabled`);\n }\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","/**\n * Kubernetes Deploy Service\n *\n * Handles building container images, generating production K8s manifests,\n * and deploying to Kubernetes clusters.\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { exec, spawn } from 'child_process';\nimport { promisify } from 'util';\nimport type { StackSoloConfig, ResolvedResource } from '@stacksolo/blueprint';\nimport {\n toYaml,\n generateYamlDocument,\n combineYamlDocuments,\n} from '../generators/k8s/yaml';\nimport type {\n K8sDeployment,\n K8sService,\n K8sNamespace,\n K8sConfigMap,\n K8sIngress,\n GeneratedManifest,\n} from '../generators/k8s/types';\n\nconst execAsync = promisify(exec);\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface K8sDeployOptions {\n config: StackSoloConfig;\n resources: ResolvedResource[];\n imageTag?: string;\n dryRun?: boolean;\n verbose?: boolean;\n onLog?: (message: string) => void;\n onVerbose?: (message: string) => void;\n}\n\nexport interface K8sDeployResult {\n success: boolean;\n manifests: string[];\n outputs: {\n namespace: string;\n services: Record<string, string>;\n ingressUrl?: string;\n };\n error?: string;\n}\n\nexport interface ImageBuildResult {\n success: boolean;\n images: string[];\n error?: string;\n}\n\n// =============================================================================\n// Main Deploy Function\n// =============================================================================\n\n/**\n * Deploy to Kubernetes cluster\n */\nexport async function deployToKubernetes(\n options: K8sDeployOptions\n): Promise<K8sDeployResult> {\n const { config, resources, imageTag = 'latest', dryRun = false, onLog = console.log, onVerbose } = options;\n const project = config.project;\n const k8sConfig = project.kubernetes!;\n const namespace = k8sConfig.namespace || project.name;\n const manifestDir = path.join(process.cwd(), '.stacksolo', 'k8s-prod');\n\n const log = (msg: string) => onLog(msg);\n const verbose = (msg: string) => onVerbose?.(msg);\n\n try {\n // Ensure manifest directory exists\n await fs.mkdir(manifestDir, { recursive: true });\n\n // Generate all manifests\n log('Generating Kubernetes manifests...');\n const manifests = await generateAllManifests(config, resources, imageTag);\n\n // Write manifests to disk\n const manifestPaths: string[] = [];\n for (const manifest of manifests) {\n const filePath = path.join(manifestDir, manifest.filename);\n await fs.writeFile(filePath, manifest.content, 'utf-8');\n manifestPaths.push(filePath);\n verbose?.(` Written: ${manifest.filename}`);\n }\n\n log(`Generated ${manifests.length} manifest files`);\n\n if (dryRun) {\n log('Dry run complete - manifests generated but not applied');\n return {\n success: true,\n manifests: manifestPaths,\n outputs: {\n namespace,\n services: {},\n },\n };\n }\n\n // Apply manifests to cluster\n log('Applying manifests to cluster...');\n const kubectlArgs = k8sConfig.context ? `--context ${k8sConfig.context}` : '';\n const kubeconfigArg = k8sConfig.kubeconfig ? `--kubeconfig ${k8sConfig.kubeconfig}` : '';\n\n await execAsync(\n `kubectl apply -f \"${manifestDir}\" ${kubectlArgs} ${kubeconfigArg}`.trim(),\n { timeout: 120000 }\n );\n\n // Wait for deployments to be ready\n log('Waiting for deployments to be ready...');\n const deploymentResources = resources.filter((r) => r.type === 'k8s:deployment');\n for (const deployment of deploymentResources) {\n const deploymentName = deployment.config.name as string;\n verbose?.(` Waiting for ${deploymentName}...`);\n try {\n await execAsync(\n `kubectl rollout status deployment/${deploymentName} -n ${namespace} --timeout=120s ${kubectlArgs} ${kubeconfigArg}`.trim(),\n { timeout: 130000 }\n );\n } catch (err) {\n log(`Warning: Deployment ${deploymentName} may not be ready yet`);\n }\n }\n\n // Get service URLs\n const services: Record<string, string> = {};\n const serviceResources = resources.filter((r) => r.type === 'k8s:service');\n for (const service of serviceResources) {\n const serviceName = service.config.name as string;\n services[serviceName] = `${serviceName}.${namespace}.svc.cluster.local`;\n }\n\n // Get ingress URL if configured\n let ingressUrl: string | undefined;\n if (k8sConfig.ingress?.host) {\n ingressUrl = k8sConfig.ingress.tlsSecretName\n ? `https://${k8sConfig.ingress.host}`\n : `http://${k8sConfig.ingress.host}`;\n }\n\n log('Deployment complete');\n\n return {\n success: true,\n manifests: manifestPaths,\n outputs: {\n namespace,\n services,\n ingressUrl,\n },\n };\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n manifests: [],\n outputs: { namespace, services: {} },\n error,\n };\n }\n}\n\n// =============================================================================\n// Image Building\n// =============================================================================\n\n/**\n * Build and push container images\n */\nexport async function buildAndPushImages(\n config: StackSoloConfig,\n resources: ResolvedResource[],\n tag: string = 'latest',\n options: {\n onLog?: (msg: string) => void;\n onVerbose?: (msg: string) => void;\n verbose?: boolean;\n } = {}\n): Promise<ImageBuildResult> {\n const { onLog = console.log, onVerbose, verbose = false } = options;\n const k8sConfig = config.project.kubernetes!;\n const registryUrl = k8sConfig.registry.url;\n const builtImages: string[] = [];\n\n const log = (msg: string) => onLog(msg);\n const verboseLog = (msg: string) => verbose && onVerbose?.(msg);\n\n try {\n // Find all deployment resources that need images built\n const deployments = resources.filter((r) => r.type === 'k8s:deployment');\n\n for (const deployment of deployments) {\n const deploymentConfig = deployment.config as Record<string, unknown>;\n const name = deploymentConfig.name as string;\n const sourceDir = deploymentConfig.sourceDir as string | undefined;\n const runtime = deploymentConfig.runtime as string | undefined;\n\n // Skip if no source directory (pre-built image)\n if (!sourceDir) {\n verboseLog?.(`Skipping ${name} - using existing image`);\n continue;\n }\n\n const fullSourceDir = path.resolve(process.cwd(), sourceDir);\n const imageUrl = `${registryUrl}/${name.split('-').pop()}:${tag}`;\n\n log(`Building image for ${name}...`);\n\n // Check if source directory exists\n try {\n await fs.access(fullSourceDir);\n } catch {\n throw new Error(`Source directory not found: ${fullSourceDir}`);\n }\n\n // Generate Dockerfile if needed (for functions)\n if (runtime && runtime.startsWith('nodejs')) {\n await generateFunctionDockerfile(fullSourceDir, runtime);\n }\n\n // Build image\n verboseLog?.(` docker build -t ${imageUrl} ${fullSourceDir}`);\n await execAsync(`docker build -t \"${imageUrl}\" \"${fullSourceDir}\"`, {\n timeout: 300000,\n });\n\n // Push image\n log(`Pushing ${imageUrl}...`);\n await execAsync(`docker push \"${imageUrl}\"`, { timeout: 300000 });\n\n builtImages.push(imageUrl);\n }\n\n return {\n success: true,\n images: builtImages,\n };\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n images: builtImages,\n error,\n };\n }\n}\n\n/**\n * Generate Dockerfile for function deployments\n */\nasync function generateFunctionDockerfile(\n sourceDir: string,\n runtime: string\n): Promise<void> {\n const dockerfilePath = path.join(sourceDir, 'Dockerfile');\n\n // Check if Dockerfile already exists\n try {\n await fs.access(dockerfilePath);\n return; // Dockerfile exists, skip generation\n } catch {\n // Generate Dockerfile\n }\n\n const nodeVersion = runtime === 'nodejs20' ? '20' : '18';\n\n const dockerfile = `# Auto-generated Dockerfile for StackSolo function\nFROM node:${nodeVersion}-slim\n\nWORKDIR /app\n\n# Install dependencies\nCOPY package*.json ./\nRUN npm ci --only=production\n\n# Copy source\nCOPY . .\n\n# Build if needed\nRUN if [ -f \"tsconfig.json\" ]; then npm run build 2>/dev/null || true; fi\n\n# Set environment\nENV NODE_ENV=production\nENV PORT=8080\n\n# Use functions-framework to serve\nRUN npm install --save @google-cloud/functions-framework\n\n# Start the function\nCMD [\"npx\", \"functions-framework\", \"--target=api\", \"--port=8080\"]\n`;\n\n await fs.writeFile(dockerfilePath, dockerfile, 'utf-8');\n}\n\n// =============================================================================\n// Manifest Generation\n// =============================================================================\n\n/**\n * Generate all K8s manifests from resolved resources\n */\nasync function generateAllManifests(\n config: StackSoloConfig,\n resources: ResolvedResource[],\n imageTag: string\n): Promise<GeneratedManifest[]> {\n const manifests: GeneratedManifest[] = [];\n const project = config.project;\n const k8sConfig = project.kubernetes!;\n\n for (const resource of resources) {\n switch (resource.type) {\n case 'k8s:namespace':\n manifests.push(generateNamespaceManifest(resource));\n break;\n case 'k8s:configmap':\n manifests.push(generateConfigMapManifest(resource));\n break;\n case 'k8s:deployment':\n manifests.push(generateDeploymentManifest(resource, k8sConfig, imageTag));\n break;\n case 'k8s:service':\n manifests.push(generateServiceManifest(resource));\n break;\n case 'k8s:ingress':\n manifests.push(generateIngressManifest(resource));\n break;\n }\n }\n\n return manifests;\n}\n\n/**\n * Generate Namespace manifest\n */\nfunction generateNamespaceManifest(resource: ResolvedResource): GeneratedManifest {\n const config = resource.config as { name: string; labels?: Record<string, string> };\n\n const namespace: K8sNamespace = {\n apiVersion: 'v1',\n kind: 'Namespace',\n metadata: {\n name: config.name,\n labels: config.labels,\n },\n };\n\n return {\n filename: 'namespace.yaml',\n content: generateYamlDocument(namespace as Record<string, unknown>, 'Kubernetes Namespace'),\n };\n}\n\n/**\n * Generate ConfigMap manifest\n */\nfunction generateConfigMapManifest(resource: ResolvedResource): GeneratedManifest {\n const config = resource.config as { name: string; namespace: string; data: Record<string, string> };\n\n const configMap: K8sConfigMap = {\n apiVersion: 'v1',\n kind: 'ConfigMap',\n metadata: {\n name: config.name,\n namespace: config.namespace,\n },\n data: config.data,\n };\n\n return {\n filename: 'configmap.yaml',\n content: generateYamlDocument(configMap as Record<string, unknown>, 'Configuration'),\n };\n}\n\n/**\n * Generate Deployment manifest with production settings\n */\nfunction generateDeploymentManifest(\n resource: ResolvedResource,\n k8sConfig: NonNullable<StackSoloConfig['project']['kubernetes']>,\n imageTag: string\n): GeneratedManifest {\n const config = resource.config as {\n name: string;\n namespace: string;\n image: string;\n port: number;\n replicas: number;\n memory: string;\n cpu: string;\n env?: Record<string, string>;\n imagePullSecret?: string;\n };\n\n // Update image tag\n const image = config.image.includes(':') ? config.image : `${config.image}:${imageTag}`;\n\n // Build environment variables\n const envVars = Object.entries(config.env || {}).map(([name, value]) => ({\n name,\n value,\n }));\n\n const deployment: K8sDeployment = {\n apiVersion: 'apps/v1',\n kind: 'Deployment',\n metadata: {\n name: config.name,\n namespace: config.namespace,\n labels: {\n app: config.name,\n 'app.kubernetes.io/name': config.name,\n 'app.kubernetes.io/managed-by': 'stacksolo',\n },\n },\n spec: {\n replicas: config.replicas,\n selector: {\n matchLabels: {\n app: config.name,\n },\n },\n template: {\n metadata: {\n labels: {\n app: config.name,\n 'app.kubernetes.io/name': config.name,\n },\n },\n spec: {\n containers: [\n {\n name: config.name,\n image,\n imagePullPolicy: 'Always',\n ports: [\n {\n containerPort: config.port,\n name: 'http',\n },\n ],\n env: envVars.length > 0 ? envVars : undefined,\n resources: {\n limits: {\n memory: config.memory,\n cpu: config.cpu,\n },\n requests: {\n memory: k8sConfig.resources?.defaultMemoryRequest || '128Mi',\n cpu: k8sConfig.resources?.defaultCpuRequest || '100m',\n },\n },\n },\n ],\n },\n },\n },\n };\n\n // Add imagePullSecrets if configured\n if (config.imagePullSecret) {\n (deployment.spec.template.spec as Record<string, unknown>).imagePullSecrets = [\n { name: config.imagePullSecret },\n ];\n }\n\n // Add liveness and readiness probes\n const container = deployment.spec.template.spec.containers[0] as Record<string, unknown>;\n container.livenessProbe = {\n httpGet: {\n path: '/health',\n port: 'http',\n },\n initialDelaySeconds: 10,\n periodSeconds: 10,\n failureThreshold: 3,\n };\n container.readinessProbe = {\n httpGet: {\n path: '/health',\n port: 'http',\n },\n initialDelaySeconds: 5,\n periodSeconds: 5,\n failureThreshold: 3,\n };\n\n return {\n filename: `deployment-${config.name}.yaml`,\n content: generateYamlDocument(\n deployment as unknown as Record<string, unknown>,\n `Deployment: ${config.name}`\n ),\n };\n}\n\n/**\n * Generate Service manifest\n */\nfunction generateServiceManifest(resource: ResolvedResource): GeneratedManifest {\n const config = resource.config as {\n name: string;\n namespace: string;\n port: number;\n targetPort: number;\n selector: string;\n };\n\n const service: K8sService = {\n apiVersion: 'v1',\n kind: 'Service',\n metadata: {\n name: config.name,\n namespace: config.namespace,\n labels: {\n app: config.name,\n 'app.kubernetes.io/name': config.name,\n 'app.kubernetes.io/managed-by': 'stacksolo',\n },\n },\n spec: {\n selector: {\n app: config.selector,\n },\n ports: [\n {\n port: config.port,\n targetPort: config.targetPort,\n name: 'http',\n },\n ],\n type: 'ClusterIP',\n },\n };\n\n return {\n filename: `service-${config.name}.yaml`,\n content: generateYamlDocument(service as Record<string, unknown>, `Service: ${config.name}`),\n };\n}\n\n/**\n * Generate Ingress manifest\n */\nfunction generateIngressManifest(resource: ResolvedResource): GeneratedManifest {\n const config = resource.config as {\n name: string;\n namespace: string;\n className: string;\n host?: string;\n tlsSecretName?: string;\n annotations?: Record<string, string>;\n routes: Array<{ path: string; serviceName: string; servicePort: number }>;\n };\n\n const ingress: K8sIngress = {\n apiVersion: 'networking.k8s.io/v1',\n kind: 'Ingress',\n metadata: {\n name: config.name,\n namespace: config.namespace,\n labels: {\n 'app.kubernetes.io/managed-by': 'stacksolo',\n },\n annotations: config.annotations,\n },\n spec: {\n ingressClassName: config.className,\n rules: [\n {\n host: config.host,\n http: {\n paths: config.routes.map((route) => ({\n path: route.path.replace('/*', ''),\n pathType: 'Prefix' as const,\n backend: {\n service: {\n name: route.serviceName,\n port: {\n number: route.servicePort,\n },\n },\n },\n })),\n },\n },\n ],\n },\n };\n\n // Add TLS if configured\n if (config.tlsSecretName && config.host) {\n (ingress.spec as Record<string, unknown>).tls = [\n {\n hosts: [config.host],\n secretName: config.tlsSecretName,\n },\n ];\n }\n\n return {\n filename: 'ingress.yaml',\n content: generateYamlDocument(ingress as Record<string, unknown>, 'Ingress'),\n };\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Check if kubectl is available and can connect to a cluster\n */\nexport async function checkKubernetesConnection(\n context?: string,\n kubeconfig?: string\n): Promise<{ connected: boolean; error?: string }> {\n try {\n const contextArg = context ? `--context ${context}` : '';\n const kubeconfigArg = kubeconfig ? `--kubeconfig ${kubeconfig}` : '';\n\n await execAsync(\n `kubectl cluster-info ${contextArg} ${kubeconfigArg}`.trim(),\n { timeout: 10000 }\n );\n\n return { connected: true };\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n return { connected: false, error };\n }\n}\n\n/**\n * Preview K8s deployment (dry-run)\n */\nexport async function previewKubernetesDeployment(\n options: K8sDeployOptions\n): Promise<K8sDeployResult> {\n return deployToKubernetes({ ...options, dryRun: true });\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 * 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","import path from 'path';\nimport * as fs from 'fs/promises';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport {\n GcpResource,\n TerraformState,\n findTerraformStatePath,\n parseTerraformState,\n isResourceInState,\n} from './terraform-state.service';\nimport { scanGcpResources, ScanOptions } from './gcp-scanner.service';\nimport {\n ConflictResult,\n StackSoloConfig,\n importConflicts,\n getImportCommand,\n} from './terraform-import.service';\n\nconst execAsync = promisify(exec);\n\nexport interface PreflightOptions {\n skipPreflight?: boolean;\n autoImport?: boolean;\n autoDelete?: boolean;\n}\n\nexport interface PreflightResult {\n hasConflicts: boolean;\n conflicts: ConflictResult[];\n gcpResources: GcpResource[];\n terraformStateResources: string[];\n errors: string[];\n}\n\nexport type ResolutionAction =\n | 'import_all'\n | 'delete_all'\n | 'change_prefix'\n | 'list_details'\n | 'cancel';\n\nexport interface ResolutionChoice {\n action: ResolutionAction;\n newPrefix?: string;\n}\n\n/**\n * Group conflicts by resource type for display\n */\nfunction groupByType(\n conflicts: ConflictResult[]\n): Record<string, ConflictResult[]> {\n const groups: Record<string, ConflictResult[]> = {};\n for (const conflict of conflicts) {\n const type = conflict.resource.type;\n if (!groups[type]) {\n groups[type] = [];\n }\n groups[type].push(conflict);\n }\n return groups;\n}\n\n/**\n * Get human-readable label for resource type\n */\nfunction getTypeLabel(type: string): string {\n const labels: Record<string, string> = {\n cloudfunctions: 'Cloud Functions',\n cloudrun: 'Cloud Run Services',\n storage: 'Storage Buckets',\n vpc_network: 'VPC Networks',\n vpc_connector: 'VPC Connectors',\n artifact_registry: 'Artifact Registries',\n global_address: 'Global Addresses',\n url_map: 'URL Maps',\n backend_service: 'Backend Services',\n backend_bucket: 'Backend Buckets',\n forwarding_rule: 'Forwarding Rules',\n target_http_proxy: 'HTTP Proxies',\n target_https_proxy: 'HTTPS Proxies',\n network_endpoint_group: 'Network Endpoint Groups',\n ssl_certificate: 'SSL Certificates',\n };\n return labels[type] || type;\n}\n\n/**\n * Run the complete pre-flight check\n */\nexport async function runPreflightCheck(\n config: StackSoloConfig,\n cwd: string = process.cwd()\n): Promise<PreflightResult> {\n const projectName = config.project.name;\n const gcpProjectId = config.project.gcpProjectId;\n const region = config.project.region;\n\n // 1. Scan GCP for existing resources\n const scanOptions: ScanOptions = {\n projectId: gcpProjectId,\n region,\n projectName,\n };\n\n const scanResult = await scanGcpResources(scanOptions);\n\n // 2. Read Terraform state\n const statePath = findTerraformStatePath(cwd);\n const tfState: TerraformState | null = statePath\n ? parseTerraformState(statePath)\n : null;\n\n // 3. Compare GCP resources against Terraform state\n const conflicts: ConflictResult[] = [];\n\n for (const gcpResource of scanResult.resources) {\n const stateCheck = tfState\n ? isResourceInState(gcpResource, tfState)\n : { inState: false };\n\n if (!stateCheck.inState) {\n conflicts.push({\n resource: gcpResource,\n inTerraformState: false,\n terraformAddress: stateCheck.terraformAddress,\n expectedName: gcpResource.name,\n conflictType: 'exists_not_in_state',\n });\n }\n }\n\n return {\n hasConflicts: conflicts.length > 0,\n conflicts,\n gcpResources: scanResult.resources,\n terraformStateResources: tfState?.resources.map((r) => r.address) || [],\n errors: scanResult.errors,\n };\n}\n\n/**\n * Display conflict summary\n */\nexport function displayConflictSummary(conflicts: ConflictResult[]): void {\n console.log(\n chalk.yellow(`\\n Found ${conflicts.length} existing GCP resource(s) not in Terraform state:\\n`)\n );\n\n const byType = groupByType(conflicts);\n for (const [type, items] of Object.entries(byType)) {\n console.log(chalk.white(` ${getTypeLabel(type)} (${items.length}):`));\n const displayItems = items.slice(0, 3);\n for (const item of displayItems) {\n console.log(chalk.gray(` - ${item.resource.name}`));\n }\n if (items.length > 3) {\n console.log(chalk.gray(` ... and ${items.length - 3} more`));\n }\n }\n console.log();\n}\n\n/**\n * Prompt user for conflict resolution strategy\n */\nexport async function promptConflictResolution(\n conflicts: ConflictResult[]\n): Promise<ResolutionChoice> {\n displayConflictSummary(conflicts);\n\n const { action } = await inquirer.prompt([\n {\n type: 'list',\n name: 'action',\n message: 'How would you like to resolve these conflicts?',\n choices: [\n {\n name: 'Import all (add existing resources to Terraform state)',\n value: 'import_all',\n },\n {\n name: 'Delete all (remove from GCP, let Terraform recreate)',\n value: 'delete_all',\n },\n {\n name: 'Change project prefix (deploy with new naming)',\n value: 'change_prefix',\n },\n {\n name: 'List details (show full resource info)',\n value: 'list_details',\n },\n {\n name: 'Cancel',\n value: 'cancel',\n },\n ],\n },\n ]);\n\n if (action === 'change_prefix') {\n const { newPrefix } = await inquirer.prompt([\n {\n type: 'input',\n name: 'newPrefix',\n message: 'Enter new project prefix (e.g., \"my-project-v2\"):',\n validate: (input: string) => {\n if (!/^[a-z][a-z0-9-]{0,30}$/.test(input)) {\n return 'Must start with lowercase letter, contain only lowercase letters, numbers, and hyphens';\n }\n return true;\n },\n },\n ]);\n return { action: 'change_prefix', newPrefix };\n }\n\n return { action };\n}\n\n/**\n * Display detailed resource list\n */\nexport function displayResourceDetails(\n conflicts: ConflictResult[],\n config: StackSoloConfig\n): void {\n console.log(chalk.white('\\n Resource Details:\\n'));\n\n for (const conflict of conflicts) {\n console.log(\n chalk.cyan(` ${getTypeLabel(conflict.resource.type)}: `) +\n chalk.white(conflict.resource.name)\n );\n if (conflict.resource.location) {\n console.log(chalk.gray(` Location: ${conflict.resource.location}`));\n }\n if (conflict.resource.createdAt) {\n console.log(chalk.gray(` Created: ${conflict.resource.createdAt}`));\n }\n console.log(chalk.gray(` Import: ${getImportCommand(conflict.resource, config)}`));\n console.log();\n }\n}\n\n/**\n * Execute the chosen resolution strategy\n */\n// =============================================================================\n// GCP Kernel Preflight Checks\n// =============================================================================\n\nexport interface KernelPreflightResult {\n success: boolean;\n checks: KernelPreflightCheck[];\n errors: string[];\n warnings: string[];\n}\n\nexport interface KernelPreflightCheck {\n name: string;\n status: 'pass' | 'fail' | 'warn';\n message: string;\n fix?: string;\n}\n\n/**\n * Run preflight checks specific to GCP Kernel deployment\n * Validates Docker, gcloud auth, and kernel source availability\n */\nexport async function runKernelPreflightCheck(\n gcpProjectId: string,\n cwd: string = process.cwd()\n): Promise<KernelPreflightResult> {\n const checks: KernelPreflightCheck[] = [];\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Check 1: Docker installed and running\n try {\n await execAsync('docker info', { timeout: 10000 });\n checks.push({\n name: 'Docker',\n status: 'pass',\n message: 'Docker is installed and running',\n });\n } catch (error) {\n const errorStr = String(error);\n if (errorStr.includes('Cannot connect') || errorStr.includes('not running')) {\n checks.push({\n name: 'Docker',\n status: 'fail',\n message: 'Docker daemon is not running',\n fix: 'Start Docker Desktop or run: sudo systemctl start docker',\n });\n errors.push('Docker daemon is not running');\n } else if (errorStr.includes('command not found') || errorStr.includes('not recognized')) {\n checks.push({\n name: 'Docker',\n status: 'fail',\n message: 'Docker is not installed',\n fix: 'Install Docker from https://docs.docker.com/get-docker/',\n });\n errors.push('Docker is not installed');\n } else {\n checks.push({\n name: 'Docker',\n status: 'fail',\n message: `Docker check failed: ${errorStr.slice(0, 100)}`,\n fix: 'Ensure Docker is installed and running',\n });\n errors.push('Docker check failed');\n }\n }\n\n // Check 2: gcloud CLI installed\n try {\n await execAsync('gcloud --version', { timeout: 10000 });\n checks.push({\n name: 'gcloud CLI',\n status: 'pass',\n message: 'gcloud CLI is installed',\n });\n } catch {\n checks.push({\n name: 'gcloud CLI',\n status: 'fail',\n message: 'gcloud CLI is not installed',\n fix: 'Install from https://cloud.google.com/sdk/docs/install',\n });\n errors.push('gcloud CLI is not installed');\n }\n\n // Check 3: gcloud authenticated\n try {\n const { stdout } = await execAsync('gcloud auth list --filter=status:ACTIVE --format=\"value(account)\"', { timeout: 10000 });\n if (stdout.trim()) {\n checks.push({\n name: 'GCP Authentication',\n status: 'pass',\n message: `Authenticated as ${stdout.trim()}`,\n });\n } else {\n checks.push({\n name: 'GCP Authentication',\n status: 'fail',\n message: 'Not authenticated with gcloud',\n fix: 'Run: gcloud auth login',\n });\n errors.push('Not authenticated with gcloud');\n }\n } catch {\n checks.push({\n name: 'GCP Authentication',\n status: 'warn',\n message: 'Could not verify gcloud authentication',\n fix: 'Run: gcloud auth login',\n });\n warnings.push('Could not verify gcloud authentication');\n }\n\n // Check 4: Docker auth for GCR configured\n try {\n // Check if gcr.io is in Docker config\n const dockerConfigPath = path.join(process.env.HOME || '~', '.docker', 'config.json');\n const configContent = await fs.readFile(dockerConfigPath, 'utf-8');\n const dockerConfig = JSON.parse(configContent);\n\n const hasGcr =\n dockerConfig.credHelpers?.['gcr.io'] === 'gcloud' ||\n dockerConfig.auths?.['gcr.io'] ||\n dockerConfig.auths?.['https://gcr.io'];\n\n if (hasGcr) {\n checks.push({\n name: 'Docker GCR Auth',\n status: 'pass',\n message: 'Docker is configured to authenticate with gcr.io',\n });\n } else {\n checks.push({\n name: 'Docker GCR Auth',\n status: 'warn',\n message: 'Docker may not be configured for gcr.io',\n fix: 'Run: gcloud auth configure-docker gcr.io',\n });\n warnings.push('Docker may not be configured for gcr.io (will be auto-configured during deploy)');\n }\n } catch {\n checks.push({\n name: 'Docker GCR Auth',\n status: 'warn',\n message: 'Could not verify Docker GCR configuration',\n fix: 'Run: gcloud auth configure-docker gcr.io',\n });\n warnings.push('Could not verify Docker GCR configuration (will be auto-configured during deploy)');\n }\n\n // Check 5: Kernel service source exists\n // Try multiple locations where the kernel service could be\n const possiblePaths = [\n path.resolve(cwd, '../stacksolo/plugins/gcp-kernel/service'),\n path.resolve(cwd, 'node_modules/@stacksolo/plugin-gcp-kernel/service'),\n path.resolve(cwd, 'plugins/gcp-kernel/service'),\n ];\n\n let kernelSourceFound = false;\n let foundPath = '';\n\n for (const sourcePath of possiblePaths) {\n try {\n await fs.access(path.join(sourcePath, 'Dockerfile'));\n await fs.access(path.join(sourcePath, 'package.json'));\n kernelSourceFound = true;\n foundPath = sourcePath;\n break;\n } catch {\n // Try next path\n }\n }\n\n if (kernelSourceFound) {\n checks.push({\n name: 'Kernel Source',\n status: 'pass',\n message: `Found kernel service at ${foundPath}`,\n });\n } else {\n checks.push({\n name: 'Kernel Source',\n status: 'fail',\n message: 'Could not find GCP Kernel service source',\n fix: 'Ensure @stacksolo/plugin-gcp-kernel is installed or kernel source is in plugins/gcp-kernel/service',\n });\n errors.push('Could not find GCP Kernel service source');\n }\n\n // Check 6: Project has required APIs enabled (best effort)\n if (gcpProjectId) {\n try {\n const { stdout } = await execAsync(\n `gcloud services list --project=${gcpProjectId} --format=\"value(config.name)\" --filter=\"config.name:(run.googleapis.com OR cloudbuild.googleapis.com OR firestore.googleapis.com)\"`,\n { timeout: 30000 }\n );\n\n const enabledApis = stdout.trim().split('\\n').filter(Boolean);\n const requiredApis = ['run.googleapis.com', 'cloudbuild.googleapis.com', 'firestore.googleapis.com'];\n const missingApis = requiredApis.filter(api => !enabledApis.includes(api));\n\n if (missingApis.length === 0) {\n checks.push({\n name: 'GCP APIs',\n status: 'pass',\n message: 'Required GCP APIs are enabled',\n });\n } else {\n checks.push({\n name: 'GCP APIs',\n status: 'warn',\n message: `Missing APIs: ${missingApis.join(', ')}`,\n fix: `Run: gcloud services enable ${missingApis.join(' ')} --project=${gcpProjectId}`,\n });\n warnings.push(`Some GCP APIs may need to be enabled: ${missingApis.join(', ')}`);\n }\n } catch {\n checks.push({\n name: 'GCP APIs',\n status: 'warn',\n message: 'Could not verify GCP API status',\n });\n warnings.push('Could not verify GCP API status');\n }\n }\n\n return {\n success: errors.length === 0,\n checks,\n errors,\n warnings,\n };\n}\n\n/**\n * Display kernel preflight results\n */\nexport function displayKernelPreflightResults(result: KernelPreflightResult): void {\n console.log(chalk.cyan('\\n GCP Kernel Preflight Checks:\\n'));\n\n for (const check of result.checks) {\n const icon = check.status === 'pass' ? chalk.green('✓') :\n check.status === 'warn' ? chalk.yellow('⚠') :\n chalk.red('✗');\n\n console.log(` ${icon} ${chalk.white(check.name)}: ${check.message}`);\n\n if (check.fix && check.status !== 'pass') {\n console.log(chalk.gray(` Fix: ${check.fix}`));\n }\n }\n\n if (result.errors.length > 0) {\n console.log(chalk.red('\\n Errors that must be fixed before deploy:'));\n for (const error of result.errors) {\n console.log(chalk.red(` - ${error}`));\n }\n }\n\n if (result.warnings.length > 0) {\n console.log(chalk.yellow('\\n Warnings (may auto-resolve during deploy):'));\n for (const warning of result.warnings) {\n console.log(chalk.yellow(` - ${warning}`));\n }\n }\n\n console.log();\n}\n\nexport async function executeResolution(\n resolution: ResolutionChoice,\n conflicts: ConflictResult[],\n config: StackSoloConfig,\n cwd: string = process.cwd(),\n deleteResourceFn?: (resource: GcpResource, config: StackSoloConfig) => Promise<boolean>\n): Promise<{ success: boolean; message?: string }> {\n switch (resolution.action) {\n case 'import_all': {\n const stackDir = path.join(\n cwd,\n '.stacksolo',\n 'cdktf',\n 'cdktf.out',\n 'stacks',\n 'main'\n );\n\n console.log(chalk.gray('\\n Importing resources into Terraform state...\\n'));\n\n const importResult = await importConflicts(conflicts, config, stackDir);\n\n if (importResult.success.length > 0) {\n console.log(\n chalk.green(` ✓ Imported ${importResult.success.length} resource(s)`)\n );\n }\n\n if (importResult.failed.length > 0) {\n console.log(\n chalk.yellow(\n ` ⚠ Failed to import ${importResult.failed.length} resource(s):`\n )\n );\n for (const fail of importResult.failed) {\n console.log(chalk.gray(` - ${fail.name}: ${fail.error}`));\n }\n }\n\n return {\n success: importResult.failed.length === 0,\n message:\n importResult.failed.length > 0\n ? `Failed to import ${importResult.failed.length} resource(s)`\n : undefined,\n };\n }\n\n case 'delete_all': {\n if (!deleteResourceFn) {\n console.log(\n chalk.yellow(\n '\\n Delete functionality requires integration with deploy command.\\n'\n )\n );\n console.log(chalk.gray(' Use --force flag with deploy to delete and recreate.\\n'));\n return { success: false, message: 'Delete not available in standalone mode' };\n }\n\n console.log(chalk.gray('\\n Deleting resources from GCP...\\n'));\n\n let successCount = 0;\n let failCount = 0;\n\n for (const conflict of conflicts) {\n const deleted = await deleteResourceFn(conflict.resource, config);\n if (deleted) {\n successCount++;\n console.log(chalk.green(` ✓ Deleted ${conflict.resource.name}`));\n } else {\n failCount++;\n console.log(chalk.red(` ✗ Failed to delete ${conflict.resource.name}`));\n }\n }\n\n return {\n success: failCount === 0,\n message: failCount > 0 ? `Failed to delete ${failCount} resource(s)` : undefined,\n };\n }\n\n case 'change_prefix': {\n console.log(\n chalk.yellow(`\\n To use prefix \"${resolution.newPrefix}\", update your config:\\n`)\n );\n console.log(chalk.white(` .stacksolo/stacksolo.config.json:`));\n console.log(chalk.cyan(` \"name\": \"${resolution.newPrefix}\"`));\n console.log();\n console.log(\n chalk.gray(\n ' After updating, run deploy again. Existing resources will remain unchanged.\\n'\n )\n );\n return { success: false, message: 'Config update required' };\n }\n\n case 'list_details': {\n displayResourceDetails(conflicts, config);\n return { success: false, message: 'Showing details only' };\n }\n\n case 'cancel':\n default:\n return { success: false, message: 'Cancelled by user' };\n }\n}\n\n// =============================================================================\n// Cloud Functions Gen2 Preflight Setup\n// =============================================================================\n\nexport interface CloudFunctionsPreflightResult {\n success: boolean;\n actionsPerformed: string[];\n errors: string[];\n}\n\n/**\n * Ensure all required APIs and IAM permissions are configured for Cloud Functions Gen2.\n * This runs proactively before deploy to avoid permission errors during build.\n */\nexport async function ensureCloudFunctionsPrerequisites(\n gcpProjectId: string,\n region: string\n): Promise<CloudFunctionsPreflightResult> {\n const actionsPerformed: string[] = [];\n const errors: string[] = [];\n\n // 1. Get project number\n let projectNumber: string;\n try {\n const { stdout } = await execAsync(\n `gcloud projects describe ${gcpProjectId} --format=\"value(projectNumber)\"`\n );\n projectNumber = stdout.trim();\n } catch (error) {\n errors.push(`Failed to get project number: ${error}`);\n return { success: false, actionsPerformed, errors };\n }\n\n // 2. Enable required APIs\n const requiredApis = [\n 'cloudfunctions.googleapis.com',\n 'cloudbuild.googleapis.com',\n 'run.googleapis.com',\n 'artifactregistry.googleapis.com',\n 'vpcaccess.googleapis.com',\n 'compute.googleapis.com',\n ];\n\n for (const api of requiredApis) {\n try {\n await execAsync(\n `gcloud services enable ${api} --project=${gcpProjectId} --quiet`,\n { timeout: 60000 }\n );\n actionsPerformed.push(`Enabled API: ${api}`);\n } catch {\n // API might already be enabled, continue\n }\n }\n\n // 3. Grant required roles to all relevant service accounts\n // Based on: https://github.com/firebase/firebase-tools/issues/8431\n // The DEFAULT COMPUTE service account needs cloudbuild.builds.builder role\n const cloudBuildSa = `${projectNumber}@cloudbuild.gserviceaccount.com`;\n const serverlessRobotSa = `service-${projectNumber}@serverless-robot-prod.iam.gserviceaccount.com`;\n const gcfAdminSa = `service-${projectNumber}@gcf-admin-robot.iam.gserviceaccount.com`;\n const defaultComputeSa = `${projectNumber}-compute@developer.gserviceaccount.com`;\n\n // Roles needed for Cloud Build service account\n const cloudBuildRoles = [\n 'roles/storage.objectViewer',\n 'roles/logging.logWriter',\n 'roles/artifactregistry.writer',\n 'roles/artifactregistry.reader',\n ];\n\n for (const role of cloudBuildRoles) {\n try {\n await execAsync(\n `gcloud projects add-iam-policy-binding ${gcpProjectId} ` +\n `--member=\"serviceAccount:${cloudBuildSa}\" ` +\n `--role=\"${role}\" --condition=None --quiet`,\n { timeout: 30000 }\n );\n actionsPerformed.push(`Granted ${role} to Cloud Build SA`);\n } catch {\n // Role might already be granted\n }\n }\n\n // Roles needed for serverless robot\n const serverlessRoles = [\n 'roles/cloudbuild.builds.builder',\n 'roles/storage.objectAdmin',\n 'roles/artifactregistry.reader',\n 'roles/artifactregistry.writer',\n ];\n\n for (const role of serverlessRoles) {\n try {\n await execAsync(\n `gcloud projects add-iam-policy-binding ${gcpProjectId} ` +\n `--member=\"serviceAccount:${serverlessRobotSa}\" ` +\n `--role=\"${role}\" --condition=None --quiet`,\n { timeout: 30000 }\n );\n actionsPerformed.push(`Granted ${role} to Serverless Robot SA`);\n } catch {\n // Role might already be granted\n }\n }\n\n // CRITICAL: Default compute service account needs cloudbuild.builds.builder\n // This is the key fix from firebase-tools#8431\n const computeRoles = [\n 'roles/cloudbuild.builds.builder',\n 'roles/artifactregistry.reader',\n 'roles/artifactregistry.writer',\n ];\n\n for (const role of computeRoles) {\n try {\n await execAsync(\n `gcloud projects add-iam-policy-binding ${gcpProjectId} ` +\n `--member=\"serviceAccount:${defaultComputeSa}\" ` +\n `--role=\"${role}\" --condition=None --quiet`,\n { timeout: 30000 }\n );\n actionsPerformed.push(`Granted ${role} to Default Compute SA`);\n } catch {\n // Role might already be granted\n }\n }\n\n // 4. Check if gcf-artifacts repository exists and configure permissions\n try {\n await execAsync(\n `gcloud artifacts repositories describe gcf-artifacts ` +\n `--location=${region} --project=${gcpProjectId}`,\n { timeout: 30000 }\n );\n\n // Repository exists, grant permissions (both reader and writer for full access)\n const serviceAccounts = [cloudBuildSa, serverlessRobotSa, gcfAdminSa, defaultComputeSa];\n const repoRoles = ['roles/artifactregistry.writer', 'roles/artifactregistry.reader'];\n\n for (const sa of serviceAccounts) {\n for (const role of repoRoles) {\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=\"${role}\" --quiet`,\n { timeout: 30000 }\n );\n actionsPerformed.push(`Granted ${role.split('/')[1]} on gcf-artifacts to ${sa.split('@')[0]}`);\n } catch {\n // Permission might already exist\n }\n }\n }\n } catch {\n // Repository doesn't exist yet - that's fine, GCP will create it on first function deploy\n // But we should create it proactively to avoid permission issues\n try {\n await execAsync(\n `gcloud artifacts repositories create gcf-artifacts ` +\n `--repository-format=docker ` +\n `--location=${region} ` +\n `--project=${gcpProjectId} ` +\n `--description=\"Cloud Functions artifacts\" --quiet`,\n { timeout: 60000 }\n );\n actionsPerformed.push(`Created gcf-artifacts repository`);\n\n // Now grant permissions on the newly created repo (both reader and writer)\n const serviceAccounts = [cloudBuildSa, serverlessRobotSa, gcfAdminSa, defaultComputeSa];\n const repoRoles = ['roles/artifactregistry.writer', 'roles/artifactregistry.reader'];\n\n for (const sa of serviceAccounts) {\n for (const role of repoRoles) {\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=\"${role}\" --quiet`,\n { timeout: 30000 }\n );\n } catch {\n // Continue\n }\n }\n }\n actionsPerformed.push(`Configured gcf-artifacts permissions`);\n } catch (createError) {\n // Failed to create - might be a timing issue, continue anyway\n errors.push(`Note: gcf-artifacts repo creation deferred: ${createError}`);\n }\n }\n\n return {\n success: errors.length === 0,\n actionsPerformed,\n errors,\n };\n}\n","import { existsSync, readFileSync } from 'fs';\nimport path from 'path';\n\nexport interface TerraformStateResource {\n address: string;\n type: string;\n name: string;\n attributes: Record<string, unknown>;\n}\n\nexport interface TerraformState {\n version: number;\n resources: TerraformStateResource[];\n}\n\nexport type GcpResourceType =\n | 'cloudfunctions'\n | 'cloudrun'\n | 'storage'\n | 'vpc_network'\n | 'vpc_connector'\n | 'artifact_registry'\n | 'global_address'\n | 'url_map'\n | 'backend_service'\n | 'backend_bucket'\n | 'forwarding_rule'\n | 'target_http_proxy'\n | 'target_https_proxy'\n | 'network_endpoint_group'\n | 'ssl_certificate';\n\nexport interface GcpResource {\n type: GcpResourceType;\n name: string;\n location?: string;\n selfLink?: string;\n createdAt?: string;\n}\n\nconst GCP_TO_TERRAFORM_TYPE: Record<GcpResourceType, string> = {\n cloudfunctions: 'google_cloudfunctions2_function',\n cloudrun: 'google_cloud_run_v2_service',\n storage: 'google_storage_bucket',\n vpc_network: 'google_compute_network',\n vpc_connector: 'google_vpc_access_connector',\n artifact_registry: 'google_artifact_registry_repository',\n global_address: 'google_compute_global_address',\n url_map: 'google_compute_url_map',\n backend_service: 'google_compute_backend_service',\n backend_bucket: 'google_compute_backend_bucket',\n forwarding_rule: 'google_compute_global_forwarding_rule',\n target_http_proxy: 'google_compute_target_http_proxy',\n target_https_proxy: 'google_compute_target_https_proxy',\n network_endpoint_group: 'google_compute_region_network_endpoint_group',\n ssl_certificate: 'google_compute_managed_ssl_certificate',\n};\n\n/**\n * Find the Terraform state file path\n */\nexport function findTerraformStatePath(cwd: string): string | null {\n const cdktfStatePath = path.join(\n cwd,\n '.stacksolo',\n 'cdktf',\n 'cdktf.out',\n 'stacks',\n 'main',\n 'terraform.tfstate'\n );\n\n if (existsSync(cdktfStatePath)) {\n return cdktfStatePath;\n }\n\n const legacyStatePath = path.join(\n cwd,\n '.stacksolo',\n 'terraform-state',\n 'terraform.tfstate'\n );\n\n if (existsSync(legacyStatePath)) {\n return legacyStatePath;\n }\n\n return null;\n}\n\n/**\n * Parse the terraform.tfstate file\n */\nexport function parseTerraformState(statePath: string): TerraformState | null {\n if (!existsSync(statePath)) {\n return null;\n }\n\n try {\n const content = readFileSync(statePath, 'utf-8');\n const state = JSON.parse(content);\n\n const resources: TerraformStateResource[] = [];\n\n for (const resource of state.resources || []) {\n if (resource.mode !== 'managed') continue;\n\n const instances = resource.instances || [];\n for (const instance of instances) {\n resources.push({\n address: `${resource.type}.${resource.name}`,\n type: resource.type,\n name: resource.name,\n attributes: instance.attributes || {},\n });\n }\n }\n\n return {\n version: state.version || 4,\n resources,\n };\n } catch (error) {\n console.error(`Failed to parse Terraform state: ${error}`);\n return null;\n }\n}\n\n/**\n * Get all resources from Terraform state\n */\nexport function getStateResources(statePath: string): TerraformStateResource[] {\n const state = parseTerraformState(statePath);\n return state?.resources || [];\n}\n\n/**\n * Check if a GCP resource exists in Terraform state\n */\nexport function isResourceInState(\n gcpResource: GcpResource,\n state: TerraformState\n): { inState: boolean; terraformAddress?: string } {\n const tfType = GCP_TO_TERRAFORM_TYPE[gcpResource.type];\n if (!tfType) {\n return { inState: false };\n }\n\n for (const stateResource of state.resources) {\n if (stateResource.type !== tfType) continue;\n\n // Compare by name attribute in state\n const stateName = stateResource.attributes.name as string | undefined;\n if (stateName === gcpResource.name) {\n return { inState: true, terraformAddress: stateResource.address };\n }\n\n // Also check the resource name in the address for cases where\n // the TF resource name matches the GCP resource name\n const sanitizedName = gcpResource.name.replace(/[^a-zA-Z0-9]/g, '-');\n if (stateResource.name === sanitizedName || stateResource.name === gcpResource.name) {\n return { inState: true, terraformAddress: stateResource.address };\n }\n }\n\n return { inState: false };\n}\n\n/**\n * Get the Terraform resource type for a GCP resource type\n */\nexport function getTerraformType(gcpType: GcpResourceType): string {\n return GCP_TO_TERRAFORM_TYPE[gcpType];\n}\n","import { exec } from 'child_process';\nimport { promisify } from 'util';\nimport { GcpResource, GcpResourceType } from './terraform-state.service';\n\nconst execAsync = promisify(exec);\n\nexport interface ScanOptions {\n projectId: string;\n region: string;\n projectName: string;\n}\n\nexport interface ScanResult {\n resources: GcpResource[];\n errors: string[];\n}\n\n/**\n * Check if a resource name matches the project naming pattern\n */\nfunction matchesProjectPattern(\n resourceName: string,\n projectName: string,\n gcpProjectId: string\n): boolean {\n // Patterns based on discovered naming conventions:\n // - {projectName}-{resourceName}\n // - {gcpProjectId}-{projectName}-{resourceName}\n return (\n resourceName.startsWith(`${projectName}-`) ||\n resourceName.startsWith(`${gcpProjectId}-${projectName}-`)\n );\n}\n\n/**\n * Execute a gcloud command and parse JSON output\n */\nasync function runGcloudCommand<T>(command: string, timeoutMs = 30000): Promise<T[]> {\n try {\n const { stdout } = await execAsync(command, { timeout: timeoutMs });\n const trimmed = stdout.trim();\n if (!trimmed || trimmed === '[]') {\n return [];\n }\n return JSON.parse(trimmed) as T[];\n } catch (error: unknown) {\n const err = error as Error & { code?: string };\n // Command timeout or execution error\n if (err.code === 'ETIMEDOUT') {\n throw new Error(`Command timed out: ${command}`);\n }\n // If command fails (e.g., API not enabled), return empty\n return [];\n }\n}\n\n/**\n * Scan Cloud Functions (Gen2)\n */\nasync function scanCloudFunctions(options: ScanOptions): Promise<GcpResource[]> {\n interface CloudFunction {\n name: string;\n state?: string;\n createTime?: string;\n }\n\n const functions = await runGcloudCommand<CloudFunction>(\n `gcloud functions list --gen2 --project=${options.projectId} --format=json`\n );\n\n return functions\n .filter((fn) => {\n // Extract function name from full path\n const name = fn.name.split('/').pop() || '';\n return matchesProjectPattern(name, options.projectName, options.projectId);\n })\n .map((fn) => ({\n type: 'cloudfunctions' as GcpResourceType,\n name: fn.name.split('/').pop() || '',\n location: fn.name.match(/locations\\/([^/]+)/)?.[1],\n selfLink: fn.name,\n createdAt: fn.createTime,\n }));\n}\n\n/**\n * Scan Cloud Run Services\n */\nasync function scanCloudRunServices(options: ScanOptions): Promise<GcpResource[]> {\n interface CloudRunService {\n metadata?: { name: string; creationTimestamp?: string };\n name?: string;\n }\n\n const services = await runGcloudCommand<CloudRunService>(\n `gcloud run services list --project=${options.projectId} --format=json`\n );\n\n return services\n .filter((svc) => {\n const name = svc.metadata?.name || svc.name || '';\n return matchesProjectPattern(name, options.projectName, options.projectId);\n })\n .map((svc) => ({\n type: 'cloudrun' as GcpResourceType,\n name: svc.metadata?.name || svc.name || '',\n location: options.region,\n createdAt: svc.metadata?.creationTimestamp,\n }));\n}\n\n/**\n * Scan Storage Buckets\n */\nasync function scanStorageBuckets(options: ScanOptions): Promise<GcpResource[]> {\n interface StorageBucket {\n name: string;\n timeCreated?: string;\n selfLink?: string;\n }\n\n const buckets = await runGcloudCommand<StorageBucket>(\n `gcloud storage buckets list --project=${options.projectId} --format=json`\n );\n\n return buckets\n .filter((bucket) =>\n matchesProjectPattern(bucket.name, options.projectName, options.projectId)\n )\n .map((bucket) => ({\n type: 'storage' as GcpResourceType,\n name: bucket.name,\n selfLink: bucket.selfLink,\n createdAt: bucket.timeCreated,\n }));\n}\n\n/**\n * Scan VPC Networks\n */\nasync function scanVpcNetworks(options: ScanOptions): Promise<GcpResource[]> {\n interface VpcNetwork {\n name: string;\n selfLink?: string;\n creationTimestamp?: string;\n }\n\n const networks = await runGcloudCommand<VpcNetwork>(\n `gcloud compute networks list --project=${options.projectId} --format=json`\n );\n\n return networks\n .filter((network) =>\n matchesProjectPattern(network.name, options.projectName, options.projectId)\n )\n .map((network) => ({\n type: 'vpc_network' as GcpResourceType,\n name: network.name,\n selfLink: network.selfLink,\n createdAt: network.creationTimestamp,\n }));\n}\n\n/**\n * Scan VPC Access Connectors\n */\nasync function scanVpcConnectors(options: ScanOptions): Promise<GcpResource[]> {\n interface VpcConnector {\n name: string;\n state?: string;\n }\n\n const connectors = await runGcloudCommand<VpcConnector>(\n `gcloud compute networks vpc-access connectors list --region=${options.region} --project=${options.projectId} --format=json`\n );\n\n return connectors\n .filter((connector) => {\n const name = connector.name.split('/').pop() || '';\n return matchesProjectPattern(name, options.projectName, options.projectId);\n })\n .map((connector) => ({\n type: 'vpc_connector' as GcpResourceType,\n name: connector.name.split('/').pop() || '',\n location: options.region,\n selfLink: connector.name,\n }));\n}\n\n/**\n * Scan Global Addresses\n */\nasync function scanGlobalAddresses(options: ScanOptions): Promise<GcpResource[]> {\n interface GlobalAddress {\n name: string;\n address?: string;\n selfLink?: string;\n creationTimestamp?: string;\n }\n\n const addresses = await runGcloudCommand<GlobalAddress>(\n `gcloud compute addresses list --global --project=${options.projectId} --format=json`\n );\n\n return addresses\n .filter((addr) =>\n matchesProjectPattern(addr.name, options.projectName, options.projectId)\n )\n .map((addr) => ({\n type: 'global_address' as GcpResourceType,\n name: addr.name,\n selfLink: addr.selfLink,\n createdAt: addr.creationTimestamp,\n }));\n}\n\n/**\n * Scan URL Maps\n */\nasync function scanUrlMaps(options: ScanOptions): Promise<GcpResource[]> {\n interface UrlMap {\n name: string;\n selfLink?: string;\n creationTimestamp?: string;\n }\n\n const urlMaps = await runGcloudCommand<UrlMap>(\n `gcloud compute url-maps list --project=${options.projectId} --format=json`\n );\n\n return urlMaps\n .filter((urlMap) =>\n matchesProjectPattern(urlMap.name, options.projectName, options.projectId)\n )\n .map((urlMap) => ({\n type: 'url_map' as GcpResourceType,\n name: urlMap.name,\n selfLink: urlMap.selfLink,\n createdAt: urlMap.creationTimestamp,\n }));\n}\n\n/**\n * Scan Backend Services\n */\nasync function scanBackendServices(options: ScanOptions): Promise<GcpResource[]> {\n interface BackendService {\n name: string;\n selfLink?: string;\n creationTimestamp?: string;\n }\n\n const services = await runGcloudCommand<BackendService>(\n `gcloud compute backend-services list --global --project=${options.projectId} --format=json`\n );\n\n return services\n .filter((svc) =>\n matchesProjectPattern(svc.name, options.projectName, options.projectId)\n )\n .map((svc) => ({\n type: 'backend_service' as GcpResourceType,\n name: svc.name,\n selfLink: svc.selfLink,\n createdAt: svc.creationTimestamp,\n }));\n}\n\n/**\n * Scan Backend Buckets\n */\nasync function scanBackendBuckets(options: ScanOptions): Promise<GcpResource[]> {\n interface BackendBucket {\n name: string;\n selfLink?: string;\n creationTimestamp?: string;\n }\n\n const buckets = await runGcloudCommand<BackendBucket>(\n `gcloud compute backend-buckets list --project=${options.projectId} --format=json`\n );\n\n return buckets\n .filter((bucket) =>\n matchesProjectPattern(bucket.name, options.projectName, options.projectId)\n )\n .map((bucket) => ({\n type: 'backend_bucket' as GcpResourceType,\n name: bucket.name,\n selfLink: bucket.selfLink,\n createdAt: bucket.creationTimestamp,\n }));\n}\n\n/**\n * Scan Global Forwarding Rules\n */\nasync function scanForwardingRules(options: ScanOptions): Promise<GcpResource[]> {\n interface ForwardingRule {\n name: string;\n selfLink?: string;\n creationTimestamp?: string;\n }\n\n const rules = await runGcloudCommand<ForwardingRule>(\n `gcloud compute forwarding-rules list --global --project=${options.projectId} --format=json`\n );\n\n return rules\n .filter((rule) =>\n matchesProjectPattern(rule.name, options.projectName, options.projectId)\n )\n .map((rule) => ({\n type: 'forwarding_rule' as GcpResourceType,\n name: rule.name,\n selfLink: rule.selfLink,\n createdAt: rule.creationTimestamp,\n }));\n}\n\n/**\n * Scan Target HTTP Proxies\n */\nasync function scanTargetHttpProxies(options: ScanOptions): Promise<GcpResource[]> {\n interface TargetHttpProxy {\n name: string;\n selfLink?: string;\n creationTimestamp?: string;\n }\n\n const proxies = await runGcloudCommand<TargetHttpProxy>(\n `gcloud compute target-http-proxies list --project=${options.projectId} --format=json`\n );\n\n return proxies\n .filter((proxy) =>\n matchesProjectPattern(proxy.name, options.projectName, options.projectId)\n )\n .map((proxy) => ({\n type: 'target_http_proxy' as GcpResourceType,\n name: proxy.name,\n selfLink: proxy.selfLink,\n createdAt: proxy.creationTimestamp,\n }));\n}\n\n/**\n * Scan Target HTTPS Proxies\n */\nasync function scanTargetHttpsProxies(options: ScanOptions): Promise<GcpResource[]> {\n interface TargetHttpsProxy {\n name: string;\n selfLink?: string;\n creationTimestamp?: string;\n }\n\n const proxies = await runGcloudCommand<TargetHttpsProxy>(\n `gcloud compute target-https-proxies list --project=${options.projectId} --format=json`\n );\n\n return proxies\n .filter((proxy) =>\n matchesProjectPattern(proxy.name, options.projectName, options.projectId)\n )\n .map((proxy) => ({\n type: 'target_https_proxy' as GcpResourceType,\n name: proxy.name,\n selfLink: proxy.selfLink,\n createdAt: proxy.creationTimestamp,\n }));\n}\n\n/**\n * Scan Network Endpoint Groups\n */\nasync function scanNetworkEndpointGroups(options: ScanOptions): Promise<GcpResource[]> {\n interface NetworkEndpointGroup {\n name: string;\n selfLink?: string;\n creationTimestamp?: string;\n zone?: string;\n region?: string;\n }\n\n const negs = await runGcloudCommand<NetworkEndpointGroup>(\n `gcloud compute network-endpoint-groups list --project=${options.projectId} --format=json`\n );\n\n return negs\n .filter((neg) =>\n matchesProjectPattern(neg.name, options.projectName, options.projectId)\n )\n .map((neg) => ({\n type: 'network_endpoint_group' as GcpResourceType,\n name: neg.name,\n location: neg.region?.split('/').pop() || neg.zone?.split('/').pop(),\n selfLink: neg.selfLink,\n createdAt: neg.creationTimestamp,\n }));\n}\n\n/**\n * Scan all GCP resources matching the project naming pattern\n * Runs queries in parallel for speed\n */\nexport async function scanGcpResources(options: ScanOptions): Promise<ScanResult> {\n const scanners = [\n { name: 'Cloud Functions', fn: scanCloudFunctions },\n { name: 'Cloud Run', fn: scanCloudRunServices },\n { name: 'Storage Buckets', fn: scanStorageBuckets },\n { name: 'VPC Networks', fn: scanVpcNetworks },\n { name: 'VPC Connectors', fn: scanVpcConnectors },\n { name: 'Global Addresses', fn: scanGlobalAddresses },\n { name: 'URL Maps', fn: scanUrlMaps },\n { name: 'Backend Services', fn: scanBackendServices },\n { name: 'Backend Buckets', fn: scanBackendBuckets },\n { name: 'Forwarding Rules', fn: scanForwardingRules },\n { name: 'Target HTTP Proxies', fn: scanTargetHttpProxies },\n { name: 'Target HTTPS Proxies', fn: scanTargetHttpsProxies },\n { name: 'Network Endpoint Groups', fn: scanNetworkEndpointGroups },\n ];\n\n const results = await Promise.allSettled(\n scanners.map((scanner) => scanner.fn(options))\n );\n\n const resources: GcpResource[] = [];\n const errors: string[] = [];\n\n results.forEach((result, index) => {\n if (result.status === 'fulfilled') {\n resources.push(...result.value);\n } else {\n errors.push(`${scanners[index].name}: ${result.reason}`);\n }\n });\n\n return { resources, errors };\n}\n","import { exec } from 'child_process';\nimport { promisify } from 'util';\nimport { GcpResource, GcpResourceType } from './terraform-state.service';\n\nconst execAsync = promisify(exec);\n\nexport interface StackSoloConfig {\n project: {\n name: string;\n gcpProjectId: string;\n region: string;\n };\n}\n\nexport interface ConflictResult {\n resource: GcpResource;\n inTerraformState: boolean;\n terraformAddress?: string;\n expectedName: string;\n conflictType: 'exists_not_in_state' | 'orphaned_from_previous';\n}\n\ninterface ImportMapping {\n gcpResourceType: GcpResourceType;\n terraformResourceType: string;\n importIdFormatter: (resource: GcpResource, config: StackSoloConfig) => string;\n terraformAddressFormatter: (resource: GcpResource) => string;\n}\n\n/**\n * Convert a resource name to a valid Terraform variable name\n */\nfunction toTerraformName(name: string): string {\n return name.replace(/[^a-zA-Z0-9]/g, '-');\n}\n\n/**\n * Import mapping for each GCP resource type\n */\nexport const IMPORT_MAPPINGS: Record<GcpResourceType, ImportMapping> = {\n cloudfunctions: {\n gcpResourceType: 'cloudfunctions',\n terraformResourceType: 'google_cloudfunctions2_function',\n importIdFormatter: (r, config) =>\n `projects/${config.project.gcpProjectId}/locations/${r.location || config.project.region}/functions/${r.name}`,\n terraformAddressFormatter: (r) =>\n `google_cloudfunctions2_function.${toTerraformName(r.name)}`,\n },\n cloudrun: {\n gcpResourceType: 'cloudrun',\n terraformResourceType: 'google_cloud_run_v2_service',\n importIdFormatter: (r, config) =>\n `projects/${config.project.gcpProjectId}/locations/${r.location || config.project.region}/services/${r.name}`,\n terraformAddressFormatter: (r) =>\n `google_cloud_run_v2_service.${toTerraformName(r.name)}`,\n },\n storage: {\n gcpResourceType: 'storage',\n terraformResourceType: 'google_storage_bucket',\n importIdFormatter: (r) => r.name,\n terraformAddressFormatter: (r) =>\n `google_storage_bucket.${toTerraformName(r.name)}`,\n },\n vpc_network: {\n gcpResourceType: 'vpc_network',\n terraformResourceType: 'google_compute_network',\n importIdFormatter: (r, config) =>\n `projects/${config.project.gcpProjectId}/global/networks/${r.name}`,\n terraformAddressFormatter: (r) =>\n `google_compute_network.${toTerraformName(r.name)}`,\n },\n vpc_connector: {\n gcpResourceType: 'vpc_connector',\n terraformResourceType: 'google_vpc_access_connector',\n importIdFormatter: (r, config) =>\n `projects/${config.project.gcpProjectId}/locations/${r.location || config.project.region}/connectors/${r.name}`,\n terraformAddressFormatter: (r) =>\n `google_vpc_access_connector.${toTerraformName(r.name)}`,\n },\n artifact_registry: {\n gcpResourceType: 'artifact_registry',\n terraformResourceType: 'google_artifact_registry_repository',\n importIdFormatter: (r, config) =>\n `projects/${config.project.gcpProjectId}/locations/${r.location || config.project.region}/repositories/${r.name}`,\n terraformAddressFormatter: (r) =>\n `google_artifact_registry_repository.${toTerraformName(r.name)}`,\n },\n global_address: {\n gcpResourceType: 'global_address',\n terraformResourceType: 'google_compute_global_address',\n importIdFormatter: (r, config) =>\n `projects/${config.project.gcpProjectId}/global/addresses/${r.name}`,\n terraformAddressFormatter: (r) =>\n `google_compute_global_address.${toTerraformName(r.name)}`,\n },\n url_map: {\n gcpResourceType: 'url_map',\n terraformResourceType: 'google_compute_url_map',\n importIdFormatter: (r, config) =>\n `projects/${config.project.gcpProjectId}/global/urlMaps/${r.name}`,\n terraformAddressFormatter: (r) =>\n `google_compute_url_map.${toTerraformName(r.name)}`,\n },\n backend_service: {\n gcpResourceType: 'backend_service',\n terraformResourceType: 'google_compute_backend_service',\n importIdFormatter: (r, config) =>\n `projects/${config.project.gcpProjectId}/global/backendServices/${r.name}`,\n terraformAddressFormatter: (r) =>\n `google_compute_backend_service.${toTerraformName(r.name)}`,\n },\n backend_bucket: {\n gcpResourceType: 'backend_bucket',\n terraformResourceType: 'google_compute_backend_bucket',\n importIdFormatter: (r, config) =>\n `projects/${config.project.gcpProjectId}/global/backendBuckets/${r.name}`,\n terraformAddressFormatter: (r) =>\n `google_compute_backend_bucket.${toTerraformName(r.name)}`,\n },\n forwarding_rule: {\n gcpResourceType: 'forwarding_rule',\n terraformResourceType: 'google_compute_global_forwarding_rule',\n importIdFormatter: (r, config) =>\n `projects/${config.project.gcpProjectId}/global/forwardingRules/${r.name}`,\n terraformAddressFormatter: (r) =>\n `google_compute_global_forwarding_rule.${toTerraformName(r.name)}`,\n },\n target_http_proxy: {\n gcpResourceType: 'target_http_proxy',\n terraformResourceType: 'google_compute_target_http_proxy',\n importIdFormatter: (r, config) =>\n `projects/${config.project.gcpProjectId}/global/targetHttpProxies/${r.name}`,\n terraformAddressFormatter: (r) =>\n `google_compute_target_http_proxy.${toTerraformName(r.name)}`,\n },\n target_https_proxy: {\n gcpResourceType: 'target_https_proxy',\n terraformResourceType: 'google_compute_target_https_proxy',\n importIdFormatter: (r, config) =>\n `projects/${config.project.gcpProjectId}/global/targetHttpsProxies/${r.name}`,\n terraformAddressFormatter: (r) =>\n `google_compute_target_https_proxy.${toTerraformName(r.name)}`,\n },\n network_endpoint_group: {\n gcpResourceType: 'network_endpoint_group',\n terraformResourceType: 'google_compute_region_network_endpoint_group',\n importIdFormatter: (r, config) =>\n `projects/${config.project.gcpProjectId}/regions/${r.location || config.project.region}/networkEndpointGroups/${r.name}`,\n terraformAddressFormatter: (r) =>\n `google_compute_region_network_endpoint_group.${toTerraformName(r.name)}`,\n },\n ssl_certificate: {\n gcpResourceType: 'ssl_certificate',\n terraformResourceType: 'google_compute_managed_ssl_certificate',\n importIdFormatter: (r, config) =>\n `projects/${config.project.gcpProjectId}/global/sslCertificates/${r.name}`,\n terraformAddressFormatter: (r) =>\n `google_compute_managed_ssl_certificate.${toTerraformName(r.name)}`,\n },\n};\n\n/**\n * Import priority for dependency ordering (lower = import first)\n * Resources with lower priority should be imported before those with higher priority\n */\nconst IMPORT_PRIORITY: Record<GcpResourceType, number> = {\n vpc_network: 10,\n storage: 20,\n artifact_registry: 20,\n vpc_connector: 30,\n cloudfunctions: 40,\n cloudrun: 40,\n network_endpoint_group: 50,\n backend_service: 60,\n backend_bucket: 60,\n url_map: 70,\n ssl_certificate: 75,\n target_http_proxy: 80,\n target_https_proxy: 80,\n global_address: 85,\n forwarding_rule: 90,\n};\n\n/**\n * Sort conflicts for import (dependency order - import dependencies first)\n */\nexport function sortConflictsForImport(conflicts: ConflictResult[]): ConflictResult[] {\n return [...conflicts].sort((a, b) => {\n const priorityA = IMPORT_PRIORITY[a.resource.type] || 50;\n const priorityB = IMPORT_PRIORITY[b.resource.type] || 50;\n return priorityA - priorityB;\n });\n}\n\n/**\n * Execute terraform import for a single resource\n */\nasync function importResource(\n conflict: ConflictResult,\n config: StackSoloConfig,\n stackDir: string\n): Promise<{ success: boolean; error?: string }> {\n const mapping = IMPORT_MAPPINGS[conflict.resource.type];\n if (!mapping) {\n return {\n success: false,\n error: `Unknown resource type for import: ${conflict.resource.type}`,\n };\n }\n\n const importId = mapping.importIdFormatter(conflict.resource, config);\n const tfAddress = mapping.terraformAddressFormatter(conflict.resource);\n\n try {\n await execAsync(`terraform import '${tfAddress}' '${importId}'`, {\n cwd: stackDir,\n timeout: 60000,\n });\n return { success: true };\n } catch (error: unknown) {\n const err = error as Error & { stderr?: string };\n return {\n success: false,\n error: err.stderr || err.message,\n };\n }\n}\n\n/**\n * Import all conflicting resources into Terraform state\n */\nexport async function importConflicts(\n conflicts: ConflictResult[],\n config: StackSoloConfig,\n stackDir: string\n): Promise<{ success: string[]; failed: Array<{ name: string; error: string }> }> {\n const success: string[] = [];\n const failed: Array<{ name: string; error: string }> = [];\n\n // Import in dependency order\n const sortedConflicts = sortConflictsForImport(conflicts);\n\n for (const conflict of sortedConflicts) {\n const result = await importResource(conflict, config, stackDir);\n if (result.success) {\n success.push(conflict.resource.name);\n } else {\n failed.push({\n name: conflict.resource.name,\n error: result.error || 'Unknown error',\n });\n }\n }\n\n return { success, failed };\n}\n\n/**\n * Get the terraform import command for a resource (for display purposes)\n */\nexport function getImportCommand(\n resource: GcpResource,\n config: StackSoloConfig\n): string {\n const mapping = IMPORT_MAPPINGS[resource.type];\n if (!mapping) {\n return `# Unknown resource type: ${resource.type}`;\n }\n\n const importId = mapping.importIdFormatter(resource, config);\n const tfAddress = mapping.terraformAddressFormatter(resource);\n\n return `terraform import '${tfAddress}' '${importId}'`;\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 events\n *\n * View high-resolution event logs for deploy sessions.\n * Shows detailed timeline of all operations during deployment.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport {\n initRegistry,\n listSessions,\n getSession,\n getSessionEvents,\n getLatestSession,\n} from '@stacksolo/registry';\nimport type { Session, Event, EventCategory } from '@stacksolo/registry';\n\n// =============================================================================\n// ASCII Table Helpers\n// =============================================================================\n\ninterface TableColumn {\n header: string;\n width: number;\n align?: 'left' | 'right' | 'center';\n}\n\nfunction drawTableLine(columns: TableColumn[], char = '-', join = '+'): string {\n const segments = columns.map((col) => char.repeat(col.width + 2));\n return join + segments.join(join) + join;\n}\n\nfunction drawTableRow(columns: TableColumn[], values: string[]): string {\n const cells = columns.map((col, i) => {\n const value = values[i] || '';\n const stripped = value.replace(/\\x1b\\[[0-9;]*m/g, ''); // Strip ANSI codes for length\n const padding = col.width - stripped.length;\n if (col.align === 'right') {\n return ' ' + ' '.repeat(Math.max(0, padding)) + value + ' ';\n } else if (col.align === 'center') {\n const left = Math.floor(padding / 2);\n const right = padding - left;\n return ' ' + ' '.repeat(Math.max(0, left)) + value + ' '.repeat(Math.max(0, right)) + ' ';\n } else {\n return ' ' + value + ' '.repeat(Math.max(0, padding)) + ' ';\n }\n });\n return '|' + cells.join('|') + '|';\n}\n\n/**\n * Format timestamp for display (HH:MM:SS.mmm)\n */\nfunction formatTime(date: Date): string {\n const hours = date.getHours().toString().padStart(2, '0');\n const minutes = date.getMinutes().toString().padStart(2, '0');\n const seconds = date.getSeconds().toString().padStart(2, '0');\n const ms = date.getMilliseconds().toString().padStart(3, '0');\n return `${hours}:${minutes}:${seconds}.${ms}`;\n}\n\n/**\n * Format duration in human-readable form\n */\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n const minutes = Math.floor(ms / 60000);\n const seconds = ((ms % 60000) / 1000).toFixed(1);\n return `${minutes}m ${seconds}s`;\n}\n\n/**\n * Get color for event category\n */\nfunction getCategoryColor(category: EventCategory): (s: string) => string {\n switch (category) {\n case 'internal':\n return chalk.gray;\n case 'terraform':\n return chalk.magenta;\n case 'docker':\n return chalk.blue;\n case 'gcloud':\n return chalk.cyan;\n case 'file':\n return chalk.yellow;\n case 'gcs':\n return chalk.green;\n default:\n return chalk.white;\n }\n}\n\n/**\n * Get icon for event type\n */\nfunction getEventIcon(eventType: string): string {\n if (eventType.includes('start')) return '>';\n if (eventType.includes('end')) return '<';\n if (eventType.includes('created') || eventType.includes('success')) return '+';\n if (eventType.includes('error') || eventType.includes('failed')) return '!';\n if (eventType.includes('destroyed')) return '-';\n return ' ';\n}\n\n/**\n * Format event for display\n */\nfunction formatEvent(event: Event): string {\n const time = formatTime(event.timestamp);\n const categoryColor = getCategoryColor(event.category);\n const icon = getEventIcon(event.eventType);\n\n const category = categoryColor(`[${event.category.padEnd(9)}]`);\n const eventType = chalk.white(event.eventType.padEnd(20));\n\n // Build description based on event data\n let description = '';\n const data = event.data as Record<string, unknown>;\n\n if (event.terraformAddress) {\n description = chalk.cyan(event.terraformAddress);\n } else if (data.phase) {\n description = chalk.yellow(`phase=${data.phase}`);\n } else if (data.command) {\n const cmd = Array.isArray(data.command) ? data.command.join(' ') : data.command;\n description = chalk.gray(typeof cmd === 'string' ? cmd.slice(0, 50) : '');\n } else if (data.path) {\n description = chalk.gray(data.path as string);\n } else if (data.exitCode !== undefined) {\n const exitCode = data.exitCode as number;\n description = exitCode === 0 ? chalk.green(`exit=${exitCode}`) : chalk.red(`exit=${exitCode}`);\n } else if (data.durationMs !== undefined) {\n description = chalk.gray(formatDuration(data.durationMs as number));\n }\n\n return `${chalk.gray(time)} ${icon} ${category} ${eventType} ${description}`;\n}\n\n/**\n * Display session summary\n */\nfunction displaySession(session: Session): void {\n const status = session.exitCode === null\n ? chalk.yellow('running')\n : session.exitCode === 0\n ? chalk.green('succeeded')\n : chalk.red(`failed (${session.exitCode})`);\n\n const duration = session.finishedAt\n ? formatDuration(session.finishedAt.getTime() - session.startedAt.getTime())\n : 'in progress';\n\n console.log('');\n console.log(chalk.bold(` Session: ${session.id.slice(0, 8)}`));\n console.log(chalk.gray(` Started: ${session.startedAt.toLocaleString()}`));\n console.log(chalk.gray(` Command: ${session.command} ${session.args || ''}`));\n if (session.projectName) {\n console.log(chalk.gray(` Project: ${session.projectName}`));\n }\n console.log(chalk.gray(` Status: ${status} (${duration})`));\n console.log('');\n}\n\n/**\n * Display events as an ASCII table\n */\nfunction displayEventsTable(events: Event[]): void {\n const columns: TableColumn[] = [\n { header: 'TIME', width: 12 },\n { header: 'PROJECT', width: 15 },\n { header: 'CATEGORY', width: 10 },\n { header: 'EVENT', width: 20 },\n { header: 'DETAILS', width: 35 },\n ];\n\n console.log(' ' + drawTableLine(columns));\n console.log(' ' + drawTableRow(columns, columns.map((c) => chalk.bold(c.header))));\n console.log(' ' + drawTableLine(columns));\n\n for (const event of events) {\n const time = formatTime(event.timestamp);\n const project = (event.project || '-').slice(0, 15);\n const categoryColor = getCategoryColor(event.category);\n const category = categoryColor(event.category);\n const eventType = event.eventType;\n\n // Build details based on event data\n const data = event.data as Record<string, unknown>;\n let details = '';\n\n if (event.terraformAddress) {\n details = event.terraformAddress;\n } else if (data.phase) {\n details = `phase=${data.phase}`;\n } else if (data.command) {\n const cmd = Array.isArray(data.command) ? data.command.join(' ') : data.command;\n details = typeof cmd === 'string' ? cmd.slice(0, 35) : '';\n } else if (data.path) {\n details = (data.path as string).slice(0, 35);\n } else if (data.exitCode !== undefined) {\n const exitCode = data.exitCode as number;\n details = exitCode === 0 ? chalk.green(`exit=0`) : chalk.red(`exit=${exitCode}`);\n } else if (data.durationMs !== undefined) {\n details = formatDuration(data.durationMs as number);\n } else if (data.question) {\n details = (data.question as string).slice(0, 35);\n } else if (data.choice) {\n details = `choice=${data.choice}`;\n } else if (data.count !== undefined) {\n details = `${data.count} resources`;\n }\n\n console.log(' ' + drawTableRow(columns, [time, project, category, eventType, details]));\n }\n\n console.log(' ' + drawTableLine(columns));\n}\n\n// =============================================================================\n// events list - List recent sessions\n// =============================================================================\n\nconst listCommand = new Command('list')\n .description('List recent deploy sessions')\n .option('-n, --limit <number>', 'Number of sessions to show', '10')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n await initRegistry();\n\n const limit = parseInt(options.limit, 10);\n const sessions = await listSessions(limit);\n\n if (sessions.length === 0) {\n console.log(chalk.gray('\\n No deploy sessions found.\\n'));\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(sessions, null, 2));\n return;\n }\n\n console.log(chalk.bold('\\n Recent Deploy Sessions\\n'));\n\n const columns: TableColumn[] = [\n { header: 'ID', width: 8 },\n { header: 'STARTED', width: 20 },\n { header: 'DURATION', width: 10, align: 'right' },\n { header: 'STATUS', width: 8, align: 'center' },\n { header: 'PROJECT', width: 20 },\n ];\n\n console.log(' ' + drawTableLine(columns));\n console.log(' ' + drawTableRow(columns, columns.map((c) => chalk.bold(c.header))));\n console.log(' ' + drawTableLine(columns));\n\n for (const session of sessions) {\n const id = session.id.slice(0, 8);\n const started = session.startedAt.toLocaleString();\n const duration = session.finishedAt\n ? formatDuration(session.finishedAt.getTime() - session.startedAt.getTime())\n : 'running';\n const status =\n session.exitCode === null\n ? chalk.yellow('running')\n : session.exitCode === 0\n ? chalk.green('success')\n : chalk.red('failed');\n const project = (session.projectName || '-').slice(0, 20);\n\n console.log(' ' + drawTableRow(columns, [id, started, duration, status, project]));\n }\n\n console.log(' ' + drawTableLine(columns));\n console.log('');\n });\n\n// =============================================================================\n// events show - Show events for a session\n// =============================================================================\n\nconst showCommand = new Command('show')\n .description('Show events for a deploy session')\n .argument('[session-id]', 'Session ID (uses latest if not specified)')\n .option('-c, --category <category>', 'Filter by category (internal, terraform, docker, gcloud, file, gcs)')\n .option('-r, --resource <name>', 'Filter by resource name')\n .option('-n, --limit <number>', 'Maximum events to show')\n .option('--json', 'Output as JSON')\n .action(async (sessionId, options) => {\n await initRegistry();\n\n // Get session\n let session: Session | null;\n if (sessionId) {\n session = await getSession(sessionId);\n if (!session) {\n // Try to find by prefix\n const sessions = await listSessions(100);\n session = sessions.find((s) => s.id.startsWith(sessionId)) || null;\n }\n } else {\n session = await getLatestSession();\n }\n\n if (!session) {\n console.log(chalk.red('\\n Session not found.\\n'));\n return;\n }\n\n // Get events\n const filters: Record<string, unknown> = {};\n if (options.category) filters.category = options.category;\n if (options.resource) filters.resourceName = options.resource;\n if (options.limit) filters.limit = parseInt(options.limit, 10);\n\n const events = await getSessionEvents(session.id, filters as never);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n session: {\n id: session.id,\n startedAt: session.startedAt,\n finishedAt: session.finishedAt,\n command: session.command,\n args: session.args,\n projectName: session.projectName,\n exitCode: session.exitCode,\n },\n events,\n },\n null,\n 2\n )\n );\n return;\n }\n\n displaySession(session);\n\n if (events.length === 0) {\n console.log(chalk.gray(' No events found.\\n'));\n return;\n }\n\n displayEventsTable(events);\n console.log('');\n console.log(chalk.gray(` Total: ${events.length} events`));\n console.log('');\n });\n\n// =============================================================================\n// Main events command\n// =============================================================================\n\nexport const eventsCommand = new Command('events')\n .description('View deploy event logs')\n .addCommand(listCommand)\n .addCommand(showCommand);\n\n// Default action - show latest session events\neventsCommand.action(async () => {\n await initRegistry();\n\n const session = await getLatestSession();\n\n if (!session) {\n console.log(chalk.gray('\\n No deploy sessions found.'));\n console.log(chalk.gray(' Run `stacksolo deploy` to create a session.\\n'));\n return;\n }\n\n const events = await getSessionEvents(session.id);\n\n displaySession(session);\n\n if (events.length === 0) {\n console.log(chalk.gray(' No events recorded.\\n'));\n return;\n }\n\n displayEventsTable(events);\n console.log('');\n console.log(chalk.gray(` Total: ${events.length} events`));\n console.log('');\n});\n","/**\n * stacksolo inventory\n *\n * Scan GCP for all StackSolo-managed resources using labels\n * Shows resources grouped by project, identifies orphans and shared resources\n * Can also update labels on existing resources to mark them as shared\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport { getRegistry } from '@stacksolo/registry';\n\nconst execAsync = promisify(exec);\n\n/**\n * Label update commands for different resource types\n */\nconst LABEL_UPDATE_COMMANDS: Record<string, (projectId: string, resourceName: string, labels: Record<string, string>) => string> = {\n 'VPC Network': (projectId, name, labels) => {\n const labelStr = Object.entries(labels).map(([k, v]) => `${k}=${v}`).join(',');\n return `gcloud compute networks update ${name} --project=${projectId} --update-labels=\"${labelStr}\"`;\n },\n 'VPC Connector': (_projectId, _name, labels) => {\n // VPC connectors don't support labels directly via gcloud, need to use API\n const labelStr = Object.entries(labels).map(([k, v]) => `${k}=${v}`).join(',');\n return `echo \"VPC Connectors don't support label updates via gcloud. Labels: ${labelStr}\"`;\n },\n 'Storage Bucket': (_projectId, name, labels) => {\n const labelStr = Object.entries(labels).map(([k, v]) => `${k}=${v}`).join(',');\n return `gcloud storage buckets update gs://${name} --update-labels=\"${labelStr}\"`;\n },\n 'Cloud Run': (projectId, name, labels) => {\n const labelStr = Object.entries(labels).map(([k, v]) => `${k}=${v}`).join(',');\n return `gcloud run services update ${name} --project=${projectId} --update-labels=\"${labelStr}\" --region=us-central1`;\n },\n 'Cloud Function': (projectId, name, labels) => {\n const labelStr = Object.entries(labels).map(([k, v]) => `${k}=${v}`).join(',');\n return `gcloud functions deploy ${name} --project=${projectId} --update-labels=\"${labelStr}\" --gen2 --region=us-central1`;\n },\n 'Global Address': (projectId, name, labels) => {\n const labelStr = Object.entries(labels).map(([k, v]) => `${k}=${v}`).join(',');\n return `gcloud compute addresses update ${name} --global --project=${projectId} --update-labels=\"${labelStr}\"`;\n },\n 'Artifact Registry': (projectId, name, labels) => {\n const labelStr = Object.entries(labels).map(([k, v]) => `${k}=${v}`).join(',');\n return `gcloud artifacts repositories update ${name} --project=${projectId} --update-labels=\"${labelStr}\" --location=us-central1`;\n },\n};\n\n/**\n * Update labels on an existing GCP resource\n */\nasync function updateResourceLabels(\n projectId: string,\n resourceType: string,\n resourceName: string,\n labels: Record<string, string>,\n region?: string\n): Promise<{ success: boolean; error?: string }> {\n const commandGenerator = LABEL_UPDATE_COMMANDS[resourceType];\n if (!commandGenerator) {\n return { success: false, error: `Unsupported resource type: ${resourceType}` };\n }\n\n let command = commandGenerator(projectId, resourceName, labels);\n\n // Replace region placeholder if needed\n if (region && command.includes('us-central1')) {\n command = command.replace(/us-central1/g, region);\n }\n\n try {\n await execAsync(command, { timeout: 60000 });\n return { success: true };\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n return { success: false, error: errorMsg };\n }\n}\n\n/**\n * Add StackSolo labels to an unmanaged resource\n */\nasync function adoptResource(\n projectId: string,\n resourceType: string,\n resourceName: string,\n stacksoloProjectName: string,\n region?: string\n): Promise<{ success: boolean; error?: string }> {\n const labels = {\n stacksolo: 'true',\n 'stacksolo-project': stacksoloProjectName.toLowerCase().replace(/[^a-z0-9-]/g, '-'),\n 'stacksolo-resource': resourceType.toLowerCase().replace(/[^a-z0-9-]/g, '-'),\n };\n\n return updateResourceLabels(projectId, resourceType, resourceName, labels, region);\n}\n\n/**\n * Mark a resource as shared by adding project to stacksolo-shared-with label\n */\nasync function shareResource(\n projectId: string,\n resourceType: string,\n resourceName: string,\n existingLabels: Record<string, string>,\n additionalProject: string,\n region?: string\n): Promise<{ success: boolean; error?: string }> {\n const currentShared = existingLabels['stacksolo-shared-with'] || '';\n const sharedProjects = currentShared ? currentShared.split('_') : [];\n\n // Add the new project if not already shared\n const normalizedProject = additionalProject.toLowerCase().replace(/[^a-z0-9-]/g, '-');\n if (!sharedProjects.includes(normalizedProject)) {\n sharedProjects.push(normalizedProject);\n }\n\n const updatedLabels = {\n ...existingLabels,\n 'stacksolo-shared-with': sharedProjects.join('_'),\n };\n\n return updateResourceLabels(projectId, resourceType, resourceName, updatedLabels, region);\n}\n\ninterface GcpResourceWithLabels {\n name: string;\n type: string;\n location?: string;\n labels?: Record<string, string>;\n selfLink?: string;\n createdAt?: string;\n}\n\ninterface InventoryResource extends GcpResourceWithLabels {\n stacksoloProject?: string;\n stacksoloResource?: string;\n isStacksolo: boolean;\n isOrphaned?: boolean;\n isShared?: boolean;\n}\n\ninterface InventoryResult {\n managed: InventoryResource[];\n unmanaged: InventoryResource[];\n orphaned: InventoryResource[];\n errors: string[];\n}\n\n/**\n * Execute a gcloud command and parse JSON output\n */\nasync function runGcloudCommand<T>(command: string, timeoutMs = 30000): Promise<T[]> {\n try {\n const { stdout } = await execAsync(command, { timeout: timeoutMs });\n const trimmed = stdout.trim();\n if (!trimmed || trimmed === '[]') {\n return [];\n }\n return JSON.parse(trimmed) as T[];\n } catch {\n return [];\n }\n}\n\n/**\n * Parse StackSolo labels from a resource\n */\nfunction parseStacksoloLabels(labels?: Record<string, string>): {\n isStacksolo: boolean;\n project?: string;\n resource?: string;\n} {\n if (!labels) return { isStacksolo: false };\n\n const isStacksolo = labels['stacksolo'] === 'true';\n const project = labels['stacksolo-project'];\n const resource = labels['stacksolo-resource'];\n\n return { isStacksolo, project, resource };\n}\n\n/**\n * Scan VPC Networks\n */\nasync function scanVpcNetworks(projectId: string): Promise<InventoryResource[]> {\n interface VpcNetwork {\n name: string;\n selfLink?: string;\n creationTimestamp?: string;\n labels?: Record<string, string>;\n }\n\n const networks = await runGcloudCommand<VpcNetwork>(\n `gcloud compute networks list --project=${projectId} --format=json`\n );\n\n return networks.map((network) => {\n const { isStacksolo, project, resource } = parseStacksoloLabels(network.labels);\n return {\n name: network.name,\n type: 'VPC Network',\n selfLink: network.selfLink,\n createdAt: network.creationTimestamp,\n labels: network.labels,\n isStacksolo,\n stacksoloProject: project,\n stacksoloResource: resource,\n };\n });\n}\n\n/**\n * Scan Storage Buckets\n */\nasync function scanStorageBuckets(projectId: string): Promise<InventoryResource[]> {\n interface StorageBucket {\n name: string;\n timeCreated?: string;\n selfLink?: string;\n labels?: Record<string, string>;\n }\n\n const buckets = await runGcloudCommand<StorageBucket>(\n `gcloud storage buckets list --project=${projectId} --format=json`\n );\n\n return buckets.map((bucket) => {\n const { isStacksolo, project, resource } = parseStacksoloLabels(bucket.labels);\n return {\n name: bucket.name,\n type: 'Storage Bucket',\n selfLink: bucket.selfLink,\n createdAt: bucket.timeCreated,\n labels: bucket.labels,\n isStacksolo,\n stacksoloProject: project,\n stacksoloResource: resource,\n };\n });\n}\n\n/**\n * Scan Cloud Run Services\n */\nasync function scanCloudRunServices(projectId: string): Promise<InventoryResource[]> {\n interface CloudRunService {\n metadata?: {\n name: string;\n creationTimestamp?: string;\n labels?: Record<string, string>;\n };\n }\n\n const services = await runGcloudCommand<CloudRunService>(\n `gcloud run services list --project=${projectId} --format=json`\n );\n\n return services.map((svc) => {\n const { isStacksolo, project, resource } = parseStacksoloLabels(svc.metadata?.labels);\n return {\n name: svc.metadata?.name || '',\n type: 'Cloud Run',\n createdAt: svc.metadata?.creationTimestamp,\n labels: svc.metadata?.labels,\n isStacksolo,\n stacksoloProject: project,\n stacksoloResource: resource,\n };\n });\n}\n\n/**\n * Scan Cloud Functions (Gen2)\n */\nasync function scanCloudFunctions(projectId: string): Promise<InventoryResource[]> {\n interface CloudFunction {\n name: string;\n state?: string;\n createTime?: string;\n labels?: Record<string, string>;\n }\n\n const functions = await runGcloudCommand<CloudFunction>(\n `gcloud functions list --gen2 --project=${projectId} --format=json`\n );\n\n return functions.map((fn) => {\n const { isStacksolo, project, resource } = parseStacksoloLabels(fn.labels);\n return {\n name: fn.name.split('/').pop() || '',\n type: 'Cloud Function',\n location: fn.name.match(/locations\\/([^/]+)/)?.[1],\n createdAt: fn.createTime,\n labels: fn.labels,\n isStacksolo,\n stacksoloProject: project,\n stacksoloResource: resource,\n };\n });\n}\n\n/**\n * Scan Global Addresses\n */\nasync function scanGlobalAddresses(projectId: string): Promise<InventoryResource[]> {\n interface GlobalAddress {\n name: string;\n address?: string;\n selfLink?: string;\n creationTimestamp?: string;\n labels?: Record<string, string>;\n }\n\n const addresses = await runGcloudCommand<GlobalAddress>(\n `gcloud compute addresses list --global --project=${projectId} --format=json`\n );\n\n return addresses.map((addr) => {\n const { isStacksolo, project, resource } = parseStacksoloLabels(addr.labels);\n return {\n name: addr.name,\n type: 'Global Address',\n selfLink: addr.selfLink,\n createdAt: addr.creationTimestamp,\n labels: addr.labels,\n isStacksolo,\n stacksoloProject: project,\n stacksoloResource: resource,\n };\n });\n}\n\n/**\n * Scan Artifact Registry\n */\nasync function scanArtifactRegistry(projectId: string): Promise<InventoryResource[]> {\n interface ArtifactRepo {\n name: string;\n createTime?: string;\n labels?: Record<string, string>;\n }\n\n const repos = await runGcloudCommand<ArtifactRepo>(\n `gcloud artifacts repositories list --project=${projectId} --format=json`\n );\n\n return repos.map((repo) => {\n const { isStacksolo, project, resource } = parseStacksoloLabels(repo.labels);\n return {\n name: repo.name.split('/').pop() || '',\n type: 'Artifact Registry',\n location: repo.name.match(/locations\\/([^/]+)/)?.[1],\n createdAt: repo.createTime,\n labels: repo.labels,\n isStacksolo,\n stacksoloProject: project,\n stacksoloResource: resource,\n };\n });\n}\n\n/**\n * Scan VPC Access Connectors\n */\nasync function scanVpcConnectors(projectId: string, region: string): Promise<InventoryResource[]> {\n interface VpcConnector {\n name: string;\n state?: string;\n labels?: Record<string, string>;\n }\n\n const connectors = await runGcloudCommand<VpcConnector>(\n `gcloud compute networks vpc-access connectors list --region=${region} --project=${projectId} --format=json`\n );\n\n return connectors.map((connector) => {\n const { isStacksolo, project, resource } = parseStacksoloLabels(connector.labels);\n return {\n name: connector.name.split('/').pop() || '',\n type: 'VPC Connector',\n location: region,\n labels: connector.labels,\n isStacksolo,\n stacksoloProject: project,\n stacksoloResource: resource,\n };\n });\n}\n\n/**\n * Scan all GCP resources for StackSolo labels\n */\nasync function scanAllResources(\n projectId: string,\n region: string = 'us-central1'\n): Promise<InventoryResult> {\n const scanners = [\n { name: 'VPC Networks', fn: () => scanVpcNetworks(projectId) },\n { name: 'Storage Buckets', fn: () => scanStorageBuckets(projectId) },\n { name: 'Cloud Run', fn: () => scanCloudRunServices(projectId) },\n { name: 'Cloud Functions', fn: () => scanCloudFunctions(projectId) },\n { name: 'Global Addresses', fn: () => scanGlobalAddresses(projectId) },\n { name: 'Artifact Registry', fn: () => scanArtifactRegistry(projectId) },\n { name: 'VPC Connectors', fn: () => scanVpcConnectors(projectId, region) },\n ];\n\n const results = await Promise.allSettled(scanners.map((s) => s.fn()));\n\n const allResources: InventoryResource[] = [];\n const errors: string[] = [];\n\n results.forEach((result, index) => {\n if (result.status === 'fulfilled') {\n allResources.push(...result.value);\n } else {\n errors.push(`${scanners[index].name}: ${result.reason}`);\n }\n });\n\n // Get registered projects from registry\n const registry = getRegistry();\n const registeredProjects = await registry.listProjects();\n const registeredProjectNames = new Set(registeredProjects.map((p) => p.name));\n\n // Categorize resources\n const managed: InventoryResource[] = [];\n const unmanaged: InventoryResource[] = [];\n const orphaned: InventoryResource[] = [];\n\n for (const resource of allResources) {\n if (resource.isStacksolo) {\n // Check if the project is still registered\n if (resource.stacksoloProject && !registeredProjectNames.has(resource.stacksoloProject)) {\n resource.isOrphaned = true;\n orphaned.push(resource);\n } else {\n managed.push(resource);\n }\n } else {\n unmanaged.push(resource);\n }\n }\n\n return { managed, unmanaged, orphaned, errors };\n}\n\n/**\n * Format resource type with color\n */\nfunction formatType(type: string): string {\n const colors: Record<string, typeof chalk.blue> = {\n 'VPC Network': chalk.cyan,\n 'VPC Connector': chalk.cyan,\n 'Storage Bucket': chalk.green,\n 'Cloud Run': chalk.magenta,\n 'Cloud Function': chalk.yellow,\n 'Global Address': chalk.blue,\n 'Artifact Registry': chalk.gray,\n };\n const colorFn = colors[type] || chalk.white;\n return colorFn(type.padEnd(18));\n}\n\n/**\n * Get GCP project ID from various sources\n */\nasync function getGcpProjectId(explicitProject?: string): Promise<string | null> {\n // 1. Explicit --project flag takes priority\n if (explicitProject) {\n return explicitProject;\n }\n\n // 2. Try to read from local stacksolo config\n try {\n const fs = await import('fs/promises');\n const path = await import('path');\n const configPath = path.join(process.cwd(), '.stacksolo', 'stacksolo.config.json');\n const configData = await fs.readFile(configPath, 'utf-8');\n const config = JSON.parse(configData);\n if (config.project?.gcpProjectId) {\n return config.project.gcpProjectId;\n }\n } catch {\n // No local config, continue\n }\n\n // 3. Try gcloud default project\n try {\n const { stdout } = await execAsync('gcloud config get-value project 2>/dev/null');\n const gcloudProject = stdout.trim();\n if (gcloudProject && gcloudProject !== '(unset)') {\n return gcloudProject;\n }\n } catch {\n // gcloud not available or no default set\n }\n\n // 4. Fall back to environment variable\n if (process.env.GCP_PROJECT_ID) {\n return process.env.GCP_PROJECT_ID;\n }\n\n return null;\n}\n\n/**\n * List inventory (default action)\n */\nasync function listInventory(options: {\n project?: string;\n region: string;\n orphaned?: boolean;\n unmanaged?: boolean;\n json?: boolean;\n}) {\n const projectId = await getGcpProjectId(options.project);\n\n if (!projectId) {\n console.log(chalk.red('\\n Error: No GCP project specified.\\n'));\n console.log(chalk.gray(' Use --project <id>, set GCP_PROJECT_ID, or run from a StackSolo project directory.\\n'));\n process.exit(1);\n }\n\n console.log(chalk.gray(`\\n Scanning GCP project: ${projectId}...\\n`));\n\n const result = await scanAllResources(projectId, options.region);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n // Show errors if any\n if (result.errors.length > 0) {\n console.log(chalk.yellow(' Warnings:'));\n result.errors.forEach((err) => console.log(chalk.gray(` - ${err}`)));\n console.log('');\n }\n\n // Show orphaned resources\n if (result.orphaned.length > 0) {\n console.log(chalk.red.bold(` Orphaned Resources (${result.orphaned.length})`));\n console.log(chalk.gray(' These resources have StackSolo labels but no matching registered project.\\n'));\n\n console.log(\n chalk.gray(' ') +\n chalk.gray('TYPE'.padEnd(18)) +\n chalk.gray('NAME'.padEnd(30)) +\n chalk.gray('PROJECT')\n );\n console.log(chalk.gray(' ' + '-'.repeat(70)));\n\n for (const resource of result.orphaned) {\n console.log(\n chalk.white(' ') +\n formatType(resource.type) +\n chalk.white(resource.name.padEnd(30)) +\n chalk.red(resource.stacksoloProject || 'unknown')\n );\n }\n console.log('');\n }\n\n if (options.orphaned) {\n return; // Only show orphaned\n }\n\n // Show managed resources grouped by project\n if (result.managed.length > 0) {\n console.log(chalk.green.bold(` StackSolo Managed Resources (${result.managed.length})`));\n console.log('');\n\n // Group by project\n const byProject = new Map<string, InventoryResource[]>();\n for (const resource of result.managed) {\n const proj = resource.stacksoloProject || 'unknown';\n if (!byProject.has(proj)) {\n byProject.set(proj, []);\n }\n byProject.get(proj)!.push(resource);\n }\n\n for (const [projectName, resources] of byProject) {\n console.log(chalk.cyan(` ${projectName}:`));\n\n for (const resource of resources) {\n // Show shared indicator\n const sharedWith = resource.labels?.['stacksolo-shared-with'];\n const sharedIndicator = sharedWith ? chalk.blue(` [shared: ${sharedWith.replace(/_/g, ', ')}]`) : '';\n console.log(\n chalk.gray(' ') +\n formatType(resource.type) +\n chalk.white(resource.name) +\n sharedIndicator\n );\n }\n console.log('');\n }\n }\n\n // Show unmanaged resources if requested\n if (options.unmanaged && result.unmanaged.length > 0) {\n console.log(chalk.gray.bold(` Unmanaged Resources (${result.unmanaged.length})`));\n console.log(chalk.gray(' These resources do not have StackSolo labels.\\n'));\n\n console.log(\n chalk.gray(' ') +\n chalk.gray('TYPE'.padEnd(18)) +\n chalk.gray('NAME')\n );\n console.log(chalk.gray(' ' + '-'.repeat(50)));\n\n for (const resource of result.unmanaged) {\n console.log(\n chalk.gray(' ') +\n formatType(resource.type) +\n chalk.gray(resource.name)\n );\n }\n console.log('');\n }\n\n // Summary\n console.log(chalk.bold(' Summary:'));\n console.log(chalk.green(` Managed: ${result.managed.length}`));\n if (result.orphaned.length > 0) {\n console.log(chalk.red(` Orphaned: ${result.orphaned.length}`));\n }\n console.log(chalk.gray(` Unmanaged: ${result.unmanaged.length}`));\n console.log('');\n\n // Help message if nothing found\n const totalResources = result.managed.length + result.orphaned.length + result.unmanaged.length;\n if (totalResources === 0) {\n console.log(chalk.yellow(' No resources found. This could mean:'));\n console.log(chalk.gray(' - No resources have been deployed yet'));\n console.log(chalk.gray(' - Required GCP APIs are not enabled (Compute, Storage, Cloud Run, etc.)'));\n console.log(chalk.gray(' - The GCP project ID is incorrect'));\n console.log(chalk.gray(' - Your account lacks permission to list resources'));\n console.log('');\n console.log(chalk.gray(' To enable required APIs, run:'));\n console.log(chalk.cyan(` gcloud services enable compute.googleapis.com --project=${projectId}`));\n console.log(chalk.cyan(` gcloud services enable storage.googleapis.com --project=${projectId}`));\n console.log(chalk.cyan(` gcloud services enable run.googleapis.com --project=${projectId}`));\n console.log(chalk.cyan(` gcloud services enable cloudfunctions.googleapis.com --project=${projectId}`));\n console.log(chalk.cyan(` gcloud services enable artifactregistry.googleapis.com --project=${projectId}`));\n console.log('');\n }\n}\n\nexport const inventoryCommand = new Command('inventory')\n .description('Scan GCP for all StackSolo-managed resources')\n .option('--project <id>', 'GCP project ID to scan')\n .option('--region <region>', 'GCP region for regional resources', 'us-central1')\n .option('--orphaned', 'Show only orphaned resources')\n .option('--unmanaged', 'Show unmanaged resources')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n await listInventory(options);\n });\n\n// Subcommand: adopt an unmanaged resource\ninventoryCommand\n .command('adopt <resourceType> <resourceName> <stacksoloProject>')\n .description('Add StackSolo labels to an unmanaged GCP resource')\n .option('--project <id>', 'GCP project ID')\n .option('--region <region>', 'GCP region for regional resources', 'us-central1')\n .action(async (resourceType: string, resourceName: string, stacksoloProject: string, options) => {\n const projectId = options.project || process.env.GCP_PROJECT_ID;\n\n if (!projectId) {\n console.log(chalk.red('\\n Error: No GCP project specified.\\n'));\n console.log(chalk.gray(' Use --project <id> or set GCP_PROJECT_ID environment variable.\\n'));\n process.exit(1);\n }\n\n console.log(chalk.gray(`\\n Adopting ${resourceType} \"${resourceName}\" for project \"${stacksoloProject}\"...\\n`));\n\n const result = await adoptResource(projectId, resourceType, resourceName, stacksoloProject, options.region);\n\n if (result.success) {\n console.log(chalk.green(` ✓ Successfully adopted ${resourceName}`));\n console.log(chalk.gray(` Labels added: stacksolo=true, stacksolo-project=${stacksoloProject}\\n`));\n } else {\n console.log(chalk.red(` ✗ Failed to adopt ${resourceName}`));\n console.log(chalk.gray(` Error: ${result.error}\\n`));\n process.exit(1);\n }\n });\n\n// Subcommand: share a resource with another project\ninventoryCommand\n .command('share <resourceType> <resourceName> <additionalProject>')\n .description('Mark a StackSolo resource as shared with another project')\n .option('--project <id>', 'GCP project ID')\n .option('--region <region>', 'GCP region for regional resources', 'us-central1')\n .action(async (resourceType: string, resourceName: string, additionalProject: string, options) => {\n const projectId = options.project || process.env.GCP_PROJECT_ID;\n\n if (!projectId) {\n console.log(chalk.red('\\n Error: No GCP project specified.\\n'));\n console.log(chalk.gray(' Use --project <id> or set GCP_PROJECT_ID environment variable.\\n'));\n process.exit(1);\n }\n\n console.log(chalk.gray(`\\n Scanning for ${resourceType} \"${resourceName}\"...\\n`));\n\n // First, find the resource to get its current labels\n const result = await scanAllResources(projectId, options.region);\n const allResources = [...result.managed, ...result.orphaned];\n const resource = allResources.find(r => r.name === resourceName && r.type === resourceType);\n\n if (!resource) {\n console.log(chalk.red(` ✗ Resource not found: ${resourceType} \"${resourceName}\"`));\n console.log(chalk.gray(' Make sure the resource exists and has StackSolo labels.\\n'));\n process.exit(1);\n }\n\n console.log(chalk.gray(` Sharing ${resourceType} \"${resourceName}\" with project \"${additionalProject}\"...\\n`));\n\n const shareResult = await shareResource(\n projectId,\n resourceType,\n resourceName,\n resource.labels || {},\n additionalProject,\n options.region\n );\n\n if (shareResult.success) {\n console.log(chalk.green(` ✓ Successfully shared ${resourceName}`));\n console.log(chalk.gray(` Added to stacksolo-shared-with: ${additionalProject}\\n`));\n } else {\n console.log(chalk.red(` ✗ Failed to share ${resourceName}`));\n console.log(chalk.gray(` Error: ${shareResult.error}\\n`));\n process.exit(1);\n }\n });","/**\n * stacksolo doctor\n *\n * Run health checks to verify your development environment and GCP setup.\n * Identifies issues before they cause deploy failures.\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\ninterface CheckResult {\n name: string;\n status: 'ok' | 'warn' | 'fail';\n message: string;\n fix?: string;\n}\n\nexport const doctorCommand = new Command('doctor')\n .description('Check system prerequisites and GCP configuration')\n .option('--fix', 'Attempt to fix issues automatically')\n .option('--verbose', 'Show detailed output for each check')\n .action(async (options) => {\n await runDoctor(options);\n });\n\ninterface DoctorOptions {\n fix?: boolean;\n verbose?: boolean;\n}\n\nasync function runDoctor(options: DoctorOptions): Promise<void> {\n console.log(chalk.bold('\\n StackSolo Doctor\\n'));\n console.log(chalk.gray(' Checking your development environment...\\n'));\n\n const results: CheckResult[] = [];\n\n // 1. Check Node.js version\n const nodeResult = await checkNode(options);\n results.push(nodeResult);\n displayResult(nodeResult, options.verbose);\n\n // 2. Check Terraform\n const terraformResult = await checkTerraform(options);\n results.push(terraformResult);\n displayResult(terraformResult, options.verbose);\n\n // 3. Check Docker\n const dockerResult = await checkDocker(options);\n results.push(dockerResult);\n displayResult(dockerResult, options.verbose);\n\n // 4. Check gcloud CLI\n const gcloudResult = await checkGcloud(options);\n results.push(gcloudResult);\n displayResult(gcloudResult, options.verbose);\n\n // 5. Check GCP authentication\n const gcpAuthResult = await checkGcpAuth(options);\n results.push(gcpAuthResult);\n displayResult(gcpAuthResult, options.verbose);\n\n // 6. Check project config (if exists)\n const configResult = await checkConfig(options);\n if (configResult) {\n results.push(configResult);\n displayResult(configResult, options.verbose);\n\n // 7. Check GCP project access (only if config exists)\n const projectAccessResult = await checkGcpProjectAccess(options);\n if (projectAccessResult) {\n results.push(projectAccessResult);\n displayResult(projectAccessResult, options.verbose);\n }\n\n // 8. Check required APIs (only if config exists)\n const apisResult = await checkRequiredApis(options);\n if (apisResult) {\n results.push(apisResult);\n displayResult(apisResult, options.verbose);\n }\n }\n\n // Summary\n console.log(chalk.bold('\\n Summary\\n'));\n\n const passed = results.filter((r) => r.status === 'ok').length;\n const warnings = results.filter((r) => r.status === 'warn').length;\n const failed = results.filter((r) => r.status === 'fail').length;\n\n console.log(chalk.green(` ✓ ${passed} checks passed`));\n if (warnings > 0) {\n console.log(chalk.yellow(` ⚠ ${warnings} warnings`));\n }\n if (failed > 0) {\n console.log(chalk.red(` ✗ ${failed} checks failed`));\n }\n\n // Show fixes if there are issues\n if (failed > 0 || warnings > 0) {\n console.log(chalk.bold('\\n Recommended Actions\\n'));\n\n for (const result of results) {\n if ((result.status === 'fail' || result.status === 'warn') && result.fix) {\n console.log(chalk.gray(` ${result.name}:`));\n console.log(chalk.cyan(` ${result.fix}\\n`));\n }\n }\n }\n\n if (failed === 0) {\n console.log(chalk.green('\\n Your environment is ready for StackSolo!\\n'));\n } else {\n console.log(chalk.yellow('\\n Please fix the issues above before deploying.\\n'));\n process.exit(1);\n }\n}\n\nfunction displayResult(result: CheckResult, verbose?: boolean): void {\n const icon =\n result.status === 'ok' ? chalk.green('✓') :\n result.status === 'warn' ? chalk.yellow('⚠') :\n chalk.red('✗');\n\n const color =\n result.status === 'ok' ? chalk.white :\n result.status === 'warn' ? chalk.yellow :\n chalk.red;\n\n console.log(` ${icon} ${color(result.name)}`);\n\n if (verbose || result.status !== 'ok') {\n console.log(chalk.gray(` ${result.message}`));\n }\n}\n\nasync function checkNode(_options: DoctorOptions): Promise<CheckResult> {\n try {\n const { stdout } = await execAsync('node --version');\n const version = stdout.trim().replace('v', '');\n const major = parseInt(version.split('.')[0], 10);\n\n if (major >= 18) {\n return {\n name: 'Node.js',\n status: 'ok',\n message: `Version ${version} installed`,\n };\n } else if (major >= 16) {\n return {\n name: 'Node.js',\n status: 'warn',\n message: `Version ${version} - recommend 18+`,\n fix: 'nvm install 18 && nvm use 18',\n };\n } else {\n return {\n name: 'Node.js',\n status: 'fail',\n message: `Version ${version} - requires 18+`,\n fix: 'nvm install 18 && nvm use 18',\n };\n }\n } catch {\n return {\n name: 'Node.js',\n status: 'fail',\n message: 'Not installed',\n fix: 'Install Node.js 18+ from https://nodejs.org',\n };\n }\n}\n\nasync function checkTerraform(_options: DoctorOptions): Promise<CheckResult> {\n try {\n const { stdout } = await execAsync('terraform version -json');\n const data = JSON.parse(stdout);\n const version = data.terraform_version;\n\n return {\n name: 'Terraform',\n status: 'ok',\n message: `Version ${version} installed`,\n };\n } catch {\n try {\n // Try non-JSON format for older versions\n const { stdout } = await execAsync('terraform version');\n const match = stdout.match(/Terraform v(\\d+\\.\\d+\\.\\d+)/);\n if (match) {\n return {\n name: 'Terraform',\n status: 'ok',\n message: `Version ${match[1]} installed`,\n };\n }\n } catch {\n // Fall through to fail\n }\n\n return {\n name: 'Terraform',\n status: 'fail',\n message: 'Not installed',\n fix: 'brew install terraform # or https://terraform.io/downloads',\n };\n }\n}\n\nasync function checkDocker(_options: DoctorOptions): Promise<CheckResult> {\n try {\n const { stdout } = await execAsync('docker --version');\n const match = stdout.match(/Docker version (\\d+\\.\\d+\\.\\d+)/);\n const version = match ? match[1] : 'unknown';\n\n // Check if Docker daemon is running\n try {\n await execAsync('docker info', { timeout: 5000 });\n return {\n name: 'Docker',\n status: 'ok',\n message: `Version ${version} installed and running`,\n };\n } catch {\n return {\n name: 'Docker',\n status: 'warn',\n message: `Version ${version} installed but daemon not running`,\n fix: 'Start Docker Desktop or run: sudo systemctl start docker',\n };\n }\n } catch {\n return {\n name: 'Docker',\n status: 'warn',\n message: 'Not installed (required for container deployments)',\n fix: 'Install Docker from https://docker.com',\n };\n }\n}\n\nasync function checkGcloud(_options: DoctorOptions): Promise<CheckResult> {\n try {\n const { stdout } = await execAsync('gcloud version --format=json');\n const data = JSON.parse(stdout);\n const version = data['Google Cloud SDK'];\n\n return {\n name: 'gcloud CLI',\n status: 'ok',\n message: `Version ${version} installed`,\n };\n } catch {\n return {\n name: 'gcloud CLI',\n status: 'fail',\n message: 'Not installed',\n fix: 'Install from https://cloud.google.com/sdk/docs/install',\n };\n }\n}\n\nasync function checkGcpAuth(_options: DoctorOptions): Promise<CheckResult> {\n try {\n // Check if authenticated\n const { stdout } = await execAsync('gcloud auth list --format=json');\n const accounts = JSON.parse(stdout);\n\n if (accounts.length === 0) {\n return {\n name: 'GCP Authentication',\n status: 'fail',\n message: 'No accounts authenticated',\n fix: 'gcloud auth login',\n };\n }\n\n const active = accounts.find((a: { status: string }) => a.status === 'ACTIVE');\n if (!active) {\n return {\n name: 'GCP Authentication',\n status: 'fail',\n message: 'No active account',\n fix: 'gcloud auth login',\n };\n }\n\n // Check application-default credentials\n try {\n await execAsync('gcloud auth application-default print-access-token', { timeout: 5000 });\n return {\n name: 'GCP Authentication',\n status: 'ok',\n message: `Authenticated as ${active.account}`,\n };\n } catch {\n return {\n name: 'GCP Authentication',\n status: 'warn',\n message: `Logged in as ${active.account} but missing application-default credentials`,\n fix: 'gcloud auth application-default login',\n };\n }\n } catch {\n return {\n name: 'GCP Authentication',\n status: 'fail',\n message: 'Could not check authentication status',\n fix: 'gcloud auth login',\n };\n }\n}\n\nasync function checkConfig(_options: DoctorOptions): Promise<CheckResult | null> {\n const configPath = path.join(process.cwd(), STACKSOLO_DIR, CONFIG_FILENAME);\n\n try {\n await fs.access(configPath);\n const config = parseConfig(configPath);\n\n return {\n name: 'Project Config',\n status: 'ok',\n message: `Project: ${config.project.name} (${config.project.gcpProjectId})`,\n };\n } catch (error) {\n const errorStr = String(error);\n if (errorStr.includes('ENOENT')) {\n return {\n name: 'Project Config',\n status: 'warn',\n message: 'No stacksolo.config.json found (run from project directory)',\n fix: 'cd <project-dir> && stacksolo init',\n };\n }\n\n return {\n name: 'Project Config',\n status: 'fail',\n message: `Config parse error: ${errorStr.slice(0, 100)}`,\n fix: 'Check .stacksolo/stacksolo.config.json syntax',\n };\n }\n}\n\nasync function checkGcpProjectAccess(_options: DoctorOptions): Promise<CheckResult | null> {\n const configPath = path.join(process.cwd(), STACKSOLO_DIR, CONFIG_FILENAME);\n\n try {\n const config = parseConfig(configPath);\n const projectId = config.project.gcpProjectId;\n\n // Check if we can access the project\n const { stdout } = await execAsync(\n `gcloud projects describe ${projectId} --format=\"value(projectId)\"`,\n { timeout: 10000 }\n );\n\n if (stdout.trim() === projectId) {\n return {\n name: 'GCP Project Access',\n status: 'ok',\n message: `Access to ${projectId} confirmed`,\n };\n }\n\n return {\n name: 'GCP Project Access',\n status: 'fail',\n message: `Cannot access project ${projectId}`,\n fix: `Verify project exists and you have access: gcloud projects describe ${projectId}`,\n };\n } catch (error) {\n const errorStr = String(error);\n\n if (errorStr.includes('not found') || errorStr.includes('403')) {\n return {\n name: 'GCP Project Access',\n status: 'fail',\n message: 'Project not found or access denied',\n fix: 'Check the gcpProjectId in your config and ensure you have access',\n };\n }\n\n return null;\n }\n}\n\nasync function checkRequiredApis(_options: DoctorOptions): Promise<CheckResult | null> {\n const configPath = path.join(process.cwd(), STACKSOLO_DIR, CONFIG_FILENAME);\n\n try {\n const config = parseConfig(configPath);\n const projectId = config.project.gcpProjectId;\n\n // Core APIs that should be enabled\n const requiredApis = [\n 'cloudfunctions.googleapis.com',\n 'run.googleapis.com',\n 'cloudbuild.googleapis.com',\n 'artifactregistry.googleapis.com',\n ];\n\n // Get list of enabled APIs\n const { stdout } = await execAsync(\n `gcloud services list --project=${projectId} --enabled --format=\"value(NAME)\"`,\n { timeout: 30000 }\n );\n\n const enabledApis = stdout.split('\\n').map((s) => s.trim()).filter(Boolean);\n const missingApis = requiredApis.filter((api) => !enabledApis.includes(api));\n\n if (missingApis.length === 0) {\n return {\n name: 'GCP APIs',\n status: 'ok',\n message: 'Required APIs are enabled',\n };\n }\n\n return {\n name: 'GCP APIs',\n status: 'warn',\n message: `Missing APIs: ${missingApis.join(', ')}`,\n fix: `gcloud services enable ${missingApis.join(' ')} --project=${projectId}`,\n };\n } catch {\n return null;\n }\n}\n","/**\n * stacksolo merge\n *\n * Merge multiple StackSolo projects into a single deployable stack.\n * Enables building products separately and combining them for deployment.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\nimport {\n parseConfig,\n mergeConfigs,\n formatConflicts,\n validateMergedConfig,\n validateCrossProjectReferences,\n type MergeInput,\n type StackSoloConfig,\n} from '@stacksolo/blueprint';\n\nconst STACKSOLO_DIR = '.stacksolo';\nconst CONFIG_FILENAME = 'stacksolo.config.json';\n\n/**\n * Find the config file for a project directory\n */\nasync function findProjectConfig(projectPath: string): Promise<string | null> {\n const candidates = [\n path.join(projectPath, STACKSOLO_DIR, CONFIG_FILENAME),\n path.join(projectPath, CONFIG_FILENAME),\n path.join(projectPath, 'stacksolo.json'),\n path.join(projectPath, '.stacksolo.json'),\n ];\n\n for (const candidate of candidates) {\n try {\n await fs.access(candidate);\n return candidate;\n } catch {\n continue;\n }\n }\n\n return null;\n}\n\n/**\n * Load a project config from a path\n */\nasync function loadProject(projectPath: string): Promise<MergeInput | null> {\n const absolutePath = path.resolve(projectPath);\n\n // Check if it's a directory or a config file\n let configPath: string;\n try {\n const stat = await fs.stat(absolutePath);\n if (stat.isDirectory()) {\n const found = await findProjectConfig(absolutePath);\n if (!found) {\n console.log(chalk.red(` No config file found in ${projectPath}`));\n return null;\n }\n configPath = found;\n } else {\n configPath = absolutePath;\n }\n } catch (err) {\n console.log(chalk.red(` Path not found: ${projectPath}`));\n return null;\n }\n\n try {\n const config = parseConfig(configPath);\n return {\n name: config.project.name,\n path: path.dirname(configPath),\n config,\n };\n } catch (err) {\n console.log(chalk.red(` Failed to parse config: ${configPath}`));\n console.log(chalk.gray(` ${err instanceof Error ? err.message : String(err)}`));\n return null;\n }\n}\n\nexport const mergeCommand = new Command('merge')\n .description('Merge multiple StackSolo projects into a single stack')\n .argument('<projects...>', 'Paths to project directories or config files')\n .requiredOption('--name <name>', 'Name for the merged project')\n .option('-o, --output <dir>', 'Output directory for merged config', '.stacksolo-merged')\n .option('--shared-vpc <name>', 'Use a shared VPC (name or \"auto\" to create)')\n .option('--shared-registry', 'Use a shared Artifact Registry')\n .option('--dry-run', 'Show what would be merged without writing files')\n .option('--validate', 'Only validate, do not generate output')\n .option('--json', 'Output merged config as JSON to stdout')\n .action(async (projectPaths: string[], options) => {\n console.log('');\n console.log(chalk.bold(' StackSolo Merge'));\n console.log(chalk.gray(` Merging ${projectPaths.length} project(s) into \"${options.name}\"`));\n console.log('');\n\n // Load all project configs\n console.log(chalk.cyan(' Loading projects...'));\n const inputs: MergeInput[] = [];\n\n for (const projectPath of projectPaths) {\n const input = await loadProject(projectPath);\n if (input) {\n console.log(chalk.green(` ✓ ${input.name}`), chalk.gray(`(${input.path})`));\n inputs.push(input);\n }\n }\n\n if (inputs.length === 0) {\n console.log(chalk.red('\\n No valid projects found.\\n'));\n process.exit(1);\n }\n\n if (inputs.length < 2) {\n console.log(chalk.yellow('\\n Only one project provided. At least 2 projects are needed to merge.\\n'));\n process.exit(1);\n }\n\n console.log('');\n\n // Merge configs\n console.log(chalk.cyan(' Merging configurations...'));\n const outputDir = path.resolve(options.output);\n\n const result = mergeConfigs(inputs, {\n name: options.name,\n outputDir,\n sharedVpc: options.sharedVpc,\n sharedRegistry: options.sharedRegistry,\n dryRun: options.dryRun,\n });\n\n // Show conflicts\n if (result.conflicts.conflicts.length > 0) {\n console.log('');\n console.log(formatConflicts(result.conflicts));\n }\n\n if (!result.success || !result.config) {\n console.log(chalk.red('\\n Merge failed due to conflicts.\\n'));\n process.exit(1);\n }\n\n console.log(chalk.green(' ✓ Configurations merged'));\n\n // Validate merged config\n console.log('');\n console.log(chalk.cyan(' Validating merged config...'));\n\n const validation = validateMergedConfig(result.config);\n\n if (!validation.valid) {\n console.log(chalk.red('\\n Validation errors:'));\n for (const error of validation.errors) {\n console.log(chalk.red(` - ${error.path}: ${error.message}`));\n }\n console.log('');\n process.exit(1);\n }\n\n if (validation.warnings.length > 0) {\n console.log(chalk.yellow('\\n Warnings:'));\n for (const warning of validation.warnings) {\n console.log(chalk.yellow(` - ${warning}`));\n }\n }\n\n // Validate cross-project references\n const sourceProjects = inputs.map(i => i.name);\n const refErrors = validateCrossProjectReferences(result.config, sourceProjects);\n if (refErrors.length > 0) {\n console.log(chalk.red('\\n Reference errors:'));\n for (const error of refErrors) {\n console.log(chalk.red(` - ${error}`));\n }\n console.log('');\n process.exit(1);\n }\n\n console.log(chalk.green(' ✓ Validation passed'));\n\n // If validate-only, exit here\n if (options.validate) {\n console.log(chalk.green('\\n Validation complete. No output generated.\\n'));\n process.exit(0);\n }\n\n // If JSON output, print and exit\n if (options.json) {\n console.log('');\n console.log(JSON.stringify(result.config, null, 2));\n console.log('');\n process.exit(0);\n }\n\n // If dry-run, show what would be created\n if (options.dryRun) {\n console.log('');\n console.log(chalk.cyan(' Dry run - would create:'));\n console.log(chalk.gray(` ${outputDir}/`));\n console.log(chalk.gray(` ${outputDir}/${CONFIG_FILENAME}`));\n console.log('');\n console.log(chalk.cyan(' Merged resources:'));\n showMergedResources(result.config);\n console.log('');\n process.exit(0);\n }\n\n // Write output\n console.log('');\n console.log(chalk.cyan(' Writing merged config...'));\n\n try {\n await fs.mkdir(outputDir, { recursive: true });\n const configOutput = path.join(outputDir, CONFIG_FILENAME);\n await fs.writeFile(configOutput, JSON.stringify(result.config, null, 2));\n console.log(chalk.green(` ✓ ${configOutput}`));\n } catch (err) {\n console.log(chalk.red(` Failed to write output: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n\n // Summary\n console.log('');\n console.log(chalk.bold.green(' Merge complete!'));\n console.log('');\n showMergedResources(result.config);\n console.log('');\n console.log(chalk.gray(' To deploy the merged stack:'));\n console.log(chalk.cyan(` cd ${options.output}`));\n console.log(chalk.cyan(' stacksolo deploy'));\n console.log('');\n });\n\n/**\n * Display summary of merged resources\n */\nfunction showMergedResources(config: StackSoloConfig & { _merge?: { sources: Array<{ name: string }> } }): void {\n const project = config.project;\n\n // Count resources\n const counts: Record<string, number> = {};\n\n counts['buckets'] = project.buckets?.length || 0;\n counts['secrets'] = project.secrets?.length || 0;\n counts['topics'] = project.topics?.length || 0;\n counts['queues'] = project.queues?.length || 0;\n counts['crons'] = project.crons?.length || 0;\n\n for (const network of project.networks || []) {\n counts['networks'] = (counts['networks'] || 0) + 1;\n counts['containers'] = (counts['containers'] || 0) + (network.containers?.length || 0);\n counts['functions'] = (counts['functions'] || 0) + (network.functions?.length || 0);\n counts['databases'] = (counts['databases'] || 0) + (network.databases?.length || 0);\n counts['caches'] = (counts['caches'] || 0) + (network.caches?.length || 0);\n counts['uis'] = (counts['uis'] || 0) + (network.uis?.length || 0);\n }\n\n console.log(chalk.gray(' Resources:'));\n for (const [type, count] of Object.entries(counts)) {\n if (count > 0) {\n console.log(chalk.gray(` ${type}: ${count}`));\n }\n }\n\n if (config._merge?.sources) {\n console.log('');\n console.log(chalk.gray(' Source projects:'));\n for (const source of config._merge.sources) {\n console.log(chalk.gray(` - ${source.name}`));\n }\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';\nimport { loadPlugins, getPluginService, getServiceSourcePath } from '../../services/plugin-loader.service';\n\n// =============================================================================\n// Kernel Configuration Helper\n// =============================================================================\n\ninterface KernelDevConfig {\n name: string;\n type: 'nats' | 'gcp';\n serviceName: string; // Plugin service name for getPluginService()\n httpPort: number;\n natsPort?: number; // Only for NATS kernel\n healthPath: string;\n}\n\n/**\n * Get unified kernel configuration from either kernel or gcpKernel config.\n * Returns null if no kernel is configured.\n */\nfunction getKernelConfig(config: StackSoloConfig): KernelDevConfig | null {\n if (config.project.kernel) {\n return {\n name: config.project.kernel.name,\n type: 'nats',\n serviceName: 'kernel',\n httpPort: 8090,\n natsPort: 4222,\n healthPath: '/health',\n };\n }\n\n if (config.project.gcpKernel) {\n return {\n name: config.project.gcpKernel.name,\n type: 'gcp',\n serviceName: 'gcp-kernel',\n httpPort: 8080,\n healthPath: '/health',\n };\n }\n\n return null;\n}\n\n// Track port-forward processes for cleanup\nconst portForwardProcesses: ChildProcess[] = [];\n\n// Track web admin process\nlet webAdminProcess: ChildProcess | null = null;\n\n// Flag to prevent restart during shutdown\nlet isShuttingDown = false;\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 with health')\n .option('--health', 'Check health of all services')\n .option('--ports', 'Show port-forward status')\n .option('--restart [service]', 'Restart port-forwards or specific service pod')\n .option('--service-names', 'List service names for use with other commands')\n .option('--routes', 'Show gateway routes and services')\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.health) {\n await checkHealth();\n return;\n }\n\n if (options.ports) {\n await showPorts();\n return;\n }\n\n if (options.restart !== undefined) {\n const service = typeof options.restart === 'string' ? options.restart : undefined;\n await restartService(service);\n return;\n }\n\n if (options.serviceNames) {\n await showServiceNames();\n return;\n }\n\n if (options.routes) {\n await showRoutes();\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 // Check kernel directory if configured (only for local containers, plugins handle their own source)\n const validateKernelConfig = getKernelConfig(config);\n if (validateKernelConfig) {\n // Only warn for containers dir if plugin service doesn't provide the source\n const kernelService = getPluginService(validateKernelConfig.serviceName);\n const pluginSourcePath = kernelService ? getServiceSourcePath(kernelService) : null;\n if (!pluginSourcePath) {\n const kernelDir = path.join(projectRoot, 'containers', validateKernelConfig.name);\n try {\n await fs.access(kernelDir);\n } catch {\n warnings.push(`Kernel directory not found: containers/${validateKernelConfig.name}/`);\n }\n }\n }\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 web admin UI if enabled in config\n */\nasync function startWebAdmin(config: StackSoloConfig): Promise<number | null> {\n const webAdmin = config.project.webAdmin;\n if (!webAdmin?.enabled) {\n return null;\n }\n\n const port = webAdmin.port || 3000;\n const spinner = ora(`Starting web admin on port ${port}...`).start();\n\n try {\n // Try to find the web-admin app in the plugin\n const webAdminService = getPluginService('web-admin');\n let appDir: string | null = null;\n\n if (webAdminService) {\n const sourcePath = getServiceSourcePath(webAdminService);\n if (sourcePath) {\n appDir = sourcePath;\n }\n }\n\n // Fall back to node_modules if not found in plugin\n if (!appDir) {\n // Try to find in node_modules\n const nodeModulesPath = path.join(process.cwd(), 'node_modules', '@stacksolo', 'plugin-web-admin', 'app');\n try {\n await fs.access(nodeModulesPath);\n appDir = nodeModulesPath;\n } catch {\n // Not installed\n }\n }\n\n if (!appDir) {\n spinner.warn('Web admin not found - install @stacksolo/plugin-web-admin or add to plugins');\n return null;\n }\n\n // Check if app is built\n const buildDir = path.join(appDir, 'build');\n let useDevMode = false;\n try {\n await fs.access(buildDir);\n } catch {\n // No build, use dev mode\n useDevMode = true;\n }\n\n const projectPath = process.cwd();\n\n if (useDevMode) {\n // Run in dev mode\n webAdminProcess = spawn('npm', ['run', 'dev', '--', '--port', String(port)], {\n cwd: appDir,\n env: {\n ...process.env,\n STACKSOLO_PROJECT_PATH: projectPath,\n PORT: String(port),\n },\n stdio: 'pipe',\n detached: false,\n });\n } else {\n // Run production build\n webAdminProcess = spawn('node', ['build'], {\n cwd: appDir,\n env: {\n ...process.env,\n STACKSOLO_PROJECT_PATH: projectPath,\n PORT: String(port),\n },\n stdio: 'pipe',\n detached: false,\n });\n }\n\n // Wait a moment for startup\n await new Promise((resolve) => setTimeout(resolve, 2000));\n\n if (webAdminProcess.exitCode !== null) {\n spinner.fail('Web admin failed to start');\n return null;\n }\n\n spinner.succeed(`Web admin running at http://localhost:${port}`);\n return port;\n } catch (error) {\n spinner.fail(`Failed to start web admin: ${error instanceof Error ? error.message : error}`);\n return null;\n }\n}\n\n/**\n * Build kernel Docker image from plugin service source or containers directory\n * Works with both NATS and GCP kernels using unified config\n */\nasync function buildKernelImage(config: StackSoloConfig): Promise<boolean> {\n const kernelConfig = getKernelConfig(config);\n if (!kernelConfig) {\n return false;\n }\n\n const { name: kernelName, type: kernelType, serviceName } = kernelConfig;\n\n // Try to get kernel from plugin services (for monorepo dev)\n const kernelService = getPluginService(serviceName);\n let kernelDir: string;\n\n if (kernelService) {\n // Get source path from plugin for local development\n const sourcePath = getServiceSourcePath(kernelService);\n if (sourcePath) {\n kernelDir = sourcePath;\n console.log(chalk.gray(` Using ${kernelType} kernel from plugin: ${kernelDir}`));\n } else {\n // Fall back to containers directory\n kernelDir = path.join(process.cwd(), 'containers', kernelName);\n }\n } else {\n // No plugin, use containers directory\n kernelDir = path.join(process.cwd(), 'containers', kernelName);\n }\n\n // Check if kernel directory exists\n try {\n await fs.access(kernelDir);\n } catch {\n console.log(chalk.gray(` ${kernelType.toUpperCase()} kernel directory not found: ${kernelDir}`));\n return false;\n }\n\n const spinner = ora(`Building ${kernelType} kernel image from ${kernelDir}...`).start();\n\n try {\n // Install dependencies first\n execSync('npm install', { cwd: kernelDir, stdio: 'pipe' });\n\n // Build TypeScript\n execSync('npm run build', { cwd: kernelDir, stdio: 'pipe' });\n\n // Build Docker image\n execSync(`docker build -t ${kernelName}:dev .`, { cwd: kernelDir, stdio: 'pipe' });\n\n spinner.succeed(`${kernelType.toUpperCase()} kernel image built: ${kernelName}:dev`);\n return true;\n } catch (error) {\n spinner.fail(`Failed to build ${kernelType} kernel image`);\n console.log(chalk.gray(` Error: ${error instanceof Error ? error.message : error}`));\n return false;\n }\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. Load plugins from config (registers providers/services)\n const pluginSpinner = ora('Loading plugins...').start();\n await loadPlugins(config.project.plugins);\n pluginSpinner.succeed('Plugins loaded');\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. Build kernel image if configured (NATS or GCP)\n await buildKernelImage(config);\n\n // 5. 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. Start web admin if enabled\n const webAdminPort = await startWebAdmin(config);\n if (webAdminPort) {\n portMappings.unshift({\n name: 'Web Admin',\n service: 'web-admin',\n localPort: webAdminPort,\n targetPort: webAdminPort,\n protocol: 'http',\n });\n }\n\n // 9. 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 isShuttingDown = true;\n console.log(chalk.gray('\\n Shutting down...\\n'));\n\n // Kill web admin process\n if (webAdminProcess) {\n try {\n webAdminProcess.kill('SIGTERM');\n } catch {\n // Ignore\n }\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 * Start a port-forward with auto-restart on failure\n */\nfunction startPortForwardWithRestart(\n namespace: string,\n service: string,\n localPort: number,\n targetPort: number,\n _name: string\n): ChildProcess {\n const startForward = (): ChildProcess => {\n const proc = spawn(\n 'kubectl',\n ['port-forward', '-n', namespace, `svc/${service}`, `${localPort}:${targetPort}`],\n { stdio: 'pipe', detached: false }\n );\n\n proc.on('exit', (code) => {\n // Auto-restart if not shutting down and process exited unexpectedly\n if (!isShuttingDown && code !== 0) {\n // Wait a bit before restarting to avoid tight loops\n setTimeout(() => {\n if (!isShuttingDown) {\n const newProc = startForward();\n // Replace in the array\n const idx = portForwardProcesses.indexOf(proc);\n if (idx >= 0) {\n portForwardProcesses[idx] = newProc;\n } else {\n portForwardProcesses.push(newProc);\n }\n }\n }, 2000);\n }\n });\n\n proc.on('error', () => {\n // Errors are handled by exit handler\n });\n\n return proc;\n };\n\n return startForward();\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 // Kernel ports (if configured) - works for both NATS and GCP kernels\n const kernelConfig = getKernelConfig(config);\n if (kernelConfig) {\n const label = kernelConfig.type === 'nats' ? 'Kernel' : 'GCP Kernel';\n portMappings.push({\n name: `${label} HTTP`,\n service: kernelConfig.name,\n localPort: kernelConfig.httpPort,\n targetPort: kernelConfig.httpPort,\n protocol: 'http',\n });\n if (kernelConfig.natsPort) {\n portMappings.push({\n name: `${label} NATS`,\n service: kernelConfig.name,\n localPort: kernelConfig.natsPort,\n targetPort: kernelConfig.natsPort,\n protocol: 'tcp',\n });\n }\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 with auto-restart\n for (const mapping of portMappings) {\n try {\n const proc = startPortForwardWithRestart(\n namespace,\n mapping.service,\n mapping.localPort,\n mapping.targetPort,\n mapping.name\n );\n portForwardProcesses.push(proc);\n } catch {\n // Ignore errors for individual port forwards\n }\n }\n\n // Port-forward gateway for unified load balancer access with auto-restart\n const hasGateway = config.project.networks?.some((n) => n.loadBalancer?.routes);\n if (hasGateway) {\n try {\n const gatewayProc = startPortForwardWithRestart(\n namespace,\n 'gateway',\n 8000,\n 8000,\n 'Load Balancer'\n );\n portForwardProcesses.push(gatewayProc);\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 const projectName = config.project.name;\n\n // 1. Delete namespace\n const nsSpinner = ora(`Deleting namespace ${namespace}...`).start();\n try {\n execSync(`kubectl delete namespace ${namespace}`, { stdio: 'pipe' });\n nsSpinner.succeed('Namespace deleted');\n } catch {\n nsSpinner.warn('Namespace may not exist or already deleted');\n }\n\n // 2. Clean up Docker images for this project to prevent stale images on next dev start\n const imgSpinner = ora('Cleaning up Docker images...').start();\n try {\n // Find and remove images tagged with this project's namespace\n const images = execSync(\n `docker images --format \"{{.Repository}}:{{.Tag}}\" | grep -E \"^(${namespace}-|${projectName}-)\" || true`,\n { encoding: 'utf-8' }\n ).trim();\n\n if (images) {\n const imageList = images.split('\\n').filter(Boolean);\n for (const image of imageList) {\n try {\n execSync(`docker rmi ${image}`, { stdio: 'pipe' });\n } catch {\n // Image might be in use or already removed\n }\n }\n imgSpinner.succeed(`Cleaned up ${imageList.length} Docker image(s)`);\n } else {\n imgSpinner.info('No project images to clean up');\n }\n } catch {\n imgSpinner.info('No project images to clean up');\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 * Show gateway routes and services from config\n */\nasync function showRoutes(): Promise<void> {\n console.log(chalk.bold('\\n StackSolo Gateway Routes\\n'));\n\n const config = await loadConfig();\n\n // Show kernel if configured\n const kernelConfig = getKernelConfig(config);\n if (kernelConfig) {\n const label = kernelConfig.type === 'nats' ? 'Kernel (NATS)' : 'Kernel (GCP)';\n const detail = kernelConfig.type === 'nats'\n ? `Source: containers/${kernelConfig.name}/`\n : 'Type: GCP-native (Cloud Run + Pub/Sub)';\n console.log(chalk.bold(` ${label}:\\n`));\n console.log(` ${chalk.cyan('●')} ${kernelConfig.name}`);\n console.log(chalk.gray(` ${detail}`));\n console.log('');\n }\n\n // Show networks with their routes\n for (const network of config.project.networks || []) {\n console.log(chalk.bold(` Network: ${network.name}\\n`));\n\n // Functions\n if (network.functions && network.functions.length > 0) {\n console.log(chalk.bold(' Functions:'));\n for (const func of network.functions) {\n console.log(` ${chalk.green('λ')} ${func.name}`);\n console.log(chalk.gray(` Source: functions/${func.name}/`));\n }\n console.log('');\n }\n\n // Containers\n if (network.containers && network.containers.length > 0) {\n console.log(chalk.bold(' Containers:'));\n for (const container of network.containers) {\n console.log(` ${chalk.blue('◼')} ${container.name}`);\n console.log(chalk.gray(` Source: containers/${container.name}/`));\n }\n console.log('');\n }\n\n // UIs\n if (network.uis && network.uis.length > 0) {\n console.log(chalk.bold(' UIs:'));\n for (const ui of network.uis) {\n console.log(` ${chalk.magenta('◆')} ${ui.name}`);\n console.log(chalk.gray(` Source: ui/${ui.name}/`));\n }\n console.log('');\n }\n\n // Load balancer routes\n if (network.loadBalancer?.routes && network.loadBalancer.routes.length > 0) {\n console.log(chalk.bold(' Gateway Routes:'));\n console.log(chalk.gray(' Path → Backend'));\n console.log(chalk.gray(' ' + '─'.repeat(50)));\n for (const route of network.loadBalancer.routes) {\n const pathPadded = route.path.padEnd(24);\n console.log(` ${chalk.yellow(pathPadded)} → ${route.backend}`);\n }\n console.log('');\n }\n }\n\n // Emulators section\n console.log(chalk.bold(' Emulators:\\n'));\n console.log(` ${chalk.yellow('Firebase UI')} http://localhost:4000`);\n console.log(` ${chalk.yellow('Firestore')} localhost:8080`);\n console.log(` ${chalk.yellow('Firebase Auth')} localhost:9099`);\n console.log(` ${chalk.yellow('Pub/Sub')} localhost:8085`);\n console.log('');\n\n console.log(chalk.bold(' Local Access:\\n'));\n console.log(` ${chalk.cyan('Gateway:')} http://localhost:8000`);\n const routesKernelConfig = getKernelConfig(config);\n if (routesKernelConfig) {\n const label = routesKernelConfig.type === 'nats' ? 'Kernel HTTP' : 'GCP Kernel';\n console.log(` ${chalk.cyan(`${label}:`)}${' '.repeat(14 - label.length)}http://localhost:${routesKernelConfig.httpPort}`);\n if (routesKernelConfig.natsPort) {\n console.log(` ${chalk.cyan('Kernel NATS:')} localhost:${routesKernelConfig.natsPort}`);\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 * Check health of all services by making HTTP requests\n */\nasync function checkHealth(): Promise<void> {\n console.log(chalk.bold('\\n StackSolo Dev - Health Check\\n'));\n\n const config = await loadConfig();\n const namespace = sanitizeNamespaceName(config.project.name);\n\n // Define services to check with their expected ports\n const healthChecks: Array<{ name: string; port: number; path: string }> = [];\n\n // Gateway\n const hasGateway = config.project.networks?.some((n) => n.loadBalancer?.routes);\n if (hasGateway) {\n healthChecks.push({ name: 'Gateway', port: 8000, path: '/health' });\n }\n\n // Kernel (NATS or GCP)\n const healthKernelConfig = getKernelConfig(config);\n if (healthKernelConfig) {\n const label = healthKernelConfig.type === 'nats' ? 'Kernel HTTP' : 'GCP Kernel';\n healthChecks.push({ name: label, port: healthKernelConfig.httpPort, path: healthKernelConfig.healthPath });\n }\n\n // Firebase emulator\n healthChecks.push({ name: 'Firebase UI', port: 4000, path: '/' });\n\n // Functions\n let functionPort = 8081;\n for (const network of config.project.networks || []) {\n for (const func of network.functions || []) {\n healthChecks.push({ name: `Function: ${func.name}`, port: functionPort, path: '/health' });\n functionPort++;\n }\n }\n\n // Get pod status from K8s\n console.log(chalk.bold(' Pod Status:\\n'));\n try {\n const podOutput = execSync(\n `kubectl get pods -n ${namespace} -o jsonpath='{range .items[*]}{.metadata.name}|{.status.phase}|{.status.conditions[?(@.type==\"Ready\")].status}{\\\"\\\\n\\\"}{end}'`,\n { encoding: 'utf-8' }\n );\n\n for (const line of podOutput.trim().split('\\n')) {\n if (!line) continue;\n const [name, phase, ready] = line.split('|');\n const isHealthy = phase === 'Running' && ready === 'True';\n const icon = isHealthy ? chalk.green('✓') : chalk.red('✗');\n const status = isHealthy ? chalk.green('Healthy') : chalk.yellow(phase);\n console.log(` ${icon} ${name.padEnd(40)} ${status}`);\n }\n } catch {\n console.log(chalk.yellow(' Unable to get pod status'));\n }\n\n // Check HTTP endpoints\n console.log(chalk.bold('\\n HTTP Endpoints:\\n'));\n\n for (const check of healthChecks) {\n const spinner = ora({ text: `Checking ${check.name}...`, indent: 4 }).start();\n\n try {\n const response = await Promise.race([\n fetch(`http://localhost:${check.port}${check.path}`),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('Timeout')), 2000)\n ),\n ]) as Response;\n\n if (response.ok) {\n spinner.succeed(`${check.name.padEnd(25)} ${chalk.green('OK')} (port ${check.port})`);\n } else {\n spinner.warn(`${check.name.padEnd(25)} ${chalk.yellow(`HTTP ${response.status}`)} (port ${check.port})`);\n }\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : 'Unknown error';\n if (errMsg.includes('ECONNREFUSED')) {\n spinner.fail(`${check.name.padEnd(25)} ${chalk.red('Connection refused')} (port ${check.port})`);\n } else if (errMsg.includes('Timeout')) {\n spinner.fail(`${check.name.padEnd(25)} ${chalk.red('Timeout')} (port ${check.port})`);\n } else {\n spinner.fail(`${check.name.padEnd(25)} ${chalk.red(errMsg)} (port ${check.port})`);\n }\n }\n }\n\n console.log(chalk.bold('\\n Tip:\\n'));\n console.log(chalk.gray(' If ports show \"Connection refused\", try: stacksolo dev --restart'));\n console.log(chalk.gray(' This will restart all port-forwards\\n'));\n}\n\n/**\n * Show port-forward status\n */\nasync function showPorts(): Promise<void> {\n console.log(chalk.bold('\\n StackSolo Dev - Port Forward Status\\n'));\n\n const config = await loadConfig();\n const namespace = sanitizeNamespaceName(config.project.name);\n\n // Build expected port mappings\n const expectedPorts: Array<{ name: string; service: string; port: number }> = [];\n\n // Gateway\n const hasGateway = config.project.networks?.some((n) => n.loadBalancer?.routes);\n if (hasGateway) {\n expectedPorts.push({ name: 'Gateway', service: 'gateway', port: 8000 });\n }\n\n // Firebase emulator\n expectedPorts.push(\n { name: 'Firebase UI', service: 'firebase-emulator', port: 4000 },\n { name: 'Firestore', service: 'firebase-emulator', port: 8080 },\n { name: 'Firebase Auth', service: 'firebase-emulator', port: 9099 }\n );\n\n // Pub/Sub\n expectedPorts.push({ name: 'Pub/Sub', service: 'pubsub-emulator', port: 8085 });\n\n // Kernel (NATS or GCP)\n const portsKernelConfig = getKernelConfig(config);\n if (portsKernelConfig) {\n const label = portsKernelConfig.type === 'nats' ? 'Kernel' : 'GCP Kernel';\n expectedPorts.push({ name: `${label} HTTP`, service: portsKernelConfig.name, port: portsKernelConfig.httpPort });\n if (portsKernelConfig.natsPort) {\n expectedPorts.push({ name: `${label} NATS`, service: portsKernelConfig.name, port: portsKernelConfig.natsPort });\n }\n }\n\n // Functions and UIs\n let functionPort = 8081;\n let uiPort = 3000;\n for (const network of config.project.networks || []) {\n for (const func of network.functions || []) {\n const svcName = func.name.toLowerCase().replace(/[^a-z0-9-]/g, '-');\n expectedPorts.push({ name: `Function: ${func.name}`, service: svcName, port: functionPort });\n functionPort++;\n }\n for (const ui of network.uis || []) {\n const svcName = ui.name.toLowerCase().replace(/[^a-z0-9-]/g, '-');\n expectedPorts.push({ name: `UI: ${ui.name}`, service: svcName, port: uiPort });\n uiPort++;\n }\n }\n\n // Check which ports are actually listening\n console.log(chalk.bold(' Expected Port Forwards:\\n'));\n console.log(chalk.gray(' Name Port Service Status'));\n console.log(chalk.gray(' ' + '─'.repeat(75)));\n\n for (const mapping of expectedPorts) {\n // Check if port is listening\n let status: string;\n try {\n await Promise.race([\n fetch(`http://localhost:${mapping.port}/`, { method: 'HEAD' }),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('Timeout')), 500)\n ),\n ]);\n status = chalk.green('● Active');\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : '';\n if (errMsg.includes('ECONNREFUSED')) {\n status = chalk.red('○ Not listening');\n } else if (errMsg.includes('Timeout')) {\n status = chalk.yellow('○ No response');\n } else {\n // Could be non-HTTP service (like NATS) that is actually listening\n status = chalk.blue('● TCP only');\n }\n }\n\n console.log(\n ` ${mapping.name.padEnd(30)} ${String(mapping.port).padEnd(8)} ${mapping.service.padEnd(22)} ${status}`\n );\n }\n\n // Check for any active kubectl port-forward processes\n console.log(chalk.bold('\\n Active Port-Forward Processes:\\n'));\n try {\n const psOutput = execSync(`ps aux | grep 'kubectl port-forward' | grep -v grep | grep ${namespace}`, {\n encoding: 'utf-8',\n });\n if (psOutput.trim()) {\n for (const line of psOutput.trim().split('\\n')) {\n // Extract service name and ports from the command\n const match = line.match(/port-forward.*svc\\/([^\\s]+)\\s+(\\d+:\\d+)/);\n if (match) {\n console.log(chalk.gray(` kubectl port-forward svc/${match[1]} ${match[2]}`));\n }\n }\n } else {\n console.log(chalk.yellow(' No active port-forward processes found'));\n }\n } catch {\n console.log(chalk.yellow(' No active port-forward processes found'));\n }\n\n console.log(chalk.bold('\\n Commands:\\n'));\n console.log(chalk.gray(' stacksolo dev --restart Restart all port-forwards'));\n console.log(chalk.gray(' stacksolo dev --health Check endpoint health\\n'));\n}\n\n/**\n * Show service names for use with other commands\n */\nasync function showServiceNames(): Promise<void> {\n console.log(chalk.bold('\\n StackSolo Dev - Service Names\\n'));\n\n const config = await loadConfig();\n const namespace = sanitizeNamespaceName(config.project.name);\n\n const services: Array<{ name: string; type: string; k8sName: string }> = [];\n\n // Kernel (NATS or GCP)\n const svcKernelConfig = getKernelConfig(config);\n if (svcKernelConfig) {\n services.push({\n name: svcKernelConfig.name,\n type: svcKernelConfig.type === 'nats' ? 'kernel' : 'gcp-kernel',\n k8sName: svcKernelConfig.name,\n });\n }\n\n // Functions, containers, and UIs from networks\n for (const network of config.project.networks || []) {\n for (const func of network.functions || []) {\n services.push({\n name: func.name,\n type: 'function',\n k8sName: func.name.toLowerCase().replace(/[^a-z0-9-]/g, '-'),\n });\n }\n\n for (const container of network.containers || []) {\n services.push({\n name: container.name,\n type: 'container',\n k8sName: container.name.toLowerCase().replace(/[^a-z0-9-]/g, '-'),\n });\n }\n\n for (const ui of network.uis || []) {\n services.push({\n name: ui.name,\n type: 'ui',\n k8sName: ui.name.toLowerCase().replace(/[^a-z0-9-]/g, '-'),\n });\n }\n }\n\n // Emulators\n services.push(\n { name: 'firebase-emulator', type: 'emulator', k8sName: 'firebase-emulator' },\n { name: 'pubsub-emulator', type: 'emulator', k8sName: 'pubsub-emulator' }\n );\n\n // Gateway\n const hasGateway = config.project.networks?.some((n) => n.loadBalancer?.routes);\n if (hasGateway) {\n services.push({ name: 'gateway', type: 'gateway', k8sName: 'gateway' });\n }\n\n console.log(chalk.gray(' Name Type K8s Service Name'));\n console.log(chalk.gray(' ' + '─'.repeat(60)));\n\n for (const svc of services) {\n const typeColor =\n svc.type === 'kernel' ? chalk.magenta :\n svc.type === 'gcp-kernel' ? chalk.magenta :\n svc.type === 'function' ? chalk.green :\n svc.type === 'container' ? chalk.blue :\n svc.type === 'ui' ? chalk.cyan :\n svc.type === 'gateway' ? chalk.yellow :\n chalk.gray;\n\n console.log(\n ` ${svc.name.padEnd(25)} ${typeColor(svc.type.padEnd(12))} ${svc.k8sName}`\n );\n }\n\n // Show running pods\n console.log(chalk.bold('\\n Running Pods:\\n'));\n try {\n const pods = execSync(`kubectl get pods -n ${namespace} --no-headers -o custom-columns=NAME:.metadata.name`, {\n encoding: 'utf-8',\n });\n for (const pod of pods.trim().split('\\n')) {\n if (pod) {\n // Extract service name from pod name (remove deployment hash suffix)\n const serviceName = pod.replace(/-[a-z0-9]+-[a-z0-9]+$/, '');\n console.log(` ${chalk.gray('●')} ${serviceName.padEnd(25)} ${chalk.gray(pod)}`);\n }\n }\n } catch {\n console.log(chalk.yellow(' No pods found'));\n }\n\n console.log(chalk.bold('\\n Usage:\\n'));\n console.log(chalk.gray(' stacksolo dev --restart <name> Restart a specific service'));\n console.log(chalk.gray(' stacksolo dev --logs <name> Tail logs for a service'));\n console.log(chalk.gray(' stacksolo dev --describe <name> Describe a service\\n'));\n}\n\n/**\n * Restart port-forwards or specific service pod\n */\nasync function restartService(service?: string): Promise<void> {\n console.log(chalk.bold('\\n StackSolo Dev - Restart\\n'));\n\n const config = await loadConfig();\n const namespace = sanitizeNamespaceName(config.project.name);\n\n if (service) {\n // Restart specific service pod\n const spinner = ora(`Restarting pod: ${service}...`).start();\n try {\n // Find and delete the pod - K8s will recreate it\n execSync(\n `kubectl delete pod -n ${namespace} -l app.kubernetes.io/name=${service} --grace-period=5`,\n { stdio: 'pipe' }\n );\n spinner.succeed(`Pod ${service} restarted`);\n\n // Wait for new pod to be ready\n const waitSpinner = ora(`Waiting for ${service} to be ready...`).start();\n try {\n execSync(\n `kubectl wait --for=condition=ready pod -n ${namespace} -l app.kubernetes.io/name=${service} --timeout=60s`,\n { stdio: 'pipe' }\n );\n waitSpinner.succeed(`${service} is ready`);\n } catch {\n waitSpinner.warn(`${service} may not be fully ready yet`);\n }\n } catch (error) {\n spinner.fail(`Failed to restart ${service}`);\n console.log(chalk.gray(` Error: ${error instanceof Error ? error.message : error}`));\n console.log(chalk.gray('\\n Available services:'));\n\n // List available pods\n try {\n const pods = execSync(`kubectl get pods -n ${namespace} -o name`, { encoding: 'utf-8' });\n for (const pod of pods.trim().split('\\n')) {\n const podName = pod.replace('pod/', '').replace(/-[a-z0-9]+-[a-z0-9]+$/, '');\n console.log(chalk.gray(` ${podName}`));\n }\n } catch {\n // Ignore\n }\n }\n } else {\n // Kill all existing port-forward processes for this namespace\n const killSpinner = ora('Stopping existing port-forwards...').start();\n try {\n execSync(`pkill -f \"kubectl port-forward.*${namespace}\"`, { stdio: 'pipe' });\n killSpinner.succeed('Port-forwards stopped');\n } catch {\n killSpinner.info('No existing port-forwards to stop');\n }\n\n // Wait a moment for processes to die\n await new Promise((resolve) => setTimeout(resolve, 500));\n\n // Restart port-forwards by loading config and setting up new forwards\n console.log('');\n const spinner = ora('Restarting port-forwards...').start();\n\n // Clear the process array\n portForwardProcesses.length = 0;\n\n const portMappings = await setupPortForwarding(namespace, config);\n spinner.succeed('Port-forwards restarted');\n\n console.log(chalk.bold('\\n Active Forwards:\\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 Tip:\\n'));\n console.log(chalk.gray(' Run: stacksolo dev --health to verify endpoints\\n'));\n\n // Keep process running to maintain port-forwards\n console.log(chalk.gray(' Press Ctrl+C to stop\\n'));\n\n // Setup graceful shutdown\n const cleanup = async () => {\n isShuttingDown = true;\n console.log(chalk.gray('\\n Stopping port-forwards...\\n'));\n for (const proc of portForwardProcesses) {\n try {\n proc.kill('SIGTERM');\n } catch {\n // Ignore\n }\n }\n process.exit(0);\n };\n\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n\n // Keep alive\n await new Promise(() => {});\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 * 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 * Port parameter is required to ensure the dev server listens on the expected port\n */\nexport function getFrameworkConfig(framework: UIFramework, port: number = 3000): FrameworkConfig {\n switch (framework) {\n case 'vue':\n // Vite (Vue default) uses --port\n return {\n command: ['npm', 'run', 'dev', '--', '--host', '0.0.0.0', '--port', String(port)],\n };\n\n case 'nuxt':\n // Nuxt uses --port\n return {\n command: ['npm', 'run', 'dev', '--', '--host', '0.0.0.0', '--port', String(port)],\n };\n\n case 'react':\n // Create React App uses PORT env var, Vite uses --port\n return {\n command: ['npm', 'run', 'dev', '--', '--host', '0.0.0.0', '--port', String(port)],\n };\n\n case 'next':\n // Next.js uses -p or --port\n return {\n command: ['npm', 'run', 'dev', '--', '--hostname', '0.0.0.0', '-p', String(port)],\n };\n\n case 'svelte':\n case 'sveltekit':\n // SvelteKit/Vite uses --port\n return {\n command: ['npm', 'run', 'dev', '--', '--host', '0.0.0.0', '--port', String(port)],\n };\n\n default:\n // Generic fallback - assume Vite-style args\n return {\n command: ['npm', 'run', 'dev', '--', '--host', '0.0.0.0', '--port', String(port)],\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 // For Node.js: use npm run dev for TypeScript support (uses tsx or ts-node)\n // For Python: install deps and run functions-framework directly\n const installCmd = isPython\n ? 'pip install -r requirements.txt 2>/dev/null || true && pip install functions-framework'\n : 'npm install';\n\n // For Node.js dev, prefer npm run dev which handles TypeScript via tsx\n // Fall back to direct functions-framework if no dev script exists\n const runCmd = isPython\n ? runtimeConfig.command.join(' ')\n : 'npm run dev 2>/dev/null || ' + runtimeConfig.command.join(' ');\n\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, options.port);\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 K8sConfigMap,\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 * Uses a ConfigMap with firebase.json to configure the emulators to listen on 0.0.0.0\n * so they are accessible from other pods in the cluster.\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 // ConfigMap with firebase.json to configure emulators to listen on all interfaces\n const configMap: K8sConfigMap = {\n apiVersion: 'v1',\n kind: 'ConfigMap',\n metadata: {\n name: 'firebase-config',\n namespace,\n labels,\n },\n data: {\n 'firebase.json': JSON.stringify({\n emulators: {\n firestore: {\n host: '0.0.0.0',\n port: 8080,\n },\n auth: {\n host: '0.0.0.0',\n port: 9099,\n },\n ui: {\n enabled: true,\n host: '0.0.0.0',\n port: 4000,\n },\n },\n }, null, 2),\n },\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 volumeMounts: [\n {\n name: 'firebase-config',\n mountPath: '/home/node/firebase.json',\n subPath: 'firebase.json',\n },\n ],\n workingDir: '/home/node',\n resources: {\n limits: {\n memory: '1Gi',\n },\n requests: {\n memory: '512Mi',\n },\n },\n },\n ],\n volumes: [\n {\n name: 'firebase-config',\n configMap: {\n name: 'firebase-config',\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 configMapYaml = generateYamlDocument(\n configMap 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 deploymentYaml = generateYamlDocument(\n deployment as unknown as Record<string, unknown>\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: '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 * Kernel manifest generator\n * Creates Deployment and Service for the StackSolo kernel (HTTP + NATS)\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 KernelOptions {\n projectName: string;\n kernelName?: string;\n httpPort?: number;\n natsPort?: number;\n natsClusterPort?: number;\n firebaseProjectId?: string;\n gcsBucket?: string;\n}\n\n/**\n * Generate kernel manifests (HTTP + embedded NATS)\n *\n * The kernel provides:\n * - HTTP: /health, /auth/validate (port 8090)\n * - NATS: internal messaging (port 4222)\n */\nexport function generateKernelManifests(options: KernelOptions): GeneratedManifest {\n const namespace = sanitizeNamespaceName(options.projectName);\n const kernelName = options.kernelName || 'kernel';\n const httpPort = options.httpPort || 8090;\n const natsPort = options.natsPort || 4222;\n\n const labels = {\n 'app.kubernetes.io/name': kernelName,\n 'app.kubernetes.io/component': 'kernel',\n 'app.kubernetes.io/managed-by': 'stacksolo',\n 'stacksolo.dev/project': options.projectName,\n };\n\n // Environment variables for the kernel\n const envVars = [\n { name: 'NODE_ENV', value: 'development' },\n { name: 'HTTP_PORT', value: String(httpPort) },\n { name: 'NATS_URL', value: 'nats://localhost:4222' },\n { name: 'FIREBASE_PROJECT_ID', value: options.firebaseProjectId || 'demo-stacksolo' },\n { name: 'GCP_PROJECT_ID', value: options.firebaseProjectId || 'demo-stacksolo' },\n { name: 'STACKSOLO_PROJECT_NAME', value: options.projectName },\n // Point to Firebase emulator in the cluster\n { name: 'FIREBASE_AUTH_EMULATOR_HOST', value: 'firebase-emulator:9099' },\n // GCS bucket (auto-generated if not specified)\n { name: 'GCS_BUCKET', value: options.gcsBucket || `local-${options.projectName}-kernel-files` },\n ];\n\n const deployment: K8sDeployment = {\n apiVersion: 'apps/v1',\n kind: 'Deployment',\n metadata: {\n name: kernelName,\n namespace,\n labels,\n },\n spec: {\n replicas: 1,\n selector: {\n matchLabels: {\n 'app.kubernetes.io/name': kernelName,\n },\n },\n template: {\n metadata: {\n labels: {\n 'app.kubernetes.io/name': kernelName,\n 'app.kubernetes.io/component': 'kernel',\n },\n },\n spec: {\n containers: [\n {\n name: 'kernel',\n // Use local build - image built by `stacksolo dev`\n image: `${kernelName}:dev`,\n imagePullPolicy: 'Never',\n ports: [\n {\n containerPort: httpPort,\n name: 'http',\n },\n {\n containerPort: natsPort,\n name: 'nats',\n },\n ],\n env: envVars,\n resources: {\n limits: {\n memory: '512Mi',\n },\n requests: {\n memory: '256Mi',\n },\n },\n },\n ],\n },\n },\n },\n };\n\n const service: K8sService = {\n apiVersion: 'v1',\n kind: 'Service',\n metadata: {\n name: kernelName,\n namespace,\n labels,\n },\n spec: {\n selector: {\n 'app.kubernetes.io/name': kernelName,\n },\n ports: [\n {\n port: httpPort,\n targetPort: httpPort,\n name: 'http',\n },\n {\n port: natsPort,\n targetPort: natsPort,\n name: 'nats',\n },\n ],\n type: 'ClusterIP',\n },\n };\n\n const deploymentYaml = generateYamlDocument(\n deployment as unknown as Record<string, unknown>,\n `StackSolo Kernel (HTTP + NATS)\\nPorts:\\n - HTTP: ${httpPort}\\n - NATS: ${natsPort}`\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: `${kernelName}.yaml`,\n content,\n };\n}\n\n/**\n * Generate a standalone NATS server for development\n * Use this when you want NATS without the full kernel\n */\nexport function generateNatsEmulator(options: { projectName: string }): GeneratedManifest {\n const namespace = sanitizeNamespaceName(options.projectName);\n\n const labels = {\n 'app.kubernetes.io/name': 'nats-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: 'nats-emulator',\n namespace,\n labels,\n },\n spec: {\n replicas: 1,\n selector: {\n matchLabels: {\n 'app.kubernetes.io/name': 'nats-emulator',\n },\n },\n template: {\n metadata: {\n labels: {\n 'app.kubernetes.io/name': 'nats-emulator',\n 'app.kubernetes.io/component': 'emulator',\n },\n },\n spec: {\n containers: [\n {\n name: 'nats',\n image: 'nats:2.10-alpine',\n args: ['--jetstream', '--store_dir=/data'],\n ports: [\n {\n containerPort: 4222,\n name: 'nats',\n },\n {\n containerPort: 8222,\n name: 'monitor',\n },\n ],\n resources: {\n limits: {\n memory: '256Mi',\n },\n requests: {\n memory: '64Mi',\n },\n },\n },\n ],\n },\n },\n },\n };\n\n const service: K8sService = {\n apiVersion: 'v1',\n kind: 'Service',\n metadata: {\n name: 'nats-emulator',\n namespace,\n labels,\n },\n spec: {\n selector: {\n 'app.kubernetes.io/name': 'nats-emulator',\n },\n ports: [\n {\n port: 4222,\n targetPort: 4222,\n name: 'nats',\n },\n {\n port: 8222,\n targetPort: 8222,\n name: 'monitor',\n },\n ],\n type: 'ClusterIP',\n },\n };\n\n const deploymentYaml = generateYamlDocument(\n deployment as unknown as Record<string, unknown>,\n `NATS Server with JetStream\\nPorts:\\n - NATS: 4222\\n - Monitor: 8222`\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: 'nats-emulator.yaml',\n content,\n };\n}\n","/**\n * GCP Kernel manifest generator\n * Creates Deployment and Service for the GCP-native kernel (HTTP + Pub/Sub)\n *\n * This kernel uses GCP services (Pub/Sub, Cloud Storage) instead of NATS,\n * but can run anywhere - including Kubernetes - with GCP credentials.\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 GcpKernelOptions {\n projectName: string;\n kernelName?: string;\n httpPort?: number;\n firebaseProjectId: string;\n gcsBucket: string;\n pubsubEventsTopic: string;\n gcpProjectId?: string;\n}\n\n/**\n * Generate GCP kernel manifests (HTTP + Pub/Sub)\n *\n * The GCP kernel provides:\n * - HTTP: /health, /auth/validate, /files/*, /events/* (port 8080)\n * - Uses GCP Pub/Sub for events (replaces NATS)\n * - Uses GCP Cloud Storage for files\n * - Uses Firebase Admin SDK for auth\n */\nexport function generateGcpKernelManifests(options: GcpKernelOptions): GeneratedManifest {\n const namespace = sanitizeNamespaceName(options.projectName);\n const kernelName = options.kernelName || 'gcp-kernel';\n const httpPort = options.httpPort || 8080;\n const gcpProjectId = options.gcpProjectId || options.firebaseProjectId;\n\n const labels = {\n 'app.kubernetes.io/name': kernelName,\n 'app.kubernetes.io/component': 'gcp-kernel',\n 'app.kubernetes.io/managed-by': 'stacksolo',\n 'stacksolo.dev/project': options.projectName,\n };\n\n // Environment variables for the GCP kernel\n const envVars = [\n { name: 'NODE_ENV', value: 'development' },\n { name: 'PORT', value: String(httpPort) },\n { name: 'GCP_PROJECT_ID', value: gcpProjectId },\n { name: 'FIREBASE_PROJECT_ID', value: options.firebaseProjectId },\n { name: 'GCS_BUCKET', value: options.gcsBucket },\n { name: 'PUBSUB_EVENTS_TOPIC', value: options.pubsubEventsTopic },\n { name: 'KERNEL_TYPE', value: 'gcp' },\n { name: 'STACKSOLO_PROJECT_NAME', value: options.projectName },\n ];\n\n const deployment: K8sDeployment = {\n apiVersion: 'apps/v1',\n kind: 'Deployment',\n metadata: {\n name: kernelName,\n namespace,\n labels,\n },\n spec: {\n replicas: 1,\n selector: {\n matchLabels: {\n 'app.kubernetes.io/name': kernelName,\n },\n },\n template: {\n metadata: {\n labels: {\n 'app.kubernetes.io/name': kernelName,\n 'app.kubernetes.io/component': 'gcp-kernel',\n },\n },\n spec: {\n containers: [\n {\n name: 'gcp-kernel',\n // Use local build - image built by `stacksolo dev`\n image: `${kernelName}:dev`,\n imagePullPolicy: 'Never',\n ports: [\n {\n containerPort: httpPort,\n name: 'http',\n },\n ],\n env: envVars,\n resources: {\n limits: {\n memory: '512Mi',\n },\n requests: {\n memory: '256Mi',\n },\n },\n livenessProbe: {\n httpGet: {\n path: '/health',\n port: httpPort,\n },\n initialDelaySeconds: 5,\n periodSeconds: 10,\n },\n readinessProbe: {\n httpGet: {\n path: '/health',\n port: httpPort,\n },\n initialDelaySeconds: 5,\n periodSeconds: 5,\n },\n },\n ],\n },\n },\n },\n };\n\n const service: K8sService = {\n apiVersion: 'v1',\n kind: 'Service',\n metadata: {\n name: kernelName,\n namespace,\n labels,\n },\n spec: {\n selector: {\n 'app.kubernetes.io/name': kernelName,\n },\n ports: [\n {\n port: httpPort,\n targetPort: httpPort,\n name: 'http',\n },\n ],\n type: 'ClusterIP',\n },\n };\n\n const deploymentYaml = generateYamlDocument(\n deployment as unknown as Record<string, unknown>,\n `StackSolo GCP Kernel (HTTP + Pub/Sub)\\nPort: ${httpPort}\\nUses GCP services for files and events`\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: `${kernelName}.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 keepalive_timeout 60s;\n proxy_connect_timeout 60s;\n proxy_read_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 imagePullPolicy?: 'Always' | 'IfNotPresent' | 'Never';\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 { generateKernelManifests, generateNatsEmulator } from './kernel';\nimport { generateGcpKernelManifests } from './gcp-kernel';\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 './kernel';\nexport * from './gcp-kernel';\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. Generate kernel (if configured)\n if (config.project.kernel) {\n const kernel = config.project.kernel;\n // Auto-generate bucket name if not specified (for local dev, this is just a placeholder)\n const gcsBucket = kernel.gcsBucket || `${config.project.gcpProjectId || 'local'}-${projectName}-kernel-files`;\n manifests.push(\n generateKernelManifests({\n projectName,\n kernelName: kernel.name,\n firebaseProjectId: kernel.firebaseProjectId || config.project.gcpProjectId,\n gcsBucket,\n })\n );\n services.push(kernel.name);\n servicePortMap[kernel.name] = 8090; // Kernel HTTP port\n }\n\n // 4b. Generate GCP kernel (if configured) - mutually exclusive with NATS kernel\n if (config.project.gcpKernel) {\n const gcpKernel = config.project.gcpKernel;\n const gcpProjectId = config.project.gcpProjectId || gcpKernel.firebaseProjectId;\n manifests.push(\n generateGcpKernelManifests({\n projectName,\n kernelName: gcpKernel.name,\n httpPort: 8080,\n firebaseProjectId: gcpKernel.firebaseProjectId,\n gcsBucket: gcpKernel.storageBucket,\n pubsubEventsTopic: `${projectName}-events`,\n gcpProjectId,\n })\n );\n services.push(gcpKernel.name);\n servicePortMap[gcpKernel.name] = 8080; // GCP kernel HTTP port\n }\n\n // 5. 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 // Use sourceDir from config, or default to functions/<name>\n const funcSourceDir = func.sourceDir?.replace(/^\\.\\//, '') || `functions/${func.name}`;\n const sourceDir = `${projectRoot}/${funcSourceDir}`;\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 // Use sourceDir from config (required for UI)\n const uiSourceDir = ui.sourceDir?.replace(/^\\.\\//, '') || `ui/${ui.name}`;\n const sourceDir = `${projectRoot}/${uiSourceDir}`;\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 // Filter routes to only include backends that exist as services\n const validRoutes = network.loadBalancer.routes.filter((r) => {\n const backendExists = servicePortMap[r.backend] !== undefined;\n if (!backendExists) {\n warnings.push(\n `Gateway route \"${r.path}\" references backend \"${r.backend}\" which does not exist. ` +\n `Available backends: ${Object.keys(servicePortMap).join(', ') || 'none'}. ` +\n `Skipping this route.`\n );\n }\n return backendExists;\n });\n\n const routes = validRoutes.map((r) => ({\n path: r.path,\n backend: r.backend,\n }));\n\n if (routes.length > 0) {\n manifests.push(\n generateGateway({\n projectName,\n routes,\n servicePortMap,\n })\n );\n services.push('gateway');\n } else {\n warnings.push('No valid gateway routes found. Gateway will not be created.');\n }\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":["fs","path","Command","path","exec","promisify","execAsync","api","execAsync","exec","promisify","execAsync","exec","promisify","execAsync","join","crypto","existsSync","existsSync","registry","fs","path","fs","path","resolve","registry","currentProject","api","Command","chalk","ora","path","readFileSync","existsSync","existsSync","readFileSync","path","cache","cache","path","path","cache","path","cache","fs","path","cache","generateTsConfig","generateGitignore","generateTsConfig","generateConfig","generateGitignore","STACKSOLO_DIR","Command","ora","chalk","Command","chalk","inquirer","ora","path","fs","REPO","chalk","inquirer","ora","Command","stat","registry","Command","chalk","ora","path","fs","homedir","spawn","exec","promisify","fs","path","exec","spawn","promisify","registry","execAsync","promisify","exec","resolve","spawn","generated","packageJson","getServiceSourcePath","getPluginService","buildCommand","fs","path","exec","promisify","execAsync","promisify","exec","fs","path","homedir","STACKSOLO_DIR","path","fs","chalk","inquirer","exec","promisify","existsSync","readFileSync","path","exec","promisify","execAsync","exec","promisify","execAsync","execAsync","promisify","exec","chalk","inquirer","path","api","execAsync","promisify","exec","STACKSOLO_DIR","resolve","CONFIG_FILENAME","homedir","getConfigPath","Command","chalk","hasCloudFunctions","hasGcpKernel","ora","result","inquirer","registry","spinner","promptConflictResolution","projectName","spawn","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","join","chalk","chalk","listCommand","Command","Command","chalk","exec","promisify","execAsync","promisify","exec","runGcloudCommand","scanVpcNetworks","scanStorageBuckets","scanCloudRunServices","scanCloudFunctions","scanGlobalAddresses","scanVpcConnectors","registry","chalk","fs","path","Command","Command","chalk","path","fs","exec","promisify","execAsync","promisify","exec","STACKSOLO_DIR","CONFIG_FILENAME","Command","chalk","api","Command","chalk","path","fs","STACKSOLO_DIR","CONFIG_FILENAME","stat","chalk","Command","Command","chalk","ora","path","fs","exec","promisify","execAsync","promisify","exec","STACKSOLO_DIR","CONFIG_FILENAME","getConfigPath","Command","chalk","ora","Command","chalk","ora","spawn","execSync","fs","path","sanitizeName","sanitizeName","fs","path","Command","chalk","ora","execSync","loadConfig","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","showCommand","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"]}
|