@kuckit/cli 1.0.4 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","names":["files: string[]","loadConfig","checks: CheckResult[]","configModules: Array<{ package?: string; disabled?: boolean }>","missingPackages: string[]","installedPackages: string[]","invalidMetadata: string[]","validMetadata: string[]","missingExports: string[]","validExports: string[]","missingFramework: string[]","installedFramework: Array<{ name: string; version?: string }>","localImportIssues: string[]","report: DoctorReport","report: SearchReport","KUCKIT_DIR","fileExists","constants","findProjectRoot","dirname","join","schemas: ModuleSchemaInfo[]","packagePath: string | null","moduleId: string | null","loadConfig","loadConfig","initResponse: InitiateResponse","program","loadConfig","join","constants","KUCKIT_DIR","CONFIG_FILE","DEFAULT_PROVIDER_PACKAGES: Record<string, string>","join","constants","mkdir","writeFile","packageName: string","installCommand: string","fileExists","constants","findProjectRoot","dirname","join","providerId: SupportedProvider","responses: Record<string, unknown>","readFile","writeFile","fileExists","constants","findProjectRoot","dirname","join","writeFile","fileExists","constants","findProjectRoot","dirname","join","fileExists","constants","findProjectRoot","dirname","join","getInfraDir","join","trafficMap: Record<string, number>","ERROR_PATTERNS: Array<{\n\tpattern: RegExp\n\ttype: PulumiErrorType\n\tsuggestion: string\n\tretryable: boolean\n}>","KUCKIT_DIR","CONFIG_FILE","fileExists","constants","findProjectRoot","dirname","join","loadConfig","getInfraDir","KUCKIT_DIR","CONFIG_FILE","fileExists","constants","findProjectRoot","dirname","join","loadConfig","getInfraDir","KUCKIT_DIR","CONFIG_FILE","fileExists","constants","findProjectRoot","dirname","join","loadConfig","KUCKIT_DIR","CONFIG_FILE","fileExists","constants","findProjectRoot","dirname","join","loadConfig","targetRevision: string | undefined","KUCKIT_DIR","CONFIG_FILE","fileExists","constants","findProjectRoot","dirname","join","loadConfig","args: string[]","KUCKIT_DIR","CONFIG_FILE","fileExists","constants","findProjectRoot","dirname","join","loadConfig","getInfraDir","status: StatusResult['status']","resources: StatusResult['resources']","result: StatusResult","constants","dirname","join","getInfraDir","KNOWN_CONFIG_KEYS: Record<string, { description: string; example: string }>","pulumiOptions: RunPulumiOptions","configMap: Record<string, string>","localKeys: Record<string, (c: StoredInfraConfig) => string | undefined>","value","localConfig: Record<string, string>"],"sources":["../src/commands/doctor.ts","../src/commands/search.ts","../src/commands/db.ts","../src/lib/credentials.ts","../src/commands/auth.ts","../src/lib/require-auth.ts","../src/lib/package-manager.ts","../src/commands/infra/provider-loader.ts","../src/commands/infra/init.ts","../src/commands/infra/deploy.ts","../src/commands/infra/up.ts","../src/commands/infra/eject.ts","../src/commands/infra/runner.ts","../src/commands/infra/errors.ts","../src/commands/infra/destroy.ts","../src/commands/infra/repair.ts","../src/commands/infra/db.ts","../src/commands/infra/rollback.ts","../src/commands/infra/logs.ts","../src/commands/infra/status.ts","../src/commands/infra/outputs.ts","../src/commands/infra/config.ts","../src/bin.ts"],"sourcesContent":["import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs'\nimport { join, dirname } from 'node:path'\n\nexport interface DoctorOptions {\n\tjson: boolean\n}\n\ninterface CheckResult {\n\tname: string\n\tstatus: 'pass' | 'fail' | 'warn'\n\tmessage: string\n\tdetails?: string[]\n}\n\ninterface DoctorReport {\n\tsuccess: boolean\n\tchecks: CheckResult[]\n\tsummary: {\n\t\ttotal: number\n\t\tpassed: number\n\t\tfailed: number\n\t\twarnings: number\n\t}\n}\n\nconst CONFIG_FILES = ['kuckit.config.ts', 'kuckit.config.js', 'kuckit.config.mjs']\n\n// Core framework packages that should be installed for the framework model\nconst FRAMEWORK_PACKAGES = [\n\t'@kuckit/sdk',\n\t'@kuckit/sdk-react',\n\t'@kuckit/api',\n\t'@kuckit/db',\n\t'@kuckit/auth',\n\t'@kuckit/domain',\n\t'@kuckit/contracts',\n] as const\n\ninterface KuckitMetadata {\n\tid: string\n\tserver?: string\n\tclient?: string\n}\n\ninterface PackageJson {\n\tname: string\n\tversion?: string\n\tkuckit?: KuckitMetadata\n\texports?: Record<string, unknown>\n}\n\nfunction findConfigFile(cwd: string): string | null {\n\tlet dir = cwd\n\twhile (dir !== dirname(dir)) {\n\t\tfor (const file of CONFIG_FILES) {\n\t\t\tconst configPath = join(dir, file)\n\t\t\tif (existsSync(configPath)) {\n\t\t\t\treturn configPath\n\t\t\t}\n\t\t}\n\t\tdir = dirname(dir)\n\t}\n\treturn null\n}\n\nfunction readPackageJson(packageName: string, cwd: string): PackageJson | null {\n\t// Try multiple locations for workspace/monorepo support\n\tconst locations = [\n\t\t// Standard node_modules\n\t\tjoin(cwd, 'node_modules', packageName, 'package.json'),\n\t\t// Apps server node_modules (for workspace deps)\n\t\tjoin(cwd, 'apps', 'server', 'node_modules', packageName, 'package.json'),\n\t\t// Apps web node_modules (for workspace deps)\n\t\tjoin(cwd, 'apps', 'web', 'node_modules', packageName, 'package.json'),\n\t]\n\n\t// Also check packages/ directory for workspace packages\n\t// Convert @scope/package-name to package-name\n\tconst packageDir = packageName.startsWith('@') ? packageName.split('/')[1] : packageName\n\tlocations.push(join(cwd, 'packages', packageDir, 'package.json'))\n\n\tfor (const location of locations) {\n\t\ttry {\n\t\t\tconst content = readFileSync(location, 'utf-8')\n\t\t\tconst pkg = JSON.parse(content)\n\t\t\t// Verify it's the right package\n\t\t\tif (pkg.name === packageName) {\n\t\t\t\treturn pkg\n\t\t\t}\n\t\t} catch {\n\t\t\t// Try next location\n\t\t}\n\t}\n\n\treturn null\n}\n\nfunction findPackagePath(packageName: string, cwd: string): string | null {\n\tconst locations = [\n\t\tjoin(cwd, 'node_modules', packageName),\n\t\tjoin(cwd, 'apps', 'server', 'node_modules', packageName),\n\t\tjoin(cwd, 'apps', 'web', 'node_modules', packageName),\n\t]\n\n\t// Check packages/ directory for workspace packages\n\tconst packageDir = packageName.startsWith('@') ? packageName.split('/')[1] : packageName\n\tlocations.push(join(cwd, 'packages', packageDir))\n\n\tfor (const location of locations) {\n\t\tif (existsSync(location)) {\n\t\t\t// Verify it's the right package by checking package.json\n\t\t\tconst pkgJsonPath = join(location, 'package.json')\n\t\t\tif (existsSync(pkgJsonPath)) {\n\t\t\t\ttry {\n\t\t\t\t\tconst content = readFileSync(pkgJsonPath, 'utf-8')\n\t\t\t\t\tconst pkg = JSON.parse(content)\n\t\t\t\t\tif (pkg.name === packageName) {\n\t\t\t\t\t\treturn location\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Continue to next location\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null\n}\n\nfunction scanSourceFiles(dir: string): string[] {\n\tconst files: string[] = []\n\n\ttry {\n\t\tconst entries = readdirSync(dir)\n\t\tfor (const entry of entries) {\n\t\t\tconst fullPath = join(dir, entry)\n\t\t\tconst stat = statSync(fullPath)\n\n\t\t\tif (stat.isDirectory()) {\n\t\t\t\tfiles.push(...scanSourceFiles(fullPath))\n\t\t\t} else if (entry.endsWith('.ts') || entry.endsWith('.tsx')) {\n\t\t\t\tfiles.push(fullPath)\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Ignore errors (permission, etc.)\n\t}\n\n\treturn files\n}\n\nfunction checkModuleExports(\n\tpackageName: string,\n\tcwd: string\n): { server: boolean; client: boolean } {\n\tconst result = { server: false, client: false }\n\n\tconst packagePath = findPackagePath(packageName, cwd)\n\tif (!packagePath) return result\n\n\t// Check server export - could be in dist or src\n\tconst serverPaths = [\n\t\tjoin(packagePath, 'dist', 'server', 'module.js'),\n\t\tjoin(packagePath, 'dist', 'index.js'),\n\t\tjoin(packagePath, 'src', 'server', 'module.ts'),\n\t\tjoin(packagePath, 'src', 'module.ts'),\n\t]\n\tresult.server = serverPaths.some((p) => existsSync(p))\n\n\t// Check client export\n\tconst clientPaths = [\n\t\tjoin(packagePath, 'dist', 'client', 'index.js'),\n\t\tjoin(packagePath, 'src', 'client', 'index.tsx'),\n\t\tjoin(packagePath, 'src', 'client', 'index.ts'),\n\t]\n\tresult.client = clientPaths.some((p) => existsSync(p))\n\n\treturn result\n}\n\nasync function loadConfig(\n\tconfigPath: string\n): Promise<{ success: boolean; config?: unknown; error?: string }> {\n\ttry {\n\t\tif (configPath.endsWith('.ts')) {\n\t\t\tconst { createJiti } = await import('jiti')\n\t\t\tconst jiti = createJiti(process.cwd(), { interopDefault: true })\n\t\t\tconst loaded = await jiti.import(configPath)\n\t\t\tconst config = (loaded as { default?: unknown }).default ?? loaded\n\t\t\treturn { success: true, config }\n\t\t} else {\n\t\t\tconst loaded = await import(configPath)\n\t\t\treturn { success: true, config: loaded.default ?? loaded }\n\t\t}\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t}\n\t}\n}\n\nexport async function doctor(options: DoctorOptions): Promise<void> {\n\tconst cwd = process.cwd()\n\tconst checks: CheckResult[] = []\n\n\tif (!options.json) {\n\t\tconsole.log('\\nKuckit Doctor - Checking your setup...\\n')\n\t}\n\n\t// Check 1: Config file exists\n\tconst configPath = findConfigFile(cwd)\n\tif (configPath) {\n\t\tchecks.push({\n\t\t\tname: 'config-exists',\n\t\t\tstatus: 'pass',\n\t\t\tmessage: `Config file found: ${configPath.replace(cwd, '.')}`,\n\t\t})\n\t} else {\n\t\tchecks.push({\n\t\t\tname: 'config-exists',\n\t\t\tstatus: 'warn',\n\t\t\tmessage: 'No kuckit.config.ts found (using legacy config)',\n\t\t})\n\t}\n\n\t// Check 2: Config parses correctly\n\tlet configModules: Array<{ package?: string; disabled?: boolean }> = []\n\n\tif (configPath) {\n\t\tconst { success, config, error } = await loadConfig(configPath)\n\n\t\tif (success && config && typeof config === 'object') {\n\t\t\tconst cfg = config as { modules?: unknown[] }\n\t\t\tif (Array.isArray(cfg.modules)) {\n\t\t\t\tchecks.push({\n\t\t\t\t\tname: 'config-valid',\n\t\t\t\t\tstatus: 'pass',\n\t\t\t\t\tmessage: 'Configuration is valid',\n\t\t\t\t})\n\t\t\t\tconfigModules = cfg.modules as Array<{ package?: string; disabled?: boolean }>\n\t\t\t} else {\n\t\t\t\tchecks.push({\n\t\t\t\t\tname: 'config-valid',\n\t\t\t\t\tstatus: 'fail',\n\t\t\t\t\tmessage: \"Configuration invalid: 'modules' must be an array\",\n\t\t\t\t})\n\t\t\t}\n\t\t} else {\n\t\t\tchecks.push({\n\t\t\t\tname: 'config-valid',\n\t\t\t\tstatus: 'fail',\n\t\t\t\tmessage: `Configuration failed to load: ${error}`,\n\t\t\t})\n\t\t}\n\t}\n\n\t// Check 3: Modules configured\n\tconst enabledModules = configModules.filter((m) => m.package && !m.disabled)\n\n\tif (enabledModules.length > 0) {\n\t\tconst moduleDetails = enabledModules.map(\n\t\t\t(m) => ` - ${m.package} ${m.disabled ? '(disabled)' : '(enabled)'}`\n\t\t)\n\t\tchecks.push({\n\t\t\tname: 'modules-configured',\n\t\t\tstatus: 'pass',\n\t\t\tmessage: `${enabledModules.length} module(s) configured`,\n\t\t\tdetails: moduleDetails,\n\t\t})\n\t} else if (configModules.length > 0) {\n\t\tchecks.push({\n\t\t\tname: 'modules-configured',\n\t\t\tstatus: 'warn',\n\t\t\tmessage: 'All configured modules are disabled',\n\t\t})\n\t} else {\n\t\tchecks.push({\n\t\t\tname: 'modules-configured',\n\t\t\tstatus: 'warn',\n\t\t\tmessage: 'No modules configured',\n\t\t})\n\t}\n\n\t// Check 4: All module packages installed\n\tconst missingPackages: string[] = []\n\tconst installedPackages: string[] = []\n\n\tfor (const mod of enabledModules) {\n\t\tif (!mod.package) continue\n\n\t\tconst pkgJson = readPackageJson(mod.package, cwd)\n\t\tif (pkgJson) {\n\t\t\tinstalledPackages.push(mod.package)\n\t\t} else {\n\t\t\tmissingPackages.push(mod.package)\n\t\t}\n\t}\n\n\tif (missingPackages.length > 0) {\n\t\tchecks.push({\n\t\t\tname: 'packages-installed',\n\t\t\tstatus: 'fail',\n\t\t\tmessage: `${missingPackages.length} package(s) not installed`,\n\t\t\tdetails: missingPackages.map((p) => ` - ${p} (missing)`),\n\t\t})\n\t} else if (installedPackages.length > 0) {\n\t\tchecks.push({\n\t\t\tname: 'packages-installed',\n\t\t\tstatus: 'pass',\n\t\t\tmessage: 'All module packages installed',\n\t\t})\n\t}\n\n\t// Check 5: Kuckit metadata valid\n\tconst invalidMetadata: string[] = []\n\tconst validMetadata: string[] = []\n\n\tfor (const packageName of installedPackages) {\n\t\tconst pkgJson = readPackageJson(packageName, cwd)\n\t\tif (!pkgJson?.kuckit?.id) {\n\t\t\tinvalidMetadata.push(`${packageName} (missing kuckit.id)`)\n\t\t} else {\n\t\t\tvalidMetadata.push(packageName)\n\t\t}\n\t}\n\n\tif (invalidMetadata.length > 0) {\n\t\tchecks.push({\n\t\t\tname: 'metadata-valid',\n\t\t\tstatus: 'warn',\n\t\t\tmessage: `${invalidMetadata.length} package(s) with invalid/missing kuckit metadata`,\n\t\t\tdetails: invalidMetadata.map((p) => ` - ${p}`),\n\t\t})\n\t} else if (validMetadata.length > 0) {\n\t\tchecks.push({\n\t\t\tname: 'metadata-valid',\n\t\t\tstatus: 'pass',\n\t\t\tmessage: 'All modules have valid kuckit metadata',\n\t\t})\n\t}\n\n\t// Check 6: Module exports exist\n\tconst missingExports: string[] = []\n\tconst validExports: string[] = []\n\n\tfor (const packageName of validMetadata) {\n\t\tconst pkgJson = readPackageJson(packageName, cwd)\n\t\tconst exports = checkModuleExports(packageName, cwd)\n\n\t\tif (!exports.server && pkgJson?.kuckit?.server) {\n\t\t\tmissingExports.push(`${packageName} (server export not built)`)\n\t\t} else if (!exports.client && pkgJson?.kuckit?.client) {\n\t\t\tmissingExports.push(`${packageName} (client export not built)`)\n\t\t} else {\n\t\t\tvalidExports.push(packageName)\n\t\t}\n\t}\n\n\tif (missingExports.length > 0) {\n\t\tchecks.push({\n\t\t\tname: 'exports-valid',\n\t\t\tstatus: 'warn',\n\t\t\tmessage: `${missingExports.length} module(s) may need building`,\n\t\t\tdetails: missingExports.map((p) => ` - ${p}`),\n\t\t})\n\t} else if (validExports.length > 0) {\n\t\tchecks.push({\n\t\t\tname: 'exports-valid',\n\t\t\tstatus: 'pass',\n\t\t\tmessage: 'Module exports valid',\n\t\t})\n\t}\n\n\t// Check 7: Framework packages installed\n\tconst missingFramework: string[] = []\n\tconst installedFramework: Array<{ name: string; version?: string }> = []\n\n\tfor (const pkg of FRAMEWORK_PACKAGES) {\n\t\tconst pkgJson = readPackageJson(pkg, cwd)\n\t\tif (!pkgJson) {\n\t\t\tmissingFramework.push(pkg)\n\t\t} else {\n\t\t\tinstalledFramework.push({ name: pkg, version: pkgJson.version })\n\t\t}\n\t}\n\n\tif (missingFramework.length > 0) {\n\t\tchecks.push({\n\t\t\tname: 'framework-installed',\n\t\t\tstatus: 'warn',\n\t\t\tmessage: `Framework package(s) not found: ${missingFramework.length}/${FRAMEWORK_PACKAGES.length}`,\n\t\t\tdetails: missingFramework.map((p) => ` - ${p} (not installed)`),\n\t\t})\n\t} else {\n\t\tchecks.push({\n\t\t\tname: 'framework-installed',\n\t\t\tstatus: 'pass',\n\t\t\tmessage: `All ${FRAMEWORK_PACKAGES.length} framework packages installed`,\n\t\t})\n\t}\n\n\t// Check 8: Framework package version compatibility\n\t// All @kuckit/* packages in the fixed group should have compatible versions\n\tconst kuckitVersions = new Map<string, string>()\n\tfor (const { name, version } of installedFramework) {\n\t\tif (version) {\n\t\t\tkuckitVersions.set(name, version)\n\t\t}\n\t}\n\n\tconst uniqueVersions = new Set(kuckitVersions.values())\n\tif (uniqueVersions.size > 1 && installedFramework.length >= 2) {\n\t\t// Check if versions are compatible (same major.minor)\n\t\tconst versionParts = [...uniqueVersions].map((v) => {\n\t\t\tconst match = v.match(/^(\\d+)\\.(\\d+)/)\n\t\t\treturn match ? `${match[1]}.${match[2]}` : v\n\t\t})\n\t\tconst uniqueMajorMinor = new Set(versionParts)\n\n\t\tif (uniqueMajorMinor.size > 1) {\n\t\t\tchecks.push({\n\t\t\t\tname: 'version-compatibility',\n\t\t\t\tstatus: 'warn',\n\t\t\t\tmessage: 'Framework packages have mismatched versions',\n\t\t\t\tdetails: [...kuckitVersions.entries()].map(([name, ver]) => ` - ${name}: ${ver}`),\n\t\t\t})\n\t\t} else {\n\t\t\tchecks.push({\n\t\t\t\tname: 'version-compatibility',\n\t\t\t\tstatus: 'pass',\n\t\t\t\tmessage: 'Framework package versions are compatible',\n\t\t\t})\n\t\t}\n\t} else if (installedFramework.length >= 2) {\n\t\tchecks.push({\n\t\t\tname: 'version-compatibility',\n\t\t\tstatus: 'pass',\n\t\t\tmessage: 'Framework package versions are compatible',\n\t\t})\n\t}\n\n\t// Check 9: Module imports use @kuckit/* (not local workspace packages)\n\tconst localImportIssues: string[] = []\n\n\t// Check each installed module for imports from local packages instead of @kuckit/*\n\tfor (const packageName of installedPackages) {\n\t\tconst packagePath = findPackagePath(packageName, cwd)\n\t\tif (!packagePath) continue\n\n\t\t// Check module source files for local workspace imports\n\t\tconst srcPath = join(packagePath, 'src')\n\t\tif (!existsSync(srcPath)) continue\n\n\t\ttry {\n\t\t\tconst files = scanSourceFiles(srcPath)\n\t\t\tfor (const file of files) {\n\t\t\t\tconst content = readFileSync(file, 'utf-8')\n\t\t\t\t// Look for imports from @appname/api, @appname/db, @appname/auth etc\n\t\t\t\t// These should be @kuckit/api, @kuckit/db, @kuckit/auth in the framework model\n\t\t\t\tconst localImportMatch = content.match(\n\t\t\t\t\t/from\\s+['\"]@(?!kuckit\\/)[^'\"/]+\\/(api|db|auth|domain|contracts)['\"]/g\n\t\t\t\t)\n\t\t\t\tif (localImportMatch) {\n\t\t\t\t\tconst relPath = file.replace(cwd, '.')\n\t\t\t\t\tlocalImportIssues.push(\n\t\t\t\t\t\t`${packageName}: ${relPath} imports from local package instead of @kuckit/*`\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore scan errors\n\t\t}\n\t}\n\n\tif (localImportIssues.length > 0) {\n\t\tchecks.push({\n\t\t\tname: 'framework-imports',\n\t\t\tstatus: 'warn',\n\t\t\tmessage: `${localImportIssues.length} module(s) import from local packages instead of @kuckit/*`,\n\t\t\tdetails: localImportIssues.slice(0, 5).map((i) => ` - ${i}`),\n\t\t})\n\t} else if (installedPackages.length > 0) {\n\t\tchecks.push({\n\t\t\tname: 'framework-imports',\n\t\t\tstatus: 'pass',\n\t\t\tmessage: 'Module imports use @kuckit/* framework packages',\n\t\t})\n\t}\n\n\t// Check 10: Server/Client module sync\n\tconst serverModulesPath = join(cwd, 'apps', 'server', 'src', 'config', 'modules.ts')\n\tconst clientModulesPath = join(cwd, 'apps', 'web', 'src', 'modules.client.ts')\n\n\tif (existsSync(serverModulesPath) && existsSync(clientModulesPath)) {\n\t\tconst serverContent = readFileSync(serverModulesPath, 'utf-8')\n\t\tconst clientContent = readFileSync(clientModulesPath, 'utf-8')\n\n\t\t// Extract module IDs from imports (looking for patterns like: from '@app/module-name')\n\t\tconst serverModulePattern = /from\\s+['\"]@[^'\"]+\\/([^'\"]+)-module['\"]/g\n\t\tconst clientModulePattern = /from\\s+['\"]@[^'\"]+\\/([^'\"]+)-module\\/client['\"]/g\n\n\t\tconst serverModules = new Set<string>()\n\t\tconst clientModules = new Set<string>()\n\n\t\tlet match\n\t\twhile ((match = serverModulePattern.exec(serverContent)) !== null) {\n\t\t\t// Only count if actually used (not commented out)\n\t\t\tconst lineStart = serverContent.lastIndexOf('\\n', match.index) + 1\n\t\t\tconst lineContent = serverContent.slice(lineStart, match.index)\n\t\t\tif (!lineContent.includes('//')) {\n\t\t\t\tserverModules.add(match[1])\n\t\t\t}\n\t\t}\n\n\t\twhile ((match = clientModulePattern.exec(clientContent)) !== null) {\n\t\t\tconst lineStart = clientContent.lastIndexOf('\\n', match.index) + 1\n\t\t\tconst lineContent = clientContent.slice(lineStart, match.index)\n\t\t\tif (!lineContent.includes('//')) {\n\t\t\t\tclientModules.add(match[1])\n\t\t\t}\n\t\t}\n\n\t\tconst clientOnly = [...clientModules].filter((m) => !serverModules.has(m))\n\t\tconst serverOnly = [...serverModules].filter((m) => !clientModules.has(m))\n\n\t\tif (clientOnly.length > 0) {\n\t\t\tchecks.push({\n\t\t\t\tname: 'module-sync',\n\t\t\t\tstatus: 'fail',\n\t\t\t\tmessage: `Client modules without matching server modules (will cause 404 errors)`,\n\t\t\t\tdetails: clientOnly.map((m) => ` - ${m}-module: registered in client but not server`),\n\t\t\t})\n\t\t} else if (serverOnly.length > 0) {\n\t\t\tchecks.push({\n\t\t\t\tname: 'module-sync',\n\t\t\t\tstatus: 'warn',\n\t\t\t\tmessage: `Server modules without matching client modules`,\n\t\t\t\tdetails: serverOnly.map((m) => ` - ${m}-module: registered in server but not client`),\n\t\t\t})\n\t\t} else if (serverModules.size > 0 || clientModules.size > 0) {\n\t\t\tchecks.push({\n\t\t\t\tname: 'module-sync',\n\t\t\t\tstatus: 'pass',\n\t\t\t\tmessage: 'Server and client modules are in sync',\n\t\t\t})\n\t\t}\n\t}\n\n\t// Build report\n\tconst report: DoctorReport = {\n\t\tsuccess: checks.every((c) => c.status !== 'fail'),\n\t\tchecks,\n\t\tsummary: {\n\t\t\ttotal: checks.length,\n\t\t\tpassed: checks.filter((c) => c.status === 'pass').length,\n\t\t\tfailed: checks.filter((c) => c.status === 'fail').length,\n\t\t\twarnings: checks.filter((c) => c.status === 'warn').length,\n\t\t},\n\t}\n\n\t// Output\n\tif (options.json) {\n\t\tconsole.log(JSON.stringify(report, null, 2))\n\t} else {\n\t\tfor (const check of checks) {\n\t\t\tconst icon = check.status === 'pass' ? '✓' : check.status === 'fail' ? '✗' : '!'\n\t\t\tconst color =\n\t\t\t\tcheck.status === 'pass' ? '\\x1b[32m' : check.status === 'fail' ? '\\x1b[31m' : '\\x1b[33m'\n\t\t\tconst reset = '\\x1b[0m'\n\n\t\t\tconsole.log(`${color}${icon}${reset} ${check.message}`)\n\n\t\t\tif (check.details) {\n\t\t\t\tfor (const detail of check.details) {\n\t\t\t\t\tconsole.log(` ${detail}`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconsole.log('')\n\n\t\tif (report.success) {\n\t\t\tif (report.summary.warnings > 0) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`All checks passed with ${report.summary.warnings} warning(s). Run 'kuckit doctor --json' for details.`\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tconsole.log('All checks passed!')\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.log(\n\t\t\t\t`${report.summary.failed} check(s) failed. Please fix the issues above and run 'kuckit doctor' again.`\n\t\t\t)\n\t\t\tprocess.exit(1)\n\t\t}\n\t}\n}\n","const NPM_REGISTRY_SEARCH = 'https://registry.npmjs.org/-/v1/search'\n\nexport interface SearchOptions {\n\tjson: boolean\n\tlimit: number\n}\n\ninterface NpmPackage {\n\tname: string\n\tversion: string\n\tdescription?: string\n\tdate: string\n\tkeywords?: string[]\n\tlinks?: {\n\t\tnpm?: string\n\t\thomepage?: string\n\t\trepository?: string\n\t}\n\tpublisher?: {\n\t\tusername: string\n\t\temail: string\n\t}\n}\n\ninterface NpmSearchResult {\n\tpackage: NpmPackage\n\tscore: {\n\t\tfinal: number\n\t\tdetail: {\n\t\t\tquality: number\n\t\t\tpopularity: number\n\t\t\tmaintenance: number\n\t\t}\n\t}\n\tsearchScore: number\n}\n\ninterface NpmSearchResponse {\n\tobjects: NpmSearchResult[]\n\ttotal: number\n\ttime: string\n}\n\ninterface SearchResultItem {\n\tname: string\n\tversion: string\n\tdescription: string\n\tscore: number\n\tstars: string\n\tisKuckitModule: boolean\n\tnpm?: string\n\thomepage?: string\n}\n\ninterface SearchReport {\n\tquery: string\n\ttotal: number\n\tresults: SearchResultItem[]\n}\n\nfunction scoreToStars(score: number): string {\n\t// npm score.final is typically 0-100, normalize to 0-1 for stars\n\tconst normalizedScore = score > 1 ? score / 100 : score\n\tconst safeScore = Math.max(0, Math.min(1, normalizedScore || 0))\n\tconst filled = Math.round(safeScore * 5)\n\treturn '★'.repeat(filled) + '☆'.repeat(5 - filled)\n}\n\nfunction truncate(str: string, maxLen: number): string {\n\tif (str.length <= maxLen) return str\n\treturn str.slice(0, maxLen - 3) + '...'\n}\n\nasync function searchNpm(query: string, limit: number): Promise<NpmSearchResponse> {\n\tconst url = new URL(NPM_REGISTRY_SEARCH)\n\turl.searchParams.set('text', query)\n\turl.searchParams.set('size', String(Math.min(limit, 250)))\n\n\tconst response = await fetch(url.toString(), {\n\t\theaders: {\n\t\t\tAccept: 'application/json',\n\t\t},\n\t})\n\n\tif (!response.ok) {\n\t\tthrow new Error(`npm registry returned ${response.status}: ${response.statusText}`)\n\t}\n\n\treturn (await response.json()) as NpmSearchResponse\n}\n\nfunction isLikelyKuckitModule(pkg: NpmPackage): boolean {\n\tconst keywords = pkg.keywords ?? []\n\treturn (\n\t\tkeywords.some((k) => k.toLowerCase().includes('kuckit')) ||\n\t\tpkg.name.toLowerCase().includes('kuckit')\n\t)\n}\n\nfunction formatResult(result: NpmSearchResult): SearchResultItem {\n\tconst pkg = result.package\n\treturn {\n\t\tname: pkg.name,\n\t\tversion: pkg.version,\n\t\tdescription: pkg.description ?? '',\n\t\tscore: result.score.final,\n\t\tstars: scoreToStars(result.score.final),\n\t\tisKuckitModule: isLikelyKuckitModule(pkg),\n\t\tnpm: pkg.links?.npm,\n\t\thomepage: pkg.links?.homepage,\n\t}\n}\n\nexport async function search(keyword: string, options: SearchOptions): Promise<void> {\n\tif (!keyword.trim()) {\n\t\tconsole.error('Error: Please provide a search keyword')\n\t\tprocess.exit(1)\n\t}\n\n\ttry {\n\t\t// First, search for kuckit-module packages with the keyword\n\t\tconst kuckitQuery = `keywords:kuckit-module ${keyword}`\n\t\tlet response = await searchNpm(kuckitQuery, options.limit)\n\n\t\t// If no kuckit-specific results, fall back to broader search\n\t\tlet fallback = false\n\t\tif (response.objects.length === 0) {\n\t\t\tfallback = true\n\t\t\tconst broadQuery = `kuckit ${keyword}`\n\t\t\tresponse = await searchNpm(broadQuery, options.limit)\n\t\t}\n\n\t\tconst results = response.objects.map(formatResult)\n\n\t\tconst report: SearchReport = {\n\t\t\tquery: keyword,\n\t\t\ttotal: results.length,\n\t\t\tresults,\n\t\t}\n\n\t\tif (options.json) {\n\t\t\tconsole.log(JSON.stringify(report, null, 2))\n\t\t\treturn\n\t\t}\n\n\t\t// Human-readable output\n\t\tif (results.length === 0) {\n\t\t\tconsole.log(`No Kuckit modules found for \"${keyword}\"`)\n\t\t\tconsole.log('\\nTips:')\n\t\t\tconsole.log(' - Try different keywords')\n\t\t\tconsole.log(' - Check npm directly: npm search kuckit')\n\t\t\tconsole.log(' - Create your own: kuckit generate module <name>')\n\t\t\treturn\n\t\t}\n\n\t\tconsole.log(`\\nResults for \"${keyword}\"${fallback ? ' (broad search)' : ''}:\\n`)\n\n\t\t// Calculate column widths\n\t\tconst maxNameLen = Math.min(40, Math.max(...results.map((r) => r.name.length)))\n\t\tconst maxVerLen = Math.max(...results.map((r) => r.version.length))\n\n\t\tfor (const result of results) {\n\t\t\tconst name = result.name.padEnd(maxNameLen)\n\t\t\tconst version = `v${result.version}`.padEnd(maxVerLen + 1)\n\t\t\tconst desc = truncate(result.description, 50)\n\t\t\tconst kuckitBadge = result.isKuckitModule ? '' : ' [?]'\n\n\t\t\tconsole.log(` ${name} ${version} ${result.stars} ${desc}${kuckitBadge}`)\n\t\t}\n\n\t\tconsole.log(`\\n${results.length} package${results.length === 1 ? '' : 's'} found`)\n\n\t\tif (results.some((r) => !r.isKuckitModule)) {\n\t\t\tconsole.log('\\n[?] = May not be a Kuckit module (verify before installing)')\n\t\t}\n\n\t\tif (results.length > 0) {\n\t\t\tconsole.log(`\\nInstall: kuckit add ${results[0].name}`)\n\t\t}\n\t} catch (error) {\n\t\tif (options.json) {\n\t\t\tconsole.log(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\terror: error instanceof Error ? error.message : 'Unknown error',\n\t\t\t\t\tquery: keyword,\n\t\t\t\t\ttotal: 0,\n\t\t\t\t\tresults: [],\n\t\t\t\t})\n\t\t\t)\n\t\t} else {\n\t\t\tconsole.error(\n\t\t\t\t`Error searching npm registry: ${error instanceof Error ? error.message : error}`\n\t\t\t)\n\t\t}\n\t\tprocess.exit(1)\n\t}\n}\n","import { spawn } from 'child_process'\nimport { readFile, writeFile, mkdir, access, constants } from 'fs/promises'\nimport { join, dirname } from 'path'\nimport { loadTryLoadKuckitConfig } from '../lib/sdk-loader.js'\n\nexport interface DbOptions {\n\turl?: string\n}\n\nconst KUCKIT_DIR = '.kuckit'\nconst TEMP_CONFIG_NAME = 'drizzle.config.ts'\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path, constants.F_OK)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\nasync function findProjectRoot(cwd: string): Promise<string | null> {\n\tlet dir = cwd\n\twhile (dir !== dirname(dir)) {\n\t\tif (await fileExists(join(dir, 'package.json'))) {\n\t\t\treturn dir\n\t\t}\n\t\tdir = dirname(dir)\n\t}\n\treturn null\n}\n\nasync function getDatabaseUrl(cwd: string, options: DbOptions): Promise<string | null> {\n\t// CLI flag takes precedence\n\tif (options.url) {\n\t\treturn options.url\n\t}\n\n\t// Check environment variable\n\tif (process.env.DATABASE_URL) {\n\t\treturn process.env.DATABASE_URL\n\t}\n\n\t// Try to load from .env file\n\tconst envPaths = [join(cwd, '.env'), join(cwd, 'apps', 'server', '.env'), join(cwd, '.env.local')]\n\n\tfor (const envPath of envPaths) {\n\t\tif (await fileExists(envPath)) {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(envPath, 'utf-8')\n\t\t\t\tconst match = content.match(/^DATABASE_URL=(.+)$/m)\n\t\t\t\tif (match) {\n\t\t\t\t\treturn match[1].replace(/^[\"']|[\"']$/g, '')\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Continue to next file\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null\n}\n\ninterface ModuleSchemaInfo {\n\tmoduleId: string\n\tschemaPath: string\n}\n\nasync function discoverModuleSchemas(cwd: string): Promise<ModuleSchemaInfo[]> {\n\tconst schemas: ModuleSchemaInfo[] = []\n\n\t// Load kuckit config to find enabled modules\n\tconst tryLoadKuckitConfig = await loadTryLoadKuckitConfig()\n\tconst config = await tryLoadKuckitConfig(cwd)\n\tif (!config) {\n\t\treturn schemas\n\t}\n\n\tfor (const moduleSpec of config.modules) {\n\t\tif (moduleSpec.disabled) continue\n\n\t\tlet packagePath: string | null = null\n\t\tlet moduleId: string | null = null\n\n\t\tif (moduleSpec.package) {\n\t\t\t// Try workspace packages first\n\t\t\tconst workspacePath = join(cwd, 'packages', moduleSpec.package.replace(/^@[^/]+\\//, ''))\n\t\t\tif (await fileExists(join(workspacePath, 'package.json'))) {\n\t\t\t\tpackagePath = workspacePath\n\t\t\t} else {\n\t\t\t\t// Try node_modules\n\t\t\t\tconst nodeModulesPath = join(cwd, 'node_modules', moduleSpec.package)\n\t\t\t\tif (await fileExists(join(nodeModulesPath, 'package.json'))) {\n\t\t\t\t\tpackagePath = nodeModulesPath\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Extract module ID from package.json kuckit metadata\n\t\t\tif (packagePath) {\n\t\t\t\ttry {\n\t\t\t\t\tconst pkgJson = JSON.parse(await readFile(join(packagePath, 'package.json'), 'utf-8'))\n\t\t\t\t\tmoduleId = pkgJson.kuckit?.id || moduleSpec.package\n\t\t\t\t} catch {\n\t\t\t\t\tmoduleId = moduleSpec.package\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!packagePath) continue\n\n\t\t// Look for schema files in conventional locations\n\t\tconst schemaLocations = [\n\t\t\tjoin(packagePath, 'src', 'server', 'schema', 'index.ts'),\n\t\t\tjoin(packagePath, 'src', 'server', 'schema.ts'),\n\t\t\tjoin(packagePath, 'src', 'schema', 'index.ts'),\n\t\t\tjoin(packagePath, 'src', 'schema.ts'),\n\t\t]\n\n\t\tfor (const schemaPath of schemaLocations) {\n\t\t\tif (await fileExists(schemaPath)) {\n\t\t\t\tschemas.push({ moduleId: moduleId || 'unknown', schemaPath })\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Also include the central packages/db schema if it exists\n\tconst centralSchemaPath = join(cwd, 'packages', 'db', 'src', 'schema')\n\tif (await fileExists(centralSchemaPath)) {\n\t\tschemas.push({ moduleId: 'core', schemaPath: centralSchemaPath })\n\t}\n\n\treturn schemas\n}\n\nasync function generateTempDrizzleConfig(\n\tcwd: string,\n\tdatabaseUrl: string,\n\tschemas: ModuleSchemaInfo[]\n): Promise<string> {\n\tconst kuckitDir = join(cwd, KUCKIT_DIR)\n\tawait mkdir(kuckitDir, { recursive: true })\n\n\tconst configPath = join(kuckitDir, TEMP_CONFIG_NAME)\n\tconst schemaPaths = schemas.map((s) => s.schemaPath)\n\n\tconst configContent = `import { defineConfig } from 'drizzle-kit'\n\nexport default defineConfig({\n\tschema: ${JSON.stringify(schemaPaths)},\n\tout: './drizzle',\n\tdialect: 'postgresql',\n\tdbCredentials: {\n\t\turl: ${JSON.stringify(databaseUrl)},\n\t},\n})\n`\n\n\tawait writeFile(configPath, configContent, 'utf-8')\n\treturn configPath\n}\n\nfunction runDrizzleKit(\n\tcommand: string,\n\tconfigPath: string,\n\tcwd: string\n): Promise<{ code: number; stdout: string; stderr: string }> {\n\treturn new Promise((resolve) => {\n\t\tconst args = [command, '--config', configPath]\n\t\tconst proc = spawn('npx', ['drizzle-kit', ...args], {\n\t\t\tcwd,\n\t\t\tstdio: ['inherit', 'pipe', 'pipe'],\n\t\t\tshell: true,\n\t\t})\n\n\t\tlet stdout = ''\n\t\tlet stderr = ''\n\n\t\tproc.stdout?.on('data', (data) => {\n\t\t\tstdout += data.toString()\n\t\t\tprocess.stdout.write(data)\n\t\t})\n\n\t\tproc.stderr?.on('data', (data) => {\n\t\t\tstderr += data.toString()\n\t\t\tprocess.stderr.write(data)\n\t\t})\n\n\t\tproc.on('close', (code) => {\n\t\t\tresolve({ code: code ?? 1, stdout, stderr })\n\t\t})\n\t})\n}\n\nasync function runDbCommand(\n\tcommand: 'push' | 'generate' | 'studio',\n\toptions: DbOptions\n): Promise<void> {\n\tconst cwd = process.cwd()\n\n\t// Find project root\n\tconst projectRoot = await findProjectRoot(cwd)\n\tif (!projectRoot) {\n\t\tconsole.error('Error: Could not find project root (no package.json found)')\n\t\tprocess.exit(1)\n\t}\n\n\t// Get database URL\n\tconst databaseUrl = await getDatabaseUrl(projectRoot, options)\n\tif (!databaseUrl) {\n\t\tconsole.error('Error: DATABASE_URL not found')\n\t\tconsole.error('Set it via:')\n\t\tconsole.error(' - --url flag: kuckit db push --url postgres://...')\n\t\tconsole.error(' - Environment variable: DATABASE_URL=postgres://...')\n\t\tconsole.error(' - .env file in project root or apps/server/')\n\t\tprocess.exit(1)\n\t}\n\n\t// Discover module schemas\n\tconsole.log('Discovering module schemas...')\n\tconst schemas = await discoverModuleSchemas(projectRoot)\n\n\tif (schemas.length === 0) {\n\t\tconsole.error('Error: No schemas found')\n\t\tconsole.error('Make sure your modules have schemas in one of these locations:')\n\t\tconsole.error(' - src/server/schema/index.ts')\n\t\tconsole.error(' - src/server/schema.ts')\n\t\tconsole.error(' - src/schema/index.ts')\n\t\tconsole.error(' - src/schema.ts')\n\t\tprocess.exit(1)\n\t}\n\n\tconsole.log(`Found ${schemas.length} schema source(s):`)\n\tfor (const schema of schemas) {\n\t\tconsole.log(` - ${schema.moduleId}: ${schema.schemaPath}`)\n\t}\n\n\t// Generate temp drizzle config\n\tconst configPath = await generateTempDrizzleConfig(projectRoot, databaseUrl, schemas)\n\tconsole.log(`Generated drizzle config: ${configPath}`)\n\tconsole.log('')\n\n\t// Run drizzle-kit\n\tconst result = await runDrizzleKit(command, configPath, projectRoot)\n\n\tif (result.code !== 0) {\n\t\tprocess.exit(result.code)\n\t}\n}\n\nexport async function dbPush(options: DbOptions): Promise<void> {\n\tawait runDbCommand('push', options)\n}\n\nexport async function dbGenerate(options: DbOptions): Promise<void> {\n\tawait runDbCommand('generate', options)\n}\n\nexport async function dbStudio(options: DbOptions): Promise<void> {\n\tawait runDbCommand('studio', options)\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, chmodSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport interface KuckitConfig {\n\tcliToken?: string\n\ttokenExpiresAt?: string\n\tuserId?: string\n\tuserName?: string\n\tpermissions?: string[]\n\tserverUrl?: string\n}\n\nconst DEFAULT_SERVER_URL = process.env.KUCKIT_SERVER_URL as string\nconst CONFIG_DIR = join(homedir(), '.kuckit')\nconst CONFIG_PATH = join(CONFIG_DIR, 'config.json')\n\nexport function getConfigPath(): string {\n\treturn CONFIG_PATH\n}\n\nexport function getDefaultServerUrl(): string {\n\treturn DEFAULT_SERVER_URL\n}\n\nexport function loadConfig(): KuckitConfig | null {\n\ttry {\n\t\tif (!existsSync(CONFIG_PATH)) {\n\t\t\treturn null\n\t\t}\n\t\tconst content = readFileSync(CONFIG_PATH, 'utf-8')\n\t\treturn JSON.parse(content) as KuckitConfig\n\t} catch {\n\t\treturn null\n\t}\n}\n\nexport function saveConfig(config: KuckitConfig): void {\n\tif (!existsSync(CONFIG_DIR)) {\n\t\tmkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 })\n\t}\n\n\tconst content = JSON.stringify(config, null, 2)\n\twriteFileSync(CONFIG_PATH, content, { mode: 0o600 })\n\n\t// Ensure file permissions are correct (in case file existed)\n\tchmodSync(CONFIG_PATH, 0o600)\n}\n\nexport function clearConfig(): void {\n\ttry {\n\t\tif (existsSync(CONFIG_PATH)) {\n\t\t\tunlinkSync(CONFIG_PATH)\n\t\t}\n\t} catch {\n\t\t// Ignore errors when clearing\n\t}\n}\n\nexport function getServerUrl(config: KuckitConfig | null, override?: string): string {\n\treturn override ?? config?.serverUrl ?? DEFAULT_SERVER_URL\n}\n\nexport function isTokenExpired(config: KuckitConfig): boolean {\n\tif (!config.tokenExpiresAt) {\n\t\treturn false // No expiry means not expired\n\t}\n\treturn new Date(config.tokenExpiresAt) < new Date()\n}\n","import { type Command } from 'commander'\nimport {\n\tloadConfig,\n\tsaveConfig,\n\tclearConfig,\n\tgetServerUrl,\n\tisTokenExpired,\n\ttype KuckitConfig,\n} from '../lib/credentials.js'\n\nexport interface AuthLoginOptions {\n\tserver?: string\n\tscopes?: string\n}\n\nexport interface AuthWhoamiOptions {\n\tjson?: boolean\n}\n\ninterface InitiateResponse {\n\tdeviceCode: string\n\tuserCode: string\n\tverificationUrl: string\n\texpiresIn: number\n\tintervalSec: number\n}\n\ninterface PollResponse {\n\tstatus: 'pending' | 'approved' | 'denied' | 'expired'\n\ttoken?: string\n\texpiresIn?: number\n\tscopes?: string[]\n\tpermissions?: string[]\n}\n\nasync function openBrowser(url: string): Promise<boolean> {\n\ttry {\n\t\tconst open = await import('open')\n\t\tawait open.default(url)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\nfunction sleep(ms: number): Promise<void> {\n\treturn new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction formatExpiryDate(expiresAt: string): string {\n\tconst date = new Date(expiresAt)\n\treturn date.toLocaleDateString('en-US', {\n\t\tyear: 'numeric',\n\t\tmonth: 'long',\n\t\tday: 'numeric',\n\t\thour: '2-digit',\n\t\tminute: '2-digit',\n\t})\n}\n\nexport async function authLogin(options: AuthLoginOptions): Promise<void> {\n\tconst config = loadConfig()\n\tconst serverUrl = getServerUrl(config, options.server)\n\tconst scopes = options.scopes?.split(',').map((s) => s.trim()) ?? ['cli']\n\n\tconsole.log('\\nAuthenticating with Kuckit...\\n')\n\n\t// Step 1: Initiate device flow\n\tlet initResponse: InitiateResponse\n\ttry {\n\t\tconst response = await fetch(`${serverUrl}/rpc/cliDevice/initiate`, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\tbody: JSON.stringify({ json: { scopes } }),\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tconst error = await response.json().catch(() => ({}))\n\t\t\tconsole.error('Failed to initiate authentication:', error.message ?? response.statusText)\n\t\t\tprocess.exit(1)\n\t\t}\n\n\t\tconst data = (await response.json()) as { json: InitiateResponse }\n\t\tinitResponse = data.json\n\t} catch (err) {\n\t\tconsole.error('Failed to connect to server:', err instanceof Error ? err.message : String(err))\n\t\tconsole.error(`\\nMake sure the server is running at ${serverUrl}`)\n\t\tprocess.exit(1)\n\t}\n\n\t// Step 2: Display user code\n\tconst { deviceCode, userCode, verificationUrl, intervalSec } = initResponse\n\n\tconsole.log('┌─────────────────────────────────────┐')\n\tconsole.log('│ │')\n\tconsole.log('│ Enter this code in your browser │')\n\tconsole.log('│ │')\n\tconsole.log(`│ ${userCode} │`)\n\tconsole.log('│ │')\n\tconsole.log('└─────────────────────────────────────┘')\n\tconsole.log('')\n\tconsole.log(`Open: ${verificationUrl}`)\n\tconsole.log('')\n\n\t// Step 3: Open browser\n\tconst browserOpened = await openBrowser(verificationUrl)\n\tif (browserOpened) {\n\t\tconsole.log('Browser opened automatically.')\n\t} else {\n\t\tconsole.log('Could not open browser. Please open the URL manually.')\n\t}\n\tconsole.log('\\nWaiting for authorization...\\n')\n\n\t// Step 4: Poll for approval\n\tconst pollIntervalMs = intervalSec * 1000\n\tlet attempts = 0\n\tconst maxAttempts = 120 // 10 minutes at 5 second intervals\n\n\twhile (attempts < maxAttempts) {\n\t\tawait sleep(pollIntervalMs)\n\t\tattempts++\n\n\t\ttry {\n\t\t\tconst response = await fetch(`${serverUrl}/rpc/cliDevice/poll`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\tbody: JSON.stringify({ json: { deviceCode } }),\n\t\t\t})\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst error = await response.json().catch(() => ({}))\n\t\t\t\tconsole.error('Poll failed:', error.message ?? response.statusText)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst data = (await response.json()) as { json: PollResponse }\n\t\t\tconst pollResult = data.json\n\n\t\t\tswitch (pollResult.status) {\n\t\t\t\tcase 'pending':\n\t\t\t\t\tprocess.stdout.write('.')\n\t\t\t\t\tcontinue\n\n\t\t\t\tcase 'approved': {\n\t\t\t\t\tconsole.log('\\n')\n\t\t\t\t\tif (!pollResult.token || !pollResult.expiresIn) {\n\t\t\t\t\t\tconsole.error('Authorization succeeded but no token received.')\n\t\t\t\t\t\tprocess.exit(1)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst expiresAt = new Date(Date.now() + pollResult.expiresIn * 1000).toISOString()\n\n\t\t\t\t\tconst newConfig: KuckitConfig = {\n\t\t\t\t\t\t...config,\n\t\t\t\t\t\tcliToken: pollResult.token,\n\t\t\t\t\t\ttokenExpiresAt: expiresAt,\n\t\t\t\t\t\tpermissions: pollResult.permissions,\n\t\t\t\t\t\tserverUrl,\n\t\t\t\t\t}\n\t\t\t\t\tsaveConfig(newConfig)\n\n\t\t\t\t\tconsole.log('✓ Successfully authenticated!')\n\t\t\t\t\tconsole.log(` Token expires: ${formatExpiryDate(expiresAt)}`)\n\t\t\t\t\tif (pollResult.permissions && pollResult.permissions.length > 0) {\n\t\t\t\t\t\tconsole.log(` Permissions: ${pollResult.permissions.join(', ')}`)\n\t\t\t\t\t}\n\t\t\t\t\tconsole.log('')\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tcase 'denied':\n\t\t\t\t\tconsole.log('\\n')\n\t\t\t\t\tconsole.error('Authorization was denied.')\n\t\t\t\t\tprocess.exit(1)\n\t\t\t\t\tbreak\n\n\t\t\t\tcase 'expired':\n\t\t\t\t\tconsole.log('\\n')\n\t\t\t\t\tconsole.error('Authorization request expired. Please try again.')\n\t\t\t\t\tprocess.exit(1)\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t} catch {\n\t\t\t// Network error during poll, continue trying\n\t\t\tprocess.stdout.write('x')\n\t\t}\n\t}\n\n\tconsole.log('\\n')\n\tconsole.error('Authorization timed out. Please try again.')\n\tprocess.exit(1)\n}\n\nexport async function authWhoami(options: AuthWhoamiOptions): Promise<void> {\n\tconst config = loadConfig()\n\n\tif (!config?.cliToken) {\n\t\tif (options.json) {\n\t\t\tconsole.log(JSON.stringify({ authenticated: false }))\n\t\t} else {\n\t\t\tconsole.log(\"Not logged in. Run 'kuckit auth login' to authenticate.\")\n\t\t}\n\t\treturn\n\t}\n\n\tif (isTokenExpired(config)) {\n\t\tif (options.json) {\n\t\t\tconsole.log(JSON.stringify({ authenticated: false, reason: 'token_expired' }))\n\t\t} else {\n\t\t\tconsole.log(\"Your session has expired. Run 'kuckit auth login' to sign in again.\")\n\t\t}\n\t\treturn\n\t}\n\n\tif (options.json) {\n\t\tconsole.log(\n\t\t\tJSON.stringify({\n\t\t\t\tauthenticated: true,\n\t\t\t\tuserId: config.userId,\n\t\t\t\tuserName: config.userName,\n\t\t\t\tserverUrl: config.serverUrl,\n\t\t\t\ttokenExpiresAt: config.tokenExpiresAt,\n\t\t\t\tpermissions: config.permissions,\n\t\t\t})\n\t\t)\n\t} else {\n\t\tconsole.log('\\nAuthenticated')\n\t\tif (config.userName) {\n\t\t\tconsole.log(` User: ${config.userName}`)\n\t\t}\n\t\tif (config.userId) {\n\t\t\tconsole.log(` ID: ${config.userId}`)\n\t\t}\n\t\tif (config.serverUrl) {\n\t\t\tconsole.log(` Server: ${config.serverUrl}`)\n\t\t}\n\t\tif (config.tokenExpiresAt) {\n\t\t\tconsole.log(` Token expires: ${formatExpiryDate(config.tokenExpiresAt)}`)\n\t\t}\n\t\tif (config.permissions && config.permissions.length > 0) {\n\t\t\tconsole.log(` Permissions: ${config.permissions.join(', ')}`)\n\t\t}\n\t\tconsole.log('')\n\t}\n}\n\nexport async function authLogout(): Promise<void> {\n\tconst config = loadConfig()\n\n\tif (!config?.cliToken) {\n\t\tconsole.log('Already logged out.')\n\t\treturn\n\t}\n\n\tclearConfig()\n\tconsole.log('Logged out successfully.')\n}\n\nexport function registerAuthCommands(program: Command): void {\n\tconst auth = program.command('auth').description('Manage CLI authentication')\n\n\tauth\n\t\t.command('login')\n\t\t.description('Authenticate with Kuckit using device flow')\n\t\t.option('-s, --server <url>', 'Server URL (default: http://localhost:3000)')\n\t\t.option('--scopes <scopes>', 'Comma-separated list of scopes (default: cli)')\n\t\t.action(async (options: AuthLoginOptions) => {\n\t\t\tawait authLogin(options)\n\t\t})\n\n\tauth\n\t\t.command('whoami')\n\t\t.description('Show current authentication status')\n\t\t.option('--json', 'Output as JSON', false)\n\t\t.action(async (options: AuthWhoamiOptions) => {\n\t\t\tawait authWhoami(options)\n\t\t})\n\n\tauth\n\t\t.command('logout')\n\t\t.description('Clear stored credentials')\n\t\t.action(async () => {\n\t\t\tawait authLogout()\n\t\t})\n}\n","import { loadConfig, isTokenExpired } from './credentials.js'\n\n/**\n * Checks if the user is authenticated with a valid token.\n * Exits the process with an error message if not authenticated.\n */\nexport function requireAuth(): void {\n\tconst config = loadConfig()\n\n\tif (!config?.cliToken) {\n\t\tconsole.error(\"\\nError: Not logged in. Run 'kuckit auth login' first.\\n\")\n\t\tprocess.exit(1)\n\t}\n\n\tif (isTokenExpired(config)) {\n\t\tconsole.error(\"\\nError: Session expired. Run 'kuckit auth login' to refresh.\\n\")\n\t\tprocess.exit(1)\n\t}\n}\n","/**\n * Package Manager Detection\n *\n * Detects the package manager used in a project by checking for lock files.\n */\n\nimport { accessSync, constants } from 'fs'\nimport { join } from 'path'\n\nexport type PackageManager = 'bun' | 'npm' | 'yarn' | 'pnpm'\n\n/**\n * Detect the package manager used in a project\n *\n * @param cwd - Directory to check for lock files\n * @returns The detected package manager, defaults to 'npm' if none found\n */\nexport function detectPackageManager(cwd: string): PackageManager {\n\tconst lockFiles: Record<string, PackageManager> = {\n\t\t'bun.lock': 'bun',\n\t\t'bun.lockb': 'bun',\n\t\t'package-lock.json': 'npm',\n\t\t'yarn.lock': 'yarn',\n\t\t'pnpm-lock.yaml': 'pnpm',\n\t}\n\n\tfor (const [file, pm] of Object.entries(lockFiles)) {\n\t\ttry {\n\t\t\taccessSync(join(cwd, file), constants.F_OK)\n\t\t\treturn pm\n\t\t} catch {\n\t\t\t// continue\n\t\t}\n\t}\n\n\treturn 'npm'\n}\n\n/**\n * Get the install command for a package manager\n *\n * @param pm - Package manager\n * @param packageName - Package to install\n * @param options - Install options\n * @returns The full install command\n */\nexport function getInstallCommand(\n\tpm: PackageManager,\n\tpackageName: string,\n\toptions: { dev?: boolean } = {}\n): string {\n\tconst devFlag = options.dev ? ' -D' : ''\n\n\tswitch (pm) {\n\t\tcase 'bun':\n\t\t\treturn `bun add${devFlag} ${packageName}`\n\t\tcase 'yarn':\n\t\t\treturn `yarn add${options.dev ? ' --dev' : ''} ${packageName}`\n\t\tcase 'pnpm':\n\t\t\treturn `pnpm add${devFlag} ${packageName}`\n\t\tcase 'npm':\n\t\tdefault:\n\t\t\treturn `npm install${options.dev ? ' --save-dev' : ''} ${packageName}`\n\t}\n}\n","/**\n * Provider Loader\n *\n * Dynamically loads infrastructure providers from npm packages.\n * Providers are discovered based on the providerPackage field in .kuckit/infra.json\n * or via the kuckit.type = \"infra-provider\" field in package.json.\n */\n\nimport { join } from 'path'\nimport { readFile, access, constants } from 'fs/promises'\nimport type { KuckitInfraProvider, KuckitInfraProviderModule, BaseInfraConfig } from './provider.js'\nimport type { StoredInfraConfig, LegacyInfraConfig } from './types.js'\nimport { isLegacyConfig, migrateLegacyConfig } from './types.js'\nimport { detectPackageManager, getInstallCommand } from '../../lib/package-manager.js'\n\nconst KUCKIT_DIR = '.kuckit'\nconst CONFIG_FILE = 'infra.json'\n\n/**\n * Default provider packages by provider ID\n */\nconst DEFAULT_PROVIDER_PACKAGES: Record<string, string> = {\n\tgcp: '@kuckit/infra-gcp',\n\taws: '@kuckit/infra-aws',\n\tazure: '@kuckit/infra-azure',\n}\n\n/**\n * Result of loading a provider\n */\nexport interface LoadProviderResult<\n\tTConfig extends BaseInfraConfig = BaseInfraConfig,\n\tTOutputs extends Record<string, unknown> = Record<string, unknown>,\n> {\n\tprovider: KuckitInfraProvider<TConfig, TOutputs>\n\tconfig: StoredInfraConfig | null\n}\n\n/**\n * Load the stored infrastructure config from .kuckit/infra.json\n */\nexport async function loadStoredConfig(projectRoot: string): Promise<StoredInfraConfig | null> {\n\tconst configPath = join(projectRoot, KUCKIT_DIR, CONFIG_FILE)\n\n\ttry {\n\t\tawait access(configPath, constants.F_OK)\n\t\tconst content = await readFile(configPath, 'utf-8')\n\t\tconst parsed = JSON.parse(content)\n\n\t\t// Handle legacy config format\n\t\tif (isLegacyConfig(parsed)) {\n\t\t\treturn migrateLegacyConfig(parsed as LegacyInfraConfig)\n\t\t}\n\n\t\treturn parsed as StoredInfraConfig\n\t} catch {\n\t\treturn null\n\t}\n}\n\n/**\n * Save infrastructure config to .kuckit/infra.json\n */\nexport async function saveStoredConfig(\n\tprojectRoot: string,\n\tconfig: StoredInfraConfig\n): Promise<void> {\n\tconst { mkdir, writeFile } = await import('fs/promises')\n\tconst kuckitDir = join(projectRoot, KUCKIT_DIR)\n\tawait mkdir(kuckitDir, { recursive: true })\n\n\tconst configPath = join(kuckitDir, CONFIG_FILE)\n\tconfig.updatedAt = new Date().toISOString()\n\tawait writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8')\n}\n\n/**\n * Error thrown when provider package is not installed\n */\nexport class ProviderNotInstalledError extends Error {\n\tconstructor(\n\t\tpublic readonly packageName: string,\n\t\tpublic readonly installCommand: string\n\t) {\n\t\tsuper(`Provider package '${packageName}' is not installed.`)\n\t\tthis.name = 'ProviderNotInstalledError'\n\t}\n}\n\n/**\n * Error thrown when provider package is invalid\n */\nexport class InvalidProviderError extends Error {\n\tconstructor(\n\t\tpublic readonly packageName: string,\n\t\treason: string\n\t) {\n\t\tsuper(`Package '${packageName}' is not a valid Kuckit infrastructure provider: ${reason}`)\n\t\tthis.name = 'InvalidProviderError'\n\t}\n}\n\n/**\n * Load a provider from an npm package\n *\n * @param packageName - npm package name (e.g., '@kuckit/infra-gcp')\n * @param projectRoot - Optional project root for package manager detection\n * @returns The provider instance\n * @throws ProviderNotInstalledError if package not found\n * @throws InvalidProviderError if package doesn't export a valid provider\n */\nexport async function loadProviderFromPackage<\n\tTConfig extends BaseInfraConfig = BaseInfraConfig,\n\tTOutputs extends Record<string, unknown> = Record<string, unknown>,\n>(packageName: string, projectRoot?: string): Promise<KuckitInfraProvider<TConfig, TOutputs>> {\n\ttry {\n\t\t// Try to import the package\n\t\tconst module = (await import(packageName)) as KuckitInfraProviderModule<TConfig, TOutputs>\n\n\t\tif (!module.provider) {\n\t\t\tthrow new InvalidProviderError(packageName, \"does not export a 'provider' object\")\n\t\t}\n\n\t\t// Validate provider interface\n\t\tconst provider = module.provider\n\t\tif (\n\t\t\t!provider.id ||\n\t\t\t!provider.label ||\n\t\t\t!provider.getInfraDir ||\n\t\t\t!provider.init ||\n\t\t\t!provider.deploy\n\t\t) {\n\t\t\tthrow new InvalidProviderError(\n\t\t\t\tpackageName,\n\t\t\t\t'missing required methods (id, label, getInfraDir, init, deploy)'\n\t\t\t)\n\t\t}\n\n\t\treturn provider\n\t} catch (error) {\n\t\tif (error instanceof ProviderNotInstalledError || error instanceof InvalidProviderError) {\n\t\t\tthrow error\n\t\t}\n\t\tif (\n\t\t\terror instanceof Error &&\n\t\t\t(error.message.includes('Cannot find module') ||\n\t\t\t\terror.message.includes('Cannot find package'))\n\t\t) {\n\t\t\tconst pm = detectPackageManager(projectRoot ?? process.cwd())\n\t\t\tconst installCommand = getInstallCommand(pm, packageName, { dev: true })\n\t\t\tthrow new ProviderNotInstalledError(packageName, installCommand)\n\t\t}\n\t\tthrow error\n\t}\n}\n\n/**\n * Get the provider package name for a given provider ID\n */\nexport function getProviderPackage(providerId: string): string {\n\treturn DEFAULT_PROVIDER_PACKAGES[providerId] ?? `@kuckit/infra-${providerId}`\n}\n\n/**\n * Load provider based on stored config\n *\n * @param projectRoot - Project root directory\n * @returns Provider and config, or null config if not initialized\n */\nexport async function loadProvider<\n\tTConfig extends BaseInfraConfig = BaseInfraConfig,\n\tTOutputs extends Record<string, unknown> = Record<string, unknown>,\n>(projectRoot: string): Promise<LoadProviderResult<TConfig, TOutputs> | null> {\n\tconst config = await loadStoredConfig(projectRoot)\n\n\tif (!config) {\n\t\treturn null\n\t}\n\n\tconst packageName = config.providerPackage ?? getProviderPackage(config.provider)\n\tconst provider = await loadProviderFromPackage<TConfig, TOutputs>(packageName)\n\n\treturn { provider, config }\n}\n\n/**\n * Check if a provider package is available\n */\nexport async function isProviderAvailable(providerId: string): Promise<boolean> {\n\tconst packageName = getProviderPackage(providerId)\n\ttry {\n\t\tawait import(packageName)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\n/**\n * List available provider packages\n */\nexport async function listAvailableProviders(): Promise<\n\tArray<{ id: string; package: string; available: boolean }>\n> {\n\tconst results = await Promise.all(\n\t\tObject.entries(DEFAULT_PROVIDER_PACKAGES).map(async ([id, pkg]) => ({\n\t\t\tid,\n\t\t\tpackage: pkg,\n\t\t\tavailable: await isProviderAvailable(id),\n\t\t}))\n\t)\n\treturn results\n}\n\n/**\n * Ensure provider prerequisites are met\n */\nexport async function checkProviderPrerequisites(\n\tprovider: KuckitInfraProvider\n): Promise<{ ok: boolean; missing: Array<{ name: string; installUrl: string }> }> {\n\treturn provider.checkPrerequisites()\n}\n","/**\n * kuckit infra init command\n *\n * Initialize base infrastructure using a provider package (no Docker required)\n */\n\nimport { access, constants } from 'fs/promises'\nimport { join, dirname } from 'path'\nimport { input, confirm, select } from '@inquirer/prompts'\nimport {\n\tloadStoredConfig,\n\tsaveStoredConfig,\n\tloadProviderFromPackage,\n\tgetProviderPackage,\n\tlistAvailableProviders,\n\tProviderNotInstalledError,\n\tInvalidProviderError,\n} from './provider-loader.js'\nimport type { StoredInfraConfig, SupportedProvider } from './types.js'\nimport { detectPackageManager, getInstallCommand } from '../../lib/package-manager.js'\n\nexport interface InitOptions {\n\t/** Cloud provider (gcp, aws, azure) */\n\tprovider?: string\n\t/** GCP project ID (for GCP provider) */\n\tproject?: string\n\t/** Deployment region */\n\tregion?: string\n\t/** Environment (dev/prod) */\n\tenv?: string\n\t/** Skip confirmation prompts */\n\tyes?: boolean\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path, constants.F_OK)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\nasync function findProjectRoot(cwd: string): Promise<string | null> {\n\tlet dir = cwd\n\twhile (dir !== dirname(dir)) {\n\t\tif (await fileExists(join(dir, 'package.json'))) {\n\t\t\treturn dir\n\t\t}\n\t\tdir = dirname(dir)\n\t}\n\treturn null\n}\n\n/**\n * Check if legacy packages/infra directory exists\n */\nasync function hasLegacyInfra(projectRoot: string): Promise<boolean> {\n\treturn fileExists(join(projectRoot, 'packages', 'infra', 'package.json'))\n}\n\nexport async function infraInit(options: InitOptions): Promise<void> {\n\tconsole.log('Initializing kuckit infrastructure...\\n')\n\n\t// Find project root\n\tconst projectRoot = await findProjectRoot(process.cwd())\n\tif (!projectRoot) {\n\t\tconsole.error('Error: Could not find project root (no package.json found)')\n\t\tprocess.exit(1)\n\t}\n\n\t// Check for legacy packages/infra and show migration guidance\n\tif (await hasLegacyInfra(projectRoot)) {\n\t\tconsole.log('⚠️ Legacy infrastructure detected: packages/infra')\n\t\tconsole.log('')\n\t\tconsole.log('Kuckit now uses provider packages (@kuckit/infra-gcp) instead of')\n\t\tconsole.log('local Pulumi code. Your existing Pulumi state will be preserved.')\n\t\tconsole.log('')\n\t\tconsole.log('After migration, you can remove packages/infra.')\n\t\tconsole.log('See docs/MIGRATION.md for details.')\n\t\tconsole.log('')\n\t}\n\n\t// Load existing config (may be legacy format)\n\tconst existingConfig = await loadStoredConfig(projectRoot)\n\n\t// Determine provider\n\tlet providerId: SupportedProvider = (options.provider ??\n\t\texistingConfig?.provider ??\n\t\t'gcp') as SupportedProvider\n\n\t// If no provider specified and no existing config, check what's available\n\tif (!options.provider && !existingConfig) {\n\t\tconst availableProviders = await listAvailableProviders()\n\t\tconst installedProviders = availableProviders.filter((p) => p.available)\n\n\t\tif (installedProviders.length === 0) {\n\t\t\tconst pm = detectPackageManager(projectRoot)\n\t\t\tconst installCmd = getInstallCommand(pm, '@kuckit/infra-gcp', { dev: true })\n\n\t\t\tconsole.error('Error: No infrastructure providers installed.')\n\t\t\tconsole.error('')\n\t\t\tconsole.error('Kuckit requires a cloud provider package to deploy infrastructure.')\n\t\t\tconsole.error('Install a provider to get started:')\n\t\t\tconsole.error('')\n\t\t\tconsole.error(` ${installCmd}`)\n\t\t\tconsole.error('')\n\t\t\tconsole.error('Available providers:')\n\t\t\tconsole.error(' @kuckit/infra-gcp - Google Cloud Platform (Cloud Run, Cloud SQL, Redis)')\n\t\t\tconsole.error(' @kuckit/infra-aws - Amazon Web Services (coming soon)')\n\t\t\tconsole.error(' @kuckit/infra-azure - Microsoft Azure (coming soon)')\n\t\t\tprocess.exit(1)\n\t\t}\n\n\t\t// If multiple providers installed, could prompt user (future enhancement)\n\t\t// For now, default to first available (usually gcp)\n\t\tproviderId = installedProviders[0]!.id as SupportedProvider\n\t}\n\n\t// Get the provider package\n\tconst providerPackage = getProviderPackage(providerId)\n\n\t// Load the provider\n\tlet provider\n\ttry {\n\t\tprovider = await loadProviderFromPackage(providerPackage, projectRoot)\n\t} catch (error) {\n\t\tif (error instanceof ProviderNotInstalledError) {\n\t\t\tconsole.error(`Error: ${error.message}`)\n\t\t\tconsole.error('')\n\t\t\tconsole.error('Install the provider package:')\n\t\t\tconsole.error(` ${error.installCommand}`)\n\t\t\tprocess.exit(1)\n\t\t}\n\t\tif (error instanceof InvalidProviderError) {\n\t\t\tconsole.error(`Error: ${error.message}`)\n\t\t\tconsole.error('')\n\t\t\tconsole.error('This may be a corrupted or incompatible package version.')\n\t\t\tconsole.error('Try reinstalling the provider package.')\n\t\t\tprocess.exit(1)\n\t\t}\n\t\tconsole.error(`Error: ${error instanceof Error ? error.message : 'Failed to load provider'}`)\n\t\tprocess.exit(1)\n\t}\n\n\t// Check prerequisites\n\tconsole.log('Checking prerequisites...')\n\tconst prereqResult = await provider.checkPrerequisites()\n\tif (!prereqResult.ok) {\n\t\tconsole.error('\\nError: Missing required tools:')\n\t\tfor (const missing of prereqResult.missing) {\n\t\t\tconsole.error(` - ${missing.name}`)\n\t\t\tconsole.error(` Install from: ${missing.installUrl}`)\n\t\t}\n\t\tprocess.exit(1)\n\t}\n\n\t// Validate project structure (optional)\n\tif (provider.validateProject) {\n\t\tconst validation = await provider.validateProject(projectRoot)\n\t\tif (!validation.valid) {\n\t\t\tconsole.error('\\nError: Project validation failed:')\n\t\t\tfor (const issue of validation.issues.filter((i) => i.severity === 'error')) {\n\t\t\t\tconsole.error(` - ${issue.message}`)\n\t\t\t}\n\t\t\tprocess.exit(1)\n\t\t}\n\t\t// Show warnings but continue\n\t\tfor (const issue of validation.issues.filter((i) => i.severity === 'warning')) {\n\t\t\tconsole.warn(`Warning: ${issue.message}`)\n\t\t}\n\t}\n\n\t// Get provider-specific config via prompts\n\tconst prompts = await provider.getInitPrompts(existingConfig ?? undefined)\n\tconst responses: Record<string, unknown> = {}\n\n\t// Handle CLI options first (for non-interactive use)\n\tif (options.project && providerId === 'gcp') {\n\t\tresponses.gcpProject = options.project\n\t}\n\n\t// Ask remaining prompts\n\tfor (const prompt of prompts) {\n\t\tif (responses[prompt.name] !== undefined) continue\n\n\t\tif (prompt.type === 'input') {\n\t\t\tresponses[prompt.name] = await input({\n\t\t\t\tmessage: prompt.message,\n\t\t\t\tdefault: prompt.default as string | undefined,\n\t\t\t\tvalidate: prompt.validate,\n\t\t\t})\n\t\t} else if (prompt.type === 'select' && prompt.choices) {\n\t\t\tresponses[prompt.name] = await select({\n\t\t\t\tmessage: prompt.message,\n\t\t\t\tchoices: prompt.choices.map((c) => ({ value: c.value, name: c.label })),\n\t\t\t\tdefault: prompt.default as string | undefined,\n\t\t\t})\n\t\t} else if (prompt.type === 'confirm') {\n\t\t\tresponses[prompt.name] = await confirm({\n\t\t\t\tmessage: prompt.message,\n\t\t\t\tdefault: prompt.default as boolean | undefined,\n\t\t\t})\n\t\t}\n\t}\n\n\t// Get region\n\tlet region = options.region ?? existingConfig?.region ?? 'us-central1'\n\tif (!options.region && !existingConfig?.region) {\n\t\tregion = await input({\n\t\t\tmessage: 'Deployment region:',\n\t\t\tdefault: 'us-central1',\n\t\t})\n\t}\n\n\t// Get environment\n\tlet env = (options.env ?? existingConfig?.env ?? 'dev') as 'dev' | 'staging' | 'prod'\n\tif (!options.env && !existingConfig?.env) {\n\t\tenv = (await select({\n\t\t\tmessage: 'Environment:',\n\t\t\tchoices: [\n\t\t\t\t{ value: 'dev', name: 'Development' },\n\t\t\t\t{ value: 'staging', name: 'Staging' },\n\t\t\t\t{ value: 'prod', name: 'Production' },\n\t\t\t],\n\t\t\tdefault: 'dev',\n\t\t})) as 'dev' | 'staging' | 'prod'\n\t}\n\n\t// Build project name from package.json or directory name\n\tconst packageJsonPath = join(projectRoot, 'package.json')\n\tlet projectName = 'kuckit-app'\n\ttry {\n\t\tconst { readFile } = await import('fs/promises')\n\t\tconst packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'))\n\t\tprojectName = packageJson.name?.replace(/^@[^/]+\\//, '') ?? 'kuckit-app'\n\t} catch {\n\t\tprojectName = projectRoot.split('/').pop() ?? 'kuckit-app'\n\t}\n\n\t// Derive stack name\n\tconst gcpProject = (responses.gcpProject as string) ?? ''\n\tconst stackName = `${gcpProject}-${env}`\n\n\t// Show configuration summary\n\tconsole.log('\\nConfiguration:')\n\tconsole.log(` Provider: ${provider.label}`)\n\tfor (const [key, value] of Object.entries(responses)) {\n\t\tconsole.log(` ${key}: ${value}`)\n\t}\n\tconsole.log(` Region: ${region}`)\n\tconsole.log(` Environment: ${env}`)\n\tconsole.log(` Stack: ${stackName}`)\n\tconsole.log('')\n\n\t// Confirm unless --yes\n\tif (!options.yes) {\n\t\tconst proceed = await confirm({\n\t\t\tmessage: 'Proceed with infrastructure initialization?',\n\t\t\tdefault: true,\n\t\t})\n\n\t\tif (!proceed) {\n\t\t\tconsole.log('Aborted.')\n\t\t\tprocess.exit(0)\n\t\t}\n\t}\n\n\t// Generate Dockerfile if provider supports it and none exists\n\tconst dockerfilePath = join(projectRoot, 'Dockerfile')\n\tif (provider.generateDockerfile && !(await fileExists(dockerfilePath))) {\n\t\tconsole.log('\\nGenerating Dockerfile...')\n\t\tconst dockerfileContent = await provider.generateDockerfile(projectRoot)\n\t\tif (dockerfileContent) {\n\t\t\tconst { writeFile } = await import('fs/promises')\n\t\t\tawait writeFile(dockerfilePath, dockerfileContent, 'utf-8')\n\t\t\tconsole.log('Dockerfile created.')\n\t\t}\n\t}\n\n\t// Call provider init\n\tconsole.log('\\nInitializing infrastructure...')\n\tconsole.log('This may take several minutes.\\n')\n\n\tconst result = await provider.init({\n\t\tenv,\n\t\tregion,\n\t\tprojectRoot,\n\t\tyes: options.yes,\n\t\tproviderOptions: responses,\n\t})\n\n\tif (!result.success) {\n\t\tconsole.error(`\\nError: ${result.message}`)\n\t\tif (result.error) {\n\t\t\tconsole.error(` ${result.error.code}: ${result.error.message}`)\n\t\t}\n\t\tprocess.exit(1)\n\t}\n\n\t// Build and save config\n\tconst baseConfig = {\n\t\tenv,\n\t\tregion,\n\t\tprojectName,\n\t\tstackName,\n\t}\n\n\tconst newConfig = provider.buildConfig(responses, baseConfig)\n\n\t// Add outputs and timestamps\n\tconst fullConfig: StoredInfraConfig = {\n\t\t...newConfig,\n\t\tproviderPackage,\n\t\toutputs: result.outputs,\n\t\tcreatedAt: existingConfig?.createdAt ?? new Date().toISOString(),\n\t\tupdatedAt: new Date().toISOString(),\n\t} as StoredInfraConfig\n\n\tawait saveStoredConfig(projectRoot, fullConfig)\n\tconsole.log('\\nConfiguration saved to .kuckit/infra.json')\n\n\t// Print success message\n\tconsole.log('\\n' + '='.repeat(60))\n\tconsole.log('Infrastructure initialized successfully!')\n\tconsole.log('='.repeat(60))\n\n\tif (result.outputs) {\n\t\tconsole.log('\\nOutputs:')\n\t\tconst outputs = result.outputs as Record<string, unknown>\n\t\tif (outputs.registryUrl) console.log(` Registry: ${outputs.registryUrl}`)\n\t\tif (outputs.databaseConnectionName) console.log(` Database: ${outputs.databaseConnectionName}`)\n\t\tif (outputs.redisHost) console.log(` Redis: ${outputs.redisHost}`)\n\t}\n\n\tconsole.log('\\nNext steps:')\n\tconsole.log(' 1. Ensure you have a Dockerfile in your project root')\n\tconsole.log(` 2. Run: kuckit infra deploy --env ${env}`)\n\tconsole.log('')\n}\n","/**\n * kuckit infra deploy command\n *\n * Build and deploy application using the configured provider\n */\n\nimport { access, constants } from 'fs/promises'\nimport { join, dirname } from 'path'\nimport { confirm } from '@inquirer/prompts'\nimport {\n\tloadStoredConfig,\n\tsaveStoredConfig,\n\tloadProviderFromPackage,\n\tgetProviderPackage,\n\tProviderNotInstalledError,\n\tInvalidProviderError,\n} from './provider-loader.js'\nimport type { StoredInfraConfig } from './types.js'\nimport { isGcpConfig } from './types.js'\n\nexport interface DeployOptions {\n\t/** Environment (dev/prod) */\n\tenv?: string\n\t/** Preview changes without applying */\n\tpreview?: boolean\n\t/** Skip Docker build (use existing image) */\n\tskipBuild?: boolean\n\t/** Use specific image tag */\n\timage?: string\n\t/** Skip confirmation prompts */\n\tyes?: boolean\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path, constants.F_OK)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\nasync function findProjectRoot(cwd: string): Promise<string | null> {\n\tlet dir = cwd\n\twhile (dir !== dirname(dir)) {\n\t\tif (await fileExists(join(dir, 'package.json'))) {\n\t\t\treturn dir\n\t\t}\n\t\tdir = dirname(dir)\n\t}\n\treturn null\n}\n\nexport async function infraDeploy(options: DeployOptions): Promise<void> {\n\tconsole.log('Deploying kuckit application...\\n')\n\n\t// Find project root\n\tconst projectRoot = await findProjectRoot(process.cwd())\n\tif (!projectRoot) {\n\t\tconsole.error('Error: Could not find project root (no package.json found)')\n\t\tprocess.exit(1)\n\t}\n\n\t// Load config\n\tconst config = await loadStoredConfig(projectRoot)\n\tif (!config) {\n\t\tconsole.error('Error: No infrastructure configuration found.')\n\t\tconsole.error('Run: kuckit infra init')\n\t\tprocess.exit(1)\n\t}\n\n\t// Get environment from options or config\n\tconst env = options.env ?? config.env\n\tif (env !== 'dev' && env !== 'staging' && env !== 'prod') {\n\t\tconsole.error(`Error: Invalid environment '${env}'. Must be 'dev', 'staging', or 'prod'.`)\n\t\tprocess.exit(1)\n\t}\n\n\t// Load the provider\n\tconst providerPackage = config.providerPackage ?? getProviderPackage(config.provider)\n\tlet provider\n\ttry {\n\t\tprovider = await loadProviderFromPackage(providerPackage, projectRoot)\n\t} catch (error) {\n\t\tif (error instanceof ProviderNotInstalledError) {\n\t\t\tconsole.error(`Error: ${error.message}`)\n\t\t\tconsole.error('')\n\t\t\tconsole.error('Install the provider package:')\n\t\t\tconsole.error(` ${error.installCommand}`)\n\t\t\tprocess.exit(1)\n\t\t}\n\t\tif (error instanceof InvalidProviderError) {\n\t\t\tconsole.error(`Error: ${error.message}`)\n\t\t\tconsole.error('')\n\t\t\tconsole.error('This may be a corrupted or incompatible package version.')\n\t\t\tconsole.error('Try reinstalling the provider package.')\n\t\t\tprocess.exit(1)\n\t\t}\n\t\tconsole.error(`Error: ${error instanceof Error ? error.message : 'Failed to load provider'}`)\n\t\tprocess.exit(1)\n\t}\n\n\t// Check prerequisites\n\tconst prereqResult = await provider.checkPrerequisites()\n\tif (!prereqResult.ok) {\n\t\tconsole.error('\\nError: Missing required tools:')\n\t\tfor (const missing of prereqResult.missing) {\n\t\t\tconsole.error(` - ${missing.name}`)\n\t\t\tconsole.error(` Install from: ${missing.installUrl}`)\n\t\t}\n\t\tprocess.exit(1)\n\t}\n\n\t// Check for Dockerfile (unless skipping build or using existing image)\n\tconst dockerfilePath = join(projectRoot, 'Dockerfile')\n\tif (!options.skipBuild && !options.image && !(await fileExists(dockerfilePath))) {\n\t\t// Try to generate Dockerfile if provider supports it\n\t\tif (provider.generateDockerfile) {\n\t\t\tconsole.log('Generating Dockerfile...')\n\t\t\tconst dockerfileContent = await provider.generateDockerfile(projectRoot)\n\t\t\tif (dockerfileContent) {\n\t\t\t\tconst { writeFile } = await import('fs/promises')\n\t\t\t\tawait writeFile(dockerfilePath, dockerfileContent, 'utf-8')\n\t\t\t\tconsole.log('Dockerfile created.\\n')\n\t\t\t} else {\n\t\t\t\tconsole.error('Error: Dockerfile not found in project root.')\n\t\t\t\tconsole.error('Create a Dockerfile or use --skip-build with an existing image.')\n\t\t\t\tprocess.exit(1)\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.error('Error: Dockerfile not found in project root.')\n\t\t\tconsole.error('Create a Dockerfile or use --skip-build with an existing image.')\n\t\t\tprocess.exit(1)\n\t\t}\n\t}\n\n\t// Ensure we have registry URL from init\n\tif (!config.outputs?.registryUrl) {\n\t\tconsole.error('Error: No registry URL found in configuration.')\n\t\tconsole.error('Run: kuckit infra init')\n\t\tprocess.exit(1)\n\t}\n\n\t// Get provider-specific display info\n\tlet projectDisplay = config.projectName\n\tif (isGcpConfig(config)) {\n\t\tprojectDisplay = config.providerConfig.gcpProject\n\t}\n\n\tconsole.log('Configuration:')\n\tconsole.log(` Provider: ${provider.label}`)\n\tconsole.log(` Project: ${projectDisplay}`)\n\tconsole.log(` Region: ${config.region}`)\n\tconsole.log(` Environment: ${env}`)\n\tconsole.log(` Registry: ${config.outputs.registryUrl}`)\n\n\tif (options.preview) {\n\t\tconsole.log(' Mode: Preview (no changes will be applied)')\n\t}\n\tconsole.log('')\n\n\t// Confirm unless --yes or --preview\n\tif (!options.yes && !options.preview) {\n\t\tconst proceed = await confirm({\n\t\t\tmessage: 'Proceed with deployment?',\n\t\t\tdefault: true,\n\t\t})\n\n\t\tif (!proceed) {\n\t\t\tconsole.log('Aborted.')\n\t\t\tprocess.exit(0)\n\t\t}\n\t}\n\n\t// Call provider deploy\n\tconst result = await provider.deploy(\n\t\t{\n\t\t\tenv,\n\t\t\tprojectRoot,\n\t\t\tpreview: options.preview,\n\t\t\tskipBuild: options.skipBuild,\n\t\t\timage: options.image,\n\t\t\tyes: options.yes,\n\t\t},\n\t\tconfig as Parameters<typeof provider.deploy>[1]\n\t)\n\n\tif (!result.success) {\n\t\tconsole.error(`\\nError: ${result.message}`)\n\t\tif (result.error) {\n\t\t\tconsole.error(` ${result.error.code}: ${result.error.message}`)\n\t\t}\n\t\tprocess.exit(1)\n\t}\n\n\t// Update config with new outputs if not preview\n\tif (!options.preview && result.outputs) {\n\t\tconst updatedConfig: StoredInfraConfig = {\n\t\t\t...config,\n\t\t\toutputs: result.outputs as unknown as StoredInfraConfig['outputs'],\n\t\t\tupdatedAt: new Date().toISOString(),\n\t\t}\n\t\tawait saveStoredConfig(projectRoot, updatedConfig)\n\t}\n\n\t// Print success message\n\tif (!options.preview) {\n\t\tconsole.log('\\n' + '='.repeat(60))\n\t\tconsole.log('Deployment successful!')\n\t\tconsole.log('='.repeat(60))\n\n\t\tif (result.outputs) {\n\t\t\tconst outputs = result.outputs as Record<string, unknown>\n\t\t\tif (outputs.serviceUrl) {\n\t\t\t\tconsole.log(`\\nService URL: ${outputs.serviceUrl}`)\n\t\t\t}\n\t\t\tif (outputs.migrationJobName) {\n\t\t\t\tconsole.log(`Migration Job: ${outputs.migrationJobName}`)\n\t\t\t}\n\n\t\t\t// Print custom domain information if configured\n\t\t\tif (outputs.customDomain) {\n\t\t\t\tconsole.log(`\\nCustom Domain: ${outputs.customDomain}`)\n\t\t\t\tconsole.log(`Status: ${outputs.customDomainStatus ?? 'UNKNOWN'}`)\n\n\t\t\t\t// Print DNS records if available\n\t\t\t\tconst records = outputs.customDomainRecords as\n\t\t\t\t\t| Array<{\n\t\t\t\t\t\t\ttype: string\n\t\t\t\t\t\t\tname: string\n\t\t\t\t\t\t\trrdata: string\n\t\t\t\t\t }>\n\t\t\t\t\t| undefined\n\t\t\t\tif (records && records.length > 0) {\n\t\t\t\t\tconsole.log('\\nRequired DNS Records:')\n\t\t\t\t\tfor (const record of records) {\n\t\t\t\t\t\tconsole.log(` ${record.type} ${record.name} → ${record.rrdata}`)\n\t\t\t\t\t}\n\t\t\t\t\tconsole.log('\\nNote: If using Cloudflare:')\n\t\t\t\t\tconsole.log(' 1. Set DNS records to DNS-only (gray cloud) until status is READY')\n\t\t\t\t\tconsole.log(' 2. Certificate provisioning can take 15-60 minutes')\n\t\t\t\t\tconsole.log(' 3. Once READY, you can enable Cloudflare proxy (orange cloud)')\n\t\t\t\t\tconsole.log(' 4. Ensure Cloudflare SSL mode is set to \"Full (strict)\"')\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconsole.log('\\nUseful commands:')\n\t\tconsole.log(` View logs: kuckit infra logs --env ${env}`)\n\t\tconsole.log(` Check status: kuckit infra status --env ${env}`)\n\t\tconsole.log(` Run migrations: kuckit infra db:migrate --env ${env}`)\n\t\tconsole.log('')\n\t} else {\n\t\tconsole.log('\\nPreview complete. No changes were applied.')\n\t\tconsole.log('Run without --preview to apply changes.')\n\t}\n}\n","/**\n * kuckit infra up command\n *\n * One-command deployment: if no .kuckit/infra.json exists, run init then deploy.\n * If config exists, just deploy. This is the primary DX for new users.\n */\n\nimport { access, constants } from 'fs/promises'\nimport { join, dirname } from 'path'\nimport { confirm } from '@inquirer/prompts'\nimport {\n\tloadStoredConfig,\n\tgetProviderPackage,\n\tloadProviderFromPackage,\n\tProviderNotInstalledError,\n} from './provider-loader.js'\nimport { infraInit, type InitOptions } from './init.js'\nimport { infraDeploy, type DeployOptions } from './deploy.js'\n\nexport interface UpOptions {\n\t/** Cloud provider (gcp, aws, azure) */\n\tprovider?: string\n\t/** GCP project ID (for GCP provider) */\n\tproject?: string\n\t/** Deployment region */\n\tregion?: string\n\t/** Environment (dev/prod) */\n\tenv?: string\n\t/** Preview changes without applying */\n\tpreview?: boolean\n\t/** Skip confirmation prompts */\n\tyes?: boolean\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path, constants.F_OK)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\nasync function findProjectRoot(cwd: string): Promise<string | null> {\n\tlet dir = cwd\n\twhile (dir !== dirname(dir)) {\n\t\tif (await fileExists(join(dir, 'package.json'))) {\n\t\t\treturn dir\n\t\t}\n\t\tdir = dirname(dir)\n\t}\n\treturn null\n}\n\nexport async function infraUp(options: UpOptions): Promise<void> {\n\tconsole.log('🚀 Kuckit Infrastructure Up\\n')\n\n\t// Find project root\n\tconst projectRoot = await findProjectRoot(process.cwd())\n\tif (!projectRoot) {\n\t\tconsole.error('Error: Could not find project root (no package.json found)')\n\t\tprocess.exit(1)\n\t}\n\n\t// Check if already initialized\n\tconst existingConfig = await loadStoredConfig(projectRoot)\n\n\tif (!existingConfig) {\n\t\t// First run - need to initialize\n\t\t// Check provider availability first (before asking for confirmation)\n\t\tconst requestedProvider = options.provider ?? 'gcp'\n\t\tconst providerPackage = getProviderPackage(requestedProvider)\n\n\t\tlet providerLabel = 'cloud'\n\t\ttry {\n\t\t\tconst provider = await loadProviderFromPackage(providerPackage, projectRoot)\n\t\t\tproviderLabel = provider.label\n\t\t} catch (error) {\n\t\t\tif (error instanceof ProviderNotInstalledError) {\n\t\t\t\tconsole.error(`Error: ${error.message}`)\n\t\t\t\tconsole.error('')\n\t\t\t\tconsole.error('Install the provider package first:')\n\t\t\t\tconsole.error(` ${error.installCommand}`)\n\t\t\t\tconsole.error('')\n\t\t\t\tconsole.error('Then run this command again.')\n\t\t\t\tprocess.exit(1)\n\t\t\t}\n\t\t\t// For other errors, let init handle them\n\t\t}\n\n\t\tconsole.log('No infrastructure configuration found. Starting initialization...\\n')\n\n\t\tif (!options.yes) {\n\t\t\tconst proceed = await confirm({\n\t\t\t\tmessage: `This will create ${providerLabel} infrastructure (VPC, Database, Redis, Registry). Continue?`,\n\t\t\t\tdefault: true,\n\t\t\t})\n\n\t\t\tif (!proceed) {\n\t\t\t\tconsole.log('Aborted.')\n\t\t\t\tprocess.exit(0)\n\t\t\t}\n\t\t}\n\n\t\t// Run init with the provided options\n\t\tconst initOptions: InitOptions = {\n\t\t\tprovider: options.provider,\n\t\t\tproject: options.project,\n\t\t\tregion: options.region,\n\t\t\tenv: options.env,\n\t\t\tyes: options.yes,\n\t\t}\n\n\t\tawait infraInit(initOptions)\n\n\t\t// After init, reload config\n\t\tconst newConfig = await loadStoredConfig(projectRoot)\n\t\tif (!newConfig) {\n\t\t\tconsole.error('Error: Initialization completed but no configuration found.')\n\t\t\tprocess.exit(1)\n\t\t}\n\n\t\tconsole.log('\\n' + '─'.repeat(60) + '\\n')\n\t\tconsole.log('Infrastructure initialized! Proceeding to deployment...\\n')\n\t} else {\n\t\tconsole.log(`Using existing configuration for ${existingConfig.env} environment.`)\n\t\tconsole.log(`Provider: ${existingConfig.provider}`)\n\t\tconsole.log(`Region: ${existingConfig.region}\\n`)\n\t}\n\n\t// Run deploy\n\tconst deployOptions: DeployOptions = {\n\t\tenv: options.env ?? existingConfig?.env ?? 'dev',\n\t\tpreview: options.preview,\n\t\tyes: options.yes,\n\t}\n\n\tawait infraDeploy(deployOptions)\n\n\t// Print success summary\n\tconsole.log('\\n' + '═'.repeat(60))\n\tconsole.log('✅ Infrastructure up and running!')\n\tconsole.log('═'.repeat(60))\n\tconsole.log('\\nUseful commands:')\n\tconsole.log(` kuckit infra status - Check current status`)\n\tconsole.log(` kuckit infra logs - View application logs`)\n\tconsole.log(` kuckit infra outputs - Show service URLs and secrets`)\n\tconsole.log('')\n}\n","/**\n * kuckit infra eject command\n *\n * Eject provider infrastructure code to local project for customization.\n * Copies Pulumi code from node_modules to a local directory.\n */\n\nimport { access, constants } from 'fs/promises'\nimport { join, dirname } from 'path'\nimport { confirm } from '@inquirer/prompts'\nimport {\n\tloadStoredConfig,\n\tsaveStoredConfig,\n\tloadProviderFromPackage,\n\tgetProviderPackage,\n\tProviderNotInstalledError,\n\tInvalidProviderError,\n} from './provider-loader.js'\n\nexport interface EjectOptions {\n\t/** Target directory for ejected code (default: infra) */\n\tdir?: string\n\t/** Skip confirmation prompts */\n\tforce?: boolean\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path, constants.F_OK)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\nasync function findProjectRoot(cwd: string): Promise<string | null> {\n\tlet dir = cwd\n\twhile (dir !== dirname(dir)) {\n\t\tif (await fileExists(join(dir, 'package.json'))) {\n\t\t\treturn dir\n\t\t}\n\t\tdir = dirname(dir)\n\t}\n\treturn null\n}\n\nexport async function infraEject(options: EjectOptions): Promise<void> {\n\tconsole.log('Ejecting infrastructure code...\\n')\n\n\t// Find project root\n\tconst projectRoot = await findProjectRoot(process.cwd())\n\tif (!projectRoot) {\n\t\tconsole.error('Error: Could not find project root (no package.json found)')\n\t\tprocess.exit(1)\n\t}\n\n\t// Load config\n\tconst config = await loadStoredConfig(projectRoot)\n\tif (!config) {\n\t\tconsole.error('Error: No infrastructure configuration found.')\n\t\tconsole.error('Run: kuckit infra init')\n\t\tprocess.exit(1)\n\t}\n\n\t// Check if already ejected\n\tif (config.localInfraDir) {\n\t\tconsole.error(`Error: Infrastructure already ejected to ${config.localInfraDir}`)\n\t\tconsole.error('Remove localInfraDir from .kuckit/infra.json to re-eject.')\n\t\tprocess.exit(1)\n\t}\n\n\t// Load the provider\n\tconst providerPackage = config.providerPackage ?? getProviderPackage(config.provider)\n\tlet provider\n\ttry {\n\t\tprovider = await loadProviderFromPackage(providerPackage, projectRoot)\n\t} catch (error) {\n\t\tif (error instanceof ProviderNotInstalledError) {\n\t\t\tconsole.error(`Error: ${error.message}`)\n\t\t\tconsole.error('')\n\t\t\tconsole.error('Install the provider package:')\n\t\t\tconsole.error(` ${error.installCommand}`)\n\t\t\tprocess.exit(1)\n\t\t}\n\t\tif (error instanceof InvalidProviderError) {\n\t\t\tconsole.error(`Error: ${error.message}`)\n\t\t\tprocess.exit(1)\n\t\t}\n\t\tconsole.error(`Error: ${error instanceof Error ? error.message : 'Failed to load provider'}`)\n\t\tprocess.exit(1)\n\t}\n\n\t// Check if provider supports eject\n\tif (!provider.eject) {\n\t\tconsole.error(`Error: Provider '${provider.id}' does not support ejecting.`)\n\t\tprocess.exit(1)\n\t}\n\n\t// Determine target directory\n\tconst targetDir = options.dir ?? 'infra'\n\tconst absoluteTargetDir = join(projectRoot, targetDir)\n\n\t// Check if target directory exists\n\tif (await fileExists(absoluteTargetDir)) {\n\t\tif (!options.force) {\n\t\t\tconsole.error(`Error: Directory '${targetDir}' already exists.`)\n\t\t\tconsole.error('Use --force to overwrite, or specify a different directory with --dir.')\n\t\t\tprocess.exit(1)\n\t\t}\n\t}\n\n\tconsole.log('Configuration:')\n\tconsole.log(` Provider: ${provider.label}`)\n\tconsole.log(` Target directory: ${targetDir}`)\n\tconsole.log('')\n\n\t// Confirm unless --force\n\tif (!options.force) {\n\t\tconsole.log('This will:')\n\t\tconsole.log(` 1. Copy provider Pulumi code to ${targetDir}/`)\n\t\tconsole.log(' 2. Update .kuckit/infra.json to use local infrastructure')\n\t\tconsole.log(' 3. Future deployments will use your local copy')\n\t\tconsole.log('')\n\n\t\tconst proceed = await confirm({\n\t\t\tmessage: 'Proceed with eject?',\n\t\t\tdefault: true,\n\t\t})\n\n\t\tif (!proceed) {\n\t\t\tconsole.log('Aborted.')\n\t\t\tprocess.exit(0)\n\t\t}\n\t}\n\n\t// Call provider eject\n\tconst result = await provider.eject({\n\t\ttargetDir: absoluteTargetDir,\n\t\tprojectRoot,\n\t\tforce: options.force,\n\t})\n\n\tif (!result.success) {\n\t\tconsole.error(`\\nError: ${result.message}`)\n\t\tif (result.error) {\n\t\t\tconsole.error(` ${result.error.code}: ${result.error.message}`)\n\t\t}\n\t\tprocess.exit(1)\n\t}\n\n\t// Update config with local infra directory\n\tconst updatedConfig = {\n\t\t...config,\n\t\tlocalInfraDir: targetDir,\n\t\tupdatedAt: new Date().toISOString(),\n\t}\n\tawait saveStoredConfig(projectRoot, updatedConfig)\n\n\t// Print success message\n\tconsole.log('\\n' + '='.repeat(60))\n\tconsole.log('Infrastructure ejected successfully!')\n\tconsole.log('='.repeat(60))\n\n\tconsole.log(`\\nYour infrastructure code is now in: ${targetDir}/`)\n\tconsole.log('')\n\tconsole.log('Next steps:')\n\tconsole.log(` 1. Review and customize the Pulumi code in ${targetDir}/`)\n\tconsole.log(' 2. Install Pulumi dependencies: cd ' + targetDir + ' && bun install')\n\tconsole.log(' 3. Deploy with: kuckit infra deploy')\n\tconsole.log('')\n\tconsole.log('The CLI will now use your local infrastructure instead of the provider package.')\n\tconsole.log('')\n}\n","/**\n * Pulumi and gcloud subprocess runner\n *\n * Spawns Pulumi and gcloud CLIs as subprocesses.\n * This pattern is used because:\n * - kuckit CLI uses Bun runtime\n * - Pulumi SDK has compatibility issues with Bun\n * - Same pattern as SST v3\n */\n\nimport { spawn } from 'child_process'\nimport { join } from 'path'\n\nexport interface RunPulumiOptions {\n\t/** Working directory (packages/infra) */\n\tcwd: string\n\t/** Stream output to console */\n\tstream?: boolean\n\t/** Additional environment variables */\n\tenv?: Record<string, string>\n}\n\nexport interface PulumiResult {\n\t/** Exit code */\n\tcode: number\n\t/** Standard output */\n\tstdout: string\n\t/** Standard error */\n\tstderr: string\n}\n\nexport interface PulumiOutputs {\n\t[key: string]: unknown\n}\n\n/**\n * Run a Pulumi CLI command\n */\nexport function runPulumi(args: string[], options: RunPulumiOptions): Promise<PulumiResult> {\n\treturn new Promise((resolve) => {\n\t\tconst proc = spawn('pulumi', args, {\n\t\t\tcwd: options.cwd,\n\t\t\tstdio: options.stream ? ['inherit', 'pipe', 'pipe'] : ['pipe', 'pipe', 'pipe'],\n\t\t\tshell: true,\n\t\t\tenv: {\n\t\t\t\t...process.env,\n\t\t\t\t...options.env,\n\t\t\t\tPULUMI_SKIP_UPDATE_CHECK: 'true',\n\t\t\t},\n\t\t})\n\n\t\tlet stdout = ''\n\t\tlet stderr = ''\n\n\t\tproc.stdout?.on('data', (data) => {\n\t\t\tconst str = data.toString()\n\t\t\tstdout += str\n\t\t\tif (options.stream) {\n\t\t\t\tprocess.stdout.write(data)\n\t\t\t}\n\t\t})\n\n\t\tproc.stderr?.on('data', (data) => {\n\t\t\tconst str = data.toString()\n\t\t\tstderr += str\n\t\t\tif (options.stream) {\n\t\t\t\tprocess.stderr.write(data)\n\t\t\t}\n\t\t})\n\n\t\tproc.on('close', (code) => {\n\t\t\tresolve({ code: code ?? 1, stdout, stderr })\n\t\t})\n\t})\n}\n\n/**\n * Run pulumi stack output --json and parse the result\n */\nexport async function getPulumiOutputs(options: RunPulumiOptions): Promise<PulumiOutputs | null> {\n\tconst result = await runPulumi(['stack', 'output', '--json'], options)\n\n\tif (result.code !== 0) {\n\t\treturn null\n\t}\n\n\ttry {\n\t\treturn JSON.parse(result.stdout)\n\t} catch {\n\t\treturn null\n\t}\n}\n\n/**\n * Stack information from pulumi stack --json\n */\nexport interface PulumiStackInfo {\n\tname: string\n\tcurrent: boolean\n\tupdateInProgress: boolean\n\tresourceCount: number\n\tlastUpdate?: string\n\turl?: string\n}\n\n/**\n * Run pulumi stack --json and parse the result\n */\nexport async function getPulumiStackInfo(\n\toptions: RunPulumiOptions\n): Promise<PulumiStackInfo | null> {\n\tconst result = await runPulumi(['stack', '--json'], options)\n\n\tif (result.code !== 0) {\n\t\treturn null\n\t}\n\n\ttry {\n\t\tconst data = JSON.parse(result.stdout)\n\t\treturn {\n\t\t\tname: data.name ?? '',\n\t\t\tcurrent: data.current ?? false,\n\t\t\tupdateInProgress: data.updateInProgress ?? false,\n\t\t\tresourceCount: data.resourceCount ?? 0,\n\t\t\tlastUpdate: data.lastUpdate,\n\t\t\turl: data.url,\n\t\t}\n\t} catch {\n\t\treturn null\n\t}\n}\n\n/**\n * Stack history entry\n */\nexport interface PulumiHistoryEntry {\n\tversion: number\n\tstartTime: string\n\tendTime: string\n\tresult: 'succeeded' | 'failed' | 'in-progress'\n\tresourceChanges?: {\n\t\tcreate?: number\n\t\tupdate?: number\n\t\tdelete?: number\n\t\tsame?: number\n\t}\n}\n\n/**\n * Run pulumi stack history --json and parse the result\n */\nexport async function getPulumiStackHistory(\n\toptions: RunPulumiOptions,\n\tlimit: number = 5\n): Promise<PulumiHistoryEntry[]> {\n\tconst result = await runPulumi(['stack', 'history', '--json', '--show-secrets=false'], options)\n\n\tif (result.code !== 0) {\n\t\treturn []\n\t}\n\n\ttry {\n\t\tconst data = JSON.parse(result.stdout)\n\t\tif (!Array.isArray(data)) return []\n\t\treturn data.slice(0, limit).map((entry: Record<string, unknown>) => ({\n\t\t\tversion: (entry.version as number) ?? 0,\n\t\t\tstartTime: (entry.startTime as string) ?? '',\n\t\t\tendTime: (entry.endTime as string) ?? '',\n\t\t\tresult: (entry.result as 'succeeded' | 'failed' | 'in-progress') ?? 'failed',\n\t\t\tresourceChanges: entry.resourceChanges as PulumiHistoryEntry['resourceChanges'],\n\t\t}))\n\t} catch {\n\t\treturn []\n\t}\n}\n\n/**\n * Select or create a Pulumi stack\n */\nexport async function selectOrCreateStack(\n\tstackName: string,\n\toptions: RunPulumiOptions\n): Promise<boolean> {\n\t// Try to select existing stack\n\tconst selectResult = await runPulumi(['stack', 'select', stackName], options)\n\n\tif (selectResult.code === 0) {\n\t\treturn true\n\t}\n\n\t// Create new stack\n\tconst createResult = await runPulumi(['stack', 'init', stackName], options)\n\n\treturn createResult.code === 0\n}\n\n/**\n * Set a Pulumi config value\n */\nexport async function setPulumiConfig(\n\tkey: string,\n\tvalue: string,\n\toptions: RunPulumiOptions\n): Promise<boolean> {\n\tconst result = await runPulumi(['config', 'set', key, value], options)\n\treturn result.code === 0\n}\n\n/**\n * Run pulumi up with optional preview mode\n */\nexport async function pulumiUp(\n\toptions: RunPulumiOptions & { preview?: boolean }\n): Promise<PulumiResult> {\n\tconst args = options.preview ? ['preview'] : ['up', '--yes']\n\treturn runPulumi(args, { ...options, stream: true })\n}\n\n/**\n * Run pulumi destroy\n */\nexport async function pulumiDestroy(\n\toptions: RunPulumiOptions & { force?: boolean }\n): Promise<PulumiResult> {\n\tconst args = options.force ? ['destroy', '--yes', '-f'] : ['destroy', '--yes']\n\treturn runPulumi(args, { ...options, stream: true })\n}\n\n/**\n * Run pulumi cancel to cancel stuck operations\n */\nexport async function pulumiCancel(options: RunPulumiOptions): Promise<PulumiResult> {\n\treturn runPulumi(['cancel', '--yes'], options)\n}\n\n/**\n * Run pulumi refresh to sync state with cloud provider\n */\nexport async function pulumiRefresh(options: RunPulumiOptions): Promise<PulumiResult> {\n\treturn runPulumi(['refresh', '--yes'], { ...options, stream: true })\n}\n\n/**\n * Export Pulumi stack state to a file\n */\nexport async function pulumiStackExport(\n\tfilePath: string,\n\toptions: RunPulumiOptions\n): Promise<PulumiResult> {\n\treturn runPulumi(['stack', 'export', '--file', filePath], options)\n}\n\nexport interface RunGcloudOptions {\n\t/** Stream output to console */\n\tstream?: boolean\n\t/** Working directory */\n\tcwd?: string\n}\n\nexport interface GcloudResult {\n\t/** Exit code */\n\tcode: number\n\t/** Standard output */\n\tstdout: string\n\t/** Standard error */\n\tstderr: string\n}\n\n/**\n * Run a gcloud CLI command\n */\nexport function runGcloud(args: string[], options: RunGcloudOptions = {}): Promise<GcloudResult> {\n\treturn new Promise((resolve) => {\n\t\tconst proc = spawn('gcloud', args, {\n\t\t\tcwd: options.cwd ?? process.cwd(),\n\t\t\tstdio: options.stream ? ['inherit', 'pipe', 'pipe'] : ['pipe', 'pipe', 'pipe'],\n\t\t\tshell: true,\n\t\t})\n\n\t\tlet stdout = ''\n\t\tlet stderr = ''\n\n\t\tproc.stdout?.on('data', (data) => {\n\t\t\tconst str = data.toString()\n\t\t\tstdout += str\n\t\t\tif (options.stream) {\n\t\t\t\tprocess.stdout.write(data)\n\t\t\t}\n\t\t})\n\n\t\tproc.stderr?.on('data', (data) => {\n\t\t\tconst str = data.toString()\n\t\t\tstderr += str\n\t\t\tif (options.stream) {\n\t\t\t\tprocess.stderr.write(data)\n\t\t\t}\n\t\t})\n\n\t\tproc.on('close', (code) => {\n\t\t\tresolve({ code: code ?? 1, stdout, stderr })\n\t\t})\n\t})\n}\n\nexport interface BuildAndPushOptions {\n\t/** GCP project ID */\n\tproject: string\n\t/** Artifact Registry URL (without tag) */\n\tregistryUrl: string\n\t/** Image tag (default: git SHA or 'latest') */\n\ttag?: string\n\t/** Dockerfile path (default: Dockerfile) */\n\tdockerfile?: string\n\t/** Working directory (project root) */\n\tcwd: string\n}\n\n/**\n * Build and push Docker image using Cloud Build\n * No local Docker daemon required!\n */\nexport async function buildAndPushImage(\n\toptions: BuildAndPushOptions\n): Promise<{ code: number; imageUrl: string }> {\n\tconst tag = options.tag ?? process.env.GIT_SHA ?? 'latest'\n\t// Artifact Registry format: HOST/PROJECT/REPOSITORY/IMAGE:TAG\n\tconst imageUrl = `${options.registryUrl}/kuckit:${tag}`\n\n\tconsole.log(`Building image: ${imageUrl}`)\n\n\tconst args = ['builds', 'submit', '--tag', imageUrl, '--project', options.project]\n\n\tif (options.dockerfile && options.dockerfile !== 'Dockerfile') {\n\t\targs.push('--config', options.dockerfile)\n\t}\n\n\tconst result = await runGcloud(args, {\n\t\tstream: true,\n\t\tcwd: options.cwd,\n\t})\n\n\treturn {\n\t\tcode: result.code,\n\t\timageUrl,\n\t}\n}\n\n/**\n * Get the path to the packages/infra directory\n */\nexport function getInfraDir(projectRoot: string): string {\n\treturn join(projectRoot, 'packages', 'infra')\n}\n\n/**\n * Check if Pulumi CLI is installed\n */\nexport async function checkPulumiInstalled(): Promise<boolean> {\n\ttry {\n\t\tconst result = await runPulumi(['version'], { cwd: process.cwd() })\n\t\treturn result.code === 0\n\t} catch {\n\t\treturn false\n\t}\n}\n\n/**\n * Check if gcloud CLI is installed\n */\nexport async function checkGcloudInstalled(): Promise<boolean> {\n\ttry {\n\t\tconst result = await runGcloud(['version'])\n\t\treturn result.code === 0\n\t} catch {\n\t\treturn false\n\t}\n}\n\n/**\n * Cloud Run revision information\n */\nexport interface CloudRunRevision {\n\t/** Revision name (e.g., app-00001) */\n\tname: string\n\t/** Creation timestamp */\n\tcreateTime: string\n\t/** Whether this revision is currently serving traffic */\n\tactive: boolean\n\t/** Traffic percentage (0-100) */\n\ttrafficPercent: number\n}\n\n/**\n * List Cloud Run service revisions\n */\nexport async function listCloudRunRevisions(\n\tserviceName: string,\n\tproject: string,\n\tregion: string\n): Promise<CloudRunRevision[]> {\n\t// Get revisions list\n\tconst revisionsResult = await runGcloud([\n\t\t'run',\n\t\t'revisions',\n\t\t'list',\n\t\t'--service',\n\t\tserviceName,\n\t\t'--project',\n\t\tproject,\n\t\t'--region',\n\t\tregion,\n\t\t'--format',\n\t\t'json',\n\t])\n\n\tif (revisionsResult.code !== 0) {\n\t\treturn []\n\t}\n\n\t// Get current traffic allocation\n\tconst trafficResult = await runGcloud([\n\t\t'run',\n\t\t'services',\n\t\t'describe',\n\t\tserviceName,\n\t\t'--project',\n\t\tproject,\n\t\t'--region',\n\t\tregion,\n\t\t'--format',\n\t\t'json',\n\t])\n\n\tconst trafficMap: Record<string, number> = {}\n\tif (trafficResult.code === 0) {\n\t\ttry {\n\t\t\tconst serviceInfo = JSON.parse(trafficResult.stdout)\n\t\t\tconst traffic = serviceInfo.status?.traffic ?? []\n\t\t\tfor (const t of traffic) {\n\t\t\t\tif (t.revisionName && t.percent) {\n\t\t\t\t\ttrafficMap[t.revisionName] = t.percent\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore parsing errors\n\t\t}\n\t}\n\n\ttry {\n\t\tconst revisions = JSON.parse(revisionsResult.stdout)\n\t\treturn revisions.map((rev: { metadata?: { name?: string; creationTimestamp?: string } }) => {\n\t\t\tconst name = rev.metadata?.name ?? ''\n\t\t\tconst trafficPercent = trafficMap[name] ?? 0\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tcreateTime: rev.metadata?.creationTimestamp ?? '',\n\t\t\t\tactive: trafficPercent > 0,\n\t\t\t\ttrafficPercent,\n\t\t\t}\n\t\t})\n\t} catch {\n\t\treturn []\n\t}\n}\n\n/**\n * Update Cloud Run traffic routing to a specific revision\n */\nexport async function updateCloudRunTraffic(\n\tserviceName: string,\n\trevisionName: string,\n\tproject: string,\n\tregion: string\n): Promise<GcloudResult> {\n\treturn runGcloud(\n\t\t[\n\t\t\t'run',\n\t\t\t'services',\n\t\t\t'update-traffic',\n\t\t\tserviceName,\n\t\t\t'--to-revisions',\n\t\t\t`${revisionName}=100`,\n\t\t\t'--project',\n\t\t\tproject,\n\t\t\t'--region',\n\t\t\tregion,\n\t\t],\n\t\t{ stream: true }\n\t)\n}\n\n/**\n * Extract service name from Cloud Run URL\n * e.g., https://myapp-abc123-uc.a.run.app -> myapp\n */\nexport function extractServiceNameFromUrl(url: string): string | null {\n\ttry {\n\t\tconst hostname = new URL(url).hostname\n\t\t// Format: <service>-<hash>-<region>.a.run.app\n\t\tconst match = hostname.match(/^([^-]+(?:-[^-]+)*?)-[a-z0-9]+-[a-z]+\\.a\\.run\\.app$/)\n\t\tif (match) {\n\t\t\treturn match[1]\n\t\t}\n\t\t// Fallback: just take the first segment before the hash\n\t\tconst parts = hostname.split('-')\n\t\tif (parts.length >= 3) {\n\t\t\t// Remove last two parts (hash and region.a.run.app)\n\t\t\treturn parts.slice(0, -2).join('-')\n\t\t}\n\t\treturn null\n\t} catch {\n\t\treturn null\n\t}\n}\n","/**\n * Error parsing for Pulumi and infrastructure operations\n */\n\n/**\n * Types of errors that can occur during infrastructure operations\n */\nexport enum PulumiErrorType {\n\t/** Another update is already in progress */\n\tConcurrentUpdate = 'CONCURRENT_UPDATE',\n\t/** Resource already exists */\n\tResourceConflict = 'RESOURCE_CONFLICT',\n\t/** GCP quota exceeded */\n\tQuotaExceeded = 'QUOTA_EXCEEDED',\n\t/** Permission denied (IAM issues) */\n\tPermissionDenied = 'PERMISSION_DENIED',\n\t/** State corruption or pending operations */\n\tStateCorruption = 'STATE_CORRUPTION',\n\t/** Network or transient failure */\n\tNetworkError = 'NETWORK_ERROR',\n\t/** Resource not found */\n\tResourceNotFound = 'RESOURCE_NOT_FOUND',\n\t/** Invalid configuration */\n\tInvalidConfig = 'INVALID_CONFIG',\n\t/** Unknown error */\n\tUnknown = 'UNKNOWN',\n}\n\n/**\n * Parsed error with type, message, and actionable suggestion\n */\nexport interface ParsedError {\n\t/** Error type for categorization */\n\ttype: PulumiErrorType\n\t/** Human-readable error message */\n\tmessage: string\n\t/** The resource that caused the error (if known) */\n\tresource?: string\n\t/** Actionable suggestion for the user */\n\tsuggestion: string\n\t/** Whether this error is retryable */\n\tretryable: boolean\n\t/** Original error output */\n\toriginalError: string\n}\n\n/**\n * Error patterns and their mappings\n */\nconst ERROR_PATTERNS: Array<{\n\tpattern: RegExp\n\ttype: PulumiErrorType\n\tsuggestion: string\n\tretryable: boolean\n}> = [\n\t{\n\t\tpattern: /conflict.*concurrent.*update|another update is in progress|lock/i,\n\t\ttype: PulumiErrorType.ConcurrentUpdate,\n\t\tsuggestion: 'Run: kuckit infra repair --cancel',\n\t\tretryable: false,\n\t},\n\t{\n\t\tpattern: /already exists|resource.*conflict|duplicate/i,\n\t\ttype: PulumiErrorType.ResourceConflict,\n\t\tsuggestion: 'Run: kuckit infra repair --refresh',\n\t\tretryable: false,\n\t},\n\t{\n\t\tpattern: /quota.*exceeded|limit.*reached|resource exhausted/i,\n\t\ttype: PulumiErrorType.QuotaExceeded,\n\t\tsuggestion:\n\t\t\t'Request quota increase in GCP Console: https://console.cloud.google.com/iam-admin/quotas',\n\t\tretryable: false,\n\t},\n\t{\n\t\tpattern: /permission.*denied|access.*denied|forbidden|unauthorized|403/i,\n\t\ttype: PulumiErrorType.PermissionDenied,\n\t\tsuggestion: 'Check IAM permissions in GCP Console. Ensure your account has the required roles.',\n\t\tretryable: false,\n\t},\n\t{\n\t\tpattern: /pending.*operation|state.*corrupt|inconsistent.*state/i,\n\t\ttype: PulumiErrorType.StateCorruption,\n\t\tsuggestion: 'Run: kuckit infra repair --refresh',\n\t\tretryable: false,\n\t},\n\t{\n\t\tpattern: /network.*error|connection.*refused|timeout|ETIMEDOUT|ECONNRESET/i,\n\t\ttype: PulumiErrorType.NetworkError,\n\t\tsuggestion: 'Check your network connection and try again.',\n\t\tretryable: true,\n\t},\n\t{\n\t\tpattern: /not found|does not exist|404/i,\n\t\ttype: PulumiErrorType.ResourceNotFound,\n\t\tsuggestion: 'The resource may have been deleted externally. Run: kuckit infra repair --refresh',\n\t\tretryable: false,\n\t},\n\t{\n\t\tpattern: /invalid.*config|configuration.*error|missing.*required/i,\n\t\ttype: PulumiErrorType.InvalidConfig,\n\t\tsuggestion: 'Check your configuration in .kuckit/infra.json and Pulumi stack config.',\n\t\tretryable: false,\n\t},\n]\n\n/**\n * Extract resource name from error output\n */\nfunction extractResourceName(error: string): string | undefined {\n\t// Try to extract URN\n\tconst urnMatch = error.match(/urn:pulumi:[^:]+:[^:]+::([^:]+:[^:\\s]+)/i)\n\tif (urnMatch) {\n\t\treturn urnMatch[1]\n\t}\n\n\t// Try to extract GCP resource name\n\tconst gcpMatch = error.match(/projects\\/[^/]+\\/(?:locations|regions)\\/[^/]+\\/([^/\\s]+\\/[^/\\s]+)/i)\n\tif (gcpMatch) {\n\t\treturn gcpMatch[1]\n\t}\n\n\treturn undefined\n}\n\n/**\n * Parse an error output and return a structured ParsedError\n */\nexport function parseError(error: string): ParsedError {\n\t// Find matching error pattern\n\tfor (const { pattern, type, suggestion, retryable } of ERROR_PATTERNS) {\n\t\tif (pattern.test(error)) {\n\t\t\treturn {\n\t\t\t\ttype,\n\t\t\t\tmessage: getErrorMessage(type, error),\n\t\t\t\tresource: extractResourceName(error),\n\t\t\t\tsuggestion,\n\t\t\t\tretryable,\n\t\t\t\toriginalError: error,\n\t\t\t}\n\t\t}\n\t}\n\n\t// Unknown error\n\treturn {\n\t\ttype: PulumiErrorType.Unknown,\n\t\tmessage: 'An unknown error occurred during infrastructure operation.',\n\t\tresource: extractResourceName(error),\n\t\tsuggestion:\n\t\t\t'Check the error output above. If the issue persists, run: kuckit infra repair --refresh',\n\t\tretryable: false,\n\t\toriginalError: error,\n\t}\n}\n\n/**\n * Get a human-readable error message for an error type\n */\nfunction getErrorMessage(type: PulumiErrorType, originalError: string): string {\n\tswitch (type) {\n\t\tcase PulumiErrorType.ConcurrentUpdate:\n\t\t\treturn 'Another infrastructure update is already in progress.'\n\t\tcase PulumiErrorType.ResourceConflict:\n\t\t\treturn 'A resource with this name already exists.'\n\t\tcase PulumiErrorType.QuotaExceeded:\n\t\t\treturn 'GCP quota limit has been reached.'\n\t\tcase PulumiErrorType.PermissionDenied:\n\t\t\treturn 'Permission denied. Check your IAM permissions.'\n\t\tcase PulumiErrorType.StateCorruption:\n\t\t\treturn 'Infrastructure state is inconsistent.'\n\t\tcase PulumiErrorType.NetworkError:\n\t\t\treturn 'Network error occurred. This may be a transient issue.'\n\t\tcase PulumiErrorType.ResourceNotFound:\n\t\t\treturn 'A required resource was not found.'\n\t\tcase PulumiErrorType.InvalidConfig:\n\t\t\treturn 'Invalid configuration detected.'\n\t\tdefault: {\n\t\t\t// Extract first meaningful line from error\n\t\t\tconst firstLine = originalError.split('\\n').find((line) => line.trim().length > 0)\n\t\t\treturn firstLine?.slice(0, 200) ?? 'An error occurred.'\n\t\t}\n\t}\n}\n\n/**\n * Format a ParsedError for console output\n */\nexport function formatError(error: ParsedError): string {\n\tconst lines = [`Error: ${error.message}`, '']\n\n\tif (error.resource) {\n\t\tlines.push(`Resource: ${error.resource}`)\n\t}\n\n\tlines.push(`Suggestion: ${error.suggestion}`)\n\n\treturn lines.join('\\n')\n}\n\n/**\n * Check if an error is retryable\n */\nexport function isRetryableError(error: string): boolean {\n\tconst parsed = parseError(error)\n\treturn parsed.retryable\n}\n","/**\n * kuckit infra destroy command\n *\n * Destroy infrastructure resources\n */\n\nimport { readFile, unlink, access, constants } from 'fs/promises'\nimport { join, dirname } from 'path'\nimport { confirm } from '@inquirer/prompts'\nimport {\n\tsetPulumiConfig,\n\tpulumiUp,\n\tpulumiDestroy,\n\tgetInfraDir,\n\tselectOrCreateStack,\n\tcheckPulumiInstalled,\n} from './runner.js'\nimport { parseError, formatError } from './errors.js'\nimport type { StoredInfraConfig } from './types.js'\n\nexport interface DestroyOptions {\n\t/** Environment (dev/prod) */\n\tenv?: string\n\t/** Only destroy Cloud Run, keep DB/Redis */\n\tappOnly?: boolean\n\t/** Skip confirmation prompt */\n\tforce?: boolean\n}\n\nconst KUCKIT_DIR = '.kuckit'\nconst CONFIG_FILE = 'infra.json'\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path, constants.F_OK)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\nasync function findProjectRoot(cwd: string): Promise<string | null> {\n\tlet dir = cwd\n\twhile (dir !== dirname(dir)) {\n\t\tif (await fileExists(join(dir, 'package.json'))) {\n\t\t\treturn dir\n\t\t}\n\t\tdir = dirname(dir)\n\t}\n\treturn null\n}\n\nasync function loadConfig(projectRoot: string): Promise<StoredInfraConfig | null> {\n\tconst configPath = join(projectRoot, KUCKIT_DIR, CONFIG_FILE)\n\n\tif (!(await fileExists(configPath))) {\n\t\treturn null\n\t}\n\n\ttry {\n\t\tconst content = await readFile(configPath, 'utf-8')\n\t\treturn JSON.parse(content)\n\t} catch {\n\t\treturn null\n\t}\n}\n\nexport async function infraDestroy(options: DestroyOptions): Promise<void> {\n\tconst isAppOnly = options.appOnly ?? false\n\n\tif (isAppOnly) {\n\t\tconsole.log('Destroying Cloud Run application (keeping database and Redis)...\\n')\n\t} else {\n\t\tconsole.log('Destroying kuckit infrastructure...\\n')\n\t}\n\n\t// Check prerequisites\n\tif (!(await checkPulumiInstalled())) {\n\t\tconsole.error('Error: Pulumi CLI is not installed.')\n\t\tconsole.error('Install it from: https://www.pulumi.com/docs/install/')\n\t\tprocess.exit(1)\n\t}\n\n\t// Find project root\n\tconst projectRoot = await findProjectRoot(process.cwd())\n\tif (!projectRoot) {\n\t\tconsole.error('Error: Could not find project root (no package.json found)')\n\t\tprocess.exit(1)\n\t}\n\n\t// Load config\n\tconst config = await loadConfig(projectRoot)\n\tif (!config) {\n\t\tconsole.error('Error: No infrastructure configuration found.')\n\t\tconsole.error('Nothing to destroy.')\n\t\tprocess.exit(1)\n\t}\n\n\t// Get environment from options or config\n\tconst env = (options.env ?? config.env) as 'dev' | 'prod'\n\tif (env !== 'dev' && env !== 'prod') {\n\t\tconsole.error(`Error: Invalid environment '${env}'. Must be 'dev' or 'prod'.`)\n\t\tprocess.exit(1)\n\t}\n\n\t// Get infra directory\n\tconst infraDir = getInfraDir(projectRoot)\n\tif (!(await fileExists(infraDir))) {\n\t\tconsole.error('Error: packages/infra not found.')\n\t\tprocess.exit(1)\n\t}\n\n\tconsole.log('Configuration:')\n\tconsole.log(` Project: ${config.gcpProject}`)\n\tconsole.log(` Region: ${config.region}`)\n\tconsole.log(` Environment: ${env}`)\n\tconsole.log(` Stack: ${config.stackName}`)\n\tconsole.log('')\n\n\t// Show appropriate warning\n\tif (isAppOnly) {\n\t\tconsole.log('WARNING: This will destroy the Cloud Run service.')\n\t\tconsole.log(' Database and Redis will be preserved.\\n')\n\t} else {\n\t\tconsole.log('='.repeat(60))\n\t\tconsole.log('WARNING: DESTRUCTIVE OPERATION')\n\t\tconsole.log('='.repeat(60))\n\t\tconsole.log('')\n\t\tconsole.log('This will PERMANENTLY destroy:')\n\t\tconsole.log(' - Cloud Run service')\n\t\tconsole.log(' - Cloud SQL database (ALL DATA WILL BE LOST)')\n\t\tconsole.log(' - Memorystore Redis instance')\n\t\tconsole.log(' - Artifact Registry and all container images')\n\t\tconsole.log(' - All associated secrets')\n\t\tconsole.log('')\n\t\tconsole.log('This action CANNOT be undone.')\n\t\tconsole.log('')\n\t}\n\n\t// Confirm unless --force\n\tif (!options.force) {\n\t\tconst confirmMessage = isAppOnly\n\t\t\t? 'Are you sure you want to destroy the Cloud Run service?'\n\t\t\t: 'Are you ABSOLUTELY sure you want to destroy ALL infrastructure?'\n\n\t\tconst proceed = await confirm({\n\t\t\tmessage: confirmMessage,\n\t\t\tdefault: false,\n\t\t})\n\n\t\tif (!proceed) {\n\t\t\tconsole.log('Aborted.')\n\t\t\tprocess.exit(0)\n\t\t}\n\n\t\t// Double confirmation for full destroy\n\t\tif (!isAppOnly) {\n\t\t\tconst doubleConfirm = await confirm({\n\t\t\t\tmessage: 'This will delete ALL data. Type \"yes\" to confirm:',\n\t\t\t\tdefault: false,\n\t\t\t})\n\n\t\t\tif (!doubleConfirm) {\n\t\t\t\tconsole.log('Aborted.')\n\t\t\t\tprocess.exit(0)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Select the stack\n\tconst stackName = config.stackName\n\tconsole.log(`\\nSelecting Pulumi stack: ${stackName}`)\n\tconst stackOk = await selectOrCreateStack(stackName, { cwd: infraDir })\n\tif (!stackOk) {\n\t\tconsole.error('Error: Failed to select Pulumi stack')\n\t\tprocess.exit(1)\n\t}\n\n\tif (isAppOnly) {\n\t\t// App-only destroy: clear imageUrl and run pulumi up\n\t\tconsole.log('\\nRemoving Cloud Run service...')\n\t\tconsole.log('(Database and Redis will be preserved)\\n')\n\n\t\t// Clear the imageUrl config to remove Cloud Run\n\t\tawait setPulumiConfig('imageUrl', '', { cwd: infraDir })\n\n\t\tconst result = await pulumiUp({ cwd: infraDir, stream: true })\n\n\t\tif (result.code !== 0) {\n\t\t\tconst parsed = parseError(result.stderr)\n\t\t\tconsole.error('\\n' + formatError(parsed))\n\t\t\tprocess.exit(1)\n\t\t}\n\n\t\tconsole.log('\\n' + '='.repeat(60))\n\t\tconsole.log('Cloud Run service destroyed successfully!')\n\t\tconsole.log('='.repeat(60))\n\t\tconsole.log('\\nBase infrastructure preserved:')\n\t\tconsole.log(' - Cloud SQL database')\n\t\tconsole.log(' - Memorystore Redis')\n\t\tconsole.log(' - Artifact Registry')\n\t\tconsole.log('\\nTo redeploy: kuckit infra deploy --env ' + env)\n\t} else {\n\t\t// Full destroy\n\t\tconsole.log('\\nDestroying all infrastructure...')\n\t\tconsole.log('This may take several minutes.\\n')\n\n\t\tconst result = await pulumiDestroy({ cwd: infraDir, force: true })\n\n\t\tif (result.code !== 0) {\n\t\t\tconst parsed = parseError(result.stderr)\n\t\t\tconsole.error('\\n' + formatError(parsed))\n\t\t\tprocess.exit(1)\n\t\t}\n\n\t\t// Remove config file\n\t\tconst configPath = join(projectRoot, KUCKIT_DIR, CONFIG_FILE)\n\t\ttry {\n\t\t\tawait unlink(configPath)\n\t\t\tconsole.log(`\\nRemoved ${KUCKIT_DIR}/${CONFIG_FILE}`)\n\t\t} catch {\n\t\t\t// Ignore if file doesn't exist\n\t\t}\n\n\t\tconsole.log('\\n' + '='.repeat(60))\n\t\tconsole.log('Infrastructure destroyed successfully!')\n\t\tconsole.log('='.repeat(60))\n\t\tconsole.log('\\nAll resources have been removed.')\n\t\tconsole.log('To recreate: kuckit infra init')\n\t}\n\n\tconsole.log('')\n}\n","/**\n * kuckit infra repair command\n *\n * Repair infrastructure state issues\n */\n\nimport { readFile, access, constants, mkdir } from 'fs/promises'\nimport { join, dirname } from 'path'\nimport { confirm } from '@inquirer/prompts'\nimport {\n\tgetInfraDir,\n\tselectOrCreateStack,\n\tcheckPulumiInstalled,\n\tpulumiCancel,\n\tpulumiRefresh,\n\tpulumiStackExport,\n} from './runner.js'\nimport type { StoredInfraConfig } from './types.js'\n\nexport interface RepairOptions {\n\t/** Environment (dev/prod) */\n\tenv?: string\n\t/** Refresh state from cloud provider */\n\trefresh?: boolean\n\t/** Cancel any stuck operations */\n\tcancel?: boolean\n\t/** Force repair without confirmation */\n\tforce?: boolean\n}\n\nconst KUCKIT_DIR = '.kuckit'\nconst CONFIG_FILE = 'infra.json'\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path, constants.F_OK)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\nasync function findProjectRoot(cwd: string): Promise<string | null> {\n\tlet dir = cwd\n\twhile (dir !== dirname(dir)) {\n\t\tif (await fileExists(join(dir, 'package.json'))) {\n\t\t\treturn dir\n\t\t}\n\t\tdir = dirname(dir)\n\t}\n\treturn null\n}\n\nasync function loadConfig(projectRoot: string): Promise<StoredInfraConfig | null> {\n\tconst configPath = join(projectRoot, KUCKIT_DIR, CONFIG_FILE)\n\n\tif (!(await fileExists(configPath))) {\n\t\treturn null\n\t}\n\n\ttry {\n\t\tconst content = await readFile(configPath, 'utf-8')\n\t\treturn JSON.parse(content)\n\t} catch {\n\t\treturn null\n\t}\n}\n\nexport async function infraRepair(options: RepairOptions): Promise<void> {\n\tconsole.log('Repairing kuckit infrastructure state...\\n')\n\n\t// Check prerequisites\n\tif (!(await checkPulumiInstalled())) {\n\t\tconsole.error('Error: Pulumi CLI is not installed.')\n\t\tconsole.error('Install it from: https://www.pulumi.com/docs/install/')\n\t\tprocess.exit(1)\n\t}\n\n\t// Find project root\n\tconst projectRoot = await findProjectRoot(process.cwd())\n\tif (!projectRoot) {\n\t\tconsole.error('Error: Could not find project root (no package.json found)')\n\t\tprocess.exit(1)\n\t}\n\n\t// Load config\n\tconst config = await loadConfig(projectRoot)\n\tif (!config) {\n\t\tconsole.error('Error: No infrastructure configuration found.')\n\t\tconsole.error('Run: kuckit infra init')\n\t\tprocess.exit(1)\n\t}\n\n\t// Get environment from options or config\n\tconst env = (options.env ?? config.env) as 'dev' | 'prod'\n\tif (env !== 'dev' && env !== 'prod') {\n\t\tconsole.error(`Error: Invalid environment '${env}'. Must be 'dev' or 'prod'.`)\n\t\tprocess.exit(1)\n\t}\n\n\t// Get infra directory\n\tconst infraDir = getInfraDir(projectRoot)\n\tif (!(await fileExists(infraDir))) {\n\t\tconsole.error('Error: packages/infra not found.')\n\t\tprocess.exit(1)\n\t}\n\n\t// Determine what operations to run\n\tconst runCancel = options.cancel || (!options.cancel && !options.refresh)\n\tconst runRefresh = options.refresh || (!options.cancel && !options.refresh)\n\n\tconsole.log(`Repairing stack: ${config.stackName}`)\n\tconsole.log(` Environment: ${env}`)\n\tconsole.log(\n\t\t` Operations: ${[runCancel && 'cancel', runRefresh && 'refresh'].filter(Boolean).join(', ')}`\n\t)\n\tconsole.log('')\n\n\t// Confirm unless --force\n\tif (!options.force) {\n\t\tconst proceed = await confirm({\n\t\t\tmessage: 'Proceed with repair?',\n\t\t\tdefault: true,\n\t\t})\n\n\t\tif (!proceed) {\n\t\t\tconsole.log('Aborted.')\n\t\t\tprocess.exit(0)\n\t\t}\n\t}\n\n\t// Select the stack\n\tconsole.log(`Selecting Pulumi stack: ${config.stackName}`)\n\tconst stackOk = await selectOrCreateStack(config.stackName, { cwd: infraDir })\n\tif (!stackOk) {\n\t\tconsole.error('Error: Failed to select Pulumi stack')\n\t\tprocess.exit(1)\n\t}\n\tconsole.log('')\n\n\t// Backup state (unless --force)\n\tif (!options.force) {\n\t\tconst kuckitDir = join(projectRoot, KUCKIT_DIR)\n\t\tawait mkdir(kuckitDir, { recursive: true })\n\n\t\tconst timestamp = Math.floor(Date.now() / 1000)\n\t\tconst backupFileName = `state-backup-${env}-${timestamp}.json`\n\t\tconst backupPath = join(kuckitDir, backupFileName)\n\n\t\tconsole.log('Backing up state...')\n\t\tconst backupResult = await pulumiStackExport(backupPath, { cwd: infraDir })\n\n\t\tif (backupResult.code === 0) {\n\t\t\tconsole.log(`State backed up to ${KUCKIT_DIR}/${backupFileName}\\n`)\n\t\t} else {\n\t\t\tconsole.warn('Warning: Failed to backup state. Continuing anyway...\\n')\n\t\t}\n\t}\n\n\t// Cancel stuck operations\n\tif (runCancel) {\n\t\tconsole.log('Cancelling any stuck operations...')\n\t\tconst cancelResult = await pulumiCancel({ cwd: infraDir })\n\n\t\tif (cancelResult.code === 0) {\n\t\t\tif (cancelResult.stdout.includes('no update') || cancelResult.stderr.includes('no update')) {\n\t\t\t\tconsole.log('No stuck operation to cancel\\n')\n\t\t\t} else {\n\t\t\t\tconsole.log('✓ Cancelled stuck operation\\n')\n\t\t\t}\n\t\t} else {\n\t\t\tif (cancelResult.stderr.includes('no update') || cancelResult.stdout.includes('no update')) {\n\t\t\t\tconsole.log('No stuck operation to cancel\\n')\n\t\t\t} else {\n\t\t\t\tconsole.error('Warning: Cancel operation failed')\n\t\t\t\tconsole.error(cancelResult.stderr || cancelResult.stdout)\n\t\t\t\tconsole.log('')\n\t\t\t}\n\t\t}\n\t}\n\n\t// Refresh state\n\tif (runRefresh) {\n\t\tconsole.log('Refreshing state from cloud provider...')\n\t\tconst refreshResult = await pulumiRefresh({ cwd: infraDir })\n\n\t\tif (refreshResult.code === 0) {\n\t\t\tconsole.log('✓ State refreshed successfully\\n')\n\t\t} else {\n\t\t\tconsole.error('\\nError: Refresh operation failed')\n\t\t\tconsole.error(refreshResult.stderr)\n\t\t\tprocess.exit(1)\n\t\t}\n\t}\n\n\tconsole.log('✓ Infrastructure state repair complete')\n}\n","/**\n * kuckit infra db commands\n *\n * Database operations against Cloud SQL via Cloud Run Jobs\n * (runs inside GCP VPC for private IP access)\n */\n\nimport { readFile, access, constants } from 'fs/promises'\nimport { join, dirname } from 'path'\nimport { runGcloud, checkGcloudInstalled } from './runner.js'\nimport { isGcpConfig, type StoredInfraConfig } from './types.js'\n\nexport interface DbPushOptions {\n\t/** Environment (dev/prod) */\n\tenv?: string\n\t/** Skip confirmation for destructive changes */\n\tforce?: boolean\n}\n\nexport interface DbMigrateOptions {\n\t/** Environment (dev/prod) */\n\tenv?: string\n\t/** Show migrations without applying */\n\tdryRun?: boolean\n\t/** Rollback the last migration */\n\trollback?: boolean\n}\n\nconst KUCKIT_DIR = '.kuckit'\nconst CONFIG_FILE = 'infra.json'\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path, constants.F_OK)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\nasync function findProjectRoot(cwd: string): Promise<string | null> {\n\tlet dir = cwd\n\twhile (dir !== dirname(dir)) {\n\t\tif (await fileExists(join(dir, 'package.json'))) {\n\t\t\treturn dir\n\t\t}\n\t\tdir = dirname(dir)\n\t}\n\treturn null\n}\n\nasync function loadConfig(projectRoot: string): Promise<StoredInfraConfig | null> {\n\tconst configPath = join(projectRoot, KUCKIT_DIR, CONFIG_FILE)\n\n\tif (!(await fileExists(configPath))) {\n\t\treturn null\n\t}\n\n\ttry {\n\t\tconst content = await readFile(configPath, 'utf-8')\n\t\treturn JSON.parse(content)\n\t} catch {\n\t\treturn null\n\t}\n}\n\ninterface JobContext {\n\tconfig: StoredInfraConfig\n\tgcpProject: string\n\tprojectRoot: string\n\tenv: 'dev' | 'prod'\n\tjobName: string\n}\n\nasync function getJobContext(options: { env?: string }): Promise<JobContext> {\n\t// Check prerequisites\n\tif (!(await checkGcloudInstalled())) {\n\t\tconsole.error('Error: gcloud CLI is not installed.')\n\t\tconsole.error('Install it from: https://cloud.google.com/sdk/docs/install')\n\t\tprocess.exit(1)\n\t}\n\n\t// Find project root\n\tconst projectRoot = await findProjectRoot(process.cwd())\n\tif (!projectRoot) {\n\t\tconsole.error('Error: Could not find project root (no package.json found)')\n\t\tprocess.exit(1)\n\t}\n\n\t// Load config\n\tconst config = await loadConfig(projectRoot)\n\tif (!config) {\n\t\tconsole.error('Error: No infrastructure configuration found.')\n\t\tconsole.error('Run: kuckit infra init')\n\t\tprocess.exit(1)\n\t}\n\n\t// Validate GCP provider\n\tif (!isGcpConfig(config)) {\n\t\tconsole.error('Error: Database commands only support GCP provider.')\n\t\tconsole.error(`Current provider: ${config.provider}`)\n\t\tprocess.exit(1)\n\t}\n\n\tconst gcpProject = config.providerConfig.gcpProject\n\n\t// Get environment\n\tconst env = (options.env ?? config.env) as 'dev' | 'prod'\n\tif (env !== 'dev' && env !== 'prod') {\n\t\tconsole.error(`Error: Invalid environment '${env}'. Must be 'dev' or 'prod'.`)\n\t\tprocess.exit(1)\n\t}\n\n\t// Check for migration job\n\tconst jobName = config.outputs?.migrationJobName\n\tif (!jobName) {\n\t\tconsole.error('Error: No migration job found in configuration.')\n\t\tconsole.error('Make sure you have deployed the infrastructure with an image:')\n\t\tconsole.error(' kuckit infra deploy')\n\t\tprocess.exit(1)\n\t}\n\n\treturn { config, gcpProject, projectRoot, env, jobName }\n}\n\nasync function executeCloudRunJob(\n\tproject: string,\n\tregion: string,\n\tjobName: string,\n\tcommandOverride?: string[]\n): Promise<boolean> {\n\tconst args = [\n\t\t'run',\n\t\t'jobs',\n\t\t'execute',\n\t\tjobName,\n\t\t'--region',\n\t\tregion,\n\t\t'--project',\n\t\tproject,\n\t\t'--wait',\n\t]\n\n\t// If we need to override the args (e.g., for db:push)\n\t// The --args flag expects comma-separated values, each becoming a container arg\n\t// For sh -c, we need the entire shell command as a single quoted arg\n\tif (commandOverride && commandOverride.length > 0) {\n\t\t// Escape single quotes in the command and wrap in single quotes for shell safety\n\t\tconst escapedArgs = commandOverride.map((arg) => arg.replace(/'/g, \"'\\\\''\")).join(',')\n\t\targs.push(`--args='${escapedArgs}'`)\n\t}\n\n\tconsole.log(`Executing Cloud Run Job: ${jobName}`)\n\tconsole.log(` Project: ${project}`)\n\tconsole.log(` Region: ${region}`)\n\tconsole.log('')\n\n\tconst result = await runGcloud(args, { stream: true })\n\n\treturn result.code === 0\n}\n\nasync function getLatestJobExecution(\n\tproject: string,\n\tregion: string,\n\tjobName: string\n): Promise<{ status: string; logs?: string } | null> {\n\t// Get the latest execution\n\tconst listResult = await runGcloud(\n\t\t[\n\t\t\t'run',\n\t\t\t'jobs',\n\t\t\t'executions',\n\t\t\t'list',\n\t\t\t'--job',\n\t\t\tjobName,\n\t\t\t'--region',\n\t\t\tregion,\n\t\t\t'--project',\n\t\t\tproject,\n\t\t\t'--limit',\n\t\t\t'1',\n\t\t\t'--format',\n\t\t\t'json',\n\t\t],\n\t\t{ stream: false }\n\t)\n\n\tif (listResult.code !== 0 || !listResult.stdout.trim()) {\n\t\treturn null\n\t}\n\n\ttry {\n\t\tconst executions = JSON.parse(listResult.stdout)\n\t\tif (executions.length === 0) {\n\t\t\treturn null\n\t\t}\n\n\t\tconst execution = executions[0]\n\t\tconst executionName = execution.metadata?.name\n\n\t\t// Get logs for the execution\n\t\tif (executionName) {\n\t\t\tconst logsResult = await runGcloud(\n\t\t\t\t[\n\t\t\t\t\t'logging',\n\t\t\t\t\t'read',\n\t\t\t\t\t`resource.type=\"cloud_run_job\" AND resource.labels.job_name=\"${jobName}\" AND labels.\"run.googleapis.com/execution_name\"=\"${executionName}\"`,\n\t\t\t\t\t'--project',\n\t\t\t\t\tproject,\n\t\t\t\t\t'--limit',\n\t\t\t\t\t'50',\n\t\t\t\t\t'--format',\n\t\t\t\t\t'value(textPayload)',\n\t\t\t\t],\n\t\t\t\t{ stream: false }\n\t\t\t)\n\n\t\t\treturn {\n\t\t\t\tstatus: execution.status?.conditions?.[0]?.type ?? 'Unknown',\n\t\t\t\tlogs: logsResult.stdout,\n\t\t\t}\n\t\t}\n\n\t\treturn { status: execution.status?.conditions?.[0]?.type ?? 'Unknown' }\n\t} catch {\n\t\treturn null\n\t}\n}\n\nexport async function infraDbPush(options: DbPushOptions): Promise<void> {\n\tconsole.log('Running database schema push via Cloud Run Job...\\n')\n\n\tconst ctx = await getJobContext(options)\n\n\tconsole.log('Configuration:')\n\tconsole.log(` Project: ${ctx.gcpProject}`)\n\tconsole.log(` Environment: ${ctx.env}`)\n\tconsole.log(` Job: ${ctx.jobName}`)\n\tconsole.log('')\n\n\t// For db:push, we override the args to run drizzle-kit push instead of migrate\n\t// The container command is 'sh -c' so we pass the full shell command as args\n\t// Use node instead of bun for drizzle-kit due to module resolution issues\n\t// Don't set DATABASE_URL - drizzle.config.ts now uses individual DB_* env vars directly\n\tconst forceFlag = options.force ? ' --force' : ''\n\tconst commandOverride = [\n\t\t'export NODE_PATH=/app/node_modules && ' +\n\t\t\t'cd /app && ' +\n\t\t\t`node /app/node_modules/drizzle-kit/bin.cjs push --config=packages/db/drizzle.config.ts${forceFlag}`,\n\t]\n\n\tconst success = await executeCloudRunJob(\n\t\tctx.gcpProject,\n\t\tctx.config.region,\n\t\tctx.jobName,\n\t\tcommandOverride\n\t)\n\n\tif (!success) {\n\t\tconsole.error('\\nError: Schema push failed.')\n\t\tconsole.error('Check the Cloud Run Job logs for details:')\n\t\tconsole.error(\n\t\t\t` gcloud run jobs executions list --job ${ctx.jobName} --region ${ctx.config.region}`\n\t\t)\n\t\tprocess.exit(1)\n\t}\n\n\t// Fetch and display execution result\n\tconst execution = await getLatestJobExecution(ctx.gcpProject, ctx.config.region, ctx.jobName)\n\n\tif (execution?.logs) {\n\t\tconsole.log('\\nJob output:')\n\t\tconsole.log(execution.logs)\n\t}\n\n\tconsole.log('\\n✓ Schema push complete')\n}\n\nexport async function infraDbMigrate(options: DbMigrateOptions): Promise<void> {\n\tconsole.log('Running database migrations via Cloud Run Job...\\n')\n\n\tif (options.dryRun) {\n\t\tconsole.log('Note: Dry run mode is not supported for Cloud Run Jobs.')\n\t\tconsole.log('The job will execute actual migrations.\\n')\n\t}\n\n\tif (options.rollback) {\n\t\tconsole.error('Error: Rollback is not supported via Cloud Run Jobs.')\n\t\tconsole.error('Use local drizzle-kit for rollback operations.')\n\t\tprocess.exit(1)\n\t}\n\n\tconst ctx = await getJobContext(options)\n\n\tconsole.log('Configuration:')\n\tconsole.log(` Project: ${ctx.gcpProject}`)\n\tconsole.log(` Environment: ${ctx.env}`)\n\tconsole.log(` Job: ${ctx.jobName}`)\n\tconsole.log('')\n\n\t// The job is already configured to run 'drizzle-kit migrate'\n\tconst success = await executeCloudRunJob(ctx.gcpProject, ctx.config.region, ctx.jobName)\n\n\tif (!success) {\n\t\tconsole.error('\\nError: Migration failed.')\n\t\tconsole.error('Check the Cloud Run Job logs for details:')\n\t\tconsole.error(\n\t\t\t` gcloud run jobs executions list --job ${ctx.jobName} --region ${ctx.config.region}`\n\t\t)\n\t\tprocess.exit(1)\n\t}\n\n\t// Fetch and display execution result\n\tconst execution = await getLatestJobExecution(ctx.gcpProject, ctx.config.region, ctx.jobName)\n\n\tif (execution?.logs) {\n\t\tconsole.log('\\nJob output:')\n\t\tconsole.log(execution.logs)\n\t}\n\n\tconsole.log('\\n✓ Migrations complete')\n}\n","/**\n * kuckit infra rollback command\n *\n * Rollback Cloud Run service to a previous revision\n */\n\nimport { readFile, access, constants } from 'fs/promises'\nimport { join, dirname } from 'path'\nimport { select } from '@inquirer/prompts'\nimport {\n\tcheckGcloudInstalled,\n\tlistCloudRunRevisions,\n\tupdateCloudRunTraffic,\n\textractServiceNameFromUrl,\n\ttype CloudRunRevision,\n} from './runner.js'\nimport type { StoredInfraConfig } from './types.js'\n\nexport interface RollbackOptions {\n\t/** Environment (dev/prod) */\n\tenv?: string\n\t/** Specific revision name to rollback to */\n\trevision?: string\n\t/** Rollback to the previous revision */\n\tprevious?: boolean\n}\n\nconst KUCKIT_DIR = '.kuckit'\nconst CONFIG_FILE = 'infra.json'\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path, constants.F_OK)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\nasync function findProjectRoot(cwd: string): Promise<string | null> {\n\tlet dir = cwd\n\twhile (dir !== dirname(dir)) {\n\t\tif (await fileExists(join(dir, 'package.json'))) {\n\t\t\treturn dir\n\t\t}\n\t\tdir = dirname(dir)\n\t}\n\treturn null\n}\n\nasync function loadConfig(projectRoot: string): Promise<StoredInfraConfig | null> {\n\tconst configPath = join(projectRoot, KUCKIT_DIR, CONFIG_FILE)\n\n\tif (!(await fileExists(configPath))) {\n\t\treturn null\n\t}\n\n\ttry {\n\t\tconst content = await readFile(configPath, 'utf-8')\n\t\treturn JSON.parse(content)\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction formatRevisionDate(isoDate: string): string {\n\ttry {\n\t\tconst date = new Date(isoDate)\n\t\treturn date.toLocaleString('en-US', {\n\t\t\tyear: 'numeric',\n\t\t\tmonth: '2-digit',\n\t\t\tday: '2-digit',\n\t\t\thour: '2-digit',\n\t\t\tminute: '2-digit',\n\t\t})\n\t} catch {\n\t\treturn isoDate\n\t}\n}\n\nfunction displayRevisions(revisions: CloudRunRevision[]): void {\n\tconsole.log('Available revisions:')\n\tfor (const rev of revisions) {\n\t\tconst marker = rev.active ? ' (current)' : ''\n\t\tconst traffic = rev.trafficPercent > 0 ? ` [${rev.trafficPercent}%]` : ''\n\t\tconsole.log(` ${rev.name}${marker}${traffic} - ${formatRevisionDate(rev.createTime)}`)\n\t}\n\tconsole.log('')\n}\n\nexport async function infraRollback(options: RollbackOptions): Promise<void> {\n\tconsole.log('Rolling back Cloud Run service...\\n')\n\n\t// Check prerequisites\n\tif (!(await checkGcloudInstalled())) {\n\t\tconsole.error('Error: gcloud CLI is not installed.')\n\t\tconsole.error('Install it from: https://cloud.google.com/sdk/docs/install')\n\t\tprocess.exit(1)\n\t}\n\n\t// Find project root\n\tconst projectRoot = await findProjectRoot(process.cwd())\n\tif (!projectRoot) {\n\t\tconsole.error('Error: Could not find project root (no package.json found)')\n\t\tprocess.exit(1)\n\t}\n\n\t// Load config\n\tconst config = await loadConfig(projectRoot)\n\tif (!config) {\n\t\tconsole.error('Error: No infrastructure configuration found.')\n\t\tconsole.error('Run: kuckit infra init')\n\t\tprocess.exit(1)\n\t}\n\n\t// Get environment from options or config\n\tconst env = (options.env ?? config.env) as 'dev' | 'prod'\n\tif (env !== 'dev' && env !== 'prod') {\n\t\tconsole.error(`Error: Invalid environment '${env}'. Must be 'dev' or 'prod'.`)\n\t\tprocess.exit(1)\n\t}\n\n\t// Check for service URL in outputs\n\tconst serviceUrl = config.outputs?.serviceUrl\n\tif (!serviceUrl) {\n\t\tconsole.error('Error: No Cloud Run service deployed yet.')\n\t\tconsole.error('Run: kuckit infra deploy')\n\t\tprocess.exit(1)\n\t}\n\n\t// Extract service name from URL\n\tconst serviceName = extractServiceNameFromUrl(serviceUrl)\n\tif (!serviceName) {\n\t\tconsole.error('Error: Could not determine service name from URL:', serviceUrl)\n\t\tprocess.exit(1)\n\t}\n\n\tconsole.log(`Service: ${serviceName}`)\n\tconsole.log(`Project: ${config.gcpProject}`)\n\tconsole.log(`Region: ${config.region}`)\n\tconsole.log('')\n\n\t// List available revisions\n\tconsole.log('Fetching revisions...')\n\tconst revisions = await listCloudRunRevisions(serviceName, config.gcpProject, config.region)\n\n\tif (revisions.length === 0) {\n\t\tconsole.error('Error: No revisions found for service:', serviceName)\n\t\tprocess.exit(1)\n\t}\n\n\t// Sort by creation time (newest first)\n\trevisions.sort((a, b) => new Date(b.createTime).getTime() - new Date(a.createTime).getTime())\n\n\tdisplayRevisions(revisions)\n\n\t// Determine target revision\n\tlet targetRevision: string | undefined\n\n\tif (options.revision) {\n\t\t// Use specified revision\n\t\tconst found = revisions.find((r) => r.name === options.revision)\n\t\tif (!found) {\n\t\t\tconsole.error(`Error: Revision '${options.revision}' not found.`)\n\t\t\tconsole.error('Available revisions:', revisions.map((r) => r.name).join(', '))\n\t\t\tprocess.exit(1)\n\t\t}\n\t\ttargetRevision = options.revision\n\t} else if (options.previous) {\n\t\t// Use the previous revision (second in list after sorting by time)\n\t\tif (revisions.length < 2) {\n\t\t\tconsole.error('Error: No previous revision available.')\n\t\t\tconsole.error('Only one revision exists:', revisions[0]?.name)\n\t\t\tprocess.exit(1)\n\t\t}\n\t\t// Find the first non-active revision\n\t\tconst previousRev = revisions.find((r) => !r.active)\n\t\tif (!previousRev) {\n\t\t\t// If all revisions somehow have traffic, pick the second one\n\t\t\ttargetRevision = revisions[1]?.name\n\t\t} else {\n\t\t\ttargetRevision = previousRev.name\n\t\t}\n\t} else {\n\t\t// Interactive: let user choose\n\t\tconst choices = revisions\n\t\t\t.filter((r) => !r.active || r.trafficPercent < 100)\n\t\t\t.map((r) => ({\n\t\t\t\tname: `${r.name} - ${formatRevisionDate(r.createTime)}${r.active ? ' (partial traffic)' : ''}`,\n\t\t\t\tvalue: r.name,\n\t\t\t}))\n\n\t\tif (choices.length === 0) {\n\t\t\tconsole.log('No other revisions available to rollback to.')\n\t\t\tprocess.exit(0)\n\t\t}\n\n\t\ttargetRevision = await select({\n\t\t\tmessage: 'Select revision to rollback to:',\n\t\t\tchoices,\n\t\t})\n\t}\n\n\tif (!targetRevision) {\n\t\tconsole.error('Error: Could not determine target revision.')\n\t\tprocess.exit(1)\n\t}\n\n\t// Check if already on this revision\n\tconst targetRev = revisions.find((r) => r.name === targetRevision)\n\tif (targetRev?.trafficPercent === 100) {\n\t\tconsole.log(`Already routing 100% traffic to ${targetRevision}`)\n\t\tprocess.exit(0)\n\t}\n\n\t// Perform the rollback\n\tconsole.log(`Rolling back to ${targetRevision}...`)\n\tconst result = await updateCloudRunTraffic(\n\t\tserviceName,\n\t\ttargetRevision,\n\t\tconfig.gcpProject,\n\t\tconfig.region\n\t)\n\n\tif (result.code !== 0) {\n\t\tconsole.error('\\nError: Failed to update traffic routing')\n\t\tconsole.error(result.stderr)\n\t\tprocess.exit(1)\n\t}\n\n\tconsole.log(`\\n✓ Traffic routed to ${targetRevision}`)\n}\n","/**\n * kuckit infra logs command\n *\n * View Cloud Run service logs\n */\n\nimport { readFile, access, constants } from 'fs/promises'\nimport { join, dirname } from 'path'\nimport { spawn } from 'child_process'\nimport { checkGcloudInstalled, extractServiceNameFromUrl } from './runner.js'\nimport type { StoredInfraConfig } from './types.js'\n\nexport interface LogsOptions {\n\t/** Environment (dev/prod) */\n\tenv?: string\n\t/** Stream logs in real-time */\n\tfollow?: boolean\n\t/** Show logs since duration (e.g., 1h, 30m) */\n\tsince?: string\n\t/** Filter by severity (DEBUG, INFO, WARNING, ERROR) */\n\tseverity?: string\n}\n\nconst KUCKIT_DIR = '.kuckit'\nconst CONFIG_FILE = 'infra.json'\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path, constants.F_OK)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\nasync function findProjectRoot(cwd: string): Promise<string | null> {\n\tlet dir = cwd\n\twhile (dir !== dirname(dir)) {\n\t\tif (await fileExists(join(dir, 'package.json'))) {\n\t\t\treturn dir\n\t\t}\n\t\tdir = dirname(dir)\n\t}\n\treturn null\n}\n\nasync function loadConfig(projectRoot: string): Promise<StoredInfraConfig | null> {\n\tconst configPath = join(projectRoot, KUCKIT_DIR, CONFIG_FILE)\n\n\tif (!(await fileExists(configPath))) {\n\t\treturn null\n\t}\n\n\ttry {\n\t\tconst content = await readFile(configPath, 'utf-8')\n\t\treturn JSON.parse(content)\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction runGcloudStreaming(args: string[]): Promise<number> {\n\treturn new Promise((resolve) => {\n\t\tconst proc = spawn('gcloud', args, {\n\t\t\tstdio: 'inherit',\n\t\t\tshell: true,\n\t\t})\n\n\t\tproc.on('close', (code) => {\n\t\t\tresolve(code ?? 1)\n\t\t})\n\t})\n}\n\nexport async function infraLogs(options: LogsOptions): Promise<void> {\n\t// Check prerequisites\n\tif (!(await checkGcloudInstalled())) {\n\t\tconsole.error('Error: gcloud CLI is not installed.')\n\t\tconsole.error('Install it from: https://cloud.google.com/sdk/docs/install')\n\t\tprocess.exit(1)\n\t}\n\n\t// Find project root\n\tconst projectRoot = await findProjectRoot(process.cwd())\n\tif (!projectRoot) {\n\t\tconsole.error('Error: Could not find project root (no package.json found)')\n\t\tprocess.exit(1)\n\t}\n\n\t// Load config\n\tconst config = await loadConfig(projectRoot)\n\tif (!config) {\n\t\tconsole.error('Error: No infrastructure configuration found.')\n\t\tconsole.error('Run: kuckit infra init')\n\t\tprocess.exit(1)\n\t}\n\n\t// Get environment from options or config\n\tconst env = (options.env ?? config.env) as 'dev' | 'prod'\n\tif (env !== 'dev' && env !== 'prod') {\n\t\tconsole.error(`Error: Invalid environment '${env}'. Must be 'dev' or 'prod'.`)\n\t\tprocess.exit(1)\n\t}\n\n\t// Get service URL and extract service name\n\tconst serviceUrl = config.outputs?.serviceUrl\n\tif (!serviceUrl) {\n\t\tconsole.error('Error: No Cloud Run service URL found.')\n\t\tconsole.error('The service may not be deployed yet. Run: kuckit infra deploy')\n\t\tprocess.exit(1)\n\t}\n\n\tconst serviceName = extractServiceNameFromUrl(serviceUrl)\n\tif (!serviceName) {\n\t\tconsole.error('Error: Could not extract service name from URL.')\n\t\tconsole.error(`Service URL: ${serviceUrl}`)\n\t\tprocess.exit(1)\n\t}\n\n\tconst since = options.since ?? '1h'\n\n\tconsole.log(`Fetching logs for service: ${serviceName}`)\n\tconsole.log(` Project: ${config.gcpProject}`)\n\tconsole.log(` Region: ${config.region}`)\n\tif (options.follow) {\n\t\tconsole.log(' Mode: Following (Ctrl+C to stop)')\n\t} else {\n\t\tconsole.log(` Since: ${since}`)\n\t}\n\tif (options.severity) {\n\t\tconsole.log(` Severity: >= ${options.severity}`)\n\t}\n\tconsole.log('')\n\n\t// Build gcloud command\n\tconst args: string[] = ['run', 'services', 'logs']\n\n\tif (options.follow) {\n\t\targs.push('tail')\n\t} else {\n\t\targs.push('read')\n\t}\n\n\targs.push(serviceName)\n\targs.push('--project', config.gcpProject)\n\targs.push('--region', config.region)\n\n\tif (!options.follow) {\n\t\targs.push('--limit', '100')\n\t\targs.push('--freshness', since)\n\t}\n\n\tif (options.severity) {\n\t\tconst severity = options.severity.toUpperCase()\n\t\tconst validSeverities = ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL']\n\t\tif (!validSeverities.includes(severity)) {\n\t\t\tconsole.error(`Error: Invalid severity '${severity}'.`)\n\t\t\tconsole.error(`Valid values: ${validSeverities.join(', ')}`)\n\t\t\tprocess.exit(1)\n\t\t}\n\t\targs.push('--log-filter', `severity>=${severity}`)\n\t}\n\n\t// Run gcloud with streaming output\n\tconst code = await runGcloudStreaming(args)\n\n\tif (code !== 0) {\n\t\tconsole.error('\\nError: Failed to fetch logs.')\n\t\tprocess.exit(1)\n\t}\n}\n","/**\n * kuckit infra status command\n *\n * Show current infrastructure state and resource health\n */\n\nimport { readFile, access, constants } from 'fs/promises'\nimport { join, dirname } from 'path'\nimport {\n\tgetInfraDir,\n\tgetPulumiStackInfo,\n\tgetPulumiStackHistory,\n\tgetPulumiOutputs,\n\tselectOrCreateStack,\n} from './runner.js'\nimport type { StoredInfraConfig } from './types.js'\n\nexport interface StatusOptions {\n\t/** Environment (dev/prod) */\n\tenv?: string\n\t/** Output as JSON */\n\tjson?: boolean\n}\n\ninterface StatusResult {\n\tstack: string\n\tstatus: 'active' | 'updating' | 'unknown'\n\tlastUpdate: string | null\n\tresourceCount: number\n\tresources: Array<{\n\t\tname: string\n\t\thealthy: boolean\n\t}>\n\toutputs: Record<string, unknown> | null\n}\n\nconst KUCKIT_DIR = '.kuckit'\nconst CONFIG_FILE = 'infra.json'\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path, constants.F_OK)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\nasync function findProjectRoot(cwd: string): Promise<string | null> {\n\tlet dir = cwd\n\twhile (dir !== dirname(dir)) {\n\t\tif (await fileExists(join(dir, 'package.json'))) {\n\t\t\treturn dir\n\t\t}\n\t\tdir = dirname(dir)\n\t}\n\treturn null\n}\n\nasync function loadConfig(projectRoot: string): Promise<StoredInfraConfig | null> {\n\tconst configPath = join(projectRoot, KUCKIT_DIR, CONFIG_FILE)\n\n\tif (!(await fileExists(configPath))) {\n\t\treturn null\n\t}\n\n\ttry {\n\t\tconst content = await readFile(configPath, 'utf-8')\n\t\treturn JSON.parse(content)\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction formatDate(dateStr: string): string {\n\ttry {\n\t\tconst date = new Date(dateStr)\n\t\treturn date.toLocaleString()\n\t} catch {\n\t\treturn dateStr\n\t}\n}\n\nexport async function infraStatus(options: StatusOptions): Promise<void> {\n\tconst projectRoot = await findProjectRoot(process.cwd())\n\tif (!projectRoot) {\n\t\tconsole.error('Error: Could not find project root (no package.json found)')\n\t\tprocess.exit(1)\n\t}\n\n\tconst config = await loadConfig(projectRoot)\n\tif (!config) {\n\t\tconsole.error('Error: No infrastructure configuration found.')\n\t\tconsole.error('Run: kuckit infra init')\n\t\tprocess.exit(1)\n\t}\n\n\tconst stackName = config.stackName\n\tconst infraDir = getInfraDir(projectRoot)\n\n\tif (!(await fileExists(infraDir))) {\n\t\tconsole.error('Error: packages/infra not found.')\n\t\tprocess.exit(1)\n\t}\n\n\t// Select the stack\n\tconst stackOk = await selectOrCreateStack(stackName, { cwd: infraDir })\n\tif (!stackOk) {\n\t\tconsole.error(`Error: Could not select stack '${stackName}'`)\n\t\tprocess.exit(1)\n\t}\n\n\t// Get stack info\n\tconst stackInfo = await getPulumiStackInfo({ cwd: infraDir })\n\tconst history = await getPulumiStackHistory({ cwd: infraDir }, 1)\n\tconst outputs = await getPulumiOutputs({ cwd: infraDir })\n\n\t// Determine status\n\tlet status: StatusResult['status'] = 'unknown'\n\tif (stackInfo?.updateInProgress) {\n\t\tstatus = 'updating'\n\t} else if (stackInfo) {\n\t\tstatus = 'active'\n\t}\n\n\t// Build resource list based on outputs\n\tconst resources: StatusResult['resources'] = []\n\tif (outputs) {\n\t\tif (outputs.registryUrl) {\n\t\t\tresources.push({ name: 'Artifact Registry', healthy: true })\n\t\t}\n\t\tif (outputs.databaseConnectionName) {\n\t\t\tresources.push({ name: 'Cloud SQL', healthy: true })\n\t\t}\n\t\tif (outputs.redisHost) {\n\t\t\tresources.push({ name: 'Memorystore Redis', healthy: true })\n\t\t}\n\t\tif (outputs.serviceUrl) {\n\t\t\tresources.push({ name: 'Cloud Run Service', healthy: true })\n\t\t}\n\t}\n\n\tconst lastUpdate = history[0]?.endTime ?? stackInfo?.lastUpdate ?? null\n\n\tconst result: StatusResult = {\n\t\tstack: stackName,\n\t\tstatus,\n\t\tlastUpdate,\n\t\tresourceCount: stackInfo?.resourceCount ?? 0,\n\t\tresources,\n\t\toutputs,\n\t}\n\n\tif (options.json) {\n\t\tconsole.log(JSON.stringify(result, null, 2))\n\t\treturn\n\t}\n\n\t// Pretty print\n\tconsole.log('')\n\tconsole.log(`Stack: ${result.stack}`)\n\tconsole.log(`Status: ${result.status}`)\n\tif (result.lastUpdate) {\n\t\tconsole.log(`Last updated: ${formatDate(result.lastUpdate)}`)\n\t}\n\tconsole.log(`Resources: ${result.resourceCount}`)\n\tconsole.log('')\n\n\tif (resources.length > 0) {\n\t\tconsole.log('Infrastructure:')\n\t\tfor (const resource of resources) {\n\t\t\tconst icon = resource.healthy ? '✓' : '✗'\n\t\t\tconsole.log(` ${icon} ${resource.name}`)\n\t\t}\n\t\tconsole.log('')\n\t} else {\n\t\tconsole.log('No resources deployed yet.')\n\t\tconsole.log('Run: kuckit infra deploy')\n\t\tconsole.log('')\n\t}\n}\n","/**\n * kuckit infra outputs command\n *\n * Display infrastructure outputs (URLs, connection strings)\n */\n\nimport { readFile, access, constants } from 'fs/promises'\nimport { join, dirname } from 'path'\nimport { getInfraDir, getPulumiOutputs, selectOrCreateStack } from './runner.js'\nimport type { StoredInfraConfig } from './types.js'\n\nexport interface OutputsOptions {\n\t/** Environment (dev/prod) */\n\tenv?: string\n\t/** Output as JSON */\n\tjson?: boolean\n}\n\nconst KUCKIT_DIR = '.kuckit'\nconst CONFIG_FILE = 'infra.json'\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path, constants.F_OK)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\nasync function findProjectRoot(cwd: string): Promise<string | null> {\n\tlet dir = cwd\n\twhile (dir !== dirname(dir)) {\n\t\tif (await fileExists(join(dir, 'package.json'))) {\n\t\t\treturn dir\n\t\t}\n\t\tdir = dirname(dir)\n\t}\n\treturn null\n}\n\nasync function loadConfig(projectRoot: string): Promise<StoredInfraConfig | null> {\n\tconst configPath = join(projectRoot, KUCKIT_DIR, CONFIG_FILE)\n\n\tif (!(await fileExists(configPath))) {\n\t\treturn null\n\t}\n\n\ttry {\n\t\tconst content = await readFile(configPath, 'utf-8')\n\t\treturn JSON.parse(content)\n\t} catch {\n\t\treturn null\n\t}\n}\n\nexport async function infraOutputs(options: OutputsOptions): Promise<void> {\n\tconst projectRoot = await findProjectRoot(process.cwd())\n\tif (!projectRoot) {\n\t\tconsole.error('Error: Could not find project root (no package.json found)')\n\t\tprocess.exit(1)\n\t}\n\n\tconst config = await loadConfig(projectRoot)\n\tif (!config) {\n\t\tconsole.error('Error: No infrastructure configuration found.')\n\t\tconsole.error('Run: kuckit infra init')\n\t\tprocess.exit(1)\n\t}\n\n\tconst env = options.env ?? config.env ?? 'dev'\n\tconst stackName = config.stackName\n\tconst infraDir = getInfraDir(projectRoot)\n\n\tif (!(await fileExists(infraDir))) {\n\t\tconsole.error('Error: packages/infra not found.')\n\t\tprocess.exit(1)\n\t}\n\n\t// Select the stack\n\tconst stackOk = await selectOrCreateStack(stackName, { cwd: infraDir })\n\tif (!stackOk) {\n\t\tconsole.error(`Error: Could not select stack '${stackName}'`)\n\t\tprocess.exit(1)\n\t}\n\n\t// Get outputs\n\tconst outputs = await getPulumiOutputs({ cwd: infraDir })\n\n\tif (!outputs) {\n\t\tconsole.error('Error: Could not retrieve stack outputs.')\n\t\tconsole.error('The stack may not have been deployed yet.')\n\t\tconsole.error('Run: kuckit infra deploy')\n\t\tprocess.exit(1)\n\t}\n\n\tif (options.json) {\n\t\tconsole.log(JSON.stringify(outputs, null, 2))\n\t\treturn\n\t}\n\n\t// Pretty print outputs\n\tconsole.log('')\n\tconsole.log(`Environment: ${env}`)\n\tconsole.log('')\n\n\tif (outputs.serviceUrl) {\n\t\tconsole.log(`Service URL: ${outputs.serviceUrl}`)\n\t}\n\tif (outputs.registryUrl) {\n\t\tconsole.log(`Registry URL: ${outputs.registryUrl}`)\n\t}\n\tif (outputs.databaseConnectionName) {\n\t\tconsole.log(`Database: ${outputs.databaseConnectionName}`)\n\t}\n\tif (outputs.redisHost) {\n\t\tconsole.log(`Redis Host: ${outputs.redisHost}`)\n\t}\n\n\t// Print any additional outputs\n\tconst knownKeys = ['serviceUrl', 'registryUrl', 'databaseConnectionName', 'redisHost']\n\tconst additionalKeys = Object.keys(outputs).filter((k) => !knownKeys.includes(k))\n\n\tif (additionalKeys.length > 0) {\n\t\tconsole.log('')\n\t\tconsole.log('Additional outputs:')\n\t\tfor (const key of additionalKeys) {\n\t\t\tconst value = outputs[key]\n\t\t\tif (typeof value === 'object') {\n\t\t\t\tconsole.log(` ${key}: ${JSON.stringify(value)}`)\n\t\t\t} else {\n\t\t\t\tconsole.log(` ${key}: ${value}`)\n\t\t\t}\n\t\t}\n\t}\n\n\tconsole.log('')\n}\n","/**\n * Infrastructure config command\n *\n * Manage infrastructure configuration values without needing\n * to interact with Pulumi or cloud provider CLIs directly.\n */\n\nimport { loadStoredConfig, saveStoredConfig } from './provider-loader.js'\nimport { loadProviderFromPackage, getProviderPackage } from './provider-loader.js'\nimport { setPulumiConfig, runPulumi, selectOrCreateStack, type RunPulumiOptions } from './runner.js'\nimport { isGcpConfig, type StoredInfraConfig } from './types.js'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ConfigSetOptions {\n\tenv?: string\n}\n\nexport interface ConfigGetOptions {\n\tenv?: string\n}\n\nexport interface ConfigListOptions {\n\tenv?: string\n\tjson?: boolean\n}\n\nexport interface ConfigUnsetOptions {\n\tenv?: string\n}\n\ntype Environment = 'dev' | 'staging' | 'prod'\n\n/**\n * Known configuration keys with their descriptions\n */\nconst KNOWN_CONFIG_KEYS: Record<string, { description: string; example: string }> = {\n\tappUrl: {\n\t\tdescription: 'Application URL (used for CORS and redirects)',\n\t\texample: 'https://app.example.com',\n\t},\n\tregion: {\n\t\tdescription: 'Deployment region',\n\t\texample: 'us-central1',\n\t},\n\tenv: {\n\t\tdescription: 'Environment (dev, staging, prod)',\n\t\texample: 'prod',\n\t},\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction getProjectRoot(): string {\n\treturn process.cwd()\n}\n\nasync function ensureConfigExists(projectRoot: string): Promise<StoredInfraConfig> {\n\tconst config = await loadStoredConfig(projectRoot)\n\tif (!config) {\n\t\tthrow new Error('No infrastructure configuration found. Run `kuckit infra init` first.')\n\t}\n\treturn config\n}\n\nfunction getStackName(config: StoredInfraConfig, env: Environment): string {\n\t// Stack name format: <projectName>-<env>\n\treturn `${config.projectName}-${env}`\n}\n\nasync function getInfraDir(projectRoot: string, config: StoredInfraConfig): Promise<string> {\n\t// If local infra was ejected, use that\n\tif (config.localInfraDir) {\n\t\treturn config.localInfraDir\n\t}\n\n\t// Otherwise, get from provider package\n\tconst packageName = config.providerPackage ?? getProviderPackage(config.provider)\n\tconst provider = await loadProviderFromPackage(packageName, projectRoot)\n\treturn provider.getInfraDir(projectRoot)\n}\n\nasync function selectStack(infraDir: string, stackName: string): Promise<boolean> {\n\treturn selectOrCreateStack(stackName, { cwd: infraDir })\n}\n\nasync function syncToPulumi(\n\tprojectRoot: string,\n\tconfig: StoredInfraConfig,\n\tenv: Environment,\n\tkey: string,\n\tvalue: string\n): Promise<void> {\n\tconst infraDir = await getInfraDir(projectRoot, config)\n\tconst stackName = getStackName(config, env)\n\tconst pulumiOptions: RunPulumiOptions = { cwd: infraDir }\n\n\t// Select the correct stack for this environment\n\tconst stackOk = await selectStack(infraDir, stackName)\n\tif (!stackOk) {\n\t\tthrow new Error(\n\t\t\t`Could not select stack '${stackName}'. Run 'kuckit infra init --env ${env}' first.`\n\t\t)\n\t}\n\n\tawait setPulumiConfig(key, value, pulumiOptions)\n}\n\nasync function getPulumiConfigValue(\n\tprojectRoot: string,\n\tconfig: StoredInfraConfig,\n\tenv: Environment,\n\tkey: string\n): Promise<string | null> {\n\tconst infraDir = await getInfraDir(projectRoot, config)\n\tconst stackName = getStackName(config, env)\n\tconst pulumiOptions: RunPulumiOptions = { cwd: infraDir }\n\n\t// Select the correct stack for this environment\n\tconst stackOk = await selectStack(infraDir, stackName)\n\tif (!stackOk) {\n\t\treturn null\n\t}\n\n\ttry {\n\t\tconst result = await runPulumi(['config', 'get', key], pulumiOptions)\n\t\treturn result.code === 0 ? result.stdout.trim() : null\n\t} catch {\n\t\treturn null\n\t}\n}\n\nasync function getAllPulumiConfig(\n\tprojectRoot: string,\n\tconfig: StoredInfraConfig,\n\tenv: Environment\n): Promise<Record<string, string>> {\n\tconst infraDir = await getInfraDir(projectRoot, config)\n\tconst stackName = getStackName(config, env)\n\tconst pulumiOptions: RunPulumiOptions = { cwd: infraDir }\n\n\t// Select the correct stack for this environment\n\tconst stackOk = await selectStack(infraDir, stackName)\n\tif (!stackOk) {\n\t\treturn {}\n\t}\n\n\ttry {\n\t\tconst result = await runPulumi(['config', '--json'], pulumiOptions)\n\t\tif (result.code === 0 && result.stdout) {\n\t\t\tconst parsed = JSON.parse(result.stdout) as Record<string, { value: string }>\n\t\t\tconst configMap: Record<string, string> = {}\n\t\t\tfor (const [fullKey, data] of Object.entries(parsed)) {\n\t\t\t\t// Strip namespace prefix (e.g., \"kuckit-prod:appUrl\" -> \"appUrl\")\n\t\t\t\tconst key = fullKey.includes(':') ? fullKey.split(':')[1] : fullKey\n\t\t\t\tif (key) {\n\t\t\t\t\tconfigMap[key] = data.value\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn configMap\n\t\t}\n\t\treturn {}\n\t} catch {\n\t\treturn {}\n\t}\n}\n\nasync function unsetPulumiConfig(\n\tprojectRoot: string,\n\tconfig: StoredInfraConfig,\n\tenv: Environment,\n\tkey: string\n): Promise<void> {\n\tconst infraDir = await getInfraDir(projectRoot, config)\n\tconst stackName = getStackName(config, env)\n\tconst pulumiOptions: RunPulumiOptions = { cwd: infraDir }\n\n\t// Select the correct stack for this environment\n\tconst stackOk = await selectStack(infraDir, stackName)\n\tif (!stackOk) {\n\t\tthrow new Error(\n\t\t\t`Could not select stack '${stackName}'. Run 'kuckit infra init --env ${env}' first.`\n\t\t)\n\t}\n\n\tawait runPulumi(['config', 'rm', key], pulumiOptions)\n}\n\n// ============================================================================\n// Commands\n// ============================================================================\n\n/**\n * Set a configuration value\n */\nexport async function infraConfigSet(\n\tkey: string,\n\tvalue: string,\n\toptions: ConfigSetOptions = {}\n): Promise<void> {\n\tconst projectRoot = getProjectRoot()\n\tconst config = await ensureConfigExists(projectRoot)\n\tconst env = (options.env ?? config.env ?? 'dev') as Environment\n\n\t// Handle special keys that are stored in infra.json (environment-independent)\n\tconst localKeys = ['region', 'projectName']\n\tif (localKeys.includes(key)) {\n\t\tif (key === 'region') {\n\t\t\tconfig.region = value\n\t\t} else if (key === 'projectName') {\n\t\t\tconfig.projectName = value\n\t\t}\n\t\tawait saveStoredConfig(projectRoot, config)\n\t\tconsole.log(`✓ Set ${key}=${value} in .kuckit/infra.json`)\n\t\treturn\n\t}\n\n\t// Handle provider-specific config (also environment-independent)\n\tif (key.startsWith('provider.')) {\n\t\tconst providerKey = key.replace('provider.', '')\n\t\tif (isGcpConfig(config) && providerKey === 'gcpProject') {\n\t\t\tconfig.providerConfig.gcpProject = value\n\t\t\tawait saveStoredConfig(projectRoot, config)\n\t\t\tconsole.log(`✓ Set ${key}=${value} in .kuckit/infra.json`)\n\t\t\treturn\n\t\t}\n\t}\n\n\t// All other keys go to Pulumi config (environment-specific)\n\tawait syncToPulumi(projectRoot, config, env, key, value)\n\tconsole.log(`✓ Set ${key}=${value} for env '${env}'`)\n\n\t// Show hint for common keys\n\tif (key === 'appUrl') {\n\t\tconsole.log(`\\nNote: Run 'kuckit infra deploy --env ${env}' to apply this change.`)\n\t}\n}\n\n/**\n * Get a configuration value\n */\nexport async function infraConfigGet(key: string, options: ConfigGetOptions = {}): Promise<void> {\n\tconst projectRoot = getProjectRoot()\n\tconst config = await ensureConfigExists(projectRoot)\n\tconst env = (options.env ?? config.env ?? 'dev') as Environment\n\n\t// Check local config first (environment-independent)\n\tconst localKeys: Record<string, (c: StoredInfraConfig) => string | undefined> = {\n\t\tregion: (c) => c.region,\n\t\tprojectName: (c) => c.projectName,\n\t\tprovider: (c) => c.provider,\n\t\t'provider.gcpProject': (c) => (isGcpConfig(c) ? c.providerConfig.gcpProject : undefined),\n\t}\n\n\tif (key in localKeys) {\n\t\tconst getter = localKeys[key]\n\t\tif (getter) {\n\t\t\tconst value = getter(config)\n\t\t\tif (value !== undefined) {\n\t\t\t\tconsole.log(value)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\t// Try Pulumi config (environment-specific)\n\tconst value = await getPulumiConfigValue(projectRoot, config, env, key)\n\tif (value !== null) {\n\t\tconsole.log(value)\n\t} else {\n\t\tconsole.error(`Config key '${key}' is not set for env '${env}'.`)\n\t\tprocess.exit(1)\n\t}\n}\n\n/**\n * List all configuration values\n */\nexport async function infraConfigList(options: ConfigListOptions = {}): Promise<void> {\n\tconst projectRoot = getProjectRoot()\n\tconst config = await ensureConfigExists(projectRoot)\n\tconst env = (options.env ?? config.env ?? 'dev') as Environment\n\n\t// Gather local config values (shared across environments)\n\tconst localConfig: Record<string, string> = {\n\t\tprovider: config.provider,\n\t\tregion: config.region,\n\t\tprojectName: config.projectName,\n\t}\n\n\t// Add provider-specific config\n\tif (isGcpConfig(config)) {\n\t\tlocalConfig['provider.gcpProject'] = config.providerConfig.gcpProject\n\t}\n\n\t// Get Pulumi config values for this environment\n\tconst pulumiConfig = await getAllPulumiConfig(projectRoot, config, env)\n\n\t// Merge configs\n\tconst allConfig = { ...localConfig, ...pulumiConfig }\n\n\tif (options.json) {\n\t\tconsole.log(JSON.stringify({ env, config: allConfig }, null, 2))\n\t\treturn\n\t}\n\n\t// Pretty print\n\tconsole.log(`\\nInfrastructure Configuration (env: ${env})\\n`)\n\tconsole.log('Shared (.kuckit/infra.json):')\n\tfor (const [key, value] of Object.entries(localConfig)) {\n\t\tconsole.log(` ${key}: ${value}`)\n\t}\n\n\tif (Object.keys(pulumiConfig).length > 0) {\n\t\tconsole.log(`\\nEnvironment '${env}' Config:`)\n\t\tfor (const [key, value] of Object.entries(pulumiConfig)) {\n\t\t\tif (!(key in localConfig)) {\n\t\t\t\tconst desc = KNOWN_CONFIG_KEYS[key]?.description\n\t\t\t\tconsole.log(` ${key}: ${value}${desc ? ` (${desc})` : ''}`)\n\t\t\t}\n\t\t}\n\t} else {\n\t\tconsole.log(`\\nEnvironment '${env}' Config: (none set)`)\n\t}\n\n\tconsole.log('\\nAvailable keys:')\n\tfor (const [key, info] of Object.entries(KNOWN_CONFIG_KEYS)) {\n\t\tif (!(key in allConfig)) {\n\t\t\tconsole.log(` ${key}: ${info.description} (e.g., ${info.example})`)\n\t\t}\n\t}\n\n\tconsole.log(`\\nTip: Use --env to configure other environments (dev, staging, prod)`)\n}\n\n/**\n * Unset a configuration value\n */\nexport async function infraConfigUnset(\n\tkey: string,\n\toptions: ConfigUnsetOptions = {}\n): Promise<void> {\n\tconst projectRoot = getProjectRoot()\n\tconst config = await ensureConfigExists(projectRoot)\n\tconst env = (options.env ?? config.env ?? 'dev') as Environment\n\n\t// Cannot unset required local keys\n\tconst requiredKeys = ['provider', 'region', 'projectName']\n\tif (requiredKeys.includes(key)) {\n\t\tthrow new Error(`Cannot unset required key '${key}'.`)\n\t}\n\n\t// Unset from Pulumi config for this environment\n\tawait unsetPulumiConfig(projectRoot, config, env, key)\n\tconsole.log(`✓ Unset ${key} for env '${env}'`)\n}\n","#!/usr/bin/env node\nimport { program } from 'commander'\nimport { generateModule } from './commands/generate-module.js'\nimport { addModule } from './commands/add-module.js'\nimport { discoverModules } from './commands/discover-module.js'\nimport { doctor } from './commands/doctor.js'\nimport { search } from './commands/search.js'\nimport { dbPush, dbGenerate, dbStudio, type DbOptions } from './commands/db.js'\nimport { registerAuthCommands } from './commands/auth.js'\nimport { requireAuth } from './lib/require-auth.js'\nimport {\n\tinfraInit,\n\tinfraDeploy,\n\tinfraUp,\n\tinfraEject,\n\tinfraDestroy,\n\tinfraRepair,\n\tinfraDbPush,\n\tinfraDbMigrate,\n\tinfraRollback,\n\tinfraLogs,\n\tinfraStatus,\n\tinfraOutputs,\n\ttype InitOptions,\n\ttype DeployOptions,\n\ttype UpOptions,\n\ttype EjectOptions,\n\ttype DestroyOptions,\n\ttype RepairOptions,\n\ttype DbPushOptions,\n\ttype DbMigrateOptions,\n\ttype RollbackOptions,\n\ttype LogsOptions,\n\ttype StatusOptions,\n\ttype OutputsOptions,\n\tinfraConfigSet,\n\tinfraConfigGet,\n\tinfraConfigList,\n\tinfraConfigUnset,\n\ttype ConfigSetOptions,\n\ttype ConfigGetOptions,\n\ttype ConfigListOptions,\n\ttype ConfigUnsetOptions,\n} from './commands/infra/index.js'\n\nprogram.name('kuckit').description('CLI tools for Kuckit SDK module development').version('0.1.0')\n\nprogram\n\t.command('generate')\n\t.description('Generate Kuckit resources')\n\t.command('module <name>')\n\t.description('Generate a new Kuckit module')\n\t.option('-o, --org <org>', 'Organization scope for package name', '')\n\t.option('-d, --dir <directory>', 'Target directory', 'packages')\n\t.action(async (name: string, options: { org: string; dir: string }) => {\n\t\trequireAuth()\n\t\tawait generateModule(name, options)\n\t})\n\nprogram\n\t.command('add <package>')\n\t.description('Install and wire a Kuckit module')\n\t.option('--skip-install', 'Skip package installation', false)\n\t.action(async (packageName: string, options: { skipInstall: boolean }) => {\n\t\trequireAuth()\n\t\tawait addModule(packageName, options)\n\t})\n\nprogram\n\t.command('discover')\n\t.description('Scan node_modules for installed Kuckit modules')\n\t.option('--json', 'Output as JSON (non-interactive)', false)\n\t.option('--no-interactive', 'Disable interactive prompts')\n\t.action(async (options: { json: boolean; interactive: boolean }) => {\n\t\trequireAuth()\n\t\tawait discoverModules(options)\n\t})\n\nprogram\n\t.command('doctor')\n\t.description('Check Kuckit setup and validate module configuration')\n\t.option('--json', 'Output as JSON', false)\n\t.action(async (options: { json: boolean }) => {\n\t\tawait doctor(options)\n\t})\n\nprogram\n\t.command('search <keyword>')\n\t.description('Search npm registry for Kuckit modules')\n\t.option('--json', 'Output as JSON', false)\n\t.option('-l, --limit <number>', 'Maximum results to return', '10')\n\t.action(async (keyword: string, options: { json: boolean; limit: string }) => {\n\t\tawait search(keyword, { json: options.json, limit: parseInt(options.limit, 10) })\n\t})\n\n// Database commands\nconst db = program.command('db').description('Database schema management for module-owned schemas')\n\ndb.command('push')\n\t.description('Push all module schemas to database')\n\t.option('--url <url>', 'Database connection URL')\n\t.action(async (options: DbOptions) => {\n\t\trequireAuth()\n\t\tawait dbPush(options)\n\t})\n\ndb.command('generate')\n\t.description('Generate migration files for module schemas')\n\t.option('--url <url>', 'Database connection URL')\n\t.action(async (options: DbOptions) => {\n\t\trequireAuth()\n\t\tawait dbGenerate(options)\n\t})\n\ndb.command('studio')\n\t.description('Open Drizzle Studio with all module schemas')\n\t.option('--url <url>', 'Database connection URL')\n\t.action(async (options: DbOptions) => {\n\t\trequireAuth()\n\t\tawait dbStudio(options)\n\t})\n\n// Auth commands\nregisterAuthCommands(program)\n\n// Infrastructure commands\nconst infra = program.command('infra').description('Infrastructure deployment and management')\n\ninfra\n\t.command('up')\n\t.description('Initialize (if needed) and deploy infrastructure in one command')\n\t.option('-p, --provider <provider>', 'Cloud provider (gcp)', 'gcp')\n\t.option('--project <id>', 'GCP project ID')\n\t.option('--region <region>', 'Deployment region', 'us-central1')\n\t.option('-e, --env <env>', 'Environment (dev, prod)', 'dev')\n\t.option('--preview', 'Preview changes without applying', false)\n\t.option('-y, --yes', 'Skip confirmation prompts', false)\n\t.action(async (options: UpOptions) => {\n\t\trequireAuth()\n\t\tawait infraUp(options)\n\t})\n\ninfra\n\t.command('init')\n\t.description('Initialize base infrastructure (no Docker required)')\n\t.option('-p, --provider <provider>', 'Cloud provider (gcp)', 'gcp')\n\t.option('--project <id>', 'GCP project ID')\n\t.option('--region <region>', 'Deployment region', 'us-central1')\n\t.option('-e, --env <env>', 'Environment (dev, prod)', 'dev')\n\t.option('-y, --yes', 'Skip confirmation prompts', false)\n\t.action(async (options: InitOptions) => {\n\t\trequireAuth()\n\t\tawait infraInit(options)\n\t})\n\ninfra\n\t.command('deploy')\n\t.description('Build and deploy application to Cloud Run')\n\t.option('-e, --env <env>', 'Environment (dev, prod)', 'dev')\n\t.option('--preview', 'Preview changes without applying', false)\n\t.option('--skip-build', 'Use existing image (skip Docker build)', false)\n\t.option('--image <url>', 'Use specific image URL')\n\t.option('-y, --yes', 'Skip confirmation prompts', false)\n\t.action(async (options: DeployOptions) => {\n\t\trequireAuth()\n\t\tawait infraDeploy(options)\n\t})\n\ninfra\n\t.command('eject')\n\t.description('Eject provider infrastructure code to local project for customization')\n\t.option('-d, --dir <directory>', 'Target directory for ejected code', 'infra')\n\t.option('--force', 'Overwrite existing directory', false)\n\t.action(async (options: EjectOptions) => {\n\t\trequireAuth()\n\t\tawait infraEject(options)\n\t})\n\ninfra\n\t.command('destroy')\n\t.description('Destroy infrastructure resources')\n\t.option('-e, --env <env>', 'Environment (dev, prod)', 'dev')\n\t.option('--app-only', 'Only destroy Cloud Run, keep DB/Redis', false)\n\t.option('--force', 'Skip confirmation prompt', false)\n\t.action(async (options: DestroyOptions) => {\n\t\trequireAuth()\n\t\tawait infraDestroy(options)\n\t})\n\ninfra\n\t.command('repair')\n\t.description('Repair infrastructure state issues')\n\t.option('-e, --env <env>', 'Environment (dev, prod)', 'dev')\n\t.option('--refresh', 'Refresh state from cloud provider', false)\n\t.option('--cancel', 'Cancel any stuck operations', false)\n\t.option('--force', 'Force repair without confirmation', false)\n\t.action(async (options: RepairOptions) => {\n\t\trequireAuth()\n\t\tawait infraRepair(options)\n\t})\n\ninfra\n\t.command('db:push')\n\t.description('Push schema directly to Cloud SQL (dev/fresh databases)')\n\t.option('-e, --env <env>', 'Environment (dev, prod)', 'dev')\n\t.option('--force', 'Skip confirmation for destructive changes', false)\n\t.option('--public-ip', 'Use public IP (default: private IP, requires VPC access)', false)\n\t.action(async (options: DbPushOptions) => {\n\t\trequireAuth()\n\t\tawait infraDbPush(options)\n\t})\n\ninfra\n\t.command('db:migrate')\n\t.description('Run database migrations via Cloud SQL Auth Proxy')\n\t.option('-e, --env <env>', 'Environment (dev, prod)', 'dev')\n\t.option('--dry-run', 'Show migrations without applying', false)\n\t.option('--rollback', 'Rollback the last migration', false)\n\t.option('--public-ip', 'Use public IP (default: private IP, requires VPC access)', false)\n\t.action(async (options: DbMigrateOptions) => {\n\t\trequireAuth()\n\t\tawait infraDbMigrate(options)\n\t})\n\ninfra\n\t.command('rollback')\n\t.description('Rollback Cloud Run service to a previous revision')\n\t.option('-e, --env <env>', 'Environment (dev, prod)', 'dev')\n\t.option('--revision <name>', 'Specific revision name to rollback to')\n\t.option('--previous', 'Rollback to the previous revision', false)\n\t.action(async (options: RollbackOptions) => {\n\t\trequireAuth()\n\t\tawait infraRollback(options)\n\t})\n\ninfra\n\t.command('logs')\n\t.description('View Cloud Run service logs')\n\t.option('-e, --env <env>', 'Environment (dev, prod)', 'dev')\n\t.option('-f, --follow', 'Stream logs in real-time', false)\n\t.option('--since <duration>', 'Show logs since duration (e.g., 1h, 30m)', '1h')\n\t.option('--severity <level>', 'Filter by severity (DEBUG, INFO, WARNING, ERROR)')\n\t.action(async (options: LogsOptions) => {\n\t\trequireAuth()\n\t\tawait infraLogs(options)\n\t})\n\ninfra\n\t.command('status')\n\t.description('Show current infrastructure state')\n\t.option('-e, --env <env>', 'Environment (dev, prod)', 'dev')\n\t.option('--json', 'Output as JSON', false)\n\t.action(async (options: StatusOptions) => {\n\t\trequireAuth()\n\t\tawait infraStatus(options)\n\t})\n\ninfra\n\t.command('outputs')\n\t.description('Display infrastructure outputs (URLs, connection strings)')\n\t.option('-e, --env <env>', 'Environment (dev, prod)', 'dev')\n\t.option('--json', 'Output as JSON', false)\n\t.action(async (options: OutputsOptions) => {\n\t\trequireAuth()\n\t\tawait infraOutputs(options)\n\t})\n\n// Config subcommands\nconst configCmd = infra.command('config').description('Manage infrastructure configuration')\n\nconfigCmd\n\t.command('set <key> <value>')\n\t.description('Set a configuration value')\n\t.option('-e, --env <env>', 'Environment (dev, prod)', 'dev')\n\t.action(async (key: string, value: string, options: ConfigSetOptions) => {\n\t\trequireAuth()\n\t\tawait infraConfigSet(key, value, options)\n\t})\n\nconfigCmd\n\t.command('get <key>')\n\t.description('Get a configuration value')\n\t.option('-e, --env <env>', 'Environment (dev, prod)', 'dev')\n\t.action(async (key: string, options: ConfigGetOptions) => {\n\t\trequireAuth()\n\t\tawait infraConfigGet(key, options)\n\t})\n\nconfigCmd\n\t.command('list')\n\t.description('List all configuration values')\n\t.option('-e, --env <env>', 'Environment (dev, prod)', 'dev')\n\t.option('--json', 'Output as JSON', false)\n\t.action(async (options: ConfigListOptions) => {\n\t\trequireAuth()\n\t\tawait infraConfigList(options)\n\t})\n\nconfigCmd\n\t.command('unset <key>')\n\t.description('Remove a configuration value')\n\t.option('-e, --env <env>', 'Environment (dev, prod)', 'dev')\n\t.action(async (key: string, options: ConfigUnsetOptions) => {\n\t\trequireAuth()\n\t\tawait infraConfigUnset(key, options)\n\t})\n\nprogram.parse()\n"],"mappings":"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"}