@atezca/core 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.6_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js","../src/cli.ts","../src/index.ts","../src/runner/test-runner.ts","../src/config/config-loader.ts","../src/interpreter/interpreter.ts","../src/interpreter/claude-client.ts","../src/interpreter/gemini-client.ts","../src/interpreter/prompt.ts","../src/cache/cache-manager.ts","../src/executor/playwright-executor.ts","../src/generator/code-generator.ts","../src/utils/browser-installer.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport chalk from 'chalk';\nimport { getState } from './index.js';\nimport { TestRunner } from './runner/test-runner.js';\nimport { CacheManager } from './cache/cache-manager.js';\nimport { ConfigLoader } from './config/config-loader.js';\n\n/**\n * CLI tool for Atezca\n */\n\nfunction showHelp(): void {\n console.log(chalk.bold('\\n⚡ Atezca - AI-Powered E2E Testing\\n'));\n console.log('Usage:');\n console.log(' az run <file> Execute test file');\n console.log(' az generate <file> Generate Playwright code without execution');\n console.log(' az init Create .atezcarc config file');\n console.log(' az cache clear Clear interpretation cache');\n console.log(' az cache stats Show cache statistics');\n console.log(' az help Show this help message');\n console.log('');\n console.log('Examples:');\n console.log(' az run test.spec.js');\n console.log(' az generate test.spec.js');\n console.log(' az init');\n console.log('');\n}\n\nasync function runTest(filepath: string): Promise<void> {\n try {\n // Load test file\n console.log(chalk.blue(`Loading test file: ${filepath}\\n`));\n \n if (!fs.existsSync(filepath)) {\n console.error(chalk.red(`Error: File not found: ${filepath}`));\n process.exit(1);\n }\n\n // Import and execute test file\n const absPath = path.resolve(filepath);\n await import(`file://${absPath}`);\n\n // Get state - try to find from the same module the test file uses\n let state = getState();\n \n // If local state is empty, the test file might be using a different module instance\n // Try to reimport from the package root\n if (!state.config || state.commands.length === 0) {\n try {\n // Calculate path to index module relative to this CLI\n const currentDir = path.dirname(new URL(import.meta.url).pathname);\n const indexModule = await import(path.join(currentDir, 'index.js'));\n const altState = indexModule.getState();\n if (altState.config) {\n state = altState;\n }\n } catch (e) {\n // Fallback to local state\n }\n }\n \n if (!state.config) {\n console.error(chalk.red('Error: az.setup() was not called in the test file'));\n process.exit(1);\n }\n\n if (state.commands.length === 0) {\n console.error(chalk.yellow('Warning: No test commands found'));\n process.exit(0);\n }\n\n console.log(chalk.bold(`Found ${state.commands.length} test command(s)\\n`));\n\n // Run tests\n const runner = new TestRunner(state.config);\n const result = await runner.execute(state.commands);\n\n // Show results\n console.log(chalk.bold('\\n' + '='.repeat(50)));\n \n if (result.success) {\n console.log(chalk.green.bold('\\n✓ Test passed!\\n'));\n console.log(chalk.gray(`Duration: ${(result.duration / 1000).toFixed(2)}s`));\n console.log(chalk.gray(`Actions executed: ${result.actionsExecuted}`));\n if (result.generatedFile) {\n console.log(chalk.gray(`Generated file: ${result.generatedFile}`));\n }\n process.exit(0);\n } else {\n console.log(chalk.red.bold('\\n✗ Test failed!\\n'));\n console.log(chalk.red(`Error: ${result.error}`));\n console.log(chalk.gray(`Duration: ${(result.duration / 1000).toFixed(2)}s`));\n console.log(chalk.gray(`Actions executed: ${result.actionsExecuted}`));\n process.exit(1);\n }\n\n } catch (error) {\n console.error(chalk.red('\\n✗ Error:'), (error as Error).message);\n process.exit(1);\n }\n}\n\nasync function generateTest(filepath: string): Promise<void> {\n try {\n // Load test file\n console.log(chalk.blue(`Loading test file: ${filepath}\\n`));\n \n if (!fs.existsSync(filepath)) {\n console.error(chalk.red(`Error: File not found: ${filepath}`));\n process.exit(1);\n }\n\n // Import test file\n const absPath = path.resolve(filepath);\n await import(`file://${absPath}`);\n\n // Try to get state from the core module\n let state = getState();\n \n // If local state is empty, try from package root\n if (!state.config || state.commands.length === 0) {\n try {\n const currentDir = path.dirname(new URL(import.meta.url).pathname);\n const indexModule = await import(path.join(currentDir, 'index.js'));\n const altState = indexModule.getState();\n if (altState.config) {\n state = altState;\n }\n } catch (e) {\n // Fallback to local state\n }\n }\n \n if (!state.config) {\n console.error(chalk.red('Error: az.setup() was not called in the test file'));\n process.exit(1);\n }\n\n if (state.commands.length === 0) {\n console.error(chalk.yellow('Warning: No test commands found'));\n process.exit(0);\n }\n\n console.log(chalk.bold(`Found ${state.commands.length} test command(s)\\n`));\n\n // Generate code only\n const runner = new TestRunner(state.config);\n const generatedFile = await runner.generateOnly(state.commands);\n\n console.log(chalk.green.bold('\\n✓ Code generation complete!\\n'));\n console.log(chalk.gray(`Generated file: ${generatedFile}`));\n console.log(chalk.gray('\\nRun with: npx playwright test'));\n process.exit(0);\n\n } catch (error) {\n console.error(chalk.red('\\n✗ Error:'), (error as Error).message);\n process.exit(1);\n }\n}\n\nfunction initConfig(): void {\n const filepath = '.atezcarc';\n \n if (fs.existsSync(filepath)) {\n console.log(chalk.yellow(`Warning: ${filepath} already exists`));\n process.exit(0);\n }\n\n ConfigLoader.createDefaultConfig(filepath);\n console.log(chalk.green(`✓ Created ${filepath}`));\n console.log(chalk.gray('\\nDon\\'t forget to set your ANTHROPIC_API_KEY in .env or .atezcarc'));\n process.exit(0);\n}\n\nfunction clearCache(): void {\n const cache = new CacheManager();\n cache.clear();\n console.log(chalk.green('✓ Cache cleared'));\n process.exit(0);\n}\n\nfunction showCacheStats(): void {\n const cache = new CacheManager();\n const stats = cache.getStats();\n \n console.log(chalk.bold('\\nCache Statistics:\\n'));\n console.log(chalk.gray(`Entries: ${stats.size}`));\n \n if (stats.oldestEntry) {\n const oldest = new Date(stats.oldestEntry);\n console.log(chalk.gray(`Oldest entry: ${oldest.toLocaleString()}`));\n }\n \n if (stats.newestEntry) {\n const newest = new Date(stats.newestEntry);\n console.log(chalk.gray(`Newest entry: ${newest.toLocaleString()}`));\n }\n \n if (stats.size === 0) {\n console.log(chalk.yellow('\\nCache is empty'));\n }\n \n console.log('');\n process.exit(0);\n}\n\n// Main CLI logic\nasync function main() {\n const args = process.argv.slice(2);\n \n if (args.length === 0 || args[0] === 'help' || args[0] === '--help' || args[0] === '-h') {\n showHelp();\n process.exit(0);\n }\n\n const command = args[0];\n const subcommand = args[1];\n\n switch (command) {\n case 'run':\n if (!subcommand) {\n console.error(chalk.red('Error: Please specify a test file'));\n console.log('Usage: az run <file>');\n process.exit(1);\n }\n await runTest(subcommand);\n break;\n\n case 'generate':\n if (!subcommand) {\n console.error(chalk.red('Error: Please specify a test file'));\n console.log('Usage: az generate <file>');\n process.exit(1);\n }\n await generateTest(subcommand);\n break;\n\n case 'init':\n initConfig();\n break;\n\n case 'cache':\n if (subcommand === 'clear') {\n clearCache();\n } else if (subcommand === 'stats') {\n showCacheStats();\n } else {\n console.error(chalk.red('Error: Unknown cache command'));\n console.log('Usage: az cache <clear|stats>');\n process.exit(1);\n }\n break;\n\n default:\n console.error(chalk.red(`Error: Unknown command: ${command}`));\n showHelp();\n process.exit(1);\n }\n}\n\nmain().catch((error) => {\n console.error(chalk.red('Fatal error:'), error);\n process.exit(1);\n});\n","import type { SetupConfig, TestCommand, ActionType } from './types/index.js';\n\n/**\n * Global state for Atezca test suite\n */\nclass AtezcaState {\n private config: SetupConfig | null = null;\n private commands: TestCommand[] = [];\n\n setConfig(config: SetupConfig): void {\n this.config = config;\n }\n\n getConfig(): SetupConfig | null {\n return this.config;\n }\n\n addCommand(command: TestCommand): void {\n this.commands.push(command);\n }\n\n getCommands(): TestCommand[] {\n return [...this.commands];\n }\n\n clear(): void {\n this.config = null;\n this.commands = [];\n }\n}\n\n// Use globalThis to ensure state is shared across module instances\nconst ATEZCA_STATE_KEY = Symbol.for('__ATEZCA_STATE__');\nif (!(globalThis as any)[ATEZCA_STATE_KEY]) {\n (globalThis as any)[ATEZCA_STATE_KEY] = new AtezcaState();\n}\nconst state: AtezcaState = (globalThis as any)[ATEZCA_STATE_KEY];\n\n/**\n * Setup Atezca test configuration\n * \n * @example\n * ```ts\n * az.setup({\n * url: \"https://example.com\",\n * browser: \"chromium\",\n * headless: true\n * });\n * ```\n */\nexport function setup(config: SetupConfig): void {\n if (!config.url) {\n throw new Error('az.setup() requires a url');\n }\n \n state.setConfig({\n ...config,\n browser: config.browser ?? 'chromium',\n headless: config.headless ?? true,\n timeout: config.timeout ?? 30000,\n outputDir: config.outputDir ?? 'generated-tests',\n cacheEnabled: config.cacheEnabled ?? true,\n retries: config.retries ?? 3,\n aiProvider: config.aiProvider,\n apiKey: config.apiKey,\n disableSSL: config.disableSSL ?? false,\n });\n}\n\n/**\n * Define a test action using natural language\n * \n * @example\n * ```ts\n * az.test(\"interact\", \"click button 'Login'\");\n * az.test(\"expect\", \"show success message\");\n * az.test(\"wait\", \"until page is loaded\");\n * ```\n */\nexport function test(actionType: ActionType, description: string): void {\n if (!state.getConfig()) {\n throw new Error('az.setup() must be called before az.test()');\n }\n\n if (!description || description.trim() === '') {\n throw new Error('az.test() requires a description');\n }\n\n const validTypes: ActionType[] = ['navigate', 'interact', 'wait', 'expect'];\n if (!validTypes.includes(actionType)) {\n throw new Error(`Invalid action type: ${actionType}. Must be one of: ${validTypes.join(', ')}`);\n }\n\n state.addCommand({\n actionType,\n description: description.trim(),\n timestamp: Date.now(),\n });\n}\n\n/**\n * Get current state (for internal use)\n * @internal\n */\nexport function getState() {\n return {\n config: state.getConfig(),\n commands: state.getCommands(),\n };\n}\n\n/**\n * Clear state (for internal use)\n * @internal\n */\nexport function clearState() {\n state.clear();\n}\n\n/**\n * Wait for a specified number of milliseconds\n * \n * @example\n * ```ts\n * az.wait(1000); // Wait 1 second\n * az.wait(2500); // Wait 2.5 seconds\n * ```\n */\nexport function wait(milliseconds: number): void {\n if (!state.getConfig()) {\n throw new Error('az.setup() must be called before az.wait()');\n }\n\n if (typeof milliseconds !== 'number' || milliseconds < 0) {\n throw new Error('az.wait() requires a positive number of milliseconds');\n }\n\n state.addCommand({\n actionType: 'wait',\n description: `wait ${milliseconds}ms`,\n timestamp: Date.now(),\n });\n}\n\n/**\n * Main API export\n */\nexport const az = {\n setup,\n test,\n wait,\n};\n\n// Named exports for convenience\nexport { setup as azSetup, test as azTest, wait as azWait };\n\n// Re-export types\nexport type * from './types/index.js';\n","import chalk from 'chalk';\nimport type { TestCommand, InterpretationResult, TestResult, SetupConfig } from '../types/index.js';\nimport { getConfig } from '../config/config-loader.js';\nimport { Interpreter, createInterpretationResult } from '../interpreter/interpreter.js';\nimport { CacheManager } from '../cache/cache-manager.js';\nimport { PlaywrightExecutor } from '../executor/playwright-executor.js';\nimport { CodeGenerator } from '../generator/code-generator.js';\nimport { handleBrowserInstallation } from '../utils/browser-installer.js';\n\n/**\n * Test runner that orchestrates the entire test execution\n */\nexport class TestRunner {\n private config: SetupConfig;\n private interpreter: Interpreter;\n private cache: CacheManager;\n private executor: PlaywrightExecutor | null = null;\n private generator: CodeGenerator;\n private interpretations: InterpretationResult[] = [];\n\n constructor(config: SetupConfig) {\n this.config = config;\n \n // Load global config\n const globalConfig = getConfig();\n \n // Use provider from setup config if provided, otherwise use global config\n const aiProvider = config.aiProvider || globalConfig.aiProvider;\n \n // Use API key from setup config if provided, otherwise use global config\n let apiKey = config.apiKey;\n if (!apiKey) {\n apiKey = aiProvider === 'claude' \n ? globalConfig.anthropicApiKey \n : globalConfig.googleApiKey;\n }\n\n if (!apiKey) {\n throw new Error(`API key not found for provider: ${aiProvider}`);\n }\n \n // Initialize components\n this.interpreter = new Interpreter(aiProvider, apiKey);\n this.cache = new CacheManager(\n globalConfig.cache.filePath,\n globalConfig.cache.expiryDays\n );\n this.generator = new CodeGenerator(config);\n }\n\n /**\n * Process a single command (interpret and cache) with retry logic\n */\n async processCommand(command: TestCommand): Promise<InterpretationResult> {\n const cacheEnabled = this.config.cacheEnabled ?? true;\n const aiProvider = this.config.aiProvider || getConfig().aiProvider;\n\n // Try cache first\n if (cacheEnabled) {\n const cached = this.cache.get(command);\n if (cached) {\n console.log(chalk.gray(` ✓ Using cached interpretation`));\n return createInterpretationResult(command, cached, true);\n }\n }\n\n // Get global config to show provider name\n const displayProvider = aiProvider.toUpperCase();\n\n // Interpret with AI with retry logic\n const maxInterpretationRetries = 3;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < maxInterpretationRetries; attempt++) {\n try {\n if (attempt === 0) {\n console.log(chalk.blue(` → Interpreting with ${displayProvider}...`));\n } else {\n console.log(chalk.yellow(` ⟳ Interpretation retry ${attempt}/${maxInterpretationRetries - 1}...`));\n }\n\n const actions = await this.interpreter.interpret(command);\n\n // Cache the result\n if (cacheEnabled) {\n this.cache.set(command, actions);\n }\n\n return createInterpretationResult(command, actions, false);\n } catch (error) {\n lastError = error as Error;\n console.log(chalk.yellow(` ⚠ Interpretation failed: ${lastError.message}`));\n \n if (attempt < maxInterpretationRetries - 1) {\n // Wait before retry (progressive backoff)\n await new Promise(resolve => setTimeout(resolve, 1000 * (attempt + 1)));\n }\n }\n }\n\n // If all retries failed, throw the last error\n throw new Error(`Failed to interpret after ${maxInterpretationRetries} attempts: ${lastError?.message}`);\n }\n\n /**\n * Interpret command with retry logic and page context\n */\n private async interpretWithRetry(command: TestCommand, pageContext: any): Promise<any[]> {\n const aiProvider = this.config.aiProvider || getConfig().aiProvider;\n const displayProvider = aiProvider.toUpperCase();\n const maxInterpretationRetries = 3;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < maxInterpretationRetries; attempt++) {\n try {\n if (attempt > 0) {\n console.log(chalk.yellow(` ⟳ AI retry ${attempt}/${maxInterpretationRetries - 1} (${displayProvider})...`));\n }\n\n const actions = await this.interpreter.interpret(command, pageContext);\n return actions;\n } catch (error) {\n lastError = error as Error;\n console.log(chalk.yellow(` ⚠ ${displayProvider} failed: ${lastError.message}`));\n \n if (attempt < maxInterpretationRetries - 1) {\n // Wait before retry (progressive backoff)\n await new Promise(resolve => setTimeout(resolve, 1000 * (attempt + 1)));\n }\n }\n }\n\n // If all retries failed, throw the last error\n throw new Error(`${displayProvider} failed after ${maxInterpretationRetries} attempts: ${lastError?.message}`);\n }\n\n /**\n * Process all commands\n */\n async processCommands(commands: TestCommand[]): Promise<InterpretationResult[]> {\n console.log(chalk.bold('\\n📝 Processing commands...\\n'));\n\n const interpretations: InterpretationResult[] = [];\n\n for (let i = 0; i < commands.length; i++) {\n const command = commands[i];\n console.log(chalk.cyan(`[${i + 1}/${commands.length}] ${command.actionType}: ${command.description}`));\n \n try {\n const interpretation = await this.processCommand(command);\n interpretations.push(interpretation);\n console.log(chalk.green(` ✓ ${interpretation.actions.length} action(s) generated\\n`));\n } catch (error) {\n console.error(chalk.red(` ✗ Failed: ${(error as Error).message}\\n`));\n throw error;\n }\n }\n\n this.interpretations = interpretations;\n return interpretations;\n }\n\n /**\n * Execute tests\n */\n async execute(commands: TestCommand[]): Promise<TestResult> {\n const startTime = Date.now();\n let actionsExecuted = 0;\n let browserInstalled = false;\n\n try {\n // Initialize executor FIRST (before interpretation)\n console.log(chalk.bold('🚀 Launching browser...\\n'));\n this.executor = new PlaywrightExecutor(this.config);\n \n try {\n await this.executor.initialize();\n } catch (error) {\n // Try to auto-install browser if it's missing\n const installed = await handleBrowserInstallation(\n error as Error, \n this.config.browser || 'chromium'\n );\n \n if (installed) {\n browserInstalled = true;\n console.log(chalk.blue('Retrying browser launch...\\n'));\n await this.executor.initialize();\n } else {\n throw error;\n }\n }\n\n // Execute tests with context-aware interpretation\n console.log(chalk.bold('▶️ Executing tests...\\n'));\n\n for (let i = 0; i < commands.length; i++) {\n const command = commands[i];\n console.log(chalk.cyan(`\\n[${i + 1}/${commands.length}] ${command.actionType}: ${command.description}`));\n\n // Try executing with intelligent retry and context-aware re-interpretation\n let success = false;\n let lastError: Error | null = null;\n const maxRetries = 5;\n\n for (let attempt = 0; attempt < maxRetries && !success; attempt++) {\n try {\n // Capture current page context for interpretation\n const pageContext = await this.executor!.getPageContext();\n \n if (attempt === 0) {\n console.log(chalk.blue(` → Interpreting with context...`));\n console.log(chalk.gray(` Page: ${pageContext.url}`));\n console.log(chalk.gray(` Available elements: ${pageContext.interactiveElements.length}`));\n } else {\n console.log(chalk.yellow(` ⟳ Retry ${attempt}/${maxRetries - 1} - Re-analyzing page...`));\n console.log(chalk.gray(` Page: ${pageContext.url}`));\n console.log(chalk.gray(` Available elements: ${pageContext.interactiveElements.length}`));\n }\n\n // Interpret with current page context\n let actions: any[];\n \n // Check cache first (only on first attempt)\n if (attempt === 0 && this.config.cacheEnabled) {\n const cached = this.cache.get(command);\n if (cached) {\n console.log(chalk.gray(` ✓ Using cached interpretation`));\n actions = cached;\n } else {\n // Interpret with AI using page context\n actions = await this.interpretWithRetry(command, pageContext);\n // Cache the result\n this.cache.set(command, actions);\n }\n } else {\n // Re-interpret with fresh context (don't use cache on retries)\n actions = await this.interpretWithRetry(command, pageContext);\n // Update cache with new interpretation\n if (this.config.cacheEnabled) {\n this.cache.set(command, actions);\n }\n }\n\n console.log(chalk.gray(` ✓ Generated ${actions.length} action(s)`));\n\n // Execute all actions for this command\n for (const action of actions) {\n await this.executor!.executeAction(action);\n actionsExecuted++;\n console.log(chalk.gray(` ✓ ${action.action}${action.selector ? ` (${action.selector})` : ''}`));\n }\n\n // Store interpretation for code generation\n const interpretation = createInterpretationResult(command, actions, false);\n this.interpretations.push(interpretation);\n\n success = true;\n console.log(chalk.green(` ✓ Success\\n`));\n\n } catch (error) {\n lastError = error as Error;\n \n if (attempt < maxRetries - 1) {\n console.log(chalk.yellow(` ⚠ Failed: ${lastError.message}`));\n // Wait before retry (progressive backoff)\n await new Promise(resolve => setTimeout(resolve, 1000 * (attempt + 1)));\n } else {\n throw new Error(`Failed after ${maxRetries} attempts: ${lastError.message}`);\n }\n }\n }\n }\n\n // Generate code\n console.log(chalk.bold('\\n📄 Generating Playwright code...\\n'));\n const generatedFile = await this.generator.saveTestFile(this.interpretations);\n console.log(chalk.green(`✓ Test file saved: ${generatedFile}`));\n\n const duration = Date.now() - startTime;\n\n return {\n success: true,\n duration,\n actionsExecuted,\n generatedFile,\n };\n\n } catch (error) {\n const duration = Date.now() - startTime;\n \n return {\n success: false,\n error: (error as Error).message,\n duration,\n actionsExecuted,\n };\n\n } finally {\n // Cleanup\n if (this.executor) {\n await this.executor.close();\n }\n }\n }\n\n /**\n * Generate code only (no execution)\n */\n async generateOnly(commands: TestCommand[]): Promise<string> {\n console.log(chalk.bold('📝 Processing commands for code generation...\\n'));\n\n // Process commands\n const interpretations = await this.processCommands(commands);\n\n // Generate code\n console.log(chalk.bold('\\n📄 Generating Playwright code...\\n'));\n const generatedFile = await this.generator.saveTestFile(interpretations);\n console.log(chalk.green(`✓ Test file saved: ${generatedFile}`));\n\n return generatedFile;\n }\n\n /**\n * Get interpretations\n */\n getInterpretations(): InterpretationResult[] {\n return this.interpretations;\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { config as loadEnv } from 'dotenv';\nimport { z } from 'zod';\nimport type { AtezcaConfig, AIProvider } from '../types/index.js';\n\n/**\n * Configuration schema\n */\nconst ConfigSchema = z.object({\n aiProvider: z.enum(['claude', 'gemini']).default('claude'),\n anthropicApiKey: z.string().optional(),\n googleApiKey: z.string().optional(),\n cache: z.object({\n enabled: z.boolean().default(true),\n expiryDays: z.number().positive().default(30),\n filePath: z.string().default('.atezca-cache.json'),\n }),\n browser: z.object({\n type: z.enum(['chromium', 'firefox', 'webkit']).default('chromium'),\n headless: z.boolean().default(true),\n }),\n execution: z.object({\n timeout: z.number().positive().default(30000),\n retries: z.number().nonnegative().default(3),\n outputDir: z.string().default('generated-tests'),\n }),\n}).refine(\n (data) => {\n // Validate that the appropriate API key is present for the selected provider\n if (data.aiProvider === 'claude' && !data.anthropicApiKey) {\n return false;\n }\n if (data.aiProvider === 'gemini' && !data.googleApiKey) {\n return false;\n }\n return true;\n },\n {\n message: 'API key required for selected AI provider',\n }\n);\n\n/**\n * Load configuration from environment and config file\n */\nexport class ConfigLoader {\n private config: AtezcaConfig | null = null;\n\n constructor() {\n this.load();\n }\n\n /**\n * Load configuration\n */\n private load(): void {\n // Load .env file\n loadEnv();\n\n // Try to load .atezcarc file\n const configFile = this.findConfigFile();\n let fileConfig: Record<string, unknown> = {};\n \n if (configFile) {\n try {\n const content = fs.readFileSync(configFile, 'utf-8');\n fileConfig = JSON.parse(content);\n } catch (error) {\n console.warn(`Warning: Failed to parse ${configFile}`);\n }\n }\n\n // Merge configurations (env > file > defaults)\n const rawConfig = {\n aiProvider: (process.env.ATEZCA_AI_PROVIDER as AIProvider) || (fileConfig.aiProvider as AIProvider) || 'claude',\n anthropicApiKey: process.env.ANTHROPIC_API_KEY || (fileConfig.anthropicApiKey as string) || '',\n googleApiKey: process.env.GOOGLE_API_KEY || (fileConfig.googleApiKey as string) || '',\n cache: {\n enabled: this.parseBoolean(process.env.ATEZCA_CACHE_ENABLED) ?? fileConfig.cacheEnabled ?? true,\n expiryDays: parseInt(process.env.ATEZCA_CACHE_EXPIRY_DAYS ?? '') || (fileConfig.cacheExpiryDays as number) || 30,\n filePath: process.env.ATEZCA_CACHE_FILE || (fileConfig.cacheFile as string) || '.atezca-cache.json',\n },\n browser: {\n type: (process.env.ATEZCA_BROWSER as 'chromium' | 'firefox' | 'webkit') || (fileConfig.browser as string) || 'chromium',\n headless: this.parseBoolean(process.env.ATEZCA_HEADLESS) ?? (fileConfig.headless as boolean) ?? true,\n },\n execution: {\n timeout: parseInt(process.env.ATEZCA_TIMEOUT ?? '') || (fileConfig.timeout as number) || 30000,\n retries: parseInt(process.env.ATEZCA_RETRIES ?? '') || (fileConfig.retries as number) || 3,\n outputDir: process.env.ATEZCA_OUTPUT_DIR || (fileConfig.outputDir as string) || 'generated-tests',\n },\n };\n\n // Validate and store\n try {\n this.config = ConfigSchema.parse(rawConfig);\n } catch (error) {\n if (error instanceof z.ZodError) {\n const messages = error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join('\\n');\n throw new Error(`Configuration validation failed:\\n${messages}`);\n }\n throw error;\n }\n }\n\n /**\n * Find config file in current or parent directories\n */\n private findConfigFile(): string | null {\n const filenames = ['.atezcarc', '.atezcarc.json'];\n let dir = process.cwd();\n\n while (true) {\n for (const filename of filenames) {\n const filepath = path.join(dir, filename);\n if (fs.existsSync(filepath)) {\n return filepath;\n }\n }\n\n const parent = path.dirname(dir);\n if (parent === dir) break; // Reached root\n dir = parent;\n }\n\n return null;\n }\n\n /**\n * Parse boolean from string\n */\n private parseBoolean(value: string | undefined): boolean | undefined {\n if (value === undefined) return undefined;\n return value.toLowerCase() === 'true' || value === '1';\n }\n\n /**\n * Get configuration\n */\n getConfig(): AtezcaConfig {\n if (!this.config) {\n throw new Error('Configuration not loaded');\n }\n return this.config;\n }\n\n /**\n * Create default config file\n */\n static createDefaultConfig(filepath: string = '.atezcarc'): void {\n const defaultConfig = {\n aiProvider: 'claude',\n anthropicApiKey: process.env.ANTHROPIC_API_KEY || '',\n googleApiKey: process.env.GOOGLE_API_KEY || '',\n cacheEnabled: true,\n cacheExpiryDays: 30,\n cacheFile: '.atezca-cache.json',\n browser: 'chromium',\n headless: true,\n timeout: 30000,\n retries: 3,\n outputDir: 'generated-tests',\n };\n\n fs.writeFileSync(filepath, JSON.stringify(defaultConfig, null, 2), 'utf-8');\n }\n}\n\n/**\n * Global config instance\n */\nlet globalConfig: ConfigLoader | null = null;\n\n/**\n * Get or create global config\n */\nexport function getConfig(): AtezcaConfig {\n if (!globalConfig) {\n globalConfig = new ConfigLoader();\n }\n return globalConfig.getConfig();\n}\n\n/**\n * Reset global config (for testing)\n */\nexport function resetConfig(): void {\n globalConfig = null;\n}\n","import { z } from 'zod';\nimport type { TestCommand, PlaywrightAction, InterpretationResult, AIProvider, PageContext } from '../types/index.js';\nimport { ClaudeClient } from './claude-client.js';\nimport { GeminiClient } from './gemini-client.js';\nimport { getSystemPrompt, getUserPrompt, getUserPromptWithContext } from './prompt.js';\n\n/**\n * Base AI client interface\n */\ninterface AIClient {\n sendMessage(systemPrompt: string, userPrompt: string): Promise<string>;\n testConnection(): Promise<boolean>;\n}\n\n/**\n * Zod schema for validating Claude's response\n */\nconst PlaywrightActionSchema = z.object({\n action: z.enum(['click', 'type', 'navigate', 'wait', 'expect', 'select', 'hover', 'press']),\n selector: z.string().optional(),\n value: z.string().optional(),\n condition: z.string().optional(),\n assertionType: z.enum(['visible', 'hidden', 'text', 'value', 'enabled', 'disabled']).optional(),\n expected: z.string().optional(),\n timeout: z.number().optional(),\n});\n\nconst ClaudeResponseSchema = z.object({\n actions: z.array(PlaywrightActionSchema),\n});\n\n/**\n * Interpreter that converts natural language to Playwright actions using AI\n */\nexport class Interpreter {\n private client: AIClient;\n private provider: AIProvider;\n\n constructor(provider: AIProvider, apiKey: string) {\n this.provider = provider;\n\n switch (provider) {\n case 'claude':\n this.client = new ClaudeClient(apiKey);\n break;\n case 'gemini':\n this.client = new GeminiClient(apiKey);\n break;\n default:AI\n throw new Error(`Unsupported AI provider: ${provider}`);\n }\n }\n\n /**\n * Interpret a test command into Playwright actions\n */\n async interpret(command: TestCommand, pageContext?: PageContext): Promise<PlaywrightAction[]> {\n // Check if this is a simple wait command (e.g., \"wait 1000ms\")\n const waitMatch = command.description.match(/^wait\\s+(\\d+)ms$/i);\n if (waitMatch && command.actionType === 'wait') {\n const milliseconds = parseInt(waitMatch[1], 10);\n return [{\n action: 'wait',\n timeout: milliseconds,\n selector: 'body', // Dummy selector, will just wait\n condition: 'attached',\n }];\n }\n\n const systemPrompt = getSystemPrompt();\n const userPrompt = pageContext \n ? getUserPromptWithContext(command, pageContext)\n : getUserPrompt(command);\n\n // Get response from AI\n const responseText = await this.client.sendMessage(systemPrompt, userPrompt);\n\n // Parse and validate response\n let response;\n try {\n // Clean response (remove markdown code blocks if present)\n const cleanedResponse = responseText\n .replace(/```json\\n?/g, '')\n .replace(/```\\n?/g, '')\n .trim();\n\n response = JSON.parse(cleanedResponse);\n } catch (error) {\n throw new Error(`Failed to parse ${this.provider} response: ${responseText}`);\n }\n\n // Validate against schema\n const validated = ClaudeResponseSchema.parse(response);\n\n return validated.actions;\n }\n\n /**\n * Test if the interpreter is working\n */\n async test(): Promise<boolean> {\n return this.client.testConnection();\n }\n}\n\n/**\n * Create interpretation result\n */\nexport function createInterpretationResult(\n command: TestCommand,\n actions: PlaywrightAction[],\n cached: boolean = false\n): InterpretationResult {\n return {\n command,\n actions,\n cached,\n timestamp: Date.now(),\n };\n}\n","import Anthropic from '@anthropic-ai/sdk';\n\n/**\n * Claude client wrapper\n */\nexport class ClaudeClient {\n private client: Anthropic;\n private model: string;\n\n constructor(apiKey: string, model: string = 'claude-3-5-sonnet-20241022') {\n if (!apiKey || !apiKey.startsWith('sk-ant-')) {\n throw new Error('Invalid Anthropic API key. Must start with \"sk-ant-\"');\n }\n\n this.client = new Anthropic({\n apiKey,\n });\n this.model = model;\n }\n\n /**\n * Send a message to Claude and get response\n */\n async sendMessage(systemPrompt: string, userPrompt: string): Promise<string> {\n console.log(`🤖 Using model: ${this.model}`);\n try {\n const message = await this.client.messages.create({\n model: this.model,\n max_tokens: 1024,\n temperature: 0, // Deterministic responses\n system: systemPrompt,\n messages: [\n {\n role: 'user',\n content: userPrompt,\n },\n ],\n });\n\n // Extract text from response\n const content = message.content[0];\n if (content.type !== 'text') {\n throw new Error('Expected text response from Claude');\n }\n\n return content.text;\n } catch (error) {\n if (error instanceof Anthropic.APIError) {\n throw new Error(`Claude API error: ${error.message}`);\n }\n throw error;\n }\n }\n\n /**\n * Test API key validity\n */\n async testConnection(): Promise<boolean> {\n try {\n await this.sendMessage('You are a test assistant.', 'Respond with \"OK\"');\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { GoogleGenerativeAI } from '@google/generative-ai';\n\n/**\n * Gemini client wrapper\n */\nexport class GeminiClient {\n private genAI: GoogleGenerativeAI;\n private model: string;\n\n constructor(apiKey: string, model: string = 'gemini-3-pro-preview') {\n if (!apiKey || !apiKey.startsWith('AIza')) {\n throw new Error('Invalid Google API key. Must start with \"AIza\"');\n }\n\n this.genAI = new GoogleGenerativeAI(apiKey);\n this.model = model;\n }\n\n /**\n * Send a message to Gemini and get response\n */\n async sendMessage(systemPrompt: string, userPrompt: string): Promise<string> {\n console.log(`🤖 Using model: ${this.model}`);\n try {\n const model = this.genAI.getGenerativeModel({ \n model: this.model,\n generationConfig: {\n temperature: 0, // Deterministic responses\n maxOutputTokens: 1024,\n },\n });\n\n // Combine system and user prompts for Gemini\n const fullPrompt = `${systemPrompt}\\n\\nUser Request:\\n${userPrompt}`;\n\n const result = await model.generateContent(fullPrompt);\n const response = await result.response;\n return response.text();\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Gemini API error: ${error.message}`);\n }\n throw error;\n }\n }\n\n /**\n * Test API key validity\n */\n async testConnection(): Promise<boolean> {\n try {\n await this.sendMessage('You are a test assistant.', 'Respond with \"OK\"');\n return true;\n } catch {\n return false;\n }\n }\n}\n","import type { TestCommand, PageContext } from '../types/index.js';\n\n/**\n * System prompt for Claude to interpret natural language test commands\n */\nexport function getSystemPrompt(): string {\n return `You are an expert E2E test automation assistant. Your role is to interpret natural language test commands and convert them into structured Playwright actions.\n\nCRITICAL RULES:\n1. Always respond with valid JSON only - no markdown, no code blocks, no explanations\n2. Use robust selectors in order of preference: role > aria-label > data-testid > text content > CSS\n3. Be specific and deterministic - avoid ambiguous selectors\n4. For interact actions with buttons/links, prefer getByRole over other selectors\n5. For form inputs, use getByLabel or getByPlaceholder\n6. Always include timeout values for wait actions\n\nOUTPUT FORMAT (JSON only):\n{\n \"actions\": [\n {\n \"action\": \"click\" | \"type\" | \"navigate\" | \"wait\" | \"expect\" | \"select\" | \"hover\" | \"press\",\n \"selector\": \"button:has-text('Login')\" or \"role=button[name='Login']\",\n \"value\": \"text to type or URL to navigate\",\n \"condition\": \"visible|hidden|attached|detached\",\n \"assertionType\": \"visible|hidden|text|value|enabled|disabled\",\n \"expected\": \"expected value for assertions\",\n \"timeout\": 30000\n }\n ]\n}\n\nEXAMPLES:\n\nInput: { actionType: \"interact\", description: \"click button 'Login'\" }\nOutput: {\"actions\":[{\"action\":\"click\",\"selector\":\"role=button[name='Login']\"}]}\n\nInput: { actionType: \"interact\", description: \"type 'john@example.com' in email field\" }\nOutput: {\"actions\":[{\"action\":\"type\",\"selector\":\"role=textbox[name='Email' i]\",\"value\":\"john@example.com\"}]}\n\nInput: { actionType: \"navigate\", description: \"go to login page\" }\nOutput: {\"actions\":[{\"action\":\"navigate\",\"value\":\"/login\"}]}\n\nInput: { actionType: \"wait\", description: \"until submit button is visible\" }\nOutput: {\"actions\":[{\"action\":\"wait\",\"selector\":\"role=button[name='Submit']\",\"condition\":\"visible\",\"timeout\":30000}]}\n\nInput: { actionType: \"expect\", description: \"show success message\" }\nOutput: {\"actions\":[{\"action\":\"expect\",\"selector\":\"text=/success|successfully/i\",\"assertionType\":\"visible\"}]}\n\nInput: { actionType: \"interact\", description: \"select 'Premium' from plan dropdown\" }\nOutput: {\"actions\":[{\"action\":\"select\",\"selector\":\"role=combobox[name='Plan']\",\"value\":\"Premium\"}]}\n\nIMPORTANT:\n- For \"expect\" actions, use appropriate assertionType (visible, text, value, etc.)\n- For \"wait\" actions, always include timeout\n- For text matching, use case-insensitive regex when appropriate: /text/i\n- Respond ONLY with JSON, no other text`;\n}\n\n/**\n * Create user prompt from test command\n */\nexport function getUserPrompt(command: TestCommand): string {\n return JSON.stringify({\n actionType: command.actionType,\n description: command.description,\n });\n}\n\n/**\n * Create user prompt with page context\n */\nexport function getUserPromptWithContext(command: TestCommand, context: PageContext): string {\n const elementsInfo = context.interactiveElements.length > 0\n ? `\\n\\nAvailable interactive elements on the page:\\n${context.interactiveElements\n .map(el => `- ${el.role}: \"${el.name}\" (${el.tag})`)\n .join('\\n')}`\n : '';\n\n const accessibilityInfo = context.accessibilityTree && context.accessibilityTree !== 'Unable to capture'\n ? `\\n\\nPage structure:\\n${context.accessibilityTree}`\n : '';\n\n return `CURRENT PAGE CONTEXT:\n- URL: ${context.url}\n- Title: ${context.title}${elementsInfo}${accessibilityInfo}\n\nUSER COMMAND:\n${JSON.stringify({\n actionType: command.actionType,\n description: command.description,\n })}\n\nBased on the current page context above, generate the appropriate Playwright actions to fulfill the user's command. Use the available elements to create accurate selectors.`;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as crypto from 'node:crypto';\nimport type { CacheEntry, PlaywrightAction, TestCommand } from '../types/index.js';\n\n/**\n * Cache manager for storing interpreted commands\n */\nexport class CacheManager {\n private cacheFilePath: string;\n private expiryDays: number;\n private cache: Map<string, CacheEntry>;\n\n constructor(cacheFilePath: string = '.atezca-cache.json', expiryDays: number = 30) {\n this.cacheFilePath = cacheFilePath;\n this.expiryDays = expiryDays;\n this.cache = new Map();\n this.load();\n }\n\n /**\n * Generate cache key from command\n */\n private generateKey(command: TestCommand): string {\n const data = `${command.actionType}:${command.description}`;\n return crypto.createHash('sha256').update(data).digest('hex');\n }\n\n /**\n * Check if cache entry is expired\n */\n private isExpired(entry: CacheEntry): boolean {\n return Date.now() > entry.expiresAt;\n }\n\n /**\n * Load cache from file\n */\n private load(): void {\n try {\n if (fs.existsSync(this.cacheFilePath)) {\n const data = fs.readFileSync(this.cacheFilePath, 'utf-8');\n const entries = JSON.parse(data) as CacheEntry[];\n \n // Load non-expired entries\n for (const entry of entries) {\n if (!this.isExpired(entry)) {\n this.cache.set(entry.key, entry);\n }\n }\n }\n } catch (error) {\n console.warn('Failed to load cache, starting with empty cache');\n this.cache.clear();\n }\n }\n\n /**\n * Save cache to file\n */\n private save(): void {\n try {\n const entries = Array.from(this.cache.values());\n const data = JSON.stringify(entries, null, 2);\n fs.writeFileSync(this.cacheFilePath, data, 'utf-8');\n } catch (error) {\n console.warn('Failed to save cache:', error);\n }\n }\n\n /**\n * Get cached actions for a command\n */\n get(command: TestCommand): PlaywrightAction[] | null {\n const key = this.generateKey(command);\n const entry = this.cache.get(key);\n\n if (!entry) {\n return null;\n }\n\n if (this.isExpired(entry)) {\n this.cache.delete(key);\n this.save();\n return null;\n }\n\n return entry.actions;\n }\n\n /**\n * Store actions in cache\n */\n set(command: TestCommand, actions: PlaywrightAction[]): void {\n const key = this.generateKey(command);\n const now = Date.now();\n const expiryMs = this.expiryDays * 24 * 60 * 60 * 1000;\n\n const entry: CacheEntry = {\n key,\n actions,\n cachedAt: now,\n expiresAt: now + expiryMs,\n };\n\n this.cache.set(key, entry);\n this.save();\n }\n\n /**\n * Check if command is cached\n */\n has(command: TestCommand): boolean {\n return this.get(command) !== null;\n }\n\n /**\n * Clear all cache\n */\n clear(): void {\n this.cache.clear();\n if (fs.existsSync(this.cacheFilePath)) {\n fs.unlinkSync(this.cacheFilePath);\n }\n }\n\n /**\n * Clear expired entries\n */\n clearExpired(): void {\n const keysToDelete: string[] = [];\n \n for (const [key, entry] of this.cache.entries()) {\n if (this.isExpired(entry)) {\n keysToDelete.push(key);\n }\n }\n\n for (const key of keysToDelete) {\n this.cache.delete(key);\n }\n\n if (keysToDelete.length > 0) {\n this.save();\n }\n }\n\n /**\n * Get cache statistics\n */\n getStats(): { size: number; oldestEntry: number | null; newestEntry: number | null } {\n const entries = Array.from(this.cache.values());\n \n if (entries.length === 0) {\n return { size: 0, oldestEntry: null, newestEntry: null };\n }\n\n const timestamps = entries.map(e => e.cachedAt);\n \n return {\n size: entries.length,\n oldestEntry: Math.min(...timestamps),\n newestEntry: Math.max(...timestamps),\n };\n }\n}\n","import { chromium, firefox, webkit, type Browser, type Page, type BrowserContext } from 'playwright';\nimport type { PlaywrightAction, SetupConfig, PageContext } from '../types/index.js';\n\n/**\n * Playwright executor for running test actions\n */\nexport class PlaywrightExecutor {\n private browser: Browser | null = null;\n private context: BrowserContext | null = null;\n private page: Page | null = null;\n private config: SetupConfig;\n private actionLog: Array<{ action: PlaywrightAction; result: string; duration: number }> = [];\n\n constructor(config: SetupConfig) {\n this.config = config;\n }\n\n /**\n * Initialize browser and page\n */\n async initialize(): Promise<void> {\n const browserType = this.config.browser ?? 'chromium';\n const headless = this.config.headless ?? true;\n\n // Launch browser\n switch (browserType) {\n case 'chromium':\n this.browser = await chromium.launch({ headless });\n break;\n case 'firefox':\n this.browser = await firefox.launch({ headless });\n break;\n case 'webkit':\n this.browser = await webkit.launch({ headless });\n break;\n default:\n throw new Error(`Unsupported browser: ${browserType}`);\n }\n\n // Create context and page\n this.context = await this.browser.newContext({\n ignoreHTTPSErrors: this.config.disableSSL ?? false,\n });\n this.page = await this.context.newPage();\n\n // Set default timeout\n this.page.setDefaultTimeout(this.config.timeout ?? 30000);\n\n // Navigate to base URL\n await this.page.goto(this.config.url);\n }\n\n /**\n * Execute a single action with retry logic\n */\n async executeAction(action: PlaywrightAction): Promise<void> {\n if (!this.page) {\n throw new Error('Executor not initialized. Call initialize() first.');\n }\n\n const startTime = Date.now();\n const retries = this.config.retries ?? 3;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < retries; attempt++) {\n try {\n await this.performAction(action);\n const duration = Date.now() - startTime;\n this.actionLog.push({ action, result: 'success', duration });\n return;\n } catch (error) {\n lastError = error as Error;\n if (attempt < retries - 1) {\n // Wait before retry (exponential backoff)\n await this.page.waitForTimeout(Math.pow(2, attempt) * 1000);\n }\n }\n }\n\n const duration = Date.now() - startTime;\n this.actionLog.push({ \n action, \n result: `failed: ${lastError?.message}`, \n duration \n });\n throw lastError;\n }\n\n /**\n * Perform the actual action\n */\n private async performAction(action: PlaywrightAction): Promise<void> {\n if (!this.page) {\n throw new Error('Page not initialized');\n }\n\n const timeout = action.timeout ?? this.config.timeout ?? 30000;\n\n switch (action.action) {\n case 'click':\n if (!action.selector) throw new Error('Click action requires selector');\n await this.page.locator(action.selector).click({ timeout });\n break;\n\n case 'type':\n if (!action.selector) throw new Error('Type action requires selector');\n if (!action.value) throw new Error('Type action requires value');\n await this.page.locator(action.selector).fill(action.value, { timeout });\n break;\n\n case 'navigate':\n if (!action.value) throw new Error('Navigate action requires value');\n const url = action.value.startsWith('http') \n ? action.value \n : new URL(action.value, this.config.url).toString();\n await this.page.goto(url, { timeout });\n break;\n\n case 'wait':\n // If condition is 'attached' and selector is 'body', this is a simple time wait\n if (action.condition === 'attached' && action.selector === 'body') {\n await this.page.waitForTimeout(timeout);\n } else {\n // Otherwise, wait for element state\n if (!action.selector) throw new Error('Wait action requires selector');\n const state = action.condition ?? 'visible';\n await this.page.locator(action.selector).waitFor({ \n state: state as 'visible' | 'hidden' | 'attached' | 'detached',\n timeout \n });\n }\n break;\n\n case 'expect':\n if (!action.selector) throw new Error('Expect action requires selector');\n await this.performAssertion(action, timeout);\n break;\n\n case 'select':\n if (!action.selector) throw new Error('Select action requires selector');\n if (!action.value) throw new Error('Select action requires value');\n await this.page.locator(action.selector).selectOption(action.value, { timeout });\n break;\n\n case 'hover':\n if (!action.selector) throw new Error('Hover action requires selector');\n await this.page.locator(action.selector).hover({ timeout });\n break;\n\n case 'press':\n if (!action.value) throw new Error('Press action requires value (key name)');\n await this.page.keyboard.press(action.value);\n break;\n\n default:\n throw new Error(`Unsupported action: ${action.action}`);\n }\n }\n\n /**\n * Perform assertion\n */\n private async performAssertion(action: PlaywrightAction, timeout: number): Promise<void> {\n if (!this.page || !action.selector) return;\n\n const locator = this.page.locator(action.selector);\n\n switch (action.assertionType) {\n case 'visible':\n await locator.waitFor({ state: 'visible', timeout });\n break;\n case 'hidden':\n await locator.waitFor({ state: 'hidden', timeout });\n break;\n case 'text':\n if (!action.expected) throw new Error('Text assertion requires expected value');\n await locator.waitFor({ state: 'visible', timeout });\n const text = await locator.textContent();\n if (!text?.includes(action.expected)) {\n throw new Error(`Expected text \"${action.expected}\" but got \"${text}\"`);\n }\n break;\n case 'value':\n if (!action.expected) throw new Error('Value assertion requires expected value');\n await locator.waitFor({ state: 'visible', timeout });\n const value = await locator.inputValue();\n if (value !== action.expected) {\n throw new Error(`Expected value \"${action.expected}\" but got \"${value}\"`);\n }\n break;\n case 'enabled':\n await locator.waitFor({ state: 'visible', timeout });\n if (await locator.isDisabled()) {\n throw new Error('Expected element to be enabled but it is disabled');\n }\n break;\n case 'disabled':\n await locator.waitFor({ state: 'visible', timeout });\n if (await locator.isEnabled()) {\n throw new Error('Expected element to be disabled but it is enabled');\n }\n break;\n default:\n // Default to visibility check\n await locator.waitFor({ state: 'visible', timeout });\n }\n }\n\n /**\n * Execute multiple actions in sequence\n */\n async executeActions(actions: PlaywrightAction[]): Promise<void> {\n for (const action of actions) {\n await this.executeAction(action);\n }\n }\n\n /**\n * Get action execution log\n */\n getActionLog(): typeof this.actionLog {\n return [...this.actionLog];\n }\n\n /**\n * Take screenshot\n */\n async screenshot(path: string): Promise<void> {\n if (!this.page) {\n throw new Error('Page not initialized');\n }\n await this.page.screenshot({ path });\n }\n\n /**\n * Close browser\n */\n async close(): Promise<void> {\n if (this.context) {\n await this.context.close();\n }\n if (this.browser) {\n await this.browser.close();\n }\n this.browser = null;\n this.context = null;\n this.page = null;\n }\n\n /**\n * Get current page (for advanced usage)\n */\n getPage(): Page | null {\n return this.page;\n }\n\n /**\n * Capture current page context for AI interpretation\n */\n async getPageContext(): Promise<PageContext> {\n if (!this.page) {\n throw new Error('Page not initialized');\n }\n\n try {\n // Get basic page info\n const url = this.page.url();\n const title = await this.page.title();\n\n // Get accessibility tree snapshot (simplified)\n const snapshot = await this.page.accessibility.snapshot();\n const accessibilityTree = this.simplifyAccessibilityTree(snapshot);\n\n // Get interactive elements\n const interactiveElements = await this.page.evaluate(() => {\n const elements: Array<{ role: string; name: string; tag: string }> = [];\n \n // Get buttons\n document.querySelectorAll('button, [role=\"button\"], input[type=\"button\"], input[type=\"submit\"]').forEach(el => {\n const text = el.textContent?.trim() || (el as HTMLInputElement).value || '';\n if (text) {\n elements.push({\n role: 'button',\n name: text,\n tag: el.tagName.toLowerCase()\n });\n }\n });\n\n // Get links\n document.querySelectorAll('a[href]').forEach(el => {\n const text = el.textContent?.trim() || '';\n if (text) {\n elements.push({\n role: 'link',\n name: text,\n tag: 'a'\n });\n }\n });\n\n // Get inputs\n document.querySelectorAll('input:not([type=\"hidden\"]), textarea, select').forEach(el => {\n const input = el as HTMLInputElement;\n const label = document.querySelector(`label[for=\"${input.id}\"]`)?.textContent?.trim() ||\n input.placeholder ||\n input.name ||\n input.id;\n if (label) {\n elements.push({\n role: 'input',\n name: label,\n tag: input.tagName.toLowerCase()\n });\n }\n });\n\n return elements.slice(0, 50); // Limit to first 50 elements\n });\n\n return {\n url,\n title,\n accessibilityTree,\n interactiveElements\n };\n } catch (error) {\n // Fallback context if capture fails\n return {\n url: this.page.url(),\n title: await this.page.title().catch(() => 'Unknown'),\n accessibilityTree: 'Unable to capture',\n interactiveElements: []\n };\n }\n }\n\n /**\n * Simplify accessibility tree for AI consumption\n */\n private simplifyAccessibilityTree(node: any, depth: number = 0, maxDepth: number = 3): string {\n if (!node || depth > maxDepth) return '';\n\n let result = '';\n const indent = ' '.repeat(depth);\n\n if (node.role) {\n const name = node.name ? ` \"${node.name}\"` : '';\n result += `${indent}- ${node.role}${name}\\n`;\n }\n\n if (node.children && depth < maxDepth) {\n for (const child of node.children.slice(0, 10)) { // Limit children\n result += this.simplifyAccessibilityTree(child, depth + 1, maxDepth);\n }\n }\n\n return result;\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { PlaywrightAction, SetupConfig, InterpretationResult } from '../types/index.js';\n\n/**\n * Code generator for creating reusable Playwright test files\n */\nexport class CodeGenerator {\n private config: SetupConfig;\n\n constructor(config: SetupConfig) {\n this.config = config;\n }\n\n /**\n * Generate Playwright test code from actions\n */\n generateCode(interpretations: InterpretationResult[]): string {\n const lines: string[] = [];\n\n // Add imports\n lines.push(\"import { test, expect } from '@playwright/test';\");\n lines.push('');\n\n // Add SSL warning if disabled\n if (this.config.disableSSL) {\n lines.push('// Note: SSL certificate validation is disabled (ignoreHTTPSErrors: true)');\n lines.push('// This is configured in playwright.config.ts');\n lines.push('');\n }\n\n // Add test suite\n lines.push(\"test.describe('Generated E2E Test', () => {\");\n lines.push(' test.beforeEach(async ({ page }) => {');\n lines.push(` // Navigate to base URL`);\n lines.push(` await page.goto('${this.config.url}');`);\n lines.push(' });');\n lines.push('');\n\n // Add main test\n lines.push(\" test('should execute test actions', async ({ page }) => {\");\n \n // Add each action group as comments and code\n for (const interpretation of interpretations) {\n const { command, actions } = interpretation;\n \n lines.push('');\n lines.push(` // ${command.actionType}: ${command.description}`);\n \n for (const action of actions) {\n const code = this.generateActionCode(action);\n lines.push(` ${code}`);\n }\n }\n\n lines.push(' });');\n lines.push('});');\n lines.push('');\n\n return lines.join('\\n');\n }\n\n /**\n * Generate code for a single action\n */\n private generateActionCode(action: PlaywrightAction): string {\n const timeout = action.timeout ?? this.config.timeout ?? 30000;\n\n switch (action.action) {\n case 'click':\n return `await page.locator('${this.escapeString(action.selector!)}').click({ timeout: ${timeout} });`;\n\n case 'type':\n return `await page.locator('${this.escapeString(action.selector!)}').fill('${this.escapeString(action.value!)}', { timeout: ${timeout} });`;\n\n case 'navigate': {\n const url = action.value!.startsWith('http') \n ? action.value \n : `\\${baseUrl}${action.value}`;\n return `await page.goto('${this.escapeString(url)}', { timeout: ${timeout} });`;\n }\n\n case 'wait': {\n // Check if this is a simple time wait\n if (action.condition === 'attached' && action.selector === 'body') {\n return `await page.waitForTimeout(${timeout});`;\n }\n // Otherwise, wait for element state\n const state = action.condition ?? 'visible';\n return `await page.locator('${this.escapeString(action.selector!)}').waitFor({ state: '${state}', timeout: ${timeout} });`;\n }\n\n case 'expect':\n return this.generateAssertionCode(action, timeout);\n\n case 'select':\n return `await page.locator('${this.escapeString(action.selector!)}').selectOption('${this.escapeString(action.value!)}', { timeout: ${timeout} });`;\n\n case 'hover':\n return `await page.locator('${this.escapeString(action.selector!)}').hover({ timeout: ${timeout} });`;\n\n case 'press':\n return `await page.keyboard.press('${this.escapeString(action.value!)}');`;\n\n default:\n return `// Unsupported action: ${action.action}`;\n }\n }\n\n /**\n * Generate assertion code\n */\n private generateAssertionCode(action: PlaywrightAction, timeout: number): string {\n const locator = `page.locator('${this.escapeString(action.selector!)}')`;\n\n switch (action.assertionType) {\n case 'visible':\n return `await expect(${locator}).toBeVisible({ timeout: ${timeout} });`;\n case 'hidden':\n return `await expect(${locator}).toBeHidden({ timeout: ${timeout} });`;\n case 'text':\n return `await expect(${locator}).toContainText('${this.escapeString(action.expected!)}', { timeout: ${timeout} });`;\n case 'value':\n return `await expect(${locator}).toHaveValue('${this.escapeString(action.expected!)}', { timeout: ${timeout} });`;\n case 'enabled':\n return `await expect(${locator}).toBeEnabled({ timeout: ${timeout} });`;\n case 'disabled':\n return `await expect(${locator}).toBeDisabled({ timeout: ${timeout} });`;\n default:\n return `await expect(${locator}).toBeVisible({ timeout: ${timeout} });`;\n }\n }\n\n /**\n * Escape string for code generation\n */\n private escapeString(str: string): string {\n return str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/'/g, \"\\\\'\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r');\n }\n\n /**\n * Generate and save test file\n */\n async saveTestFile(\n interpretations: InterpretationResult[],\n filename?: string\n ): Promise<string> {\n const code = this.generateCode(interpretations);\n const outputDir = this.config.outputDir ?? 'generated-tests';\n \n // Ensure output directory exists\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n // Generate filename if not provided\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const finalFilename = filename ?? `test-${timestamp}.spec.ts`;\n const filePath = path.join(outputDir, finalFilename);\n\n // Write file\n fs.writeFileSync(filePath, code, 'utf-8');\n\n return filePath;\n }\n\n /**\n * Generate Playwright config file\n */\n generatePlaywrightConfig(): string {\n const useConfig: string[] = [\n ` baseURL: '${this.config.url}',`,\n ` trace: 'on-first-retry',`,\n ` screenshot: 'only-on-failure',`,\n ];\n\n // Add ignoreHTTPSErrors if disableSSL is enabled\n if (this.config.disableSSL) {\n useConfig.push(` ignoreHTTPSErrors: true, // SSL certificate errors disabled`);\n }\n\n return `import { defineConfig, devices } from '@playwright/test';\n\nexport default defineConfig({\n testDir: './generated-tests',\n fullyParallel: true,\n forbidOnly: !!process.env.CI,\n retries: process.env.CI ? 2 : 0,\n workers: process.env.CI ? 1 : undefined,\n reporter: 'html',\n use: {\n${useConfig.join('\\n')}\n },\n projects: [\n {\n name: 'chromium',\n use: { ...devices['Desktop Chrome'] },\n },\n ],\n});\n`;\n }\n\n /**\n * Save Playwright config file\n */\n async savePlaywrightConfig(): Promise<string> {\n const config = this.generatePlaywrightConfig();\n const filePath = 'playwright.config.ts';\n \n // Only create if it doesn't exist\n if (!fs.existsSync(filePath)) {\n fs.writeFileSync(filePath, config, 'utf-8');\n }\n \n return filePath;\n }\n}\n","import { execSync } from 'child_process';\nimport chalk from 'chalk';\n\n/**\n * Check if error is due to missing Playwright browser\n */\nexport function isMissingBrowserError(error: Error): boolean {\n const message = error.message;\n return (\n message.includes(\"Executable doesn't exist at\") ||\n message.includes('Looks like Playwright') ||\n message.includes('npx playwright install')\n );\n}\n\n/**\n * Extract browser name from error message\n */\nexport function extractBrowserFromError(error: Error): string | null {\n const message = error.message;\n \n if (message.includes('chromium')) return 'chromium';\n if (message.includes('firefox')) return 'firefox';\n if (message.includes('webkit')) return 'webkit';\n \n return null;\n}\n\n/**\n * Auto-install Playwright browser\n */\nexport async function installPlaywrightBrowser(browser: string): Promise<boolean> {\n try {\n console.log(chalk.yellow(`\\n⚠️ Browser ${browser} not found. Installing automatically...\\n`));\n \n // Execute playwright install command\n execSync(`npx playwright install ${browser}`, {\n stdio: 'inherit',\n cwd: process.cwd(),\n });\n \n console.log(chalk.green(`\\n✓ Browser ${browser} installed successfully!\\n`));\n return true;\n } catch (error) {\n console.error(chalk.red(`\\n✗ Failed to install browser: ${(error as Error).message}\\n`));\n return false;\n }\n}\n\n/**\n * Handle browser installation if needed\n */\nexport async function handleBrowserInstallation(error: Error, browserType: string): Promise<boolean> {\n if (!isMissingBrowserError(error)) {\n return false;\n }\n\n const browser = extractBrowserFromError(error) || browserType;\n return await installPlaywrightBrowser(browser);\n}\n"],"mappings":"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","names":["fs","path","import_chalk","import_chalk","loadEnv","import_zod","Anthropic","fs","duration","state","path","fs","path","state","chalk","globalConfig","chalk","resolve","chalk","state"]}