{"version":3,"sources":["../src/index.ts","../src/cli.ts","../src/detect.ts","../src/features/add-ai.ts","../src/features/add-better-auth.ts","../src/utils/cli-styling.ts","../src/features/add-clerk.ts","../src/features/add-drizzle.ts","../src/features/add-i18n.ts","../src/features/add-pwa.ts","../src/features/add-supabase.ts","../src/features/add-testing.ts","../src/utils/integration.ts"],"sourcesContent":["/**\n * AT3 Stack Kit\n * CLI tool to upgrade existing projects to AT3 Stack with AI, edge, and modern features\n */\n\n// CLI utilities\nexport { program } from './cli.js'\n// Core detection and analysis\nexport * from './detect.js'\n// Feature addition modules\nexport * from './features/index.js'\n","#!/usr/bin/env node\n\n/**\n * AT3 Stack Kit CLI\n * Upgrade existing projects to AT3 Stack with AI, edge, and modern features\n */\n\nimport {\n  cancel,\n  confirm,\n  intro,\n  isCancel,\n  multiselect,\n  note,\n  outro,\n  select,\n  spinner,\n} from '@clack/prompts'\nimport chalk from 'chalk'\nimport { program } from 'commander'\nimport { detect as detectPackageManager } from 'detect-package-manager'\nimport { existsSync, readFileSync } from 'fs-extra'\nimport { join } from 'path'\nimport { detectProjectType, type ProjectType } from './detect.js'\nimport { addAI, addBetterAuth, addClerk, addDrizzle, addI18n, addPWA, addSupabase, addTesting } from './features/index.js'\nimport { colors, header, style, symbols } from './utils/cli-styling.js'\nimport { getPostMigrationWorkflow, suggestAT3Tools, updateAT3Config } from './utils/integration.js'\nimport spawn from 'cross-spawn'\n\nconst features = [\n  {\n    id: 'ai-custom',\n    name: 'AI Integration (Custom)',\n    description: 'Add custom AI integration with multiple providers',\n    value: 'ai-custom',\n  },\n  {\n    id: 'ai-vercel',\n    name: 'AI Integration (Vercel SDK)',\n    description: 'Add Vercel AI SDK for streaming responses',\n    value: 'ai-vercel',\n  },\n  {\n    id: 'supabase',\n    name: 'Supabase',\n    description: 'Add Supabase for database, auth, and edge functions',\n    value: 'supabase',\n  },\n  {\n    id: 'drizzle',\n    name: 'Drizzle ORM + PostgreSQL',\n    description: 'Add Drizzle ORM with generic PostgreSQL support',\n    value: 'drizzle',\n  },\n  {\n    id: 'clerk',\n    name: 'Clerk Auth',\n    description: 'Add Clerk authentication',\n    value: 'clerk',\n  },\n  {\n    id: 'better-auth',\n    name: 'Better Auth',\n    description: 'Add Better Auth (Self-hosted auth)',\n    value: 'better-auth',\n  },\n  {\n    id: 'pwa',\n    name: 'PWA Support',\n    description: 'Add Progressive Web App features',\n    value: 'pwa',\n  },\n  {\n    id: 'i18n',\n    name: 'Internationalization',\n    description: 'Add next-intl for multi-language support',\n    value: 'i18n',\n  },\n  {\n    id: 'testing',\n    name: 'Testing Suite',\n    description: 'Add Vitest and Playwright for comprehensive testing',\n    value: 'testing',\n  },\n] as const\n\ntype FeatureId = (typeof features)[number]['value']\n\nasync function main() {\n  console.clear()\n\n  intro(style.title('AT3 Stack Kit'))\n\n  // Detect current project\n  const s = spinner()\n  s.start('Analyzing your project...')\n\n  const projectType = await detectProjectType(process.cwd())\n  const packageManager = await detectPackageManager().catch(() => 'npm')\n\n  s.stop(\n    `${symbols.success} Detected: ${style.value(getProjectTypeLabel(projectType))} project using ${style.accent(packageManager)}`\n  )\n\n  if (projectType === 'unknown') {\n    cancel(\n      \"This doesn't appear to be a supported project type. AT3 Kit supports Next.js, T3, and React projects.\"\n    )\n    process.exit(1)\n  }\n\n  // Show current project info\n  note(getProjectInfo(projectType), 'Current Project')\n\n  // Select features to add\n  const selectedFeatures = await multiselect({\n    message: 'Which features would you like to add?',\n    options: features.map((feature) => ({\n      value: feature.value,\n      label: feature.name,\n      hint: feature.description,\n    })),\n    required: true,\n  })\n\n  if (isCancel(selectedFeatures) || selectedFeatures.length === 0) {\n    cancel('No features selected.')\n    process.exit(0)\n  }\n\n  // Confirm installation\n  const shouldInstall = await confirm({\n    message: `Install dependencies with ${packageManager}?`,\n    initialValue: true,\n  })\n\n  if (isCancel(shouldInstall)) {\n    cancel('Operation cancelled.')\n    process.exit(0)\n  }\n\n  // Apply features\n  const addSpinner = spinner()\n\n  try {\n    for (const featureId of selectedFeatures as FeatureId[]) {\n      addSpinner.start(`Adding ${getFeatureName(featureId)}...`)\n\n      switch (featureId) {\n        case 'ai-custom':\n          await addAI('custom', process.cwd())\n          break\n        case 'ai-vercel':\n          await addAI('vercel', process.cwd())\n          break\n        case 'supabase':\n          await addSupabase(process.cwd())\n          break\n        case 'drizzle':\n          await addDrizzle(process.cwd())\n          break\n        case 'clerk':\n          await addClerk(process.cwd())\n          break\n        case 'better-auth':\n          await addBetterAuth(process.cwd())\n          break\n        case 'pwa':\n          await addPWA(process.cwd())\n          break\n        case 'i18n':\n          await addI18n(process.cwd())\n          break\n        case 'testing':\n          await addTesting(process.cwd())\n          break\n      }\n\n      addSpinner.stop(`✓ Added ${getFeatureName(featureId)}`)\n    }\n\n    if (shouldInstall) {\n      addSpinner.start(`Installing dependencies with ${packageManager}...`)\n\n      await new Promise<void>((resolve, reject) => {\n        const child = spawn(packageManager, ['install'], {\n          cwd: process.cwd(),\n          stdio: 'ignore',\n        })\n\n        child.on('close', (code) => {\n          if (code === 0) {\n            resolve()\n          } else {\n            reject(new Error(`Installation failed with code ${code}`))\n          }\n        })\n      })\n\n      addSpinner.stop('✓ Dependencies installed')\n    }\n\n    // Update AT3 configuration and get suggestions\n    const projectInfo = { type: projectType, packageManager } as any // Simplified for now\n    const addedFeatures = selectedFeatures // This would be the actual added features\n\n    updateAT3Config(process.cwd(), addedFeatures)\n    const toolSuggestions = suggestAT3Tools(projectInfo, addedFeatures)\n    const workflows = getPostMigrationWorkflow(projectInfo, addedFeatures)\n\n    outro(style.success('🎉 Your project has been upgraded to AT3 Stack!'))\n\n    const nextSteps = [\n      'Review the added files and configurations',\n      'Update your .env.local with required API keys',\n      `Run ${style.command(packageManager + ' dev')} to test your upgraded project`,\n      ...workflows,\n    ]\n\n    note(\n      `\n${header.section('Next steps:')}\n${nextSteps.map((step, i) => `  ${colors.muted(`${i + 1}.`)} ${step}`).join('\\n')}\n\n${colors.primary('Documentation:')}\n  ${colors.muted('•')} AT3 Stack Guide: https://at3-stack.dev/docs\n  ${colors.muted('•')} Feature Guides: https://at3-stack.dev/docs/features\n\n${\n  toolSuggestions.length > 0\n    ? `${colors.primary('AT3 Ecosystem:')}\n  ${toolSuggestions.map((s) => `${colors.muted('•')} ${s}`).join('\\n  ')}\n\n`\n    : ''\n}${colors.primary('Need help?')}\n  ${colors.muted('•')} GitHub Issues: https://github.com/entro314-labs/at3-stack-kit/issues\n  ${colors.muted('•')} Discord: https://discord.gg/at3-stack\n      `,\n      'Welcome to AT3!'\n    )\n  } catch (error) {\n    addSpinner.stop('Error occurred')\n    console.error(chalk.red('Error upgrading project:'), error)\n    process.exit(1)\n  }\n}\n\nfunction getProjectTypeLabel(type: ProjectType): string {\n  switch (type) {\n    case 'nextjs':\n      return 'Next.js'\n    case 't3':\n      return 'T3 Stack'\n    case 'react':\n      return 'React'\n    case 'unknown':\n      return 'Unknown'\n    default:\n      return 'Unknown'\n  }\n}\n\nfunction getProjectInfo(type: ProjectType): string {\n  const packageJsonPath = join(process.cwd(), 'package.json')\n\n  if (!existsSync(packageJsonPath)) {\n    return 'No package.json found'\n  }\n\n  const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'))\n  const deps = Object.keys({ ...packageJson.dependencies, ...packageJson.devDependencies })\n\n  let info = `Project: ${packageJson.name || 'unnamed'}\\n`\n  info += `Type: ${getProjectTypeLabel(type)}\\n`\n\n  // Show key dependencies\n  const keyDeps = ['next', 'react', 'typescript', 'tailwindcss']\n  const foundDeps = keyDeps.filter((dep) => deps.some((d) => d.includes(dep)))\n\n  if (foundDeps.length > 0) {\n    info += `Dependencies: ${foundDeps.join(', ')}`\n  }\n\n  return info\n}\n\nfunction getFeatureName(id: FeatureId): string {\n  return features.find((f) => f.value === id)?.name || id\n}\n\n// CLI setup\nprogram\n  .name('at3-kit')\n  .description('Upgrade existing projects to AT3 Stack')\n  .version('0.1.0')\n  .option('-d, --dry-run', 'Show what would be changed without making changes')\n  .option('--no-install', 'Skip installing dependencies')\n  .action(async (options: { dryRun?: boolean; install?: boolean }) => {\n    await main()\n  })\n\n// Subcommands\nprogram\n  .command('add <feature>')\n  .description('Add a specific feature to your project')\n  .option('--no-install', 'Skip installing dependencies')\n  .action(async (feature: string, options: { install?: boolean }) => {\n    const validFeatures = features.map((f) => f.value)\n\n    if (!validFeatures.includes(feature as FeatureId)) {\n      console.error(chalk.red(`Unknown feature: ${feature}`))\n      console.log(chalk.dim(`Valid features: ${validFeatures.join(', ')}`))\n      process.exit(1)\n    }\n\n    // Add single feature without prompts\n    console.log(chalk.blue(`Adding ${getFeatureName(feature as FeatureId)}...`))\n\n    try {\n      switch (feature) {\n        case 'ai-custom':\n          await addAI('custom', process.cwd())\n          break\n        case 'ai-vercel':\n          await addAI('vercel', process.cwd())\n          break\n        case 'supabase':\n          await addSupabase(process.cwd())\n          break\n        case 'drizzle':\n          await addDrizzle(process.cwd())\n          break\n        case 'clerk':\n          await addClerk(process.cwd())\n          break\n        case 'better-auth':\n          await addBetterAuth(process.cwd())\n          break\n        case 'pwa':\n          await addPWA(process.cwd())\n          break\n        case 'i18n':\n          await addI18n(process.cwd())\n          break\n        case 'testing':\n          await addTesting(process.cwd())\n          break\n      }\n\n      if (options.install !== false) {\n        console.log(chalk.blue('Installing dependencies...'))\n        const packageManager = await detectPackageManager().catch(() => 'npm')\n\n        await new Promise<void>((resolve, reject) => {\n          const child = spawn(packageManager, ['install'], {\n            cwd: process.cwd(),\n            stdio: 'inherit',\n          })\n\n          child.on('close', (code) => {\n            if (code === 0) {\n              resolve()\n            } else {\n              reject(new Error(`Installation failed with code ${code}`))\n            }\n          })\n        })\n      }\n\n      console.log(chalk.green(`✓ Successfully added ${getFeatureName(feature as FeatureId)}`))\n    } catch (error) {\n      console.error(chalk.red('Failed to add feature:'), error)\n      process.exit(1)\n    }\n  })\n\nprogram\n  .command('detect')\n  .description('Detect current project type and show available upgrades')\n  .action(async () => {\n    const projectType = await detectProjectType(process.cwd())\n    const packageManager = await detectPackageManager().catch(() => 'npm')\n\n    console.log(chalk.green('Project Analysis:'))\n    console.log(`  Type: ${getProjectTypeLabel(projectType)}`)\n    console.log(`  Package Manager: ${packageManager}`)\n    console.log('\\n' + getProjectInfo(projectType))\n  })\n\n// Parse command line arguments (run as CLI)\nprogram.parse()\n\nexport { program }\n","/**\n * Project detection utilities for AT3 Stack Kit\n * Aligned with at3-toolkit's sophisticated detection system\n */\n\nimport { detect as detectPackageManager } from 'detect-package-manager'\nimport { existsSync, readdirSync, readFileSync } from 'fs-extra'\nimport { join } from 'path'\n\nexport type ProjectType =\n  | 'ait3e'\n  | 'nextjs'\n  | 't3'\n  | 'react'\n  | 'vue'\n  | 'nuxt'\n  | 'vite'\n  | 'node'\n  | 'webpack'\n  | 'unknown'\n\nexport type AuthProvider = 'supabase' | 'clerk' | 'better-auth' | 'next-auth' | 'lucia' | 'none'\n\nexport interface DependencyInfo {\n  name: string\n  version: string\n  type: 'dependency' | 'devDependency' | 'peerDependency'\n  current?: string // Installed version\n  latest?: string // Latest available version\n}\n\nexport interface TestingInfo {\n  unit: 'vitest' | 'jest' | 'none'\n  e2e: 'playwright' | 'cypress' | 'none'\n}\n\nexport interface ProjectInfo {\n  path: string\n  type: ProjectType\n  hasNextjs: boolean\n  hasReact: boolean\n  hasVue: boolean\n  hasTypeScript: boolean\n  hasTailwind: boolean\n  hasTRPC: boolean\n  hasSupabase: boolean\n  hasAI: boolean\n  hasPWA: boolean\n  hasI18n: boolean\n  hasVitest: boolean\n  hasPlaywright: boolean\n  hasEslint: boolean\n  hasPrettier: boolean\n  hasBiome: boolean\n  hasEdgeRuntime: boolean\n  hasVectorDB: boolean\n  // Extended detection\n  hasDrizzle: boolean\n  hasPrisma: boolean\n  authProvider: AuthProvider\n  testing: TestingInfo\n  packageManager: 'npm' | 'pnpm' | 'yarn' | 'bun'\n  dependencies: DependencyInfo[]\n  configFiles: string[]\n}\n\n/**\n * Detect project type based on dependencies and file structure\n * Enhanced with comprehensive type detection from at3-toolkit\n */\nexport async function detectProjectType(projectPath: string): Promise<ProjectType> {\n  const packageJsonPath = join(projectPath, 'package.json')\n\n  if (!existsSync(packageJsonPath)) {\n    return 'unknown'\n  }\n\n  try {\n    const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'))\n    const deps = { ...packageJson.dependencies, ...packageJson.devDependencies }\n\n    // Check for AIT3E stack (AI + T3 + Edge)\n    const hasAI =\n      deps.ai || deps['@ai-sdk/openai'] || deps['@ai-sdk/anthropic'] || deps['@ai-sdk/google']\n    const hasSupabase = deps['@supabase/supabase-js'] || deps['@supabase/ssr']\n    const hasNextJS = deps.next\n    const hasTailwind = deps.tailwindcss\n    const hasTypeScript = deps.typescript || existsSync(join(projectPath, 'tsconfig.json'))\n\n    if (hasAI && hasSupabase && hasNextJS && (hasTailwind || hasTypeScript)) {\n      return 'ait3e'\n    }\n\n    // Check for T3 stack (Next.js + tRPC + Prisma/Drizzle)\n    if (deps.next && deps['@trpc/server']) {\n      if (deps.prisma || deps['@prisma/client'] || deps['drizzle-orm']) {\n        return 't3'\n      }\n    }\n\n    // Check for Next.js\n    if (deps.next) return 'nextjs'\n\n    // Check for Nuxt\n    if (deps.nuxt || deps['@nuxt/core']) return 'nuxt'\n\n    // Check for Vue\n    if (deps.vue) return 'vue'\n\n    // Check for React\n    if (deps.react) return 'react'\n\n    // Check for Vite\n    if (deps.vite) return 'vite'\n\n    // Check for Webpack\n    if (deps.webpack) return 'webpack'\n\n    // Default to Node.js\n    return 'node'\n  } catch (error) {\n    return 'unknown'\n  }\n}\n\n/**\n * Get comprehensive project information\n * Enhanced with sophisticated dependency analysis from at3-toolkit\n */\nexport async function analyzeProject(projectPath: string): Promise<ProjectInfo> {\n  if (!existsSync(projectPath)) {\n    throw new Error(`Project path does not exist: ${projectPath}`)\n  }\n\n  const packageJsonPath = join(projectPath, 'package.json')\n  if (!existsSync(packageJsonPath)) {\n    throw new Error('No package.json found. This does not appear to be a Node.js project.')\n  }\n\n  const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'))\n\n  // Use sophisticated package manager detection with fallback\n  let packageManager: ProjectInfo['packageManager'] = 'npm'\n  try {\n    packageManager = (await detectPackageManager({ cwd: projectPath })) as any\n  } catch {\n    // Fallback to file-based detection\n    if (existsSync(join(projectPath, 'pnpm-lock.yaml'))) packageManager = 'pnpm'\n    else if (existsSync(join(projectPath, 'yarn.lock'))) packageManager = 'yarn'\n    else if (existsSync(join(projectPath, 'bun.lockb'))) packageManager = 'bun'\n  }\n\n  // Analyze dependencies with detailed structure\n  const dependencies = await analyzeDependencies(packageJson, projectPath)\n  const configFiles = findConfigFiles(projectPath)\n\n  // Feature detection\n  const hasTypeScript = hasTypeScriptSupport(projectPath, dependencies)\n  const hasNextjs = hasDependency(dependencies, 'next')\n  const hasReact = hasDependency(dependencies, 'react')\n  const hasVue = hasDependency(dependencies, 'vue')\n  const hasTailwind = hasDependency(dependencies, 'tailwindcss')\n  const hasTRPC = detectTRPC(dependencies)\n  const hasEslint = hasDependency(dependencies, 'eslint')\n  const hasPrettier = hasDependency(dependencies, 'prettier')\n  const hasBiome = hasDependency(dependencies, '@biomejs/biome')\n\n  // AT3-specific features\n  const hasAI = detectAISupport(dependencies)\n  const hasSupabase = detectSupabase(dependencies, projectPath)\n  const hasEdgeRuntime = detectEdgeRuntime(projectPath)\n  const hasVectorDB = hasSupabaseVectorConfig(projectPath)\n  const hasPWA = detectPWA(dependencies, projectPath)\n  const hasI18n = detectI18n(dependencies, projectPath)\n\n  // Database detection\n  const hasDrizzle = detectDrizzle(dependencies, projectPath)\n  const hasPrisma = detectPrisma(dependencies, projectPath)\n\n  // Auth detection\n  const authProvider = detectAuthProvider(dependencies, projectPath)\n\n  // Testing detection\n  const testing = detectTesting(dependencies)\n  const hasVitest = testing.unit === 'vitest'\n  const hasPlaywright = testing.e2e === 'playwright'\n\n  return {\n    path: projectPath,\n    type: await detectProjectType(projectPath),\n    hasNextjs,\n    hasReact,\n    hasVue,\n    hasTypeScript,\n    hasTailwind,\n    hasTRPC,\n    hasSupabase,\n    hasAI,\n    hasPWA,\n    hasI18n,\n    hasVitest,\n    hasPlaywright,\n    hasEslint,\n    hasPrettier,\n    hasBiome,\n    hasEdgeRuntime,\n    hasVectorDB,\n    hasDrizzle,\n    hasPrisma,\n    authProvider,\n    testing,\n    packageManager,\n    dependencies,\n    configFiles,\n  }\n}\n\n/**\n * Analyze dependencies with installed version info\n */\nasync function analyzeDependencies(\n  packageJson: any,\n  projectPath: string\n): Promise<DependencyInfo[]> {\n  const deps: DependencyInfo[] = []\n\n  // Production dependencies\n  if (packageJson.dependencies) {\n    for (const [name, version] of Object.entries(packageJson.dependencies)) {\n      const info: DependencyInfo = {\n        name,\n        version: version as string,\n        type: 'dependency',\n      }\n\n      // Try to get installed version\n      try {\n        const installedPkgPath = join(projectPath, 'node_modules', name, 'package.json')\n        if (existsSync(installedPkgPath)) {\n          const installedPkg = JSON.parse(readFileSync(installedPkgPath, 'utf-8'))\n          info.current = installedPkg.version\n        }\n      } catch {\n        // Ignore\n      }\n\n      deps.push(info)\n    }\n  }\n\n  // Development dependencies\n  if (packageJson.devDependencies) {\n    for (const [name, version] of Object.entries(packageJson.devDependencies)) {\n      const info: DependencyInfo = {\n        name,\n        version: version as string,\n        type: 'devDependency',\n      }\n\n      try {\n        const installedPkgPath = join(projectPath, 'node_modules', name, 'package.json')\n        if (existsSync(installedPkgPath)) {\n          const installedPkg = JSON.parse(readFileSync(installedPkgPath, 'utf-8'))\n          info.current = installedPkg.version\n        }\n      } catch {\n        // Ignore\n      }\n\n      deps.push(info)\n    }\n  }\n\n  // Peer dependencies\n  if (packageJson.peerDependencies) {\n    for (const [name, version] of Object.entries(packageJson.peerDependencies)) {\n      deps.push({\n        name,\n        version: version as string,\n        type: 'peerDependency',\n      })\n    }\n  }\n\n  return deps\n}\n\n/**\n * Find configuration files in the project\n */\nfunction findConfigFiles(projectPath: string): string[] {\n  const configFiles: string[] = []\n\n  const commonConfigFiles = [\n    // TypeScript\n    'tsconfig.json',\n    'tsconfig.build.json',\n    'tsconfig.test.json',\n\n    // Next.js\n    'next.config.js',\n    'next.config.ts',\n    'next.config.mjs',\n    'next-env.d.ts',\n\n    // Tailwind\n    'tailwind.config.js',\n    'tailwind.config.ts',\n    'tailwind.config.mjs',\n    'postcss.config.js',\n    'postcss.config.mjs',\n\n    // Linting\n    '.eslintrc.js',\n    '.eslintrc.json',\n    '.eslintrc.yml',\n    '.eslintrc.yaml',\n    'eslint.config.js',\n    'eslint.config.mjs',\n    '.prettierrc',\n    '.prettierrc.js',\n    '.prettierrc.json',\n    'biome.json',\n    'biome.jsonc',\n\n    // Testing\n    'vitest.config.ts',\n    'vitest.config.js',\n    'vitest.config.mts',\n    'jest.config.js',\n    'jest.config.ts',\n    'playwright.config.ts',\n    'cypress.config.js',\n    'cypress.config.ts',\n\n    // Build tools\n    'vite.config.ts',\n    'vite.config.js',\n    'webpack.config.js',\n    'rollup.config.js',\n    'turbo.json',\n\n    // Database\n    'drizzle.config.ts',\n    'drizzle.config.js',\n    'prisma/schema.prisma',\n\n    // Environment\n    '.env',\n    '.env.local',\n    '.env.example',\n    '.env.development',\n    '.env.production',\n\n    // Other\n    '.gitignore',\n    'README.md',\n    'package.json',\n    'pnpm-workspace.yaml',\n    'vercel.json',\n    'netlify.toml',\n  ]\n\n  commonConfigFiles.forEach((file) => {\n    if (existsSync(join(projectPath, file))) {\n      configFiles.push(file)\n    }\n  })\n\n  // Check for Supabase config\n  if (existsSync(join(projectPath, 'supabase', 'config.toml'))) {\n    configFiles.push('supabase/config.toml')\n  }\n\n  return configFiles\n}\n\n/**\n * Check if TypeScript is supported\n */\nfunction hasTypeScriptSupport(projectPath: string, dependencies: DependencyInfo[]): boolean {\n  return existsSync(join(projectPath, 'tsconfig.json')) || hasDependency(dependencies, 'typescript')\n}\n\n/**\n * Check if a dependency exists\n */\nfunction hasDependency(dependencies: DependencyInfo[], name: string): boolean {\n  return dependencies.some((dep) => dep.name === name)\n}\n\n/**\n * Detect AI SDK support\n */\nfunction detectAISupport(dependencies: DependencyInfo[]): boolean {\n  const aiDeps = [\n    'ai',\n    '@ai-sdk/openai',\n    '@ai-sdk/anthropic',\n    '@ai-sdk/google',\n    '@ai-sdk/azure',\n    '@ai-sdk/mistral',\n    '@ai-sdk/cohere',\n    'openai',\n    '@anthropic-ai/sdk',\n    '@google/generative-ai',\n    'langchain',\n    '@langchain/core',\n    'llamaindex',\n  ]\n\n  return aiDeps.some((dep) => hasDependency(dependencies, dep))\n}\n\n/**\n * Detect Supabase usage\n */\nfunction detectSupabase(dependencies: DependencyInfo[], projectPath: string): boolean {\n  const hasSupabaseDeps =\n    hasDependency(dependencies, '@supabase/supabase-js') ||\n    hasDependency(dependencies, '@supabase/ssr') ||\n    hasDependency(dependencies, '@supabase/auth-helpers-nextjs')\n\n  const hasSupabaseConfig = existsSync(join(projectPath, 'supabase', 'config.toml'))\n\n  return hasSupabaseDeps || hasSupabaseConfig\n}\n\n/**\n * Detect Edge runtime usage\n */\nfunction detectEdgeRuntime(projectPath: string): boolean {\n  const middlewarePaths = [\n    join(projectPath, 'middleware.ts'),\n    join(projectPath, 'middleware.js'),\n    join(projectPath, 'src/middleware.ts'),\n    join(projectPath, 'src/middleware.js'),\n  ]\n\n  if (middlewarePaths.some((p) => existsSync(p))) {\n    return true\n  }\n\n  // Check for edge runtime in API routes\n  const apiPaths = [\n    join(projectPath, 'app/api'),\n    join(projectPath, 'src/app/api'),\n    join(projectPath, 'pages/api'),\n  ]\n\n  for (const apiPath of apiPaths) {\n    if (existsSync(apiPath)) {\n      try {\n        const files = getAllFiles(apiPath, ['.ts', '.js'])\n        for (const file of files) {\n          const content = readFileSync(file, 'utf8')\n          if (content.includes(\"export const runtime = 'edge'\")) {\n            return true\n          }\n        }\n      } catch {\n        // Ignore\n      }\n    }\n  }\n\n  return false\n}\n\n/**\n * Check for Supabase vector configuration\n */\nfunction hasSupabaseVectorConfig(projectPath: string): boolean {\n  const supabaseMigrationDir = join(projectPath, 'supabase', 'migrations')\n  if (!existsSync(supabaseMigrationDir)) return false\n\n  try {\n    const migrationFiles = readdirSync(supabaseMigrationDir)\n\n    return migrationFiles.some((file: string) => {\n      if (file.endsWith('.sql')) {\n        const content = readFileSync(join(supabaseMigrationDir, file), 'utf8')\n        return content.includes('vector') || content.includes('embedding') || content.includes('pgvector')\n      }\n      return false\n    })\n  } catch {\n    return false\n  }\n}\n\n/**\n * Detect Drizzle ORM\n */\nfunction detectDrizzle(dependencies: DependencyInfo[], projectPath: string): boolean {\n  const hasDrizzleDeps =\n    hasDependency(dependencies, 'drizzle-orm') || hasDependency(dependencies, 'drizzle-kit')\n\n  const hasDrizzleConfig =\n    existsSync(join(projectPath, 'drizzle.config.ts')) ||\n    existsSync(join(projectPath, 'drizzle.config.js'))\n\n  return hasDrizzleDeps || hasDrizzleConfig\n}\n\n/**\n * Detect Prisma ORM\n */\nfunction detectPrisma(dependencies: DependencyInfo[], projectPath: string): boolean {\n  const hasPrismaDeps =\n    hasDependency(dependencies, 'prisma') || hasDependency(dependencies, '@prisma/client')\n\n  const hasPrismaSchema = existsSync(join(projectPath, 'prisma', 'schema.prisma'))\n\n  return hasPrismaDeps || hasPrismaSchema\n}\n\n/**\n * Detect auth provider\n */\nfunction detectAuthProvider(dependencies: DependencyInfo[], projectPath: string): AuthProvider {\n  // Supabase Auth\n  if (\n    hasDependency(dependencies, '@supabase/auth-helpers-nextjs') ||\n    hasDependency(dependencies, '@supabase/ssr')\n  ) {\n    const hasAuthConfig =\n      existsSync(join(projectPath, 'src/lib/supabase')) ||\n      existsSync(join(projectPath, 'lib/supabase'))\n    if (hasAuthConfig) return 'supabase'\n  }\n\n  // Clerk\n  if (\n    hasDependency(dependencies, '@clerk/nextjs') ||\n    hasDependency(dependencies, '@clerk/clerk-react')\n  ) {\n    return 'clerk'\n  }\n\n  // Better Auth\n  if (hasDependency(dependencies, 'better-auth')) {\n    return 'better-auth'\n  }\n\n  // NextAuth / Auth.js\n  if (hasDependency(dependencies, 'next-auth') || hasDependency(dependencies, '@auth/core')) {\n    return 'next-auth'\n  }\n\n  // Lucia\n  if (hasDependency(dependencies, 'lucia')) {\n    return 'lucia'\n  }\n\n  return 'none'\n}\n\n/**\n * Detect tRPC\n */\nfunction detectTRPC(dependencies: DependencyInfo[]): boolean {\n  return (\n    hasDependency(dependencies, '@trpc/server') ||\n    hasDependency(dependencies, '@trpc/client') ||\n    hasDependency(dependencies, '@trpc/react-query')\n  )\n}\n\n/**\n * Detect PWA support\n */\nfunction detectPWA(dependencies: DependencyInfo[], projectPath: string): boolean {\n  const hasPWADeps =\n    hasDependency(dependencies, '@ducanh2912/next-pwa') ||\n    hasDependency(dependencies, 'next-pwa') ||\n    hasDependency(dependencies, 'workbox-webpack-plugin')\n\n  const hasManifest = existsSync(join(projectPath, 'public', 'manifest.json'))\n  const hasServiceWorker =\n    existsSync(join(projectPath, 'public', 'sw.js')) ||\n    existsSync(join(projectPath, 'public', 'service-worker.js'))\n\n  return hasPWADeps || (hasManifest && hasServiceWorker)\n}\n\n/**\n * Detect i18n support\n */\nfunction detectI18n(dependencies: DependencyInfo[], projectPath: string): boolean {\n  const hasI18nDeps =\n    hasDependency(dependencies, 'next-intl') ||\n    hasDependency(dependencies, 'next-i18next') ||\n    hasDependency(dependencies, 'react-i18next') ||\n    hasDependency(dependencies, 'i18next')\n\n  const hasMessagesDir =\n    existsSync(join(projectPath, 'messages')) ||\n    existsSync(join(projectPath, 'locales')) ||\n    existsSync(join(projectPath, 'public/locales'))\n\n  return hasI18nDeps || hasMessagesDir\n}\n\n/**\n * Detect testing setup\n */\nfunction detectTesting(dependencies: DependencyInfo[]): TestingInfo {\n  // Unit testing\n  let unit: TestingInfo['unit'] = 'none'\n  if (hasDependency(dependencies, 'vitest')) {\n    unit = 'vitest'\n  } else if (hasDependency(dependencies, 'jest')) {\n    unit = 'jest'\n  }\n\n  // E2E testing\n  let e2e: TestingInfo['e2e'] = 'none'\n  if (hasDependency(dependencies, '@playwright/test') || hasDependency(dependencies, 'playwright')) {\n    e2e = 'playwright'\n  } else if (hasDependency(dependencies, 'cypress')) {\n    e2e = 'cypress'\n  }\n\n  return { unit, e2e }\n}\n\n/**\n * Get all files in directory recursively\n */\nfunction getAllFiles(dirPath: string, extensions: string[]): string[] {\n  const files: string[] = []\n\n  try {\n    const entries = readdirSync(dirPath, { withFileTypes: true })\n\n    for (const entry of entries) {\n      const fullPath = join(dirPath, entry.name)\n      if (entry.isDirectory()) {\n        files.push(...getAllFiles(fullPath, extensions))\n      } else if (extensions.some((ext) => entry.name.endsWith(ext))) {\n        files.push(fullPath)\n      }\n    }\n  } catch {\n    // Ignore errors\n  }\n\n  return files\n}\n\n/**\n * Check what AT3 features are missing from the project\n */\nexport function getMissingFeatures(info: ProjectInfo): string[] {\n  const missing: string[] = []\n\n  if (!info.hasSupabase && !info.hasDrizzle && !info.hasPrisma) missing.push('database')\n  if (!info.hasAI) missing.push('ai')\n  if (!info.hasPWA) missing.push('pwa')\n  if (!info.hasI18n) missing.push('i18n')\n  if (info.testing.unit === 'none') missing.push('testing')\n  if (!info.hasTailwind) missing.push('tailwind')\n  if (!info.hasTypeScript) missing.push('typescript')\n  if (info.authProvider === 'none') missing.push('auth')\n\n  return missing\n}\n\n/**\n * Check if project is compatible with AT3 stack\n */\nexport function isCompatible(info: ProjectInfo): boolean {\n  // Must have Next.js or React\n  if (!(info.hasNextjs || info.hasReact)) return false\n\n  // Must have a supported package manager\n  if (!['npm', 'pnpm', 'yarn', 'bun'].includes(info.packageManager)) return false\n\n  return true\n}\n\n/**\n * Get upgrade recommendations based on current project state\n */\nexport function getRecommendations(info: ProjectInfo): {\n  priority: 'high' | 'medium' | 'low'\n  feature: string\n  reason: string\n}[] {\n  const recommendations = []\n\n  if (!info.hasTypeScript) {\n    recommendations.push({\n      priority: 'high' as const,\n      feature: 'typescript',\n      reason: 'TypeScript provides better development experience and type safety',\n    })\n  }\n\n  if (!info.hasTailwind) {\n    recommendations.push({\n      priority: 'high' as const,\n      feature: 'tailwind',\n      reason: 'Tailwind CSS is essential for AT3 stack styling',\n    })\n  }\n\n  if (!info.hasSupabase && !info.hasDrizzle && !info.hasPrisma) {\n    recommendations.push({\n      priority: 'high' as const,\n      feature: 'database',\n      reason: 'A database solution is needed for most applications',\n    })\n  }\n\n  if (info.authProvider === 'none') {\n    recommendations.push({\n      priority: 'medium' as const,\n      feature: 'auth',\n      reason: 'Authentication is essential for user management',\n    })\n  }\n\n  if (!info.hasAI) {\n    recommendations.push({\n      priority: 'medium' as const,\n      feature: 'ai',\n      reason: 'AI integration is a core feature of AT3 stack',\n    })\n  }\n\n  if (info.testing.unit === 'none') {\n    recommendations.push({\n      priority: 'low' as const,\n      feature: 'testing',\n      reason: 'Comprehensive testing improves code quality',\n    })\n  }\n\n  if (!info.hasBiome && (info.hasEslint || info.hasPrettier)) {\n    recommendations.push({\n      priority: 'low' as const,\n      feature: 'biome',\n      reason: 'Biome provides faster linting and formatting than ESLint/Prettier',\n    })\n  }\n\n  return recommendations\n}\n\n/**\n * Get a summary score for AT3 stack compatibility\n */\nexport function getAT3Score(info: ProjectInfo): {\n  score: number\n  maxScore: number\n  percentage: number\n  level: 'none' | 'basic' | 'intermediate' | 'advanced' | 'full'\n} {\n  let score = 0\n  const maxScore = 10\n\n  if (info.hasNextjs) score += 1\n  if (info.hasTypeScript) score += 1\n  if (info.hasTailwind) score += 1\n  if (info.hasSupabase || info.hasDrizzle || info.hasPrisma) score += 1\n  if (info.authProvider !== 'none') score += 1\n  if (info.hasAI) score += 2\n  if (info.hasEdgeRuntime) score += 1\n  if (info.testing.unit !== 'none') score += 1\n  if (info.hasBiome) score += 1\n\n  const percentage = Math.round((score / maxScore) * 100)\n\n  let level: 'none' | 'basic' | 'intermediate' | 'advanced' | 'full'\n  if (percentage === 0) level = 'none'\n  else if (percentage < 30) level = 'basic'\n  else if (percentage < 60) level = 'intermediate'\n  else if (percentage < 90) level = 'advanced'\n  else level = 'full'\n\n  return { score, maxScore, percentage, level }\n}\n","/**\n * Add AI integration to existing project\n */\n\nimport { join } from 'node:path'\nimport { ensureDir, pathExists, readFile, writeFile } from 'fs-extra'\n\nexport async function addAI(type: 'custom' | 'vercel', projectPath: string): Promise<void> {\n  const srcPath = join(projectPath, 'src')\n  await ensureDir(srcPath)\n\n  // Create lib/ai directory\n  const aiPath = join(srcPath, 'lib', 'ai')\n  await ensureDir(aiPath)\n\n  if (type === 'custom') {\n    await addCustomAI(aiPath)\n  }\n\n  if (type === 'vercel') {\n    await addVercelAI(aiPath)\n  }\n\n  // Create API routes\n  const apiPath = join(srcPath, 'app', 'api')\n  await ensureDir(apiPath)\n\n  await addAPIRoutes(apiPath, type)\n\n  // Update package.json\n  await updatePackageJson(projectPath, type)\n}\n\nasync function addCustomAI(aiPath: string): Promise<void> {\n  // AI client configuration\n  const clientConfig = `/**\n * Custom AI client configuration\n */\n\nexport interface AIProvider {\n  name: string;\n  baseURL: string;\n  apiKey: string;\n}\n\nexport const AI_PROVIDERS = {\n  openai: {\n    name: 'OpenAI',\n    baseURL: 'https://api.openai.com/v1',\n    apiKey: process.env.OPENAI_API_KEY!,\n  },\n  anthropic: {\n    name: 'Anthropic',\n    baseURL: 'https://api.anthropic.com',\n    apiKey: process.env.ANTHROPIC_API_KEY!,\n  },\n  google: {\n    name: 'Google AI',\n    baseURL: 'https://generativelanguage.googleapis.com',\n    apiKey: process.env.GOOGLE_AI_API_KEY!,\n  },\n} as const;\n\nexport type AIProviderKey = keyof typeof AI_PROVIDERS;\n`\n\n  await writeFile(join(aiPath, 'config.ts'), clientConfig)\n\n  // AI client\n  const client = `/**\n * Custom AI client implementation\n */\n\nimport { AI_PROVIDERS, type AIProviderKey } from './config.js';\n\nexport interface ChatMessage {\n  role: 'system' | 'user' | 'assistant';\n  content: string;\n}\n\nexport interface CompletionOptions {\n  model: string;\n  temperature?: number;\n  maxTokens?: number;\n}\n\nexport class AIClient {\n  constructor(\n    private provider: AIProviderKey,\n    private options: CompletionOptions = {}\n  ) {}\n\n  async completion(\n    messages: ChatMessage[],\n    options: Partial<CompletionOptions> = {}\n  ): Promise<string> {\n    const config = AI_PROVIDERS[this.provider];\n    const finalOptions = { ...this.options, ...options };\n\n    // Implementation would depend on the provider\n    // This is a basic structure\n    const response = await fetch(\\`\\${config.baseURL}/chat/completions\\`, {\n      method: 'POST',\n      headers: {\n        'Authorization': \\`Bearer \\${config.apiKey}\\`,\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({\n        model: finalOptions.model || 'gpt-3.5-turbo',\n        messages,\n        temperature: finalOptions.temperature || 0.7,\n        max_tokens: finalOptions.maxTokens || 1000,\n      }),\n    });\n\n    const data = await response.json();\n    return data.choices[0]?.message?.content || '';\n  }\n}\n`\n\n  await writeFile(join(aiPath, 'client.ts'), client)\n}\n\nasync function addVercelAI(aiPath: string): Promise<void> {\n  // Vercel AI client\n  const vercelClient = `/**\n * Vercel AI SDK integration\n */\n\nimport { anthropic } from '@ai-sdk/anthropic';\nimport { google } from '@ai-sdk/google';\nimport { openai } from '@ai-sdk/openai';\nimport { generateText, streamText } from 'ai';\n\nexport const AI_MODELS = {\n  'gpt-4-turbo': openai('gpt-4-turbo'),\n  'gpt-3.5-turbo': openai('gpt-3.5-turbo'),\n  'claude-3-haiku': anthropic('claude-3-haiku-20240307'),\n  'claude-3-sonnet': anthropic('claude-3-sonnet-20240229'),\n  'gemini-pro': google('models/gemini-pro'),\n} as const;\n\nexport type AIModelKey = keyof typeof AI_MODELS;\n\nexport async function generateCompletion(\n  model: AIModelKey,\n  prompt: string,\n  options?: {\n    temperature?: number;\n    maxTokens?: number;\n  }\n) {\n  const { text } = await generateText({\n    model: AI_MODELS[model],\n    prompt,\n    temperature: options?.temperature || 0.7,\n    maxTokens: options?.maxTokens || 1000,\n  });\n\n  return text;\n}\n\nexport async function streamCompletion(\n  model: AIModelKey,\n  prompt: string,\n  options?: {\n    temperature?: number;\n    maxTokens?: number;\n  }\n) {\n  const { textStream } = await streamText({\n    model: AI_MODELS[model],\n    prompt,\n    temperature: options?.temperature || 0.7,\n    maxTokens: options?.maxTokens || 1000,\n  });\n\n  return textStream;\n}\n`\n\n  await writeFile(join(aiPath, 'vercel-client.ts'), vercelClient)\n\n  // Vercel AI hooks\n  const hooks = `/**\n * React hooks for Vercel AI SDK\n */\n\n'use client';\n\nimport { useChat, useCompletion } from 'ai/react';\nimport { type AIModelKey } from './vercel-client.js';\n\nexport function useAIChat(model: AIModelKey = 'gpt-3.5-turbo') {\n  return useChat({\n    api: '/api/chat',\n    body: {\n      model,\n    },\n  });\n}\n\nexport function useAICompletion(model: AIModelKey = 'gpt-3.5-turbo') {\n  return useCompletion({\n    api: '/api/completion',\n    body: {\n      model,\n    },\n  });\n}\n`\n\n  await writeFile(join(aiPath, 'vercel-hooks.ts'), hooks)\n}\n\nasync function addAPIRoutes(apiPath: string, type: 'custom' | 'vercel'): Promise<void> {\n  if (type === 'vercel') {\n    // Chat API route\n    const chatRoute = `import { AI_MODELS, type AIModelKey } from '@/lib/ai/vercel-client';\nimport { streamText } from 'ai';\n\nexport async function POST(req: Request) {\n  const { messages, model = 'gpt-3.5-turbo' } = await req.json();\n\n  const result = await streamText({\n    model: AI_MODELS[model as AIModelKey],\n    messages,\n  });\n\n  return result.toDataStreamResponse();\n}\n`\n\n    await ensureDir(join(apiPath, 'chat'))\n    await writeFile(join(apiPath, 'chat', 'route.ts'), chatRoute)\n\n    // Completion API route\n    const completionRoute = `import { AI_MODELS, type AIModelKey } from '@/lib/ai/vercel-client';\nimport { generateText } from 'ai';\n\nexport async function POST(req: Request) {\n  const { prompt, model = 'gpt-3.5-turbo' } = await req.json();\n\n  const { text } = await generateText({\n    model: AI_MODELS[model as AIModelKey],\n    prompt,\n  });\n\n  return Response.json({ text });\n}\n`\n\n    await ensureDir(join(apiPath, 'completion'))\n    await writeFile(join(apiPath, 'completion', 'route.ts'), completionRoute)\n  }\n}\n\nasync function updatePackageJson(projectPath: string, type: 'custom' | 'vercel'): Promise<void> {\n  const packageJsonPath = join(projectPath, 'package.json')\n\n  if (!(await pathExists(packageJsonPath))) return\n\n  const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'))\n\n  if (!packageJson.dependencies) packageJson.dependencies = {}\n\n  if (type === 'vercel') {\n    packageJson.dependencies.ai = '^5.0.104'\n    packageJson.dependencies['@ai-sdk/openai'] = '^2.0.74'\n    packageJson.dependencies['@ai-sdk/anthropic'] = '^2.0.50'\n    packageJson.dependencies['@ai-sdk/google'] = '^2.0.44'\n  }\n\n  await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2))\n}\n","\nimport { readFile, writeFile, pathExists, ensureDir } from 'fs-extra'\nimport { join } from 'path'\nimport { colors } from '../utils/cli-styling'\n\nexport async function addBetterAuth(projectPath: string): Promise<void> {\n  console.log(colors.info('Adding Better Auth...'))\n\n  // 1. Update package.json\n  await updatePackageJson(projectPath)\n\n  // 2. Add env vars\n  await addEnvExample(projectPath)\n\n  // 3. Create auth client/server files\n  await createAuthFiles(projectPath)\n\n  console.log(colors.success('✓ Added Better Auth configuration'))\n}\n\nasync function updatePackageJson(projectPath: string): Promise<void> {\n  const packageJsonPath = join(projectPath, 'package.json')\n  if (!(await pathExists(packageJsonPath))) return\n\n  const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'))\n\n  if (!packageJson.dependencies) packageJson.dependencies = {}\n  packageJson.dependencies['better-auth'] = '^1.1.0' // Check version\n\n  await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2))\n}\n\nasync function addEnvExample(projectPath: string): Promise<void> {\n  const envExamplePath = join(projectPath, '.env.example')\n  let envContent = ''\n\n  if (await pathExists(envExamplePath)) {\n    envContent = await readFile(envExamplePath, 'utf-8')\n  }\n\n  if (!envContent.includes('BETTER_AUTH_SECRET')) {\n    envContent += `\n# Better Auth\nBETTER_AUTH_SECRET=your_secret_here\nBETTER_AUTH_URL=http://localhost:3000\n`\n    await writeFile(envExamplePath, envContent)\n  }\n}\n\nasync function createAuthFiles(projectPath: string): Promise<void> {\n  const libPath = join(projectPath, 'src', 'lib', 'auth')\n  await ensureDir(libPath)\n\n  // client.ts\n  await writeFile(join(libPath, 'client.ts'), `import { createAuthClient } from \"better-auth/react\"\nexport const authClient = createAuthClient({\n    baseURL: process.env.BETTER_AUTH_URL\n})\n`)\n\n  // server.ts (Basic stub, assumes Drizzle or similar will be connected manually for now)\n  await writeFile(join(libPath, 'auth.ts'), `import { betterAuth } from \"better-auth\";\n// import { db } from \"@/db\";\n// import { drizzleAdapter } from \"better-auth/adapters/drizzle\";\n\nexport const auth = betterAuth({\n    // adapter: drizzleAdapter(db, {\n    //     provider: \"pg\",\n    // }),\n    emailAndPassword: {\n        enabled: true\n    },\n    // socialProviders: {\n    //    github: {\n    //        clientId: process.env.GITHUB_CLIENT_ID,\n    //        clientSecret: process.env.GITHUB_CLIENT_SECRET,\n    //    }\n    // },\n})\n`)\n\n  // API Route\n  const apiPath = join(projectPath, 'src', 'app', 'api', 'auth', '[...all]')\n  await ensureDir(apiPath)\n\n  await writeFile(join(apiPath, 'route.ts'), `import { auth } from \"@/lib/auth/auth\";\nimport { toNextJsHandler } from \"better-auth/next-js\";\n\nexport const { GET, POST } = toNextJsHandler(auth);\n`)\n}\n","/**\n * CLI styling utilities for AT3 Stack Kit\n * Aligned with at3-toolkit's sophisticated styling system\n */\n\nimport boxen from 'boxen'\nimport chalk from 'chalk'\nimport figures from 'figures'\nimport gradient from 'gradient-string'\n\n// Color palette\nexport const colors = {\n  primary: chalk.hex('#2563eb'), // Blue\n  secondary: chalk.hex('#7c3aed'), // Purple\n  success: chalk.green,\n  error: chalk.red,\n  warning: chalk.yellow,\n  info: chalk.blue,\n  muted: chalk.gray,\n  accent: chalk.magenta,\n  ai: chalk.hex('#10b981'), // Emerald for AI features\n} as const\n\n// Gradients\nexport const gradients = {\n  at3: gradient('#2563eb', '#10b981'), // Blue to Emerald\n  ai: gradient('#10b981', '#059669'), // Emerald gradient\n  success: gradient('#22c55e', '#16a34a'), // Green gradient\n  warning: gradient('#f59e0b', '#d97706'), // Amber gradient\n  error: gradient('#ef4444', '#dc2626'), // Red gradient\n} as const\n\n// Icons and symbols\nexport const symbols = {\n  success: colors.success(figures.tick),\n  error: colors.error(figures.cross),\n  warning: colors.warning(figures.warning),\n  info: colors.info(figures.info),\n  arrow: colors.muted(figures.arrowRight),\n  bullet: colors.muted(figures.bullet),\n  line: colors.muted(figures.line),\n  ai: colors.ai('🤖'),\n  stack: colors.primary('📚'),\n  edge: colors.secondary('⚡'),\n  database: colors.info('🗄️'),\n  config: colors.muted('⚙️'),\n} as const\n\n// Text styling utilities\nexport const style = {\n  title: (text: string) => gradients.at3(text),\n  subtitle: (text: string) => colors.secondary(text),\n  heading: (text: string) => colors.primary.bold(text),\n  label: (text: string) => colors.muted(text),\n  value: (text: string) => colors.primary(text),\n  success: (text: string) => colors.success(text),\n  error: (text: string) => colors.error(text),\n  warning: (text: string) => colors.warning(text),\n  info: (text: string) => colors.info(text),\n  muted: (text: string) => colors.muted(text),\n  accent: (text: string) => colors.accent(text),\n  ai: (text: string) => colors.ai(text),\n  code: (text: string) => chalk.cyan.italic(text),\n  path: (text: string) => chalk.dim.underline(text),\n  command: (text: string) => chalk.bgBlack.white.bold(` ${text} `),\n} as const\n\n// Box utilities\nexport const box = {\n  info: (content: string, title?: string) =>\n    boxen(content, {\n      ...(title && { title }),\n      titleAlignment: 'center',\n      padding: 1,\n      margin: 1,\n      borderStyle: 'round',\n      borderColor: 'blue',\n    }),\n  success: (content: string, title?: string) =>\n    boxen(content, {\n      ...(title && { title }),\n      titleAlignment: 'center',\n      padding: 1,\n      margin: 1,\n      borderStyle: 'round',\n      borderColor: 'green',\n    }),\n  warning: (content: string, title?: string) =>\n    boxen(content, {\n      ...(title && { title }),\n      titleAlignment: 'center',\n      padding: 1,\n      margin: 1,\n      borderStyle: 'round',\n      borderColor: 'yellow',\n    }),\n  error: (content: string, title?: string) =>\n    boxen(content, {\n      ...(title && { title }),\n      titleAlignment: 'center',\n      padding: 1,\n      margin: 1,\n      borderStyle: 'round',\n      borderColor: 'red',\n    }),\n} as const\n\n// Progress indicators\nexport const progress = {\n  step: (current: number, total: number, description: string) =>\n    `${colors.muted(`[${current}/${total}]`)} ${description}`,\n\n  percentage: (percent: number) => {\n    const filled = Math.floor(percent / 5)\n    const empty = 20 - filled\n    const bar = '█'.repeat(filled) + '░'.repeat(empty)\n    return `${colors.primary(bar)} ${colors.muted(`${percent}%`)}`\n  },\n}\n\n// Header utilities\nexport const header = {\n  main: (title: string, subtitle?: string) => {\n    const titleText = gradients.at3.multiline(title)\n    const subtitleText = subtitle ? `\\n${colors.muted(subtitle)}` : ''\n    return `${titleText}${subtitleText}`\n  },\n\n  section: (title: string) =>\n    `\\n${colors.primary.bold(title)}\\n${colors.muted('─'.repeat(title.length))}`,\n}\n\n// List utilities\nexport const list = {\n  item: (text: string, symbol = symbols.bullet) => `${symbol} ${text}`,\n  checkItem: (text: string, checked = false) => {\n    const icon = checked ? symbols.success : colors.muted(figures.radioOff)\n    return `${icon} ${text}`\n  },\n  numbered: (items: string[]) =>\n    items.map((item, i) => `${colors.muted(`${i + 1}.`)} ${item}`).join('\\n'),\n}\n","\nimport { readFile, writeFile, pathExists } from 'fs-extra'\nimport { join } from 'path'\nimport { colors } from '../utils/cli-styling'\n\nexport async function addClerk(projectPath: string): Promise<void> {\n  console.log(colors.info('Adding Clerk authentication...'))\n\n  // 1. Install dependencies\n  // This will be handled by the main CLI loop if we return dependencies,\n  // but for now we assume the caller handles installation or we update package.json directly\n  await updatePackageJson(projectPath)\n\n  // 2. Add environment variables\n  await addEnvExample(projectPath)\n\n  // 3. Add Middleware\n  await addMiddleware(projectPath)\n\n  // 4. Wrap Layout (This is tricky with regex, might need manual instruction or smart AST)\n  // For now, we'll log instructions for the layout part as it's high risk to break\n  console.log(colors.warning('NOTE: You need to wrap your root layout with <ClerkProvider> manually.'))\n\n  console.log(colors.success('✓ Added Clerk configuration'))\n}\n\nasync function updatePackageJson(projectPath: string): Promise<void> {\n  const packageJsonPath = join(projectPath, 'package.json')\n  if (!(await pathExists(packageJsonPath))) return\n\n  const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'))\n\n  if (!packageJson.dependencies) packageJson.dependencies = {}\n  packageJson.dependencies['@clerk/nextjs'] = '^6.9.0'\n\n  await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2))\n}\n\nasync function addEnvExample(projectPath: string): Promise<void> {\n  const envExamplePath = join(projectPath, '.env.example')\n  let envContent = ''\n\n  if (await pathExists(envExamplePath)) {\n    envContent = await readFile(envExamplePath, 'utf-8')\n  }\n\n  if (!envContent.includes('NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY')) {\n    envContent += `\n# Clerk Auth\nNEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_...\nCLERK_SECRET_KEY=sk_test_...\n`\n    await writeFile(envExamplePath, envContent)\n  }\n}\n\nasync function addMiddleware(projectPath: string): Promise<void> {\n  const middlewarePath = join(projectPath, 'src', 'middleware.ts')\n\n  const content = `import { clerkMiddleware } from \"@clerk/nextjs/server\";\n\nexport default clerkMiddleware();\n\nexport const config = {\n  matcher: [\"/((?!.*\\\\\\\\..*|_next).*)\", \"/\", \"/(api|trpc)(.*)\"],\n};\n`\n  await writeFile(middlewarePath, content)\n}\n","/**\n * Add Drizzle ORM + PostgreSQL integration to existing project\n */\n\nimport { ensureDir, pathExists, readFile, writeFile } from 'fs-extra'\nimport { join } from 'path'\n\nexport async function addDrizzle(projectPath: string): Promise<void> {\n  const srcPath = join(projectPath, 'src')\n  await ensureDir(srcPath)\n\n  // Create db directory\n  const dbPath = join(srcPath, 'db')\n  await ensureDir(dbPath)\n\n  // Add Drizzle config\n  await addDrizzleConfig(projectPath)\n\n  // Add schema\n  await addSchema(dbPath)\n\n  // Add client\n  await addClient(dbPath)\n\n  // Update package.json\n  await updatePackageJson(projectPath)\n\n  // Add environment variables template\n  await addEnvExample(projectPath)\n\n  console.log('✓ Added Drizzle ORM + PostgreSQL support')\n}\n\nasync function addDrizzleConfig(projectPath: string): Promise<void> {\n  const config = `import { defineConfig } from 'drizzle-kit';\nimport * as dotenv from 'dotenv';\n\ndotenv.config({ path: '.env.local' });\n\nif (!process.env.DATABASE_URL) {\n  throw new Error('DATABASE_URL is missing');\n}\n\nexport default defineConfig({\n  schema: './src/db/schema.ts',\n  out: './drizzle',\n  dialect: 'postgresql',\n  dbCredentials: {\n    url: process.env.DATABASE_URL,\n  },\n});\n`\n\n  await writeFile(join(projectPath, 'drizzle.config.ts'), config)\n}\n\nasync function addSchema(dbPath: string): Promise<void> {\n  const schema = `import { pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core';\n\nexport const users = pgTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  email: text('email').notNull(),\n  createdAt: timestamp('created_at').defaultNow(),\n});\n`\n\n  await writeFile(join(dbPath, 'schema.ts'), schema)\n}\n\nasync function addClient(dbPath: string): Promise<void> {\n  const client = `import { drizzle } from 'drizzle-orm/postgres-js';\nimport postgres from 'postgres';\nimport * as schema from './schema';\n\nconst connectionString = process.env.DATABASE_URL!;\n\n// Disable prefetch as it is not supported for \"Transaction\" pool mode\nconst client = postgres(connectionString, { prepare: false });\nexport const db = drizzle(client, { schema });\n`\n\n  await writeFile(join(dbPath, 'index.ts'), client)\n}\n\nasync function updatePackageJson(projectPath: string): Promise<void> {\n  const packageJsonPath = join(projectPath, 'package.json')\n\n  if (!(await pathExists(packageJsonPath))) return\n\n  const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'))\n\n  if (!packageJson.dependencies) packageJson.dependencies = {}\n  if (!packageJson.devDependencies) packageJson.devDependencies = {}\n  if (!packageJson.scripts) packageJson.scripts = {}\n\n  // Add dependencies\n  packageJson.dependencies['drizzle-orm'] = '^0.36.0'\n  packageJson.dependencies['postgres'] = '^3.4.4'\n  packageJson.dependencies['dotenv'] = '^16.4.5'\n\n  // Add dev dependencies\n  packageJson.devDependencies['drizzle-kit'] = '^0.28.0'\n  packageJson.devDependencies['pg'] = '^8.13.0'\n  packageJson.devDependencies['@types/pg'] = '^8.11.10'\n\n  // Add scripts\n  packageJson.scripts['db:generate'] = 'drizzle-kit generate'\n  packageJson.scripts['db:migrate'] = 'drizzle-kit migrate'\n  packageJson.scripts['db:push'] = 'drizzle-kit push'\n  packageJson.scripts['db:studio'] = 'drizzle-kit studio'\n\n  await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2))\n}\n\nasync function addEnvExample(projectPath: string): Promise<void> {\n  const envExamplePath = join(projectPath, '.env.example')\n\n  let envContent = ''\n\n  // Read existing .env.example if it exists\n  if (await pathExists(envExamplePath)) {\n    envContent = await readFile(envExamplePath, 'utf-8')\n  }\n\n  // Add Database variables if not present\n  if (!envContent.includes('DATABASE_URL')) {\n    const dbVars = `\n# Database (PostgreSQL)\nDATABASE_URL=\"postgresql://postgres:password@localhost:5432/postgres\"\n`\n\n    envContent = envContent + dbVars\n    await writeFile(envExamplePath, envContent)\n  }\n}\n","/**\n * Add internationalization support to existing project\n */\n\nimport { ensureDir, pathExists, readFile, writeFile } from 'fs-extra'\nimport { join } from 'path'\n\n/**\n * Add internationalization support to existing project with next-intl v4\n */\nexport async function addI18n(projectPath: string): Promise<void> {\n  const srcPath = join(projectPath, 'src')\n  await ensureDir(srcPath)\n\n  // Create messages directory with sample translations\n  const messagesPath = join(projectPath, 'messages')\n  await ensureDir(messagesPath)\n  await addDefaultMessages(messagesPath)\n\n  // Create i18n configuration\n  const i18nPath = join(srcPath, 'lib', 'i18n')\n  await ensureDir(i18nPath)\n\n  await addI18nConfig(i18nPath)\n  await addI18nRequest(i18nPath)\n  await addI18nNavigation(i18nPath)\n  await addI18nMiddleware(srcPath)\n  await addLocaleProvider(i18nPath)\n  await addLanguageSwitcher(srcPath)\n  await addLocaleLayout(srcPath)\n\n  // Update package.json\n  await updatePackageJson(projectPath)\n\n  // Update next.config.ts\n  await updateNextConfig(projectPath)\n\n  console.log('✓ Added i18n support (next-intl v4)')\n}\n\nasync function addDefaultMessages(messagesPath: string): Promise<void> {\n  const enMessages = {\n    Common: {\n      loading: 'Loading...',\n      error: 'An error occurred',\n      retry: 'Try again',\n      cancel: 'Cancel',\n      save: 'Save',\n      delete: 'Delete',\n      edit: 'Edit',\n      back: 'Back',\n      next: 'Next',\n      previous: 'Previous',\n      search: 'Search',\n      noResults: 'No results found',\n    },\n    Navigation: {\n      home: 'Home',\n      about: 'About',\n      contact: 'Contact',\n      dashboard: 'Dashboard',\n      settings: 'Settings',\n      profile: 'Profile',\n    },\n    Auth: {\n      signIn: 'Sign In',\n      signOut: 'Sign Out',\n      signUp: 'Sign Up',\n      email: 'Email',\n      password: 'Password',\n      forgotPassword: 'Forgot password?',\n      rememberMe: 'Remember me',\n      noAccount: \"Don't have an account?\",\n      hasAccount: 'Already have an account?',\n    },\n    Index: {\n      title: 'Welcome to AT3 Stack',\n      description: 'Build AI-native applications with edge deployment',\n      getStarted: 'Get Started',\n      learnMore: 'Learn More',\n    },\n    Errors: {\n      notFound: 'Page not found',\n      notFoundDescription: 'The page you are looking for does not exist.',\n      serverError: 'Server error',\n      serverErrorDescription: 'Something went wrong on our end.',\n      goHome: 'Go to home',\n    },\n    LanguageSwitcher: {\n      label: 'Language',\n      en: 'English',\n      es: 'Español',\n      fr: 'Français',\n      de: 'Deutsch',\n      ja: '日本語',\n      zh: '中文',\n    },\n  }\n\n  const esMessages = {\n    Common: {\n      loading: 'Cargando...',\n      error: 'Ocurrió un error',\n      retry: 'Intentar de nuevo',\n      cancel: 'Cancelar',\n      save: 'Guardar',\n      delete: 'Eliminar',\n      edit: 'Editar',\n      back: 'Atrás',\n      next: 'Siguiente',\n      previous: 'Anterior',\n      search: 'Buscar',\n      noResults: 'No se encontraron resultados',\n    },\n    Navigation: {\n      home: 'Inicio',\n      about: 'Acerca de',\n      contact: 'Contacto',\n      dashboard: 'Panel',\n      settings: 'Configuración',\n      profile: 'Perfil',\n    },\n    Auth: {\n      signIn: 'Iniciar sesión',\n      signOut: 'Cerrar sesión',\n      signUp: 'Registrarse',\n      email: 'Correo electrónico',\n      password: 'Contraseña',\n      forgotPassword: '¿Olvidaste tu contraseña?',\n      rememberMe: 'Recordarme',\n      noAccount: '¿No tienes una cuenta?',\n      hasAccount: '¿Ya tienes una cuenta?',\n    },\n    Index: {\n      title: 'Bienvenido a AT3 Stack',\n      description: 'Construye aplicaciones nativas de IA con despliegue en el borde',\n      getStarted: 'Comenzar',\n      learnMore: 'Saber más',\n    },\n    Errors: {\n      notFound: 'Página no encontrada',\n      notFoundDescription: 'La página que buscas no existe.',\n      serverError: 'Error del servidor',\n      serverErrorDescription: 'Algo salió mal de nuestro lado.',\n      goHome: 'Ir al inicio',\n    },\n    LanguageSwitcher: {\n      label: 'Idioma',\n      en: 'English',\n      es: 'Español',\n      fr: 'Français',\n      de: 'Deutsch',\n      ja: '日本語',\n      zh: '中文',\n    },\n  }\n\n  await writeFile(join(messagesPath, 'en.json'), JSON.stringify(enMessages, null, 2))\n  await writeFile(join(messagesPath, 'es.json'), JSON.stringify(esMessages, null, 2))\n}\n\nasync function addI18nConfig(i18nPath: string): Promise<void> {\n  const config = `import { getRequestConfig } from 'next-intl/server'\nimport { hasLocale } from 'next-intl'\nimport { routing } from './navigation'\n\nexport default getRequestConfig(async ({ requestLocale }) => {\n  // Typically corresponds to the \\`[locale]\\` segment\n  const requested = await requestLocale\n  const locale = hasLocale(routing.locales, requested)\n    ? requested\n    : routing.defaultLocale\n\n  return {\n    locale,\n    messages: (await import(\\`../../../messages/\\${locale}.json\\`)).default,\n  }\n})\n`\n  await writeFile(join(i18nPath, 'config.ts'), config)\n}\n\nasync function addI18nRequest(i18nPath: string): Promise<void> {\n  const request = `import { getRequestConfig } from 'next-intl/server'\nimport { routing } from './navigation'\n\nexport default getRequestConfig(async ({ requestLocale }) => {\n  // This typically corresponds to the \\`[locale]\\` segment\n  let locale = await requestLocale\n\n  // Ensure that the incoming \\`locale\\` is valid\n  if (!locale || !routing.locales.includes(locale as any)) {\n    locale = routing.defaultLocale\n  }\n\n  return {\n    locale,\n    messages: (await import(\\`../../../messages/\\${locale}.json\\`)).default,\n    timeZone: 'UTC',\n    now: new Date(),\n  }\n})\n`\n  await writeFile(join(i18nPath, 'request.ts'), request)\n}\n\nasync function addI18nNavigation(i18nPath: string): Promise<void> {\n  const navigation = `import { createNavigation } from 'next-intl/navigation'\nimport { defineRouting } from 'next-intl/routing'\n\nexport const locales = ['en', 'es'] as const\nexport const defaultLocale = 'en' as const\n\nexport type Locale = (typeof locales)[number]\n\nexport const routing = defineRouting({\n  locales,\n  defaultLocale,\n  localePrefix: 'as-needed',\n})\n\n// Lightweight wrappers around Next.js' navigation APIs\n// that will consider the routing configuration\nexport const { Link, redirect, usePathname, useRouter, getPathname } =\n  createNavigation(routing)\n`\n  await writeFile(join(i18nPath, 'navigation.ts'), navigation)\n}\n\nasync function addI18nMiddleware(srcPath: string): Promise<void> {\n  const middleware = `import createMiddleware from 'next-intl/middleware'\nimport { routing } from './lib/i18n/navigation'\n\nexport default createMiddleware(routing)\n\nexport const config = {\n  // Match all pathnames except for\n  // - ... if they start with \\`/api\\`, \\`/_next\\` or \\`/_vercel\\`\n  // - ... the ones containing a dot (e.g. \\`favicon.ico\\`)\n  matcher: ['/((?!api|_next|_vercel|.*\\\\\\\\..*).*)'],\n}\n`\n  await writeFile(join(srcPath, 'middleware.ts'), middleware)\n}\n\nasync function addLocaleProvider(i18nPath: string): Promise<void> {\n  const provider = `'use client'\n\nimport { NextIntlClientProvider } from 'next-intl'\nimport type { ReactNode } from 'react'\n\ninterface LocaleProviderProps {\n  children: ReactNode\n  locale: string\n  messages: Record<string, unknown>\n  timeZone?: string\n  now?: Date\n}\n\nexport function LocaleProvider({\n  children,\n  locale,\n  messages,\n  timeZone = 'UTC',\n  now,\n}: LocaleProviderProps) {\n  return (\n    <NextIntlClientProvider\n      locale={locale}\n      messages={messages}\n      timeZone={timeZone}\n      now={now}\n    >\n      {children}\n    </NextIntlClientProvider>\n  )\n}\n`\n  await writeFile(join(i18nPath, 'provider.tsx'), provider)\n\n  // Add index export\n  const index = `export { locales, defaultLocale, routing, type Locale } from './navigation'\nexport { Link, redirect, usePathname, useRouter, getPathname } from './navigation'\nexport { LocaleProvider } from './provider'\n`\n  await writeFile(join(i18nPath, 'index.ts'), index)\n}\n\nasync function addLanguageSwitcher(srcPath: string): Promise<void> {\n  const componentPath = join(srcPath, 'components', 'layout')\n  await ensureDir(componentPath)\n\n  const switcher = `'use client'\n\nimport { useLocale, useTranslations } from 'next-intl'\nimport { usePathname, useRouter } from '@/lib/i18n/navigation'\nimport { locales, type Locale } from '@/lib/i18n/navigation'\n\ninterface LanguageSwitcherProps {\n  className?: string\n}\n\nexport function LanguageSwitcher({ className }: LanguageSwitcherProps) {\n  const t = useTranslations('LanguageSwitcher')\n  const locale = useLocale()\n  const router = useRouter()\n  const pathname = usePathname()\n\n  const handleChange = (newLocale: string) => {\n    router.replace(pathname, { locale: newLocale as Locale })\n  }\n\n  return (\n    <div className={className}>\n      <label htmlFor=\"language-select\" className=\"sr-only\">\n        {t('label')}\n      </label>\n      <select\n        id=\"language-select\"\n        value={locale}\n        onChange={(e) => handleChange(e.target.value)}\n        className=\"rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\"\n      >\n        {locales.map((loc) => (\n          <option key={loc} value={loc}>\n            {t(loc)}\n          </option>\n        ))}\n      </select>\n    </div>\n  )\n}\n\n/**\n * Alternative: Language switcher with buttons\n */\nexport function LanguageSwitcherButtons({ className }: LanguageSwitcherProps) {\n  const t = useTranslations('LanguageSwitcher')\n  const locale = useLocale()\n  const router = useRouter()\n  const pathname = usePathname()\n\n  return (\n    <div className={\\`flex gap-2 \\${className}\\`}>\n      {locales.map((loc) => (\n        <button\n          key={loc}\n          onClick={() => router.replace(pathname, { locale: loc })}\n          disabled={locale === loc}\n          className={\\`px-3 py-1 text-sm rounded-md transition-colors \\${\n            locale === loc\n              ? 'bg-primary text-primary-foreground'\n              : 'bg-secondary text-secondary-foreground hover:bg-secondary/80'\n          }\\`}\n        >\n          {t(loc)}\n        </button>\n      ))}\n    </div>\n  )\n}\n`\n  await writeFile(join(componentPath, 'language-switcher.tsx'), switcher)\n}\n\nasync function addLocaleLayout(srcPath: string): Promise<void> {\n  const localePath = join(srcPath, 'app', '[locale]')\n  await ensureDir(localePath)\n\n  const layout = `import { NextIntlClientProvider, hasLocale } from 'next-intl'\nimport { getMessages, setRequestLocale } from 'next-intl/server'\nimport { notFound } from 'next/navigation'\nimport type { ReactNode } from 'react'\nimport { routing } from '@/lib/i18n/navigation'\n\ninterface LocaleLayoutProps {\n  children: ReactNode\n  params: Promise<{ locale: string }>\n}\n\nexport function generateStaticParams() {\n  return routing.locales.map((locale) => ({ locale }))\n}\n\nexport default async function LocaleLayout({\n  children,\n  params,\n}: LocaleLayoutProps) {\n  const { locale } = await params\n\n  // Ensure that the incoming \\`locale\\` is valid\n  if (!hasLocale(routing.locales, locale)) {\n    notFound()\n  }\n\n  // Enable static rendering\n  setRequestLocale(locale)\n\n  // Providing all messages to the client\n  // side is the easiest way to get started\n  const messages = await getMessages()\n\n  return (\n    <NextIntlClientProvider messages={messages}>\n      {children}\n    </NextIntlClientProvider>\n  )\n}\n`\n  await writeFile(join(localePath, 'layout.tsx'), layout)\n\n  // Create sample page\n  const page = `import { useTranslations } from 'next-intl'\nimport { setRequestLocale } from 'next-intl/server'\nimport { Link } from '@/lib/i18n/navigation'\n\ninterface HomePageProps {\n  params: Promise<{ locale: string }>\n}\n\nexport default async function HomePage({ params }: HomePageProps) {\n  const { locale } = await params\n\n  // Enable static rendering\n  setRequestLocale(locale)\n\n  return <HomeContent />\n}\n\nfunction HomeContent() {\n  const t = useTranslations('Index')\n\n  return (\n    <main className=\"flex min-h-screen flex-col items-center justify-center p-24\">\n      <h1 className=\"text-4xl font-bold mb-4\">{t('title')}</h1>\n      <p className=\"text-lg text-muted-foreground mb-8\">{t('description')}</p>\n      <div className=\"flex gap-4\">\n        <Link\n          href=\"/dashboard\"\n          className=\"rounded-md bg-primary px-6 py-3 text-primary-foreground hover:bg-primary/90\"\n        >\n          {t('getStarted')}\n        </Link>\n        <Link\n          href=\"/about\"\n          className=\"rounded-md border border-input bg-background px-6 py-3 hover:bg-accent hover:text-accent-foreground\"\n        >\n          {t('learnMore')}\n        </Link>\n      </div>\n    </main>\n  )\n}\n`\n  await writeFile(join(localePath, 'page.tsx'), page)\n\n  // Create not-found page\n  const notFound = `import { useTranslations } from 'next-intl'\nimport { Link } from '@/lib/i18n/navigation'\n\nexport default function NotFoundPage() {\n  const t = useTranslations('Errors')\n\n  return (\n    <main className=\"flex min-h-screen flex-col items-center justify-center p-24\">\n      <h1 className=\"text-4xl font-bold mb-4\">{t('notFound')}</h1>\n      <p className=\"text-lg text-muted-foreground mb-8\">\n        {t('notFoundDescription')}\n      </p>\n      <Link\n        href=\"/\"\n        className=\"rounded-md bg-primary px-6 py-3 text-primary-foreground hover:bg-primary/90\"\n      >\n        {t('goHome')}\n      </Link>\n    </main>\n  )\n}\n`\n  await writeFile(join(localePath, 'not-found.tsx'), notFound)\n}\n\nasync function updatePackageJson(projectPath: string): Promise<void> {\n  const packageJsonPath = join(projectPath, 'package.json')\n  const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'))\n\n  if (!packageJson.dependencies) packageJson.dependencies = {}\n\n  packageJson.dependencies['next-intl'] = '^4.5.5'\n\n  await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2))\n}\n\nasync function updateNextConfig(projectPath: string): Promise<void> {\n  const configPath = join(projectPath, 'next.config.ts')\n\n  try {\n    let configContent = await readFile(configPath, 'utf-8')\n\n    // Check if already configured\n    if (configContent.includes('withNextIntl') || configContent.includes('next-intl/plugin')) {\n      return\n    }\n\n    // Add import at the top\n    const importStatement = `import createNextIntlPlugin from 'next-intl/plugin'\\n`\n    const pluginInit = `const withNextIntl = createNextIntlPlugin('./src/lib/i18n/request.ts')\\n\\n`\n\n    // Add import\n    if (!configContent.includes('next-intl/plugin')) {\n      configContent = importStatement + configContent\n    }\n\n    // Find export default and wrap it\n    const exportDefaultRegex = /export\\s+default\\s+(\\w+);?\\s*$/m\n    const match = configContent.match(exportDefaultRegex)\n\n    if (match) {\n      const configName = match[1]\n      configContent = configContent.replace(\n        exportDefaultRegex,\n        `${pluginInit}export default withNextIntl(${configName})\\n`\n      )\n    } else {\n      // If no simple export found, try to handle inline exports\n      const inlineExportRegex = /export\\s+default\\s+({[\\s\\S]*?})\\s*;?\\s*$/m\n      const inlineMatch = configContent.match(inlineExportRegex)\n\n      if (inlineMatch) {\n        configContent = configContent.replace(\n          inlineExportRegex,\n          `const nextConfig = ${inlineMatch[1]}\\n\\n${pluginInit}export default withNextIntl(nextConfig)\\n`\n        )\n      }\n    }\n\n    await writeFile(configPath, configContent)\n  } catch (error) {\n    console.warn(\n      'Could not update next.config.ts automatically. Please wrap your config with withNextIntl manually.'\n    )\n  }\n}\n","/**\n * Add PWA support to existing project\n */\n\nimport { join } from 'node:path'\nimport { ensureDir, pathExists, readFile, writeFile } from 'fs-extra'\n\nexport async function addPWA(projectPath: string): Promise<void> {\n  const srcPath = join(projectPath, 'src')\n  const publicPath = join(projectPath, 'public')\n\n  await ensureDir(publicPath)\n  await ensureDir(join(publicPath, 'icons'))\n\n  // Add manifest.json\n  await addManifest(publicPath)\n\n  // Add custom service worker\n  await addServiceWorker(publicPath)\n\n  // Add offline page\n  await addOfflinePage(srcPath)\n\n  // Add PWA hooks and utilities\n  await addPWAUtils(srcPath)\n\n  // Add install prompt component\n  await addInstallPrompt(srcPath)\n\n  // Add PWA provider\n  await addPWAProvider(srcPath)\n\n  // Update package.json\n  await updatePackageJson(projectPath)\n\n  // Update next.config.ts\n  await updateNextConfig(projectPath)\n\n  // Update layout to include PWA meta tags\n  await updateLayout(srcPath)\n\n  console.log('✓ PWA support added')\n}\n\nasync function addManifest(publicPath: string): Promise<void> {\n  const manifest = {\n    name: 'AT3 App',\n    short_name: 'AT3',\n    description: 'AT3 Stack Application - AI-native, edge-first',\n    start_url: '/',\n    display: 'standalone',\n    background_color: '#ffffff',\n    theme_color: '#6366f1',\n    orientation: 'portrait-primary',\n    scope: '/',\n    lang: 'en',\n    categories: ['productivity', 'utilities'],\n    icons: [\n      {\n        src: '/icons/icon-72x72.png',\n        sizes: '72x72',\n        type: 'image/png',\n        purpose: 'any',\n      },\n      {\n        src: '/icons/icon-96x96.png',\n        sizes: '96x96',\n        type: 'image/png',\n        purpose: 'any',\n      },\n      {\n        src: '/icons/icon-128x128.png',\n        sizes: '128x128',\n        type: 'image/png',\n        purpose: 'any',\n      },\n      {\n        src: '/icons/icon-144x144.png',\n        sizes: '144x144',\n        type: 'image/png',\n        purpose: 'any',\n      },\n      {\n        src: '/icons/icon-152x152.png',\n        sizes: '152x152',\n        type: 'image/png',\n        purpose: 'any',\n      },\n      {\n        src: '/icons/icon-192x192.png',\n        sizes: '192x192',\n        type: 'image/png',\n        purpose: 'maskable',\n      },\n      {\n        src: '/icons/icon-384x384.png',\n        sizes: '384x384',\n        type: 'image/png',\n        purpose: 'any',\n      },\n      {\n        src: '/icons/icon-512x512.png',\n        sizes: '512x512',\n        type: 'image/png',\n        purpose: 'maskable',\n      },\n    ],\n    screenshots: [\n      {\n        src: '/screenshots/desktop.png',\n        sizes: '1280x720',\n        type: 'image/png',\n        form_factor: 'wide',\n        label: 'Desktop view',\n      },\n      {\n        src: '/screenshots/mobile.png',\n        sizes: '750x1334',\n        type: 'image/png',\n        form_factor: 'narrow',\n        label: 'Mobile view',\n      },\n    ],\n    shortcuts: [\n      {\n        name: 'Dashboard',\n        short_name: 'Dashboard',\n        description: 'Go to dashboard',\n        url: '/dashboard',\n        icons: [{ src: '/icons/dashboard-96x96.png', sizes: '96x96' }],\n      },\n    ],\n  }\n\n  await writeFile(join(publicPath, 'manifest.json'), JSON.stringify(manifest, null, 2))\n}\n\nasync function addServiceWorker(publicPath: string): Promise<void> {\n  const serviceWorker = `// Custom Service Worker for AT3 PWA\n// This works alongside @ducanh2912/next-pwa\n\nconst CACHE_NAME = 'at3-cache-v1'\nconst OFFLINE_URL = '/offline'\n\n// Resources to pre-cache\nconst PRECACHE_RESOURCES = [\n  '/',\n  '/offline',\n  '/manifest.json',\n]\n\n// Install event - pre-cache resources\nself.addEventListener('install', (event) => {\n  event.waitUntil(\n    caches.open(CACHE_NAME).then((cache) => {\n      console.log('[SW] Pre-caching resources')\n      return cache.addAll(PRECACHE_RESOURCES)\n    })\n  )\n  // Force waiting service worker to become active\n  self.skipWaiting()\n})\n\n// Activate event - clean up old caches\nself.addEventListener('activate', (event) => {\n  event.waitUntil(\n    caches.keys().then((cacheNames) => {\n      return Promise.all(\n        cacheNames\n          .filter((cacheName) => cacheName !== CACHE_NAME)\n          .map((cacheName) => {\n            console.log('[SW] Deleting old cache:', cacheName)\n            return caches.delete(cacheName)\n          })\n      )\n    })\n  )\n  // Take control of all pages immediately\n  self.clients.claim()\n})\n\n// Fetch event - network first, fallback to cache\nself.addEventListener('fetch', (event) => {\n  // Skip non-GET requests\n  if (event.request.method !== 'GET') return\n\n  // Skip cross-origin requests\n  if (!event.request.url.startsWith(self.location.origin)) return\n\n  // Handle navigation requests\n  if (event.request.mode === 'navigate') {\n    event.respondWith(\n      fetch(event.request).catch(() => {\n        return caches.match(OFFLINE_URL)\n      })\n    )\n    return\n  }\n\n  // Network first strategy for API requests\n  if (event.request.url.includes('/api/')) {\n    event.respondWith(\n      fetch(event.request).catch(() => {\n        return new Response(\n          JSON.stringify({ error: 'Offline', message: 'No network connection' }),\n          {\n            status: 503,\n            headers: { 'Content-Type': 'application/json' },\n          }\n        )\n      })\n    )\n    return\n  }\n\n  // Cache first strategy for static assets\n  event.respondWith(\n    caches.match(event.request).then((cachedResponse) => {\n      if (cachedResponse) {\n        // Return cached response and update cache in background\n        event.waitUntil(\n          fetch(event.request).then((networkResponse) => {\n            if (networkResponse.ok) {\n              caches.open(CACHE_NAME).then((cache) => {\n                cache.put(event.request, networkResponse.clone())\n              })\n            }\n          })\n        )\n        return cachedResponse\n      }\n\n      // If not in cache, fetch from network\n      return fetch(event.request).then((networkResponse) => {\n        // Cache successful responses\n        if (networkResponse.ok) {\n          const responseClone = networkResponse.clone()\n          caches.open(CACHE_NAME).then((cache) => {\n            cache.put(event.request, responseClone)\n          })\n        }\n        return networkResponse\n      })\n    })\n  )\n})\n\n// Push notification event\nself.addEventListener('push', (event) => {\n  if (!event.data) return\n\n  const data = event.data.json()\n  const options = {\n    body: data.body || 'New notification',\n    icon: '/icons/icon-192x192.png',\n    badge: '/icons/badge-72x72.png',\n    vibrate: [100, 50, 100],\n    data: {\n      url: data.url || '/',\n    },\n    actions: data.actions || [],\n  }\n\n  event.waitUntil(\n    self.registration.showNotification(data.title || 'AT3 App', options)\n  )\n})\n\n// Notification click event\nself.addEventListener('notificationclick', (event) => {\n  event.notification.close()\n\n  const url = event.notification.data?.url || '/'\n\n  event.waitUntil(\n    clients.matchAll({ type: 'window' }).then((clientList) => {\n      // If a window is already open, focus it\n      for (const client of clientList) {\n        if (client.url === url && 'focus' in client) {\n          return client.focus()\n        }\n      }\n      // Otherwise, open a new window\n      if (clients.openWindow) {\n        return clients.openWindow(url)\n      }\n    })\n  )\n})\n\n// Background sync event\nself.addEventListener('sync', (event) => {\n  if (event.tag === 'sync-data') {\n    event.waitUntil(syncData())\n  }\n})\n\nasync function syncData() {\n  // Implement your background sync logic here\n  console.log('[SW] Background sync triggered')\n}\n`\n  await writeFile(join(publicPath, 'sw.js'), serviceWorker)\n}\n\nasync function addOfflinePage(srcPath: string): Promise<void> {\n  const offlinePath = join(srcPath, 'app', 'offline')\n  await ensureDir(offlinePath)\n\n  const offlinePage = `export default function OfflinePage() {\n  return (\n    <main className=\"flex min-h-screen flex-col items-center justify-center p-24 bg-background text-foreground\">\n      <div className=\"text-center\">\n        <div className=\"mb-8\">\n          <svg\n            className=\"mx-auto h-24 w-24 text-muted-foreground\"\n            fill=\"none\"\n            viewBox=\"0 0 24 24\"\n            stroke=\"currentColor\"\n            aria-hidden=\"true\"\n          >\n            <path\n              strokeLinecap=\"round\"\n              strokeLinejoin=\"round\"\n              strokeWidth={1.5}\n              d=\"M18.364 5.636a9 9 0 010 12.728m0 0l-2.829-2.829m2.829 2.829L21 21M15.536 8.464a5 5 0 010 7.072m0 0l-2.829-2.829m-4.243 2.829a5 5 0 01-7.072-7.072m0 0l2.829 2.829M6.343 6.343L3 3\"\n            />\n          </svg>\n        </div>\n        <h1 className=\"text-3xl font-bold tracking-tight sm:text-4xl\">\n          You&apos;re offline\n        </h1>\n        <p className=\"mt-4 text-lg text-muted-foreground max-w-md mx-auto\">\n          It looks like you&apos;ve lost your internet connection.\n          Please check your network and try again.\n        </p>\n        <div className=\"mt-8\">\n          <button\n            onClick={() => window.location.reload()}\n            className=\"rounded-md bg-primary px-6 py-3 text-sm font-semibold text-primary-foreground shadow-sm hover:bg-primary/90 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\"\n          >\n            Try again\n          </button>\n        </div>\n        <p className=\"mt-6 text-sm text-muted-foreground\">\n          Some features may still be available offline.\n        </p>\n      </div>\n    </main>\n  )\n}\n`\n  await writeFile(join(offlinePath, 'page.tsx'), offlinePage)\n}\n\nasync function addPWAUtils(srcPath: string): Promise<void> {\n  const pwaPath = join(srcPath, 'lib', 'pwa')\n  await ensureDir(pwaPath)\n\n  const pwaHooks = `'use client'\n\nimport { useCallback, useEffect, useState } from 'react'\n\ninterface BeforeInstallPromptEvent extends Event {\n  prompt(): Promise<void>\n  userChoice: Promise<{ outcome: 'accepted' | 'dismissed' }>\n}\n\n/**\n * Hook to manage PWA installation\n */\nexport function useInstallPrompt() {\n  const [deferredPrompt, setDeferredPrompt] = useState<BeforeInstallPromptEvent | null>(null)\n  const [isInstallable, setIsInstallable] = useState(false)\n  const [isInstalled, setIsInstalled] = useState(false)\n\n  useEffect(() => {\n    // Check if already installed\n    if (window.matchMedia('(display-mode: standalone)').matches) {\n      setIsInstalled(true)\n      return\n    }\n\n    const handleBeforeInstall = (e: Event) => {\n      e.preventDefault()\n      setDeferredPrompt(e as BeforeInstallPromptEvent)\n      setIsInstallable(true)\n    }\n\n    const handleAppInstalled = () => {\n      setIsInstalled(true)\n      setIsInstallable(false)\n      setDeferredPrompt(null)\n    }\n\n    window.addEventListener('beforeinstallprompt', handleBeforeInstall)\n    window.addEventListener('appinstalled', handleAppInstalled)\n\n    return () => {\n      window.removeEventListener('beforeinstallprompt', handleBeforeInstall)\n      window.removeEventListener('appinstalled', handleAppInstalled)\n    }\n  }, [])\n\n  const install = useCallback(async () => {\n    if (!deferredPrompt) return false\n\n    await deferredPrompt.prompt()\n    const { outcome } = await deferredPrompt.userChoice\n\n    setDeferredPrompt(null)\n    setIsInstallable(false)\n\n    return outcome === 'accepted'\n  }, [deferredPrompt])\n\n  return { isInstallable, isInstalled, install }\n}\n\n/**\n * Hook to check online/offline status\n */\nexport function useOnlineStatus() {\n  const [isOnline, setIsOnline] = useState(\n    typeof navigator !== 'undefined' ? navigator.onLine : true\n  )\n\n  useEffect(() => {\n    const handleOnline = () => setIsOnline(true)\n    const handleOffline = () => setIsOnline(false)\n\n    window.addEventListener('online', handleOnline)\n    window.addEventListener('offline', handleOffline)\n\n    return () => {\n      window.removeEventListener('online', handleOnline)\n      window.removeEventListener('offline', handleOffline)\n    }\n  }, [])\n\n  return isOnline\n}\n\n/**\n * Hook to manage service worker registration\n */\nexport function useServiceWorker() {\n  const [registration, setRegistration] = useState<ServiceWorkerRegistration | null>(null)\n  const [updateAvailable, setUpdateAvailable] = useState(false)\n\n  useEffect(() => {\n    if ('serviceWorker' in navigator) {\n      navigator.serviceWorker.ready.then((reg) => {\n        setRegistration(reg)\n\n        reg.addEventListener('updatefound', () => {\n          const newWorker = reg.installing\n          if (newWorker) {\n            newWorker.addEventListener('statechange', () => {\n              if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {\n                setUpdateAvailable(true)\n              }\n            })\n          }\n        })\n      })\n    }\n  }, [])\n\n  const update = useCallback(() => {\n    if (registration?.waiting) {\n      registration.waiting.postMessage({ type: 'SKIP_WAITING' })\n      window.location.reload()\n    }\n  }, [registration])\n\n  const checkForUpdates = useCallback(async () => {\n    if (registration) {\n      await registration.update()\n    }\n  }, [registration])\n\n  return { registration, updateAvailable, update, checkForUpdates }\n}\n\n/**\n * Hook to manage push notifications\n */\nexport function usePushNotifications() {\n  const [permission, setPermission] = useState<NotificationPermission>('default')\n  const [subscription, setSubscription] = useState<PushSubscription | null>(null)\n\n  useEffect(() => {\n    if ('Notification' in window) {\n      setPermission(Notification.permission)\n    }\n  }, [])\n\n  const requestPermission = useCallback(async () => {\n    if (!('Notification' in window)) return false\n\n    const result = await Notification.requestPermission()\n    setPermission(result)\n    return result === 'granted'\n  }, [])\n\n  const subscribe = useCallback(async (vapidPublicKey: string) => {\n    if (!('serviceWorker' in navigator) || !('PushManager' in window)) {\n      return null\n    }\n\n    const registration = await navigator.serviceWorker.ready\n    const sub = await registration.pushManager.subscribe({\n      userVisibleOnly: true,\n      applicationServerKey: urlBase64ToUint8Array(vapidPublicKey),\n    })\n\n    setSubscription(sub)\n    return sub\n  }, [])\n\n  const unsubscribe = useCallback(async () => {\n    if (subscription) {\n      await subscription.unsubscribe()\n      setSubscription(null)\n    }\n  }, [subscription])\n\n  return { permission, subscription, requestPermission, subscribe, unsubscribe }\n}\n\nfunction urlBase64ToUint8Array(base64String: string): Uint8Array {\n  const padding = '='.repeat((4 - (base64String.length % 4)) % 4)\n  const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/')\n  const rawData = window.atob(base64)\n  const outputArray = new Uint8Array(rawData.length)\n\n  for (let i = 0; i < rawData.length; ++i) {\n    outputArray[i] = rawData.charCodeAt(i)\n  }\n\n  return outputArray\n}\n`\n  await writeFile(join(pwaPath, 'hooks.ts'), pwaHooks)\n\n  // Add index export\n  const index = `export { useInstallPrompt, useOnlineStatus, useServiceWorker, usePushNotifications } from './hooks'\nexport { PWAProvider } from './provider'\nexport { InstallPrompt } from './install-prompt'\n`\n  await writeFile(join(pwaPath, 'index.ts'), index)\n}\n\nasync function addInstallPrompt(srcPath: string): Promise<void> {\n  const pwaPath = join(srcPath, 'lib', 'pwa')\n\n  const installPrompt = `'use client'\n\nimport { useEffect, useState } from 'react'\nimport { useInstallPrompt } from './hooks'\n\ninterface InstallPromptProps {\n  title?: string\n  description?: string\n  installText?: string\n  dismissText?: string\n  onInstall?: () => void\n  onDismiss?: () => void\n}\n\nexport function InstallPrompt({\n  title = 'Install App',\n  description = 'Install this app on your device for a better experience.',\n  installText = 'Install',\n  dismissText = 'Not now',\n  onInstall,\n  onDismiss,\n}: InstallPromptProps) {\n  const { isInstallable, isInstalled, install } = useInstallPrompt()\n  const [isDismissed, setIsDismissed] = useState(false)\n  const [showPrompt, setShowPrompt] = useState(false)\n\n  useEffect(() => {\n    // Check if user has previously dismissed the prompt\n    const dismissed = localStorage.getItem('pwa-install-dismissed')\n    if (dismissed) {\n      const dismissedTime = parseInt(dismissed, 10)\n      // Show again after 7 days\n      if (Date.now() - dismissedTime < 7 * 24 * 60 * 60 * 1000) {\n        setIsDismissed(true)\n      }\n    }\n\n    // Delay showing the prompt\n    const timer = setTimeout(() => {\n      setShowPrompt(true)\n    }, 3000)\n\n    return () => clearTimeout(timer)\n  }, [])\n\n  if (!showPrompt || !isInstallable || isInstalled || isDismissed) {\n    return null\n  }\n\n  const handleInstall = async () => {\n    const installed = await install()\n    if (installed) {\n      onInstall?.()\n    }\n  }\n\n  const handleDismiss = () => {\n    setIsDismissed(true)\n    localStorage.setItem('pwa-install-dismissed', Date.now().toString())\n    onDismiss?.()\n  }\n\n  return (\n    <div className=\"fixed bottom-4 left-4 right-4 md:left-auto md:right-4 md:w-96 z-50\">\n      <div className=\"bg-background border border-border rounded-lg shadow-lg p-4\">\n        <div className=\"flex items-start gap-4\">\n          <div className=\"shrink-0\">\n            <div className=\"h-12 w-12 rounded-lg bg-primary/10 flex items-center justify-center\"\n              <svg\n                className=\"h-6 w-6 text-primary\"\n                fill=\"none\"\n                viewBox=\"0 0 24 24\"\n                stroke=\"currentColor\"\n              >\n                <path\n                  strokeLinecap=\"round\"\n                  strokeLinejoin=\"round\"\n                  strokeWidth={2}\n                  d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n                />\n              </svg>\n            </div>\n          </div>\n          <div className=\"flex-1 min-w-0\">\n            <h3 className=\"text-sm font-semibold text-foreground\">{title}</h3>\n            <p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>\n            <div className=\"mt-3 flex gap-2\">\n              <button\n                onClick={handleInstall}\n                className=\"inline-flex items-center px-3 py-1.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors\"\n              >\n                {installText}\n              </button>\n              <button\n                onClick={handleDismiss}\n                className=\"inline-flex items-center px-3 py-1.5 text-sm font-medium rounded-md text-muted-foreground hover:text-foreground hover:bg-accent transition-colors\"\n              >\n                {dismissText}\n              </button>\n            </div>\n          </div>\n          <button\n            onClick={handleDismiss}\n            className=\"shrink-0 text-muted-foreground hover:text-foreground\"\n            aria-label=\"Close\"\n          >\n            <svg className=\"h-5 w-5\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n              <path\n                fillRule=\"evenodd\"\n                d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n                clipRule=\"evenodd\"\n              />\n            </svg>\n          </button>\n        </div>\n      </div>\n    </div>\n  )\n}\n`\n  await writeFile(join(pwaPath, 'install-prompt.tsx'), installPrompt)\n}\n\nasync function addPWAProvider(srcPath: string): Promise<void> {\n  const pwaPath = join(srcPath, 'lib', 'pwa')\n\n  const provider = `'use client'\n\nimport { createContext, useContext, useEffect, type ReactNode } from 'react'\nimport { useOnlineStatus, useServiceWorker } from './hooks'\n\ninterface PWAContextType {\n  isOnline: boolean\n  updateAvailable: boolean\n  update: () => void\n  checkForUpdates: () => Promise<void>\n}\n\nconst PWAContext = createContext<PWAContextType | null>(null)\n\nexport function usePWA() {\n  const context = useContext(PWAContext)\n  if (!context) {\n    throw new Error('usePWA must be used within a PWAProvider')\n  }\n  return context\n}\n\ninterface PWAProviderProps {\n  children: ReactNode\n}\n\nexport function PWAProvider({ children }: PWAProviderProps) {\n  const isOnline = useOnlineStatus()\n  const { updateAvailable, update, checkForUpdates } = useServiceWorker()\n\n  // Register service worker on mount\n  useEffect(() => {\n    if ('serviceWorker' in navigator && process.env.NODE_ENV === 'production') {\n      navigator.serviceWorker.register('/sw.js').catch((error) => {\n        console.error('Service Worker registration failed:', error)\n      })\n    }\n  }, [])\n\n  // Check for updates periodically\n  useEffect(() => {\n    const interval = setInterval(() => {\n      checkForUpdates()\n    }, 60 * 60 * 1000) // Check every hour\n\n    return () => clearInterval(interval)\n  }, [checkForUpdates])\n\n  return (\n    <PWAContext.Provider value={{ isOnline, updateAvailable, update, checkForUpdates }}>\n      {children}\n    </PWAContext.Provider>\n  )\n}\n`\n  await writeFile(join(pwaPath, 'provider.tsx'), provider)\n}\n\nasync function updatePackageJson(projectPath: string): Promise<void> {\n  const packageJsonPath = join(projectPath, 'package.json')\n  const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'))\n\n  if (!packageJson.dependencies) packageJson.dependencies = {}\n\n  // Using @ducanh2912/next-pwa for better App Router support\n  packageJson.dependencies['@ducanh2912/next-pwa'] = '^10.2.9'\n\n  await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2))\n}\n\nasync function updateNextConfig(projectPath: string): Promise<void> {\n  const configPath = join(projectPath, 'next.config.ts')\n\n  try {\n    let configContent = await readFile(configPath, 'utf-8')\n\n    // Check if already configured\n    if (configContent.includes('withPWA')) return\n\n    // Add import\n    const importStatement = `import withPWAInit from \"@ducanh2912/next-pwa\"\\n`\n\n    // Initialize plugin\n    const pluginInit = `\nconst withPWA = withPWAInit({\n  dest: \"public\",\n  cacheOnFrontEndNav: true,\n  aggressiveFrontEndNavCaching: true,\n  reloadOnOnline: true,\n  disable: process.env.NODE_ENV === \"development\",\n  workboxOptions: {\n    disableDevLogs: true,\n  },\n})\n`\n\n    // Add import at the top\n    if (!configContent.includes('@ducanh2912/next-pwa')) {\n      configContent = importStatement + configContent\n    }\n\n    // Find export default and wrap it\n    const exportDefaultRegex = /export\\s+default\\s+(\\w+)\\s*;?\\s*$/m\n    const match = configContent.match(exportDefaultRegex)\n\n    if (match) {\n      const configName = match[1]\n      configContent = configContent.replace(\n        exportDefaultRegex,\n        `${pluginInit}\\nexport default withPWA(${configName})\\n`\n      )\n    } else {\n      // Handle wrapped configs like withNextIntl(nextConfig)\n      const wrappedExportRegex = /export\\s+default\\s+(with\\w+\\([^)]+\\))\\s*;?\\s*$/m\n      const wrappedMatch = configContent.match(wrappedExportRegex)\n\n      if (wrappedMatch) {\n        configContent = configContent.replace(\n          wrappedExportRegex,\n          `${pluginInit}\\nexport default withPWA(${wrappedMatch[1]})\\n`\n        )\n      }\n    }\n\n    await writeFile(configPath, configContent)\n  } catch (error) {\n    console.warn(\n      'Could not update next.config.ts automatically. Please wrap your config with withPWA manually.'\n    )\n  }\n}\n\nasync function updateLayout(srcPath: string): Promise<void> {\n  // Add PWA meta tags component\n  const componentsPath = join(srcPath, 'components', 'pwa')\n  await ensureDir(componentsPath)\n\n  const pwaMeta = `import type { Metadata, Viewport } from 'next'\n\nexport const pwaViewport: Viewport = {\n  themeColor: [\n    { media: '(prefers-color-scheme: light)', color: '#ffffff' },\n    { media: '(prefers-color-scheme: dark)', color: '#0a0a0a' },\n  ],\n  width: 'device-width',\n  initialScale: 1,\n  maximumScale: 1,\n  userScalable: false,\n  viewportFit: 'cover',\n}\n\nexport const pwaMetadata: Partial<Metadata> = {\n  applicationName: 'AT3 App',\n  appleWebApp: {\n    capable: true,\n    statusBarStyle: 'default',\n    title: 'AT3 App',\n  },\n  formatDetection: {\n    telephone: false,\n  },\n  manifest: '/manifest.json',\n  icons: {\n    icon: [\n      { url: '/icons/icon-192x192.png', sizes: '192x192', type: 'image/png' },\n      { url: '/icons/icon-512x512.png', sizes: '512x512', type: 'image/png' },\n    ],\n    apple: [\n      { url: '/icons/icon-152x152.png', sizes: '152x152', type: 'image/png' },\n      { url: '/icons/icon-192x192.png', sizes: '192x192', type: 'image/png' },\n    ],\n  },\n}\n\n/**\n * Usage in layout.tsx:\n *\n * import { pwaMetadata, pwaViewport } from '@/components/pwa/pwa-meta'\n *\n * export const metadata: Metadata = {\n *   ...pwaMetadata,\n *   title: 'Your App Title',\n *   description: 'Your app description',\n * }\n *\n * export const viewport: Viewport = pwaViewport\n */\n`\n  await writeFile(join(componentsPath, 'pwa-meta.ts'), pwaMeta)\n\n  // Add update notification component\n  const updateNotification = `'use client'\n\nimport { usePWA } from '@/lib/pwa'\n\nexport function UpdateNotification() {\n  const { updateAvailable, update } = usePWA()\n\n  if (!updateAvailable) return null\n\n  return (\n    <div className=\"fixed top-4 left-4 right-4 md:left-auto md:right-4 md:w-96 z-50\">\n      <div className=\"bg-primary text-primary-foreground rounded-lg shadow-lg p-4\">\n        <div className=\"flex items-center justify-between\">\n          <div className=\"flex items-center gap-3\">\n            <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n              <path\n                strokeLinecap=\"round\"\n                strokeLinejoin=\"round\"\n                strokeWidth={2}\n                d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\"\n              />\n            </svg>\n            <span className=\"text-sm font-medium\">Update available</span>\n          </div>\n          <button\n            onClick={update}\n            className=\"text-sm font-medium underline hover:no-underline\"\n          >\n            Refresh\n          </button>\n        </div>\n      </div>\n    </div>\n  )\n}\n`\n  await writeFile(join(componentsPath, 'update-notification.tsx'), updateNotification)\n\n  // Add offline indicator component\n  const offlineIndicator = `'use client'\n\nimport { usePWA } from '@/lib/pwa'\n\nexport function OfflineIndicator() {\n  const { isOnline } = usePWA()\n\n  if (isOnline) return null\n\n  return (\n    <div className=\"fixed bottom-4 left-1/2 -translate-x-1/2 z-50\">\n      <div className=\"bg-yellow-500 text-yellow-950 rounded-full px-4 py-2 shadow-lg\">\n        <div className=\"flex items-center gap-2\">\n          <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n            <path\n              strokeLinecap=\"round\"\n              strokeLinejoin=\"round\"\n              strokeWidth={2}\n              d=\"M18.364 5.636a9 9 0 010 12.728m0 0l-2.829-2.829m2.829 2.829L21 21M15.536 8.464a5 5 0 010 7.072m0 0l-2.829-2.829m-4.243 2.829a5 5 0 01-7.072-7.072\"\n            />\n          </svg>\n          <span className=\"text-sm font-medium\">You&apos;re offline</span>\n        </div>\n      </div>\n    </div>\n  )\n}\n`\n  await writeFile(join(componentsPath, 'offline-indicator.tsx'), offlineIndicator)\n\n  // Add index export\n  const index = `export { pwaMetadata, pwaViewport } from './pwa-meta'\nexport { UpdateNotification } from './update-notification'\nexport { OfflineIndicator } from './offline-indicator'\n`\n  await writeFile(join(componentsPath, 'index.ts'), index)\n}\n","/**\n * Add Supabase integration to existing project\n */\n\nimport { ensureDir, pathExists, readFile, writeFile } from 'fs-extra'\nimport { join } from 'path'\n\nexport async function addSupabase(projectPath: string): Promise<void> {\n  const srcPath = join(projectPath, 'src')\n  await ensureDir(srcPath)\n\n  // Create lib/supabase directory\n  const supabasePath = join(srcPath, 'lib', 'supabase')\n  await ensureDir(supabasePath)\n\n  // Add Supabase clients\n  await addSupabaseClients(supabasePath)\n\n  // Add auth helpers\n  await addAuthHelpers(join(srcPath, 'lib', 'auth'))\n\n  // Update package.json\n  await updatePackageJson(projectPath)\n\n  // Add environment variables template\n  await addEnvExample(projectPath)\n\n  // Initialize Supabase config\n  await initSupabaseConfig(projectPath)\n}\n\nasync function addSupabaseClients(supabasePath: string): Promise<void> {\n  // Client-side Supabase client\n  const clientCode = `import { createBrowserClient } from '@supabase/ssr';\n\nexport function createClient() {\n  return createBrowserClient(\n    process.env.NEXT_PUBLIC_SUPABASE_URL!,\n    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!\n  );\n}\n`\n\n  await writeFile(join(supabasePath, 'client.ts'), clientCode)\n\n  // Server-side Supabase client\n  const serverCode = `import { createServerClient } from '@supabase/ssr';\nimport { cookies } from 'next/headers';\n\nexport async function createServerClient() {\n  const cookieStore = await cookies();\n\n  return createServerClient(\n    process.env.NEXT_PUBLIC_SUPABASE_URL!,\n    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,\n    {\n      cookies: {\n        getAll() {\n          return cookieStore.getAll();\n        },\n        setAll(cookiesToSet) {\n          try {\n            cookiesToSet.forEach(({ name, value, options }) =>\n              cookieStore.set(name, value, options)\n            );\n          } catch {\n            // The 'setAll' method was called from a Server Component.\n            // This can be ignored if you have middleware refreshing\n            // user sessions.\n          }\n        },\n      },\n    }\n  );\n}\n`\n\n  await writeFile(join(supabasePath, 'server.ts'), serverCode)\n\n  // Middleware helper\n  const middlewareCode = `import { createServerClient } from '@supabase/ssr';\nimport { NextResponse, type NextRequest } from 'next/server';\n\nexport async function updateSession(request: NextRequest) {\n  let supabaseResponse = NextResponse.next({\n    request,\n  });\n\n  const supabase = createServerClient(\n    process.env.NEXT_PUBLIC_SUPABASE_URL!,\n    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,\n    {\n      cookies: {\n        getAll() {\n          return request.cookies.getAll();\n        },\n        setAll(cookiesToSet) {\n          cookiesToSet.forEach(({ name, value }) => request.cookies.set(name, value));\n          supabaseResponse = NextResponse.next({\n            request,\n          });\n          cookiesToSet.forEach(({ name, value, options }) =>\n            supabaseResponse.cookies.set(name, value, options)\n          );\n        },\n      },\n    }\n  );\n\n  // This will refresh session if expired - required for Server Components\n  await supabase.auth.getUser();\n\n  return supabaseResponse;\n}\n`\n\n  await writeFile(join(supabasePath, 'middleware.ts'), middlewareCode)\n}\n\nasync function addAuthHelpers(authPath: string): Promise<void> {\n  await ensureDir(authPath)\n\n  const authHelpersCode = `import { createServerClient } from '@/lib/supabase/server';\nimport { redirect } from 'next/navigation';\n\nexport async function requireAuth() {\n  const supabase = await createServerClient();\n  const { data: { user }, error } = await supabase.auth.getUser();\n\n  if (error || !user) {\n    redirect('/auth/sign-in');\n  }\n\n  return user;\n}\n\nexport async function getUser() {\n  const supabase = await createServerClient();\n  const { data: { user } } = await supabase.auth.getUser();\n  return user;\n}\n\nexport async function signOut() {\n  const supabase = await createServerClient();\n  await supabase.auth.signOut();\n  redirect('/');\n}\n`\n\n  await writeFile(join(authPath, 'auth-helpers.ts'), authHelpersCode)\n}\n\nasync function updatePackageJson(projectPath: string): Promise<void> {\n  const packageJsonPath = join(projectPath, 'package.json')\n\n  if (!(await pathExists(packageJsonPath))) return\n\n  const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'))\n\n  if (!packageJson.dependencies) packageJson.dependencies = {}\n  if (!packageJson.devDependencies) packageJson.devDependencies = {}\n\n  // Add Supabase dependencies\n  packageJson.dependencies['@supabase/supabase-js'] = '^2.46.0'\n  packageJson.dependencies['@supabase/ssr'] = '^0.5.1'\n\n  // Add Supabase CLI as dev dependency\n  packageJson.devDependencies['supabase'] = '^1.207.9'\n\n  await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2))\n}\n\nasync function addEnvExample(projectPath: string): Promise<void> {\n  const envExamplePath = join(projectPath, '.env.example')\n\n  let envContent = ''\n\n  // Read existing .env.example if it exists\n  if (await pathExists(envExamplePath)) {\n    envContent = await readFile(envExamplePath, 'utf-8')\n  }\n\n  // Add Supabase variables if not present\n  if (!envContent.includes('NEXT_PUBLIC_SUPABASE_URL')) {\n    const supabaseVars = `\n# Supabase\nNEXT_PUBLIC_SUPABASE_URL=your_supabase_url\nNEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key\nSUPABASE_SERVICE_ROLE_KEY=your_service_role_key\n`\n\n    envContent = envContent + supabaseVars\n    await writeFile(envExamplePath, envContent)\n  }\n}\n\nasync function initSupabaseConfig(projectPath: string): Promise<void> {\n  const supabaseConfigPath = join(projectPath, 'supabase', 'config.toml')\n\n  if (await pathExists(supabaseConfigPath)) return // Already exists\n\n  await ensureDir(join(projectPath, 'supabase'))\n\n  const config = `# A string used to distinguish different Supabase projects on the same host.\nproject_id = \"your-project-id\"\n\n[api]\nenabled = true\nport = 54321\nschemas = [\"public\", \"graphql_public\"]\nextra_search_path = [\"public\", \"extensions\"]\nmax_rows = 1000\n\n[auth]\nenabled = true\nport = 9999\nsite_url = \"http://localhost:3000\"\nadditional_redirect_urls = [\"https://localhost:3000\"]\njwt_expiry = 3600\nrefresh_token_rotation_enabled = true\nsecurity_update_password_require_reauthentication = true\n\n[auth.email]\nenable_signup = true\ndouble_confirm_changes = true\nenable_confirmations = false\n`\n\n  await writeFile(supabaseConfigPath, config)\n}\n","/**\n * Add testing suite to existing project\n */\n\nimport { ensureDir, pathExists, readJson, writeFile, writeJson } from 'fs-extra'\nimport { join } from 'path'\n\n/**\n * Add testing suite to existing project\n */\nexport async function addTesting(projectPath: string): Promise<void> {\n  const packageJsonPath = join(projectPath, 'package.json')\n\n  try {\n    const pkg = await readJson(packageJsonPath)\n    const devCommand = getDevCommand(pkg.packageManager as string | undefined)\n\n    // Add scripts\n    pkg.scripts = {\n      ...pkg.scripts,\n      test: 'vitest',\n      'test:ui': 'vitest --ui',\n      'test:run': 'vitest run',\n      'test:coverage': 'vitest run --coverage',\n      'test:e2e': 'playwright test',\n      'test:e2e:ui': 'playwright test --ui',\n      'test:e2e:report': 'playwright show-report',\n    }\n\n    // Add devDependencies\n    pkg.devDependencies = {\n      ...pkg.devDependencies,\n      vitest: '^4.0.14',\n      '@vitest/ui': '^4.0.14',\n      '@vitest/coverage-v8': '^4.0.14',\n      '@testing-library/react': '^16.3.0',\n      '@testing-library/dom': '^10.4.1',\n      '@testing-library/user-event': '^14.6.1',\n      '@testing-library/jest-dom': '^6.9.1',\n      jsdom: '^27.2.0',\n      '@playwright/test': '^1.57.0',\n      '@vitejs/plugin-react': '^5.1.1',\n      '@faker-js/faker': '^10.1.0',\n    }\n\n    await writeJson(packageJsonPath, pkg, { spaces: 2 })\n\n    // Create test directories\n    const testDir = join(projectPath, 'src', 'test')\n    const e2eDir = join(projectPath, 'tests', 'e2e')\n    const unitDir = join(projectPath, 'tests', 'unit')\n\n    await ensureDir(testDir)\n    await ensureDir(e2eDir)\n    await ensureDir(unitDir)\n    await ensureDir(join(projectPath, 'src', 'app'))\n\n    // Create test setup file\n    await createTestSetup(testDir)\n\n    // Create test utilities\n    await createTestUtils(testDir)\n\n    // Create vitest.config.ts\n    await createVitestConfig(projectPath)\n\n    // Create playwright.config.ts\n    await createPlaywrightConfig(projectPath, devCommand)\n\n    // Create sample tests\n    await createSampleUnitTest(unitDir)\n    await createSampleComponentTest(projectPath)\n    await createSampleE2ETest(e2eDir)\n\n    // Create mock utilities\n    await createMockUtils(testDir)\n\n    console.log('✓ Added testing configuration (Vitest + Playwright)')\n  } catch (error) {\n    console.error('Failed to add testing suite:', error)\n    throw error\n  }\n}\n\nasync function createTestSetup(testDir: string): Promise<void> {\n  const setupFile = `import '@testing-library/jest-dom'\nimport { cleanup } from '@testing-library/react'\nimport { afterEach, beforeAll, vi } from 'vitest'\n\n// Cleanup after each test case\nafterEach(() => {\n  cleanup()\n})\n\n// Mock window.matchMedia\nbeforeAll(() => {\n  Object.defineProperty(window, 'matchMedia', {\n    writable: true,\n    value: vi.fn().mockImplementation((query: string) => ({\n      matches: false,\n      media: query,\n      onchange: null,\n      addListener: vi.fn(),\n      removeListener: vi.fn(),\n      addEventListener: vi.fn(),\n      removeEventListener: vi.fn(),\n      dispatchEvent: vi.fn(),\n    })),\n  })\n\n  // Mock ResizeObserver\n  global.ResizeObserver = vi.fn().mockImplementation(() => ({\n    observe: vi.fn(),\n    unobserve: vi.fn(),\n    disconnect: vi.fn(),\n  }))\n\n  // Mock IntersectionObserver\n  global.IntersectionObserver = vi.fn().mockImplementation(() => ({\n    observe: vi.fn(),\n    unobserve: vi.fn(),\n    disconnect: vi.fn(),\n  }))\n})\n\n// Suppress console errors in tests (optional)\n// vi.spyOn(console, 'error').mockImplementation(() => {})\n`\n  await writeFile(join(testDir, 'setup.ts'), setupFile)\n}\n\nasync function createTestUtils(testDir: string): Promise<void> {\n  const testUtils = `import type { RenderOptions } from '@testing-library/react'\nimport { render } from '@testing-library/react'\nimport userEvent from '@testing-library/user-event'\nimport type { ReactElement, ReactNode } from 'react'\n\n// Add providers here as your app grows\ninterface WrapperProps {\n  children: ReactNode\n}\n\nfunction AllProviders({ children }: WrapperProps) {\n  return (\n    <>\n      {/* Add providers like ThemeProvider, QueryClientProvider, etc. */}\n      {children}\n    </>\n  )\n}\n\n/**\n * Custom render function that includes providers\n */\nfunction customRender(\n  ui: ReactElement,\n  options?: Omit<RenderOptions, 'wrapper'>\n) {\n  return {\n    user: userEvent.setup(),\n    ...render(ui, { wrapper: AllProviders, ...options }),\n  }\n}\n\n// Re-export everything from testing-library\nexport * from '@testing-library/react'\n\n// Override render with custom render\nexport { customRender as render }\n\n/**\n * Helper to wait for async state updates\n */\nexport async function waitForStateUpdate(): Promise<void> {\n  await new Promise((resolve) => setTimeout(resolve, 0))\n}\n\n/**\n * Helper to create a mock function with specific return value\n */\nexport function createMockFn<T>(returnValue?: T) {\n  const { vi } = await import('vitest')\n  return vi.fn().mockReturnValue(returnValue)\n}\n\n/**\n * Helper to mock a module\n */\nexport async function mockModule(modulePath: string, mocks: Record<string, unknown>) {\n  const { vi } = await import('vitest')\n  vi.mock(modulePath, () => mocks)\n}\n`\n  await writeFile(join(testDir, 'utils.tsx'), testUtils)\n}\n\nasync function createVitestConfig(projectPath: string): Promise<void> {\n  const vitestConfig = `import react from '@vitejs/plugin-react'\nimport { resolve } from 'path'\nimport { defineConfig } from 'vitest/config'\n\nexport default defineConfig({\n  plugins: [react()],\n  test: {\n    environment: 'jsdom',\n    globals: true,\n    setupFiles: ['./src/test/setup.ts'],\n    include: [\n      'src/**/*.{test,spec}.{js,ts,jsx,tsx}',\n      'tests/unit/**/*.{test,spec}.{js,ts,jsx,tsx}',\n    ],\n    exclude: [\n      'node_modules',\n      'dist',\n      '.next',\n      '.git',\n      'tests/e2e/**/*',\n    ],\n    coverage: {\n      provider: 'v8',\n      reporter: ['text', 'json', 'html'],\n      exclude: [\n        'node_modules/',\n        'src/test/',\n        '**/*.d.ts',\n        '**/*.config.*',\n        '**/types/**',\n      ],\n    },\n    // Enable parallel test execution\n    pool: 'threads',\n    poolOptions: {\n      threads: {\n        singleThread: false,\n      },\n    },\n    // Timeout for async operations\n    testTimeout: 10000,\n    hookTimeout: 10000,\n  },\n  resolve: {\n    alias: {\n      '@': resolve(__dirname, './src'),\n    },\n  },\n})\n`\n  await writeFile(join(projectPath, 'vitest.config.ts'), vitestConfig)\n}\n\nasync function createPlaywrightConfig(projectPath: string, devCommand: string): Promise<void> {\n  const playwrightConfig = `import { defineConfig, devices } from '@playwright/test'\n\n/**\n * Playwright configuration for E2E testing\n * @see https://playwright.dev/docs/test-configuration\n */\nexport default defineConfig({\n  testDir: './tests/e2e',\n\n  // Run tests in files in parallel\n  fullyParallel: true,\n\n  // Fail the build on CI if you accidentally left test.only in the source code\n  forbidOnly: !!process.env.CI,\n\n  // Retry on CI only\n  retries: process.env.CI ? 2 : 0,\n\n  // Opt out of parallel tests on CI\n  workers: process.env.CI ? 1 : undefined,\n\n  // Reporter configuration\n  reporter: [\n    ['html', { open: 'never' }],\n    ['list'],\n    ...(process.env.CI ? [['github'] as const] : []),\n  ],\n\n  // Shared settings for all projects\n  use: {\n    baseURL: 'http://localhost:3000',\n\n    // Collect trace when retrying the failed test\n    trace: 'on-first-retry',\n\n    // Screenshot on failure\n    screenshot: 'only-on-failure',\n\n    // Video on failure\n    video: 'on-first-retry',\n  },\n\n  // Configure projects for major browsers\n  projects: [\n    {\n      name: 'chromium',\n      use: { ...devices['Desktop Chrome'] },\n    },\n    {\n      name: 'firefox',\n      use: { ...devices['Desktop Firefox'] },\n    },\n    {\n      name: 'webkit',\n      use: { ...devices['Desktop Safari'] },\n    },\n    // Mobile viewports\n    {\n      name: 'Mobile Chrome',\n      use: { ...devices['Pixel 5'] },\n    },\n    {\n      name: 'Mobile Safari',\n      use: { ...devices['iPhone 12'] },\n    },\n  ],\n\n  // Run your local dev server before starting the tests\n  webServer: {\n    command: '${devCommand}',\n    url: 'http://localhost:3000',\n    reuseExistingServer: !process.env.CI,\n    timeout: 120 * 1000,\n  },\n})\n`\n  await writeFile(join(projectPath, 'playwright.config.ts'), playwrightConfig)\n}\n\nasync function createSampleUnitTest(unitDir: string): Promise<void> {\n  const sampleUnitTest = `import { describe, expect, it } from 'vitest'\n\n/**\n * Sample utility function tests\n */\ndescribe('Utility Functions', () => {\n  describe('String utilities', () => {\n    it('should capitalize first letter', () => {\n      const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1)\n\n      expect(capitalize('hello')).toBe('Hello')\n      expect(capitalize('world')).toBe('World')\n      expect(capitalize('')).toBe('')\n    })\n\n    it('should truncate long strings', () => {\n      const truncate = (str: string, maxLength: number) =>\n        str.length > maxLength ? str.slice(0, maxLength) + '...' : str\n\n      expect(truncate('Hello World', 5)).toBe('Hello...')\n      expect(truncate('Hi', 5)).toBe('Hi')\n    })\n  })\n\n  describe('Number utilities', () => {\n    it('should clamp number within range', () => {\n      const clamp = (num: number, min: number, max: number) =>\n        Math.min(Math.max(num, min), max)\n\n      expect(clamp(5, 0, 10)).toBe(5)\n      expect(clamp(-5, 0, 10)).toBe(0)\n      expect(clamp(15, 0, 10)).toBe(10)\n    })\n  })\n\n  describe('Array utilities', () => {\n    it('should remove duplicates', () => {\n      const unique = <T>(arr: T[]) => [...new Set(arr)]\n\n      expect(unique([1, 2, 2, 3, 3, 3])).toEqual([1, 2, 3])\n      expect(unique(['a', 'b', 'a'])).toEqual(['a', 'b'])\n    })\n\n    it('should chunk array', () => {\n      const chunk = <T>(arr: T[], size: number): T[][] => {\n        const chunks: T[][] = []\n        for (let i = 0; i < arr.length; i += size) {\n          chunks.push(arr.slice(i, i + size))\n        }\n        return chunks\n      }\n\n      expect(chunk([1, 2, 3, 4, 5], 2)).toEqual([[1, 2], [3, 4], [5]])\n      expect(chunk([1, 2, 3], 3)).toEqual([[1, 2, 3]])\n    })\n  })\n})\n`\n  await writeFile(join(unitDir, 'utils.test.ts'), sampleUnitTest)\n}\n\nasync function createSampleComponentTest(projectPath: string): Promise<void> {\n  const componentTest = `import { render, screen } from '@/test/utils'\nimport { describe, expect, it, vi } from 'vitest'\n\n/**\n * Sample React component tests\n */\ndescribe('Component Tests', () => {\n  describe('Button Component', () => {\n    // Example button component for testing\n    function Button({\n      children,\n      onClick,\n      disabled = false\n    }: {\n      children: React.ReactNode\n      onClick?: () => void\n      disabled?: boolean\n    }) {\n      return (\n        <button onClick={onClick} disabled={disabled} type=\"button\">\n          {children}\n        </button>\n      )\n    }\n\n    it('renders button with text', () => {\n      render(<Button>Click me</Button>)\n\n      expect(screen.getByRole('button', { name: /click me/i })).toBeInTheDocument()\n    })\n\n    it('calls onClick when clicked', async () => {\n      const handleClick = vi.fn()\n      const { user } = render(<Button onClick={handleClick}>Click me</Button>)\n\n      await user.click(screen.getByRole('button'))\n\n      expect(handleClick).toHaveBeenCalledTimes(1)\n    })\n\n    it('does not call onClick when disabled', async () => {\n      const handleClick = vi.fn()\n      const { user } = render(<Button onClick={handleClick} disabled>Click me</Button>)\n\n      await user.click(screen.getByRole('button'))\n\n      expect(handleClick).not.toHaveBeenCalled()\n    })\n  })\n\n  describe('Form Component', () => {\n    function LoginForm({ onSubmit }: { onSubmit: (data: { email: string; password: string }) => void }) {\n      return (\n        <form onSubmit={(e) => {\n          e.preventDefault()\n          const formData = new FormData(e.currentTarget)\n          onSubmit({\n            email: formData.get('email') as string,\n            password: formData.get('password') as string,\n          })\n        }}>\n          <label htmlFor=\"email\">Email</label>\n          <input id=\"email\" name=\"email\" type=\"email\" required />\n\n          <label htmlFor=\"password\">Password</label>\n          <input id=\"password\" name=\"password\" type=\"password\" required />\n\n          <button type=\"submit\">Login</button>\n        </form>\n      )\n    }\n\n    it('submits form with entered values', async () => {\n      const handleSubmit = vi.fn()\n      const { user } = render(<LoginForm onSubmit={handleSubmit} />)\n\n      await user.type(screen.getByLabelText(/email/i), 'test@example.com')\n      await user.type(screen.getByLabelText(/password/i), 'password123')\n      await user.click(screen.getByRole('button', { name: /login/i }))\n\n      expect(handleSubmit).toHaveBeenCalledWith({\n        email: 'test@example.com',\n        password: 'password123',\n      })\n    })\n  })\n})\n`\n  await writeFile(join(projectPath, 'tests', 'unit', 'components.test.tsx'), componentTest)\n}\n\nasync function createSampleE2ETest(e2eDir: string): Promise<void> {\n  const sampleE2ETest = `import { expect, test } from '@playwright/test'\n\ntest.describe('Home Page', () => {\n  test('has title', async ({ page }) => {\n    await page.goto('/')\n\n    // Expect a title to contain a substring\n    await expect(page).toHaveTitle(/AT3|Next|App/)\n  })\n\n  test('has main heading', async ({ page }) => {\n    await page.goto('/')\n\n    // Check for a main heading\n    const heading = page.getByRole('heading', { level: 1 })\n    await expect(heading).toBeVisible()\n  })\n\n  test('navigation works', async ({ page }) => {\n    await page.goto('/')\n\n    // Check page loads without errors\n    await expect(page.locator('body')).toBeVisible()\n  })\n})\n\ntest.describe('Accessibility', () => {\n  test('page has no accessibility violations', async ({ page }) => {\n    await page.goto('/')\n\n    // Check that images have alt text\n    const images = page.locator('img')\n    const count = await images.count()\n\n    for (let i = 0; i < count; i++) {\n      const img = images.nth(i)\n      const alt = await img.getAttribute('alt')\n      expect(alt).not.toBeNull()\n    }\n  })\n\n  test('interactive elements are keyboard accessible', async ({ page }) => {\n    await page.goto('/')\n\n    // Tab through interactive elements\n    await page.keyboard.press('Tab')\n\n    // Check that something is focused\n    const focusedElement = await page.evaluate(() => document.activeElement?.tagName)\n    expect(focusedElement).toBeTruthy()\n  })\n})\n\ntest.describe('Performance', () => {\n  test('page loads within acceptable time', async ({ page }) => {\n    const startTime = Date.now()\n    await page.goto('/')\n    const loadTime = Date.now() - startTime\n\n    // Page should load within 3 seconds\n    expect(loadTime).toBeLessThan(3000)\n  })\n})\n`\n  await writeFile(join(e2eDir, 'home.spec.ts'), sampleE2ETest)\n\n  // Create auth e2e test\n  const authE2ETest = `import { expect, test } from '@playwright/test'\n\ntest.describe('Authentication', () => {\n  test.describe('Login Flow', () => {\n    test('shows login form', async ({ page }) => {\n      await page.goto('/login')\n\n      // Check for login form elements\n      await expect(page.getByLabel(/email/i)).toBeVisible()\n      await expect(page.getByLabel(/password/i)).toBeVisible()\n      await expect(page.getByRole('button', { name: /sign in|login/i })).toBeVisible()\n    })\n\n    test('shows validation errors for empty form', async ({ page }) => {\n      await page.goto('/login')\n\n      // Try to submit empty form\n      await page.getByRole('button', { name: /sign in|login/i }).click()\n\n      // Check for validation messages\n      // Adjust based on your validation implementation\n    })\n\n    test('shows error for invalid credentials', async ({ page }) => {\n      await page.goto('/login')\n\n      await page.getByLabel(/email/i).fill('invalid@example.com')\n      await page.getByLabel(/password/i).fill('wrongpassword')\n      await page.getByRole('button', { name: /sign in|login/i }).click()\n\n      // Check for error message\n      // await expect(page.getByText(/invalid credentials/i)).toBeVisible()\n    })\n  })\n\n  test.describe('Protected Routes', () => {\n    test('redirects unauthenticated users', async ({ page }) => {\n      await page.goto('/dashboard')\n\n      // Should redirect to login\n      await expect(page).toHaveURL(/login/)\n    })\n  })\n})\n`\n  await writeFile(join(e2eDir, 'auth.spec.ts'), authE2ETest)\n}\n\nasync function createMockUtils(testDir: string): Promise<void> {\n  const mockUtils = `import { vi } from 'vitest'\n\n/**\n * Mock utilities for common scenarios\n */\n\n/**\n * Mock fetch for API calls\n */\nexport function mockFetch(response: unknown, options?: { ok?: boolean; status?: number }) {\n  return vi.fn().mockResolvedValue({\n    ok: options?.ok ?? true,\n    status: options?.status ?? 200,\n    json: () => Promise.resolve(response),\n    text: () => Promise.resolve(JSON.stringify(response)),\n  })\n}\n\n/**\n * Mock Next.js router\n */\nexport function mockNextRouter(overrides?: Partial<{\n  pathname: string\n  query: Record<string, string>\n  push: ReturnType<typeof vi.fn>\n  replace: ReturnType<typeof vi.fn>\n  back: ReturnType<typeof vi.fn>\n}>) {\n  return {\n    pathname: '/',\n    query: {},\n    push: vi.fn(),\n    replace: vi.fn(),\n    back: vi.fn(),\n    forward: vi.fn(),\n    refresh: vi.fn(),\n    prefetch: vi.fn(),\n    ...overrides,\n  }\n}\n\n/**\n * Mock user session\n */\nexport function mockSession(user?: Partial<{\n  id: string\n  email: string\n  name: string\n}>) {\n  return {\n    user: {\n      id: 'test-user-id',\n      email: 'test@example.com',\n      name: 'Test User',\n      ...user,\n    },\n    expires: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n  }\n}\n\n/**\n * Mock Supabase client\n */\nexport function mockSupabaseClient() {\n  const mockQueryBuilder = {\n    select: vi.fn().mockReturnThis(),\n    insert: vi.fn().mockReturnThis(),\n    update: vi.fn().mockReturnThis(),\n    delete: vi.fn().mockReturnThis(),\n    eq: vi.fn().mockReturnThis(),\n    neq: vi.fn().mockReturnThis(),\n    gt: vi.fn().mockReturnThis(),\n    gte: vi.fn().mockReturnThis(),\n    lt: vi.fn().mockReturnThis(),\n    lte: vi.fn().mockReturnThis(),\n    order: vi.fn().mockReturnThis(),\n    limit: vi.fn().mockReturnThis(),\n    single: vi.fn().mockResolvedValue({ data: null, error: null }),\n    maybeSingle: vi.fn().mockResolvedValue({ data: null, error: null }),\n  }\n\n  return {\n    from: vi.fn().mockReturnValue(mockQueryBuilder),\n    auth: {\n      getUser: vi.fn().mockResolvedValue({ data: { user: null }, error: null }),\n      getSession: vi.fn().mockResolvedValue({ data: { session: null }, error: null }),\n      signIn: vi.fn().mockResolvedValue({ data: null, error: null }),\n      signOut: vi.fn().mockResolvedValue({ error: null }),\n    },\n    storage: {\n      from: vi.fn().mockReturnValue({\n        upload: vi.fn().mockResolvedValue({ data: null, error: null }),\n        download: vi.fn().mockResolvedValue({ data: null, error: null }),\n        getPublicUrl: vi.fn().mockReturnValue({ data: { publicUrl: '' } }),\n      }),\n    },\n  }\n}\n\n/**\n * Create a deferred promise for testing async flows\n */\nexport function createDeferredPromise<T>() {\n  let resolve: (value: T) => void\n  let reject: (reason?: unknown) => void\n\n  const promise = new Promise<T>((res, rej) => {\n    resolve = res\n    reject = rej\n  })\n\n  return {\n    promise,\n    resolve: resolve!,\n    reject: reject!,\n  }\n}\n\n/**\n * Wait for a specific amount of time\n */\nexport function wait(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\n/**\n * Mock localStorage\n */\nexport function mockLocalStorage() {\n  const store: Record<string, string> = {}\n\n  return {\n    getItem: vi.fn((key: string) => store[key] ?? null),\n    setItem: vi.fn((key: string, value: string) => {\n      store[key] = value\n    }),\n    removeItem: vi.fn((key: string) => {\n      delete store[key]\n    }),\n    clear: vi.fn(() => {\n      Object.keys(store).forEach((key) => delete store[key])\n    }),\n    get length() {\n      return Object.keys(store).length\n    },\n    key: vi.fn((index: number) => Object.keys(store)[index] ?? null),\n  }\n}\n`\n  await writeFile(join(testDir, 'mocks.ts'), mockUtils)\n}\n\nfunction getDevCommand(packageManager?: string): string {\n  if (!packageManager) return 'pnpm dev'\n  if (packageManager.startsWith('npm')) return 'npm run dev'\n  if (packageManager.startsWith('yarn')) return 'yarn dev'\n  if (packageManager.startsWith('bun')) return 'bun run dev'\n  return 'pnpm dev'\n}\n","/**\n * Integration utilities for at3-stack-kit\n * Enables smart detection and suggestions for other AT3 tools\n */\n\nimport { existsSync } from 'fs-extra'\nimport { join } from 'path'\nimport type { ProjectInfo } from '../detect.js'\nimport { colors, style } from './cli-styling.js'\n\nexport interface AT3Config {\n  version: string\n  created: string\n  template?: string\n  features: string[]\n  toolsUsed: string[]\n  suggestedWorkflows?: string[]\n  lastMigration?: string\n}\n\n/**\n * Update AT3 configuration after migration\n */\nexport function updateAT3Config(projectPath: string, addedFeatures: string[]): AT3Config {\n  const configPath = join(projectPath, '.at3-config.json')\n  let config: AT3Config\n\n  if (existsSync(configPath)) {\n    try {\n      config = JSON.parse(require('fs').readFileSync(configPath, 'utf8'))\n    } catch {\n      config = createDefaultConfig()\n    }\n  } else {\n    config = createDefaultConfig()\n  }\n\n  // Update config\n  config.features = [...new Set([...config.features, ...addedFeatures])]\n  config.toolsUsed = [...new Set([...config.toolsUsed, 'at3-stack-kit'])]\n  config.lastMigration = new Date().toISOString()\n\n  // Write config file (optional for integration)\n  try {\n    require('fs').writeFileSync(configPath, JSON.stringify(config, null, 2))\n  } catch {\n    // Silently fail - integration is optional\n  }\n\n  return config\n}\n\nfunction createDefaultConfig(): AT3Config {\n  return {\n    version: '0.1.0',\n    created: new Date().toISOString(),\n    features: [],\n    toolsUsed: ['at3-stack-kit'],\n  }\n}\n\n/**\n * Detect if project was created with create-at3-app\n */\nexport function detectCreateAt3App(projectPath: string): boolean {\n  const configPath = join(projectPath, '.at3-config.json')\n\n  if (!existsSync(configPath)) {\n    return false\n  }\n\n  try {\n    const config = JSON.parse(require('fs').readFileSync(configPath, 'utf8'))\n    return config.toolsUsed?.includes('create-at3-app')\n  } catch {\n    return false\n  }\n}\n\n/**\n * Suggest complementary AT3 tools based on project state\n */\nexport function suggestAT3Tools(projectInfo: ProjectInfo, addedFeatures: string[]): string[] {\n  const suggestions: string[] = []\n\n  // Suggest at3-toolkit for development workflow optimization\n  if (!(projectInfo.hasEslint && projectInfo.hasPrettier && projectInfo.hasVitest)) {\n    suggestions.push(\n      `${colors.info('💡 Tip:')} Use ${style.command('@entro314-labs/at3t')} for advanced linting, testing, and development workflow optimization`\n    )\n  }\n\n  // Suggest create-at3-app for future projects\n  if (addedFeatures.length > 0) {\n    suggestions.push(\n      `${colors.info('💡 Tip:')} For new projects, use ${style.command('create-at3-app')} to start with the AT3 stack from the beginning`\n    )\n  }\n\n  return suggestions\n}\n\n/**\n * Get post-migration workflow suggestions\n */\nexport function getPostMigrationWorkflow(\n  projectInfo: ProjectInfo,\n  addedFeatures: string[]\n): string[] {\n  const workflows: string[] = []\n\n  if (addedFeatures.includes('ai')) {\n    workflows.push('Configure your AI provider API keys in .env.local')\n    workflows.push('Explore the AI integration examples in your project')\n  }\n\n  if (addedFeatures.includes('supabase')) {\n    workflows.push('Set up your Supabase project and update connection strings')\n    workflows.push('Run database migrations if any were added')\n  }\n\n  if (addedFeatures.includes('testing')) {\n    workflows.push(\n      `Run ${style.command(projectInfo.packageManager + ' test')} to verify your test setup`\n    )\n  }\n\n  if (projectInfo.type === 'ait3e') {\n    workflows.push('Your project now includes the complete AT3 stack!')\n    workflows.push('Consider using at3t for advanced development workflow optimization')\n  }\n\n  return workflows\n}\n"],"mappings":"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","names":["import_chalk","import_detect_package_manager","import_fs_extra","import_path","detectPackageManager","import_fs_extra","import_fs_extra","import_path","chalk","gradient","figures","updatePackageJson","import_fs_extra","import_path","updatePackageJson","addEnvExample","import_fs_extra","import_path","updatePackageJson","addEnvExample","import_fs_extra","import_path","updatePackageJson","import_node_path","import_fs_extra","updatePackageJson","updateNextConfig","import_fs_extra","import_path","updatePackageJson","addEnvExample","import_fs_extra","import_path","import_fs_extra","import_path","detectPackageManager","spawn","s","chalk"]}