intellitester 0.2.19 → 0.2.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-LKSREGQS.js → chunk-CKUSY4ZM.js} +407 -65
- package/dist/chunk-CKUSY4ZM.js.map +1 -0
- package/dist/{chunk-LFCMPHWU.cjs → chunk-PP666GZQ.cjs} +412 -65
- package/dist/chunk-PP666GZQ.cjs.map +1 -0
- package/dist/cli/index.cjs +35 -43
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +2 -10
- package/dist/cli/index.js.map +1 -1
- package/dist/index.cjs +52 -28
- package/dist/index.d.cts +987 -8
- package/dist/index.d.ts +987 -8
- package/dist/index.js +1 -1
- package/package.json +2 -1
- package/dist/chunk-LFCMPHWU.cjs.map +0 -1
- package/dist/chunk-LKSREGQS.js.map +0 -1
package/dist/cli/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/executors/web/pipelineExecutor.ts","../../src/generator/elementExtractor.ts","../../src/generator/sourceScanner.ts","../../src/generator/prompts.ts","../../src/generator/testGenerator.ts","../../src/cli/envHelper.ts","../../src/cli/index.ts"],"names":["firefox","webkit","chromium","path","crypto","startTrackingServer","startWebServer","killServer","createTestContext","setupAppwriteTracking","loadWorkflowDefinition","generateRandomUsername","runWorkflowWithContext","loadCleanupHandlers","executeCleanup","path2","basename","fs","glob","createAIProvider","yaml","parse","TestDefinitionSchema","prompts","dotenv","resolve","spawn","process","loadTestDefinition","collectMissingEnvVars","loadIntellitesterConfig","runWebTest","runWorkflow","loadPipelineDefinition","Command","isPipelineFile","isWorkflowFile","isPipelineContent","isWorkflowContent","loadFailedCleanups","removeFailedCleanup"],"mappings":"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","file":"index.cjs","sourcesContent":["import crypto from 'node:crypto';\nimport path from 'node:path';\nimport type { ChildProcess } from 'node:child_process';\n\nimport {\n chromium,\n firefox,\n webkit,\n type BrowserType,\n type Page,\n} from 'playwright';\n\nimport type {\n PipelineDefinition,\n PipelineResult,\n PipelineWorkflowResult,\n WorkflowReference,\n} from '../../core/types';\nimport { generateRandomUsername } from '../../core/randomUsername';\nimport { loadWorkflowDefinition } from '../../core/loader';\nimport {\n runWorkflowWithContext,\n setupAppwriteTracking,\n type ExecutionContext,\n type WorkflowOptions,\n} from './workflowExecutor';\nimport { createTestContext } from '../../integrations/appwrite';\nimport { startTrackingServer, type TrackingServer } from '../../tracking';\nimport { startWebServer, killServer, type BrowserName } from './playwrightExecutor';\nimport { loadCleanupHandlers, executeCleanup } from '../../core/cleanup/index.js';\nimport type { CleanupConfig } from '../../core/cleanup/types.js';\n\nexport interface PipelineOptions {\n headed?: boolean;\n browser?: BrowserName;\n interactive?: boolean;\n debug?: boolean;\n}\n\nconst getBrowser = (browser: BrowserName): BrowserType => {\n switch (browser) {\n case 'firefox':\n return firefox;\n case 'webkit':\n return webkit;\n default:\n return chromium;\n }\n};\n\n/**\n * Build execution order using topological sort (Kahn's algorithm).\n * Returns workflows in order respecting depends_on.\n * Throws if circular dependency detected.\n */\nfunction buildExecutionOrder(workflows: WorkflowReference[]): WorkflowReference[] {\n // Build a map of id -> workflow for quick lookup\n const workflowMap = new Map<string, WorkflowReference>();\n const workflowIds: string[] = [];\n\n for (let i = 0; i < workflows.length; i++) {\n const workflow = workflows[i];\n // Use explicit id or generate one based on index\n const id = workflow.id ?? `workflow_${i}`;\n workflowIds.push(id);\n workflowMap.set(id, { ...workflow, id });\n }\n\n // Build adjacency list and in-degree count\n const adjacencyList = new Map<string, string[]>();\n const inDegree = new Map<string, number>();\n\n // Initialize\n for (const id of workflowIds) {\n adjacencyList.set(id, []);\n inDegree.set(id, 0);\n }\n\n // Build edges from depends_on\n for (const id of workflowIds) {\n const workflow = workflowMap.get(id)!;\n const deps = workflow.depends_on ?? [];\n\n for (const depId of deps) {\n if (!workflowMap.has(depId)) {\n throw new Error(\n `Workflow \"${id}\" depends on \"${depId}\" which does not exist in the pipeline`\n );\n }\n // depId -> id (depId must come before id)\n adjacencyList.get(depId)!.push(id);\n inDegree.set(id, (inDegree.get(id) ?? 0) + 1);\n }\n }\n\n // Kahn's algorithm: start with nodes that have no dependencies\n const queue: string[] = [];\n for (const id of workflowIds) {\n if (inDegree.get(id) === 0) {\n queue.push(id);\n }\n }\n\n const sorted: WorkflowReference[] = [];\n\n while (queue.length > 0) {\n const currentId = queue.shift()!;\n sorted.push(workflowMap.get(currentId)!);\n\n // Reduce in-degree of dependents\n for (const dependentId of adjacencyList.get(currentId) ?? []) {\n const newInDegree = (inDegree.get(dependentId) ?? 1) - 1;\n inDegree.set(dependentId, newInDegree);\n\n if (newInDegree === 0) {\n queue.push(dependentId);\n }\n }\n }\n\n // Detect cycle: if not all nodes processed, there's a cycle\n if (sorted.length !== workflowIds.length) {\n const remaining = workflowIds.filter((id) => !sorted.some((w) => w.id === id));\n throw new Error(\n `Circular dependency detected in pipeline. Workflows involved: ${remaining.join(', ')}`\n );\n }\n\n return sorted;\n}\n\n/**\n * Infer cleanup configuration from pipeline config.\n */\nfunction inferCleanupConfig(\n config: PipelineDefinition['config']\n): CleanupConfig | undefined {\n if (!config) return undefined;\n\n // Check for new cleanup config first\n if (config.cleanup) {\n return config.cleanup as CleanupConfig;\n }\n\n // Backwards compatibility: convert old appwrite config\n if (config.appwrite?.cleanup) {\n return {\n provider: 'appwrite',\n appwrite: {\n endpoint: config.appwrite.endpoint,\n projectId: config.appwrite.projectId,\n apiKey: config.appwrite.apiKey,\n cleanupOnFailure: config.appwrite.cleanupOnFailure,\n },\n };\n }\n\n return undefined;\n}\n\n/**\n * Execute a pipeline: multiple workflows in sequence with shared browser and deferred cleanup.\n *\n * @param pipeline - The pipeline definition to execute\n * @param pipelinePath - Path to the pipeline YAML file (used for resolving relative workflow paths)\n * @param options - Pipeline execution options\n * @returns PipelineResult with workflow results and cleanup data\n */\nexport async function runPipeline(\n pipeline: PipelineDefinition,\n pipelinePath: string,\n options: PipelineOptions = {}\n): Promise<PipelineResult> {\n const pipelineDir = path.dirname(pipelinePath);\n const sessionId = crypto.randomUUID();\n const testStartTime = new Date().toISOString();\n\n console.log(`\\n${'='.repeat(60)}`);\n console.log(`Pipeline: ${pipeline.name}`);\n console.log(`Session ID: ${sessionId}`);\n console.log(`${'='.repeat(60)}\\n`);\n\n // 1. Build execution order (topological sort)\n let executionOrder: WorkflowReference[];\n try {\n executionOrder = buildExecutionOrder(pipeline.workflows);\n console.log(\n `Execution order: ${executionOrder.map((w) => w.id ?? w.file).join(' -> ')}\\n`\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Failed to build execution order: ${message}`);\n return {\n status: 'failed',\n workflows: [],\n sessionId,\n };\n }\n\n // 2. Start tracking server\n let trackingServer: TrackingServer | null = null;\n try {\n trackingServer = await startTrackingServer({ port: 0 });\n console.log(`Tracking server started on port ${trackingServer.port}`);\n } catch (error) {\n console.warn('Failed to start tracking server:', error);\n }\n\n // 3. Set environment variables for the app under test\n if (trackingServer) {\n process.env.INTELLITESTER_SESSION_ID = sessionId;\n process.env.INTELLITESTER_TRACK_URL = `http://localhost:${trackingServer.port}`;\n }\n\n // 4. Start web server if configured\n let serverProcess: ChildProcess | null = null;\n if (pipeline.config?.webServer) {\n try {\n serverProcess = await startWebServer({\n ...pipeline.config.webServer,\n cwd: pipelineDir,\n });\n } catch (error) {\n console.error('Failed to start web server:', error);\n if (trackingServer) await trackingServer.stop();\n throw error;\n }\n }\n\n // 5. Handle cleanup on Ctrl+C\n const signalCleanup = async () => {\n console.log('\\n\\nInterrupted - cleaning up...');\n killServer(serverProcess);\n if (trackingServer) await trackingServer.stop();\n process.exit(1);\n };\n process.on('SIGINT', signalCleanup);\n process.on('SIGTERM', signalCleanup);\n\n // 6. Launch browser ONCE for entire pipeline\n const browserName = options.browser ?? pipeline.config?.web?.browser ?? 'chromium';\n const headless = options.headed === true ? false : (pipeline.config?.web?.headless ?? true);\n const browser = await getBrowser(browserName).launch({ headless });\n const browserContext = await browser.newContext();\n const page = await browserContext.newPage();\n page.setDefaultTimeout(30000);\n\n // 7. Create shared ExecutionContext for ALL workflows\n const executionContext: ExecutionContext = {\n variables: new Map<string, string>(),\n lastEmail: null,\n emailClient: null,\n appwriteContext: createTestContext(),\n appwriteConfig: pipeline.config?.appwrite\n ? {\n endpoint: pipeline.config.appwrite.endpoint,\n projectId: pipeline.config.appwrite.projectId,\n apiKey: pipeline.config.appwrite.apiKey,\n }\n : undefined,\n };\n\n // 8. Setup Appwrite tracking ONCE at the start if any workflow may need it\n if (pipeline.config?.appwrite) {\n setupAppwriteTracking(page, executionContext);\n }\n\n // Track workflow execution status\n const completedIds = new Set<string>();\n const failedIds = new Set<string>();\n const skippedIds = new Set<string>();\n const workflowResults: PipelineWorkflowResult[] = [];\n let pipelineFailed = false;\n let shouldStopPipeline = false;\n\n try {\n // 9. Execute workflows in order\n for (const workflowRef of executionOrder) {\n const workflowId = workflowRef.id ?? workflowRef.file;\n\n if (shouldStopPipeline) {\n // Mark remaining workflows as skipped\n workflowResults.push({\n id: workflowRef.id,\n file: workflowRef.file,\n status: 'skipped',\n error: 'Pipeline stopped due to previous failure',\n });\n skippedIds.add(workflowId);\n continue;\n }\n\n // Check if dependencies passed\n const deps = workflowRef.depends_on ?? [];\n const depsFailed = deps.some((id) => failedIds.has(id) || skippedIds.has(id));\n const depsNotMet = deps.some(\n (id) => !completedIds.has(id) && !failedIds.has(id) && !skippedIds.has(id)\n );\n\n if (depsFailed || depsNotMet) {\n const onFailure = workflowRef.on_failure ?? pipeline.on_failure;\n\n if (onFailure === 'skip') {\n console.log(`\\nSkipping workflow \"${workflowId}\" - dependencies not met`);\n workflowResults.push({\n id: workflowRef.id,\n file: workflowRef.file,\n status: 'skipped',\n error: `Dependencies not met: ${deps.filter((d) => failedIds.has(d) || skippedIds.has(d)).join(', ')}`,\n });\n skippedIds.add(workflowId);\n continue;\n } else if (onFailure === 'fail') {\n console.log(\n `\\nPipeline stopped - workflow \"${workflowId}\" dependencies failed`\n );\n workflowResults.push({\n id: workflowRef.id,\n file: workflowRef.file,\n status: 'failed',\n error: `Dependencies failed: ${deps.filter((d) => failedIds.has(d) || skippedIds.has(d)).join(', ')}`,\n });\n failedIds.add(workflowId);\n pipelineFailed = true;\n shouldStopPipeline = true;\n continue;\n }\n // 'ignore' falls through to run anyway\n console.log(\n `\\nRunning workflow \"${workflowId}\" despite dependency failure (on_failure: ignore)`\n );\n }\n\n // Load and execute workflow\n const workflowFilePath = path.resolve(pipelineDir, workflowRef.file);\n console.log(`\\n${'='.repeat(40)}`);\n console.log(`Workflow: ${workflowId}`);\n console.log(`File: ${workflowRef.file}`);\n console.log(`${'='.repeat(40)}`);\n\n try {\n const workflowDefinition = await loadWorkflowDefinition(workflowFilePath);\n\n // Apply workflow-level variables from pipeline\n if (workflowRef.variables) {\n for (const [key, value] of Object.entries(workflowRef.variables)) {\n // Interpolate {{uuid}}, {{randomUsername}} and other variables\n const interpolated = value.replace(/\\{\\{(\\w+)\\}\\}/g, (match, varName) => {\n if (varName === 'uuid') {\n return crypto.randomUUID().split('-')[0];\n }\n if (varName === 'randomUsername') {\n return generateRandomUsername();\n }\n return executionContext.variables.get(varName) ?? match;\n });\n executionContext.variables.set(key, interpolated);\n }\n }\n\n // Execute workflow with shared context\n const workflowOptions: WorkflowOptions & {\n page: Page;\n executionContext: ExecutionContext;\n skipCleanup: boolean;\n sessionId: string;\n testStartTime: string;\n } = {\n ...options,\n page,\n executionContext,\n skipCleanup: true, // Defer cleanup to pipeline end\n sessionId,\n testStartTime,\n };\n\n const result = await runWorkflowWithContext(\n workflowDefinition,\n workflowFilePath,\n workflowOptions\n );\n\n if (result.status === 'passed') {\n completedIds.add(workflowId);\n workflowResults.push({\n id: workflowRef.id,\n file: workflowRef.file,\n status: 'passed',\n workflowResult: result,\n });\n } else {\n failedIds.add(workflowId);\n pipelineFailed = true;\n workflowResults.push({\n id: workflowRef.id,\n file: workflowRef.file,\n status: 'failed',\n workflowResult: result,\n error: result.tests.find((t) => t.status === 'failed')?.error,\n });\n\n // Check if we should stop the pipeline\n const onFailure = workflowRef.on_failure ?? pipeline.on_failure;\n if (onFailure === 'fail') {\n console.log(`\\nPipeline stopped due to workflow \"${workflowId}\" failure`);\n shouldStopPipeline = true;\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Failed to load/run workflow \"${workflowId}\": ${message}`);\n\n failedIds.add(workflowId);\n pipelineFailed = true;\n workflowResults.push({\n id: workflowRef.id,\n file: workflowRef.file,\n status: 'failed',\n error: message,\n });\n\n const onFailure = workflowRef.on_failure ?? pipeline.on_failure;\n if (onFailure === 'fail') {\n console.log(`\\nPipeline stopped due to workflow \"${workflowId}\" failure`);\n shouldStopPipeline = true;\n }\n }\n }\n\n // 10. Collect server-tracked resources\n if (trackingServer) {\n const serverResources = trackingServer.getResources(sessionId);\n if (serverResources.length > 0) {\n console.log(`\\nCollected ${serverResources.length} server-tracked resources`);\n // Cast to Appwrite-specific format - tracking server returns generic resources\n executionContext.appwriteContext.resources.push(...(serverResources as any));\n }\n }\n\n // 11. Run cleanup at end (respecting cleanup_on_failure)\n let cleanupResult: { success: boolean; deleted: string[]; failed: string[] } | undefined;\n const cleanupConfig = inferCleanupConfig(pipeline.config);\n\n if (cleanupConfig) {\n const shouldCleanup = pipelineFailed ? pipeline.cleanup_on_failure : true;\n\n if (shouldCleanup) {\n try {\n console.log('\\n---');\n console.log('[Cleanup] Starting pipeline cleanup...');\n\n const { handlers, typeMappings, provider } = await loadCleanupHandlers(\n cleanupConfig,\n process.cwd()\n );\n\n // Convert tracked resources to generic format\n const genericResources = executionContext.appwriteContext.resources.map(\n (r) => ({ ...r })\n );\n\n // Build provider config\n const providerConfig: { provider: string; [key: string]: unknown } = {\n provider: cleanupConfig.provider || 'appwrite',\n };\n\n if (cleanupConfig.provider === 'appwrite' && cleanupConfig.appwrite) {\n const appwriteCleanupConfig = cleanupConfig.appwrite as any;\n providerConfig.endpoint = appwriteCleanupConfig.endpoint;\n providerConfig.projectId = appwriteCleanupConfig.projectId;\n }\n\n cleanupResult = await executeCleanup(\n genericResources,\n handlers,\n typeMappings,\n {\n parallel: cleanupConfig.parallel ?? false,\n retries: cleanupConfig.retries ?? 3,\n sessionId,\n testStartTime,\n userId: executionContext.appwriteContext.userId,\n providerConfig,\n cwd: process.cwd(),\n config: cleanupConfig,\n provider,\n }\n );\n\n if (cleanupResult.success) {\n console.log(\n `[Cleanup] Cleanup complete: ${cleanupResult.deleted.length} resources deleted`\n );\n } else {\n console.log(\n `[Cleanup] Cleanup partial: ${cleanupResult.deleted.length} deleted, ${cleanupResult.failed.length} failed`\n );\n for (const failed of cleanupResult.failed) {\n console.log(` - ${failed}`);\n }\n }\n } catch (error) {\n console.error('[Cleanup] Cleanup failed:', error);\n }\n } else {\n console.log('\\nSkipping cleanup (cleanup_on_failure is false)');\n }\n }\n\n // 12. Calculate final status\n const passedCount = workflowResults.filter((w) => w.status === 'passed').length;\n const failedCount = workflowResults.filter((w) => w.status === 'failed').length;\n const skippedCount = workflowResults.filter((w) => w.status === 'skipped').length;\n\n console.log(`\\n${'='.repeat(60)}`);\n console.log(`Pipeline: ${pipelineFailed ? 'FAILED' : 'PASSED'}`);\n console.log(\n `Workflows: ${passedCount} passed, ${failedCount} failed, ${skippedCount} skipped`\n );\n console.log(`${'='.repeat(60)}\\n`);\n\n return {\n status: pipelineFailed ? 'failed' : 'passed',\n workflows: workflowResults,\n sessionId,\n cleanupResult,\n };\n } finally {\n // Remove signal handlers\n process.off('SIGINT', signalCleanup);\n process.off('SIGTERM', signalCleanup);\n\n // Close browser\n await browserContext.close();\n await browser.close();\n\n // Stop servers\n killServer(serverProcess);\n if (trackingServer) {\n await trackingServer.stop();\n }\n\n // Clean up env vars\n delete process.env.INTELLITESTER_SESSION_ID;\n delete process.env.INTELLITESTER_TRACK_URL;\n }\n}\n","/**\n * Element extractor for parsing interactive elements from component templates\n */\n\nexport interface ElementInfo {\n /** HTML tag name (button, input, a, etc.) */\n tag: string;\n /** data-testid attribute */\n testId?: string;\n /** Inner text or label */\n text?: string;\n /** ARIA role */\n role?: string;\n /** Accessible name (aria-label) */\n name?: string;\n /** Input type */\n type?: string;\n /** Placeholder text */\n placeholder?: string;\n /** Which page/route this element is on */\n route?: string;\n /** Human-readable description */\n description?: string;\n /** Source file path */\n file: string;\n}\n\n/**\n * Interactive HTML elements we're interested in extracting\n */\nconst INTERACTIVE_TAGS = [\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'a',\n 'form',\n 'label',\n 'option',\n] as const;\n\n/**\n * Extract template content based on file type\n */\nfunction extractTemplateContent(content: string, filePath: string): string {\n const ext = filePath.split('.').pop()?.toLowerCase();\n\n switch (ext) {\n case 'vue': {\n // Extract from <template> section\n const templateMatch = content.match(/<template[^>]*>([\\s\\S]*?)<\\/template>/);\n return templateMatch ? templateMatch[1] : '';\n }\n\n case 'astro': {\n // Astro files: content after frontmatter (---)\n const frontmatterEnd = content.lastIndexOf('---');\n if (frontmatterEnd > 0) {\n return content.substring(frontmatterEnd + 3);\n }\n return content;\n }\n\n case 'tsx':\n case 'jsx': {\n // Extract JSX from return statements\n const jsxPatterns = [\n // return ( ... )\n /return\\s*\\(([\\s\\S]*?)\\);/g,\n // return <...>\n /return\\s+(<[\\s\\S]*?>[\\s\\S]*?<\\/[\\w.]+>)/g,\n // return <... />\n /return\\s+(<[^>]+\\/\\s*>)/g,\n ];\n\n const jsxParts: string[] = [];\n for (const pattern of jsxPatterns) {\n const matches = content.matchAll(pattern);\n for (const match of matches) {\n jsxParts.push(match[1]);\n }\n }\n\n return jsxParts.join('\\n');\n }\n\n case 'svelte': {\n // Svelte: HTML-like template (whole file minus script/style)\n let template = content;\n\n // Remove <script> blocks\n template = template.replace(/<script[^>]*>[\\s\\S]*?<\\/script>/g, '');\n\n // Remove <style> blocks\n template = template.replace(/<style[^>]*>[\\s\\S]*?<\\/style>/g, '');\n\n return template;\n }\n\n default:\n return content;\n }\n}\n\n/**\n * Extract attribute value from an element string\n */\nfunction extractAttribute(element: string, attrName: string): string | undefined {\n // Handle both quoted and unquoted attributes\n const patterns = [\n new RegExp(`${attrName}\\\\s*=\\\\s*\"([^\"]*)\"`, 'i'),\n new RegExp(`${attrName}\\\\s*=\\\\s*'([^']*)'`, 'i'),\n new RegExp(`${attrName}\\\\s*=\\\\s*\\{([^}]*)\\}`, 'i'), // JSX expressions\n ];\n\n for (const pattern of patterns) {\n const match = element.match(pattern);\n if (match && match[1]) {\n // Clean up JSX expressions\n let value = match[1].trim();\n\n // Remove common JSX wrapper patterns like `\"string\"` or 't(\"key\")'\n if (value.startsWith('\"') && value.endsWith('\"')) {\n value = value.slice(1, -1);\n } else if (value.startsWith(\"'\") && value.endsWith(\"'\")) {\n value = value.slice(1, -1);\n }\n\n return value;\n }\n }\n\n return undefined;\n}\n\n/**\n * Extract text content from an element\n */\nfunction extractTextContent(element: string, tag: string): string | undefined {\n // Match opening tag to closing tag\n const regex = new RegExp(`<${tag}[^>]*>([^<]*)<\\/${tag}>`, 'i');\n const match = element.match(regex);\n\n if (match && match[1]) {\n let text = match[1].trim();\n\n // Remove common JSX expressions\n text = text.replace(/\\{[^}]*\\}/g, '').trim();\n\n // Only return if there's actual text content\n if (text.length > 0 && text.length < 100) {\n return text;\n }\n }\n\n return undefined;\n}\n\n/**\n * Generate a human-readable description for an element\n */\nfunction generateDescription(element: Partial<ElementInfo>): string {\n const parts: string[] = [];\n\n // Start with tag\n if (element.tag === 'input' && element.type) {\n parts.push(`${element.type} input`);\n } else if (element.tag === 'a') {\n parts.push('link');\n } else if (element.tag) {\n parts.push(element.tag);\n }\n\n // Add identifying information\n if (element.text) {\n parts.push(`\"${element.text}\"`);\n } else if (element.name) {\n parts.push(`\"${element.name}\"`);\n } else if (element.placeholder) {\n parts.push(`with placeholder \"${element.placeholder}\"`);\n } else if (element.testId) {\n parts.push(`(${element.testId})`);\n }\n\n return parts.join(' ');\n}\n\n/**\n * Parse a single element string and extract its information\n */\nfunction parseElement(\n elementStr: string,\n file: string,\n route?: string,\n): ElementInfo | null {\n // Extract tag name\n const tagMatch = elementStr.match(/<(\\w+)/);\n if (!tagMatch) return null;\n\n const tag = tagMatch[1].toLowerCase();\n\n // Only process interactive elements\n if (!INTERACTIVE_TAGS.includes(tag as any)) {\n return null;\n }\n\n const element: Partial<ElementInfo> = {\n tag,\n file,\n route,\n };\n\n // Extract attributes\n element.testId = extractAttribute(elementStr, 'data-testid');\n element.role = extractAttribute(elementStr, 'role');\n element.name = extractAttribute(elementStr, 'aria-label');\n element.type = extractAttribute(elementStr, 'type');\n element.placeholder = extractAttribute(elementStr, 'placeholder');\n\n // Also check for 'name' attribute if no aria-label\n if (!element.name) {\n element.name = extractAttribute(elementStr, 'name');\n }\n\n // Extract text content for buttons, links, labels\n if (['button', 'a', 'label', 'option'].includes(tag)) {\n element.text = extractTextContent(elementStr, tag);\n }\n\n // Generate description\n element.description = generateDescription(element);\n\n return element as ElementInfo;\n}\n\n/**\n * Extract all interactive elements from component content\n */\nexport function extractElements(\n content: string,\n filePath: string,\n route?: string,\n): ElementInfo[] {\n // Extract template content based on framework\n const template = extractTemplateContent(content, filePath);\n\n if (!template.trim()) {\n return [];\n }\n\n const elements: ElementInfo[] = [];\n\n // Find all element tags\n // This regex matches opening tags with their attributes (including self-closing)\n const elementPattern = /<(\\w+)(?:\\s+[^>]*)?(?:\\/>|>[\\s\\S]*?<\\/\\1>)/g;\n const matches = template.matchAll(elementPattern);\n\n for (const match of matches) {\n const elementStr = match[0];\n const element = parseElement(elementStr, filePath, route);\n\n if (element) {\n elements.push(element);\n }\n }\n\n return elements;\n}\n","/**\n * Source scanner for extracting component information from project source files\n */\n\nimport { glob } from 'glob';\nimport { promises as fs } from 'fs';\nimport * as path from 'path';\nimport { extractElements, type ElementInfo } from './elementExtractor';\n\nexport interface SourceConfig {\n /** Directory containing page/route components */\n pagesDir?: string;\n /** Directory containing reusable components */\n componentsDir?: string;\n /** File extensions to scan */\n extensions?: string[];\n /** Working directory (defaults to process.cwd()) */\n cwd?: string;\n}\n\nexport interface RouteInfo {\n /** Route path (e.g., /signup, /login) */\n path: string;\n /** Source file path */\n file: string;\n /** Component name */\n name: string;\n}\n\nexport interface ComponentInfo {\n /** Component name */\n name: string;\n /** Source file path */\n file: string;\n /** Elements found in the component */\n elements: ElementInfo[];\n}\n\nexport interface SourceScanResult {\n /** Detected routes */\n routes: RouteInfo[];\n /** Scanned components with their elements */\n components: ComponentInfo[];\n /** All elements across all components (flattened) */\n allElements: ElementInfo[];\n}\n\nconst DEFAULT_EXTENSIONS = ['.vue', '.astro', '.tsx', '.jsx', '.svelte'];\n\n/**\n * Converts a file path to a route path using file-based routing conventions\n */\nfunction fileToRoute(filePath: string, pagesDir: string): string {\n // Get relative path from pages directory\n let route = path.relative(pagesDir, filePath);\n\n // Remove extension\n route = route.replace(/\\.(vue|astro|tsx|jsx|svelte)$/, '');\n\n // Handle index files\n route = route.replace(/\\/index$/, '');\n route = route.replace(/^index$/, '');\n\n // Handle dynamic routes: [param] -> :param, [...slug] -> *\n route = route.replace(/\\[\\.\\.\\.(\\w+)\\]/g, '*');\n route = route.replace(/\\[(\\w+)\\]/g, ':$1');\n\n // Ensure leading slash\n route = '/' + route;\n\n // Clean up double slashes\n route = route.replace(/\\/+/g, '/');\n\n // Remove trailing slash (except for root)\n if (route.length > 1) {\n route = route.replace(/\\/$/, '');\n }\n\n return route;\n}\n\n/**\n * Extracts component name from file path\n */\nfunction getComponentName(filePath: string): string {\n const basename = path.basename(filePath);\n return basename.replace(/\\.(vue|astro|tsx|jsx|svelte)$/, '');\n}\n\n/**\n * Scans a directory for component files\n */\nasync function scanDirectory(\n dir: string,\n extensions: string[],\n cwd: string,\n): Promise<string[]> {\n const fullDir = path.resolve(cwd, dir);\n\n try {\n await fs.access(fullDir);\n } catch {\n // Directory doesn't exist\n return [];\n }\n\n const patterns = extensions.map((ext) => `**/*${ext}`);\n const files: string[] = [];\n\n for (const pattern of patterns) {\n const matches = await glob(pattern, {\n cwd: fullDir,\n absolute: true,\n nodir: true,\n });\n files.push(...matches);\n }\n\n return files;\n}\n\n/**\n * Scans project source files to extract routes, components, and elements\n */\nexport async function scanProjectSource(config: SourceConfig): Promise<SourceScanResult> {\n const cwd = config.cwd ?? process.cwd();\n const extensions = config.extensions ?? DEFAULT_EXTENSIONS;\n\n const routes: RouteInfo[] = [];\n const components: ComponentInfo[] = [];\n const allElements: ElementInfo[] = [];\n\n // Scan pages directory for routes\n if (config.pagesDir) {\n const pageFiles = await scanDirectory(config.pagesDir, extensions, cwd);\n const pagesFullDir = path.resolve(cwd, config.pagesDir);\n\n for (const file of pageFiles) {\n const routePath = fileToRoute(file, pagesFullDir);\n const name = getComponentName(file);\n\n routes.push({\n path: routePath,\n file,\n name,\n });\n\n // Extract elements from page component\n const content = await fs.readFile(file, 'utf-8');\n const elements = extractElements(content, file, routePath);\n\n components.push({\n name,\n file,\n elements,\n });\n\n allElements.push(...elements);\n }\n }\n\n // Scan components directory\n if (config.componentsDir) {\n const componentFiles = await scanDirectory(config.componentsDir, extensions, cwd);\n\n for (const file of componentFiles) {\n // Skip if already processed as a page\n if (components.some((c) => c.file === file)) {\n continue;\n }\n\n const name = getComponentName(file);\n const content = await fs.readFile(file, 'utf-8');\n const elements = extractElements(content, file, undefined);\n\n components.push({\n name,\n file,\n elements,\n });\n\n allElements.push(...elements);\n }\n }\n\n // If no specific dirs provided, try common defaults\n if (!config.pagesDir && !config.componentsDir) {\n const commonPageDirs = ['src/pages', 'pages', 'app', 'src/app', 'src/routes'];\n const commonComponentDirs = ['src/components', 'components', 'src/lib', 'lib'];\n\n // Try to find pages\n for (const dir of commonPageDirs) {\n const files = await scanDirectory(dir, extensions, cwd);\n if (files.length > 0) {\n const pagesFullDir = path.resolve(cwd, dir);\n\n for (const file of files) {\n const routePath = fileToRoute(file, pagesFullDir);\n const name = getComponentName(file);\n\n routes.push({\n path: routePath,\n file,\n name,\n });\n\n const content = await fs.readFile(file, 'utf-8');\n const elements = extractElements(content, file, routePath);\n\n components.push({\n name,\n file,\n elements,\n });\n\n allElements.push(...elements);\n }\n break; // Use first matching directory\n }\n }\n\n // Try to find components\n for (const dir of commonComponentDirs) {\n const files = await scanDirectory(dir, extensions, cwd);\n if (files.length > 0) {\n for (const file of files) {\n if (components.some((c) => c.file === file)) {\n continue;\n }\n\n const name = getComponentName(file);\n const content = await fs.readFile(file, 'utf-8');\n const elements = extractElements(content, file, undefined);\n\n components.push({\n name,\n file,\n elements,\n });\n\n allElements.push(...elements);\n }\n break; // Use first matching directory\n }\n }\n }\n\n return {\n routes,\n components,\n allElements,\n };\n}\n\n/**\n * Formats scan results for use in AI prompts\n */\nexport function formatScanResultsForPrompt(result: SourceScanResult): string {\n const lines: string[] = [];\n\n // Routes section\n if (result.routes.length > 0) {\n lines.push('## ROUTES');\n lines.push('');\n for (const route of result.routes) {\n lines.push(`- ${route.path}: ${route.name}`);\n }\n lines.push('');\n }\n\n // Elements by route\n const elementsByRoute = new Map<string, ElementInfo[]>();\n\n for (const element of result.allElements) {\n const route = element.route ?? 'shared';\n if (!elementsByRoute.has(route)) {\n elementsByRoute.set(route, []);\n }\n elementsByRoute.get(route)!.push(element);\n }\n\n lines.push('## ELEMENTS');\n lines.push('');\n\n for (const [route, elements] of elementsByRoute) {\n lines.push(`### ${route === 'shared' ? 'Shared Components' : route}`);\n lines.push('');\n\n for (const el of elements) {\n const locators: string[] = [];\n\n if (el.testId) locators.push(`data-testid=\"${el.testId}\"`);\n if (el.text) locators.push(`text=\"${el.text}\"`);\n if (el.role) locators.push(`role=\"${el.role}\"`);\n if (el.name) locators.push(`name=\"${el.name}\"`);\n if (el.placeholder) locators.push(`placeholder=\"${el.placeholder}\"`);\n if (el.type) locators.push(`type=\"${el.type}\"`);\n\n const locatorStr = locators.length > 0 ? `[${locators.join(', ')}]` : '';\n const description = el.description ? ` - ${el.description}` : '';\n\n lines.push(`- <${el.tag}>${locatorStr}${description}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","/**\n * System prompts and prompt building for test generation\n */\n\nimport { type SourceScanResult, formatScanResultsForPrompt } from './sourceScanner';\n\nexport const SYSTEM_PROMPT = `You are a test automation expert that converts natural language test descriptions into YAML test definitions.\n\n## Schema Structure\n\nA test definition must have:\n- name: A descriptive test name (non-empty string)\n- platform: One of 'web', 'android', or 'ios'\n- config: Optional configuration object\n- steps: Array of actions (minimum 1 action required)\n\n## Available Actions\n\n1. navigate - Navigate to a URL\n { type: 'navigate', value: string }\n\n2. tap - Click or tap an element\n { type: 'tap', target: Locator }\n\n3. input - Type text into an input field\n { type: 'input', target: Locator, value: string }\n\n4. assert - Assert element exists or contains text\n { type: 'assert', target: Locator, value?: string }\n\n5. wait - Wait for an element or timeout\n { type: 'wait', target?: Locator, timeout?: number }\n Note: Requires either target or timeout\n\n6. scroll - Scroll the page or to an element\n { type: 'scroll', target?: Locator, direction?: 'up'|'down', amount?: number }\n\n7. screenshot - Take a screenshot\n { type: 'screenshot', name?: string }\n\n## Locator Structure\n\nA locator must have AT LEAST ONE of these properties:\n- description: Human-readable description for AI healing\n- testId: data-testid attribute value\n- text: Text content to match\n- css: CSS selector\n- xpath: XPath expression\n- role: ARIA role attribute\n- name: Accessible name\n\n## Configuration Options\n\nweb:\n baseUrl: Base URL for the application\n browser: Browser to use (e.g., 'chromium', 'firefox', 'webkit')\n headless: Run browser in headless mode (boolean)\n timeout: Default timeout in milliseconds\n\nandroid:\n appId: Android application package ID\n device: Device name or ID\n\nios:\n bundleId: iOS bundle identifier\n simulator: Simulator name\n\n## Example 1: Login Test\n\n\\`\\`\\`yaml\nname: Login with valid credentials\nplatform: web\nconfig:\n web:\n baseUrl: https://example.com\n headless: true\nsteps:\n - type: navigate\n value: /login\n - type: input\n target:\n testId: email-input\n description: Email input field\n value: test@example.com\n - type: input\n target:\n testId: password-input\n description: Password input field\n value: password123\n - type: tap\n target:\n text: Sign In\n role: button\n description: Sign in button\n - type: assert\n target:\n text: Welcome\n description: Welcome message after login\n\\`\\`\\`\n\n## Example 2: Search Test\n\n\\`\\`\\`yaml\nname: Search for products\nplatform: web\nconfig:\n web:\n baseUrl: https://shop.example.com\nsteps:\n - type: navigate\n value: /\n - type: input\n target:\n css: input[type=\"search\"]\n description: Product search input\n value: laptop\n - type: tap\n target:\n role: button\n name: Search\n description: Search button\n - type: wait\n target:\n css: .search-results\n description: Search results container\n timeout: 5000\n - type: assert\n target:\n text: results found\n description: Results count message\n\\`\\`\\`\n\n## Example 3: Mobile App Test\n\n\\`\\`\\`yaml\nname: Add item to cart\nplatform: android\nconfig:\n android:\n appId: com.example.shop\nsteps:\n - type: tap\n target:\n testId: category-electronics\n description: Electronics category button\n - type: scroll\n direction: down\n amount: 300\n - type: tap\n target:\n text: Laptop Pro\n description: Product card for Laptop Pro\n - type: tap\n target:\n testId: add-to-cart-button\n description: Add to cart button\n - type: assert\n target:\n text: Added to cart\n description: Success message\n - type: screenshot\n name: cart-confirmation\n\\`\\`\\`\n\n## Important Instructions\n\n1. Output ONLY valid YAML - no markdown code blocks, no explanations\n2. Every locator MUST have at least one selector property\n3. Include descriptive locator descriptions for AI healing\n4. Use multiple locator strategies when possible for resilience\n5. For wait actions, provide either a target or timeout (or both)\n6. Use appropriate platform-specific configurations\n7. Ensure all strings are properly quoted if they contain special characters\n8. Action steps must be in logical order\n\nGenerate the test definition now based on the user's description.`;\n\nexport interface PromptContext {\n baseUrl?: string;\n platform?: 'web' | 'android' | 'ios';\n additionalContext?: string;\n}\n\nexport function buildPrompt(naturalLanguage: string, context?: PromptContext): string {\n const parts: string[] = [\n 'Generate a test definition for the following scenario:',\n '',\n naturalLanguage,\n ];\n\n if (context) {\n parts.push('', 'Additional Context:');\n\n if (context.platform) {\n parts.push(`- Platform: ${context.platform}`);\n }\n\n if (context.baseUrl) {\n parts.push(`- Base URL: ${context.baseUrl}`);\n }\n\n if (context.additionalContext) {\n parts.push(`- ${context.additionalContext}`);\n }\n }\n\n parts.push('', 'Output only valid YAML without code block markers.');\n\n return parts.join('\\n');\n}\n\n/**\n * Builds a source-aware system prompt that includes actual routes and elements from the project\n */\nexport function buildSourceAwareSystemPrompt(scanResult: SourceScanResult): string {\n const parts: string[] = [\n 'You are a test automation expert that converts natural language test descriptions into YAML test definitions.',\n '',\n '## Schema Structure',\n '',\n 'A test definition must have:',\n '- name: A descriptive test name (non-empty string)',\n '- platform: One of \\'web\\', \\'android\\', or \\'ios\\'',\n '- config: Optional configuration object',\n '- steps: Array of actions (minimum 1 action required)',\n '',\n '## Available Actions',\n '',\n '1. navigate - Navigate to a URL',\n ' { type: \\'navigate\\', value: string }',\n '',\n '2. tap - Click or tap an element',\n ' { type: \\'tap\\', target: Locator }',\n '',\n '3. input - Type text into an input field',\n ' { type: \\'input\\', target: Locator, value: string }',\n '',\n '4. assert - Assert element exists or contains text',\n ' { type: \\'assert\\', target: Locator, value?: string }',\n '',\n '5. wait - Wait for an element or timeout',\n ' { type: \\'wait\\', target?: Locator, timeout?: number }',\n ' Note: Requires either target or timeout',\n '',\n '6. scroll - Scroll the page or to an element',\n ' { type: \\'scroll\\', target?: Locator, direction?: \\'up\\'|\\'down\\', amount?: number }',\n '',\n '7. screenshot - Take a screenshot',\n ' { type: \\'screenshot\\', name?: string }',\n '',\n '## Locator Structure',\n '',\n 'A locator must have AT LEAST ONE of these properties:',\n '- description: Human-readable description for AI healing',\n '- testId: data-testid attribute value',\n '- text: Text content to match',\n '- css: CSS selector',\n '- xpath: XPath expression',\n '- role: ARIA role attribute',\n '- name: Accessible name',\n '',\n '## PROJECT STRUCTURE',\n '',\n 'The following routes and elements were extracted from the project source code.',\n 'Use these REAL selectors in your generated tests.',\n '',\n '### Selector Priority (prefer earlier options):',\n '1. text - Most resilient to DOM changes',\n '2. role + name - ARIA-compliant, accessible',\n '3. testId - Explicit but requires dev setup',\n '4. css - Last resort, fragile',\n '',\n ];\n\n // Add the formatted scan results\n parts.push(formatScanResultsForPrompt(scanResult));\n\n // Add configuration and examples\n parts.push(\n '## Configuration Options',\n '',\n 'web:',\n ' baseUrl: Base URL for the application',\n ' browser: Browser to use (e.g., \\'chromium\\', \\'firefox\\', \\'webkit\\')',\n ' headless: Run browser in headless mode (boolean)',\n ' timeout: Default timeout in milliseconds',\n '',\n 'android:',\n ' appId: Android application package ID',\n ' device: Device name or ID',\n '',\n 'ios:',\n ' bundleId: iOS bundle identifier',\n ' simulator: Simulator name',\n '',\n '## Example Test Structure',\n '',\n '```yaml',\n 'name: Example test name',\n 'platform: web',\n 'config:',\n ' web:',\n ' baseUrl: https://example.com',\n ' headless: true',\n 'steps:',\n ' - type: navigate',\n ' value: /login',\n ' - type: input',\n ' target:',\n ' text: Email',\n ' description: Email input field',\n ' value: test@example.com',\n ' - type: input',\n ' target:',\n ' role: textbox',\n ' name: Password',\n ' description: Password input field',\n ' value: password123',\n ' - type: tap',\n ' target:',\n ' text: Sign In',\n ' role: button',\n ' description: Sign in button',\n ' - type: assert',\n ' target:',\n ' text: Welcome',\n ' description: Welcome message after login',\n '```',\n '',\n '## Important Instructions',\n '',\n '1. Output ONLY valid YAML - no markdown code blocks, no explanations',\n '2. Use REAL selectors from the project structure above whenever possible',\n '3. Every locator MUST have at least one selector property',\n '4. Include descriptive locator descriptions for AI healing',\n '5. Prefer text and role selectors over testId and css for resilience',\n '6. Use multiple locator strategies when possible for resilience',\n '7. For wait actions, provide either a target or timeout (or both)',\n '8. Use appropriate platform-specific configurations',\n '9. Ensure all strings are properly quoted if they contain special characters',\n '10. Action steps must be in logical order',\n '',\n 'Generate the test definition now based on the user\\'s description.',\n );\n\n return parts.join('\\n');\n}\n","/**\n * Test generator that converts natural language to YAML test definitions\n */\n\nimport { parse } from 'yaml';\nimport type { z } from 'zod';\nimport { TestDefinitionSchema } from '../core/schema';\nimport type { AIConfig } from '../ai/types';\nimport { createAIProvider } from '../ai/provider';\nimport {\n SYSTEM_PROMPT,\n buildPrompt,\n buildSourceAwareSystemPrompt,\n type PromptContext,\n} from './prompts';\nimport { scanProjectSource, type SourceConfig } from './sourceScanner';\n\nexport interface GeneratorOptions {\n aiConfig: AIConfig;\n baseUrl?: string;\n platform?: 'web' | 'android' | 'ios';\n additionalContext?: string;\n maxRetries?: number;\n source?: SourceConfig | null; // null = explicitly disabled, undefined = auto-detect\n}\n\nexport interface GeneratorResult {\n success: boolean;\n test?: z.infer<typeof TestDefinitionSchema>;\n yaml?: string;\n error?: string;\n attempts?: number;\n}\n\n/**\n * Strips markdown code blocks from YAML content\n */\nfunction cleanYamlResponse(response: string): string {\n // Remove markdown YAML code blocks\n let cleaned = response.replace(/```ya?ml\\n?/gi, '').replace(/```\\n?/g, '');\n\n // Remove leading/trailing whitespace\n cleaned = cleaned.trim();\n\n return cleaned;\n}\n\n/**\n * Generates a test definition from natural language description\n *\n * @param naturalLanguage - The natural language test description\n * @param options - Generator configuration options\n * @returns Promise resolving to the generation result\n */\nexport async function generateTest(\n naturalLanguage: string,\n options: GeneratorOptions,\n): Promise<GeneratorResult> {\n const provider = createAIProvider(options.aiConfig);\n\n // Scan source if configured (default to auto-detect)\n let systemPrompt = SYSTEM_PROMPT;\n if (options.source !== null) {\n // null = explicitly disabled\n const sourceConfig = options.source ?? {}; // empty = auto-detect\n const scanResult = await scanProjectSource(sourceConfig);\n if (scanResult.allElements.length > 0) {\n systemPrompt = buildSourceAwareSystemPrompt(scanResult);\n }\n }\n\n const context: PromptContext = {\n baseUrl: options.baseUrl,\n platform: options.platform,\n additionalContext: options.additionalContext,\n };\n\n const userPrompt = buildPrompt(naturalLanguage, context);\n const maxRetries = options.maxRetries ?? 3;\n\n let lastError: Error | undefined;\n let lastYaml: string | undefined;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n // Build retry-specific prompt with feedback from previous attempt\n let promptWithFeedback = userPrompt;\n if (attempt > 0 && lastError) {\n promptWithFeedback = `${userPrompt}\\n\\nPrevious attempt failed with error: ${lastError.message}\\n\\nPlease fix the issue and generate valid YAML.`;\n }\n\n // Generate completion from AI using the system prompt (possibly source-aware)\n const response = await provider.generateCompletion(promptWithFeedback, systemPrompt);\n\n // Clean the response\n const yaml = cleanYamlResponse(response);\n lastYaml = yaml;\n\n // Parse YAML\n const parsed = parse(yaml);\n\n // Validate against schema\n const validated = TestDefinitionSchema.parse(parsed);\n\n // Success!\n return {\n success: true,\n test: validated,\n yaml,\n attempts: attempt + 1,\n };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // If this was the last retry, return failure\n if (attempt === maxRetries - 1) {\n return {\n success: false,\n error: `Failed to generate valid test after ${maxRetries} attempts. Last error: ${lastError.message}`,\n yaml: lastYaml,\n attempts: maxRetries,\n };\n }\n\n // Otherwise, continue to next retry\n }\n }\n\n // This should never be reached, but TypeScript wants it\n return {\n success: false,\n error: 'Unknown error occurred during test generation',\n attempts: maxRetries,\n };\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport prompts from 'prompts';\nimport dotenv from 'dotenv';\n\nexport interface MissingEnvVar {\n name: string;\n description?: string;\n}\n\n/**\n * Displays a formatted box showing missing environment variables\n */\nexport function displayMissingEnvVars(missing: string[]): void {\n console.log('\\n┌─────────────────────────────────────────────┐');\n console.log('│ ⚠️ Missing Environment Variables │');\n console.log('├─────────────────────────────────────────────┤');\n for (const name of missing) {\n console.log(`│ • ${name.padEnd(39)}│`);\n }\n console.log('└─────────────────────────────────────────────┘\\n');\n}\n\n/**\n * Prompts the user to add missing environment variables to .env file\n * Returns true if variables were successfully added, false otherwise\n */\nexport async function promptAddToEnv(\n missing: string[],\n envPath: string\n): Promise<boolean> {\n const { shouldAdd } = await prompts({\n type: 'confirm',\n name: 'shouldAdd',\n message: `Add missing variables to ${path.basename(envPath)}?`,\n initial: true,\n });\n\n if (!shouldAdd) return false;\n\n // Collect values for each missing var\n const values: Record<string, string> = {};\n for (const name of missing) {\n const { value } = await prompts({\n type: 'password', // Hide sensitive values\n name: 'value',\n message: `Enter value for ${name}:`,\n });\n if (value !== undefined) {\n values[name] = value;\n }\n }\n\n // Append to .env file (create if doesn't exist)\n const lines = Object.entries(values)\n .map(([key, val]) => `${key}=${val}`)\n .join('\\n');\n\n let existingContent = '';\n try {\n existingContent = await fs.readFile(envPath, 'utf8');\n } catch {\n // File doesn't exist, that's okay\n }\n\n const newContent = existingContent\n ? `${existingContent.trimEnd()}\\n${lines}\\n`\n : `${lines}\\n`;\n\n await fs.writeFile(envPath, newContent, 'utf8');\n console.log(`\\n✓ Added ${missing.length} variable(s) to ${path.basename(envPath)}\\n`);\n\n // Reload env vars\n dotenv.config({ path: envPath, override: true });\n\n return true;\n}\n\n/**\n * Main function to check and handle missing environment variables\n * Returns true if all required vars are available (or were successfully added),\n * false if the user chose not to provide them\n */\nexport async function validateEnvVars(\n missing: string[],\n projectDir: string\n): Promise<boolean> {\n if (missing.length === 0) return true;\n\n displayMissingEnvVars(missing);\n\n const envPath = path.join(projectDir, '.env');\n const added = await promptAddToEnv(missing, envPath);\n\n if (!added) {\n console.log('Cannot continue without required environment variables.');\n return false;\n }\n\n return true;\n}\n","#!/usr/bin/env node\nimport dotenv from 'dotenv';\n\n// Load .env from current working directory\ndotenv.config();\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { Command } from 'commander';\n\nimport { spawn, type ChildProcess } from 'node:child_process';\n\nimport { loadIntellitesterConfig, loadTestDefinition, loadWorkflowDefinition, isWorkflowFile, isPipelineFile, loadPipelineDefinition, collectMissingEnvVars, isWorkflowContent, isPipelineContent } from '../core/loader';\nimport { runPipeline } from '../executors/web/pipelineExecutor';\nimport type { TestDefinition } from '../core/types';\nimport { runWebTest, type BrowserName } from '../executors/web';\nimport { runWorkflow } from '../executors/web/workflowExecutor';\nimport { generateTest } from '../generator';\nimport type { AIConfig as _AIConfig } from '../ai/types';\nimport { loadFailedCleanups, removeFailedCleanup } from '../core/cleanup/persistence.js';\nimport { loadCleanupHandlers, executeCleanup } from '../core/cleanup/index.js';\nimport type { CleanupConfig } from '../core/cleanup/types.js';\nimport { validateEnvVars } from './envHelper';\n\nconst CONFIG_FILENAME = 'intellitester.config.yaml';\n\n/**\n * Map common browser names to Playwright browser names.\n */\nconst BROWSER_ALIASES: Record<string, BrowserName> = {\n chrome: 'chromium',\n chromium: 'chromium',\n safari: 'webkit',\n webkit: 'webkit',\n firefox: 'firefox',\n ff: 'firefox',\n};\n\nconst resolveBrowserName = (input: string): BrowserName => {\n const normalized = input.toLowerCase().trim();\n const resolved = BROWSER_ALIASES[normalized];\n if (!resolved) {\n const valid = Object.keys(BROWSER_ALIASES).join(', ');\n throw new Error(`Unknown browser \"${input}\". Valid options: ${valid}`);\n }\n return resolved;\n};\n\n/**\n * Detect package manager from lockfile.\n */\nconst detectPackageManager = async (): Promise<'pnpm' | 'npm' | 'yarn' | 'bun'> => {\n if (await fileExists('pnpm-lock.yaml')) return 'pnpm';\n if (await fileExists('bun.lockb')) return 'bun';\n if (await fileExists('yarn.lock')) return 'yarn';\n return 'npm';\n};\n\n/**\n * Run a command and wait for it to complete.\n */\nconst execCommand = async (cmd: string, args: string[], cwd: string): Promise<void> => {\n return new Promise((resolve, reject) => {\n console.log(`Running: ${cmd} ${args.join(' ')}`);\n const child = spawn(cmd, args, {\n cwd,\n stdio: 'inherit',\n shell: true,\n });\n child.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`Command failed with exit code ${code}`));\n });\n child.on('error', reject);\n });\n};\n\n/**\n * Build the project and start preview server.\n * Returns the preview server process and cleanup function.\n */\nconst buildAndPreview = async (\n config: any,\n cwd: string\n): Promise<{ previewProcess: ChildProcess | null; cleanup: () => void }> => {\n const pm = await detectPackageManager();\n const previewConfig = config?.preview || {};\n\n // Get build command (default: pm run build)\n const buildCmd = previewConfig.build?.command || `${pm} run build`;\n const [buildExec, ...buildArgs] = buildCmd.split(' ');\n\n // Get preview command (default: pm run preview)\n const previewCmd = previewConfig.preview?.command || `${pm} run preview`;\n const [previewExec, ...previewArgs] = previewCmd.split(' ');\n\n // Get preview URL (default from webServer or baseUrl)\n const previewUrl = previewConfig.url || config?.webServer?.url || config?.platforms?.web?.baseUrl || 'http://localhost:4321';\n const timeout = previewConfig.timeout || 60000;\n\n // Run build\n console.log('\\n📦 Building project...\\n');\n await execCommand(buildExec, buildArgs, cwd);\n console.log('\\n✅ Build complete\\n');\n\n // Start preview server\n console.log('\\n🚀 Starting preview server...\\n');\n const previewProcess = await startPreviewServer(previewExec, previewArgs, cwd, previewUrl, timeout);\n\n const cleanup = () => {\n if (previewProcess && !previewProcess.killed) {\n console.log('\\n🛑 Stopping preview server...');\n previewProcess.kill('SIGTERM');\n }\n };\n\n // Handle cleanup on exit\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n\n return { previewProcess, cleanup };\n};\n\n/**\n * Start a preview server and wait for it to be ready.\n */\nconst startPreviewServer = async (\n cmd: string,\n args: string[],\n cwd: string,\n url: string,\n timeout: number = 60000\n): Promise<ChildProcess> => {\n return new Promise((resolve, reject) => {\n console.log(`Starting preview server: ${cmd} ${args.join(' ')}`);\n const child = spawn(cmd, args, {\n cwd,\n stdio: 'pipe',\n shell: true,\n });\n\n let output = '';\n const startTime = Date.now();\n\n const checkServer = async () => {\n try {\n const response = await fetch(url, { method: 'HEAD' });\n if (response.ok || response.status < 500) {\n console.log(`Preview server ready at ${url}`);\n resolve(child);\n return true;\n }\n } catch {\n // Server not ready yet\n }\n return false;\n };\n\n // Poll for server readiness\n const pollInterval = setInterval(async () => {\n if (await checkServer()) {\n clearInterval(pollInterval);\n } else if (Date.now() - startTime > timeout) {\n clearInterval(pollInterval);\n child.kill();\n reject(new Error(`Preview server failed to start within ${timeout}ms`));\n }\n }, 500);\n\n child.stdout?.on('data', (data) => {\n output += data.toString();\n process.stdout.write(data);\n });\n\n child.stderr?.on('data', (data) => {\n output += data.toString();\n process.stderr.write(data);\n });\n\n child.on('error', (err) => {\n clearInterval(pollInterval);\n reject(err);\n });\n\n child.on('close', (code) => {\n clearInterval(pollInterval);\n if (code !== 0 && code !== null) {\n reject(new Error(`Preview server exited with code ${code}\\n${output}`));\n }\n });\n });\n};\n\nconst logError = (message: string): void => {\n console.error(`Error: ${message}`);\n};\n\n/**\n * Find the project root directory by walking up from the given path\n * until we find a directory containing package.json, .git, or intellitester.config.yaml\n */\nconst findProjectRoot = async (startPath: string): Promise<string | null> => {\n let currentDir = path.isAbsolute(startPath) ? startPath : path.resolve(startPath);\n\n // If startPath is a file, start from its directory\n try {\n const stat = await fs.stat(currentDir);\n if (stat.isFile()) {\n currentDir = path.dirname(currentDir);\n }\n } catch {\n // If stat fails, assume it's a directory or use dirname\n currentDir = path.dirname(currentDir);\n }\n\n // Walk up the directory tree\n const root = path.parse(currentDir).root;\n while (currentDir !== root) {\n // Check for project markers\n const markers = ['package.json', '.git', CONFIG_FILENAME];\n for (const marker of markers) {\n if (await fileExists(path.join(currentDir, marker))) {\n return currentDir;\n }\n }\n\n // Move up one directory\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) break; // Reached root\n currentDir = parentDir;\n }\n\n return null; // No project root found\n};\n\n/**\n * Load .env file from the project directory\n */\nconst loadProjectEnv = async (targetPath: string): Promise<void> => {\n const projectRoot = await findProjectRoot(targetPath);\n if (projectRoot) {\n const envPath = path.join(projectRoot, '.env');\n if (await fileExists(envPath)) {\n dotenv.config({ path: envPath, override: false });\n console.log(`Loaded .env from ${projectRoot}`);\n }\n }\n};\n\nconst fileExists = async (filePath: string): Promise<boolean> => {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n};\n\nconst collectYamlFiles = async (target: string): Promise<string[]> => {\n const stat = await fs.stat(target);\n if (stat.isFile()) return [target];\n\n if (!stat.isDirectory()) {\n throw new Error(`Unsupported target: ${target}`);\n }\n\n const entries = await fs.readdir(target, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n const fullPath = path.join(target, entry.name);\n if (entry.isDirectory()) {\n const nested = await collectYamlFiles(fullPath);\n files.push(...nested);\n } else if (entry.isFile() && (entry.name.endsWith('.yaml') || entry.name.endsWith('.yml'))) {\n files.push(fullPath);\n }\n }\n return files;\n};\n\n/**\n * Auto-discover test files in the tests/ directory.\n * Returns files grouped by type: pipelines first, then workflows, then individual tests.\n * Tests that are referenced by workflows are excluded from standalone test list.\n */\nconst discoverTestFiles = async (testsDir: string = 'tests'): Promise<{\n pipelines: string[];\n workflows: string[];\n tests: string[];\n}> => {\n const absoluteDir = path.resolve(testsDir);\n\n if (!(await fileExists(absoluteDir))) {\n return { pipelines: [], workflows: [], tests: [] };\n }\n\n const allFiles = await collectYamlFiles(absoluteDir);\n\n const pipelines: string[] = [];\n const workflows: string[] = [];\n const allTests: string[] = [];\n\n for (const file of allFiles) {\n const name = path.basename(file).toLowerCase();\n if (name.endsWith('.pipeline.yaml') || name.endsWith('.pipeline.yml')) {\n pipelines.push(file);\n } else if (name.endsWith('.workflow.yaml') || name.endsWith('.workflow.yml')) {\n workflows.push(file);\n } else if (name.endsWith('.test.yaml') || name.endsWith('.test.yml')) {\n allTests.push(file);\n }\n }\n\n const { parse } = await import('yaml');\n\n // Parse pipelines to find workflows they reference\n const workflowsInPipelines = new Set<string>();\n for (const pipelineFile of pipelines) {\n try {\n const content = await fs.readFile(pipelineFile, 'utf8');\n const pipeline = parse(content);\n const pipelineDir = path.dirname(pipelineFile);\n\n if (pipeline?.workflows && Array.isArray(pipeline.workflows)) {\n for (const workflowRef of pipeline.workflows) {\n if (workflowRef?.file) {\n const absoluteWorkflowPath = path.resolve(pipelineDir, workflowRef.file);\n workflowsInPipelines.add(absoluteWorkflowPath);\n }\n }\n }\n } catch {\n // If we can't parse a pipeline, just continue\n }\n }\n\n // Filter out workflows that are part of pipelines\n const standaloneWorkflows = workflows.filter(wf => !workflowsInPipelines.has(wf));\n\n // Parse workflows to find tests they reference, so we don't run them twice\n const testsInWorkflows = new Set<string>();\n for (const workflowFile of workflows) {\n try {\n const content = await fs.readFile(workflowFile, 'utf8');\n const workflow = parse(content);\n const workflowDir = path.dirname(workflowFile);\n\n if (workflow?.tests && Array.isArray(workflow.tests)) {\n for (const testRef of workflow.tests) {\n if (testRef?.file) {\n const absoluteTestPath = path.resolve(workflowDir, testRef.file);\n testsInWorkflows.add(absoluteTestPath);\n }\n }\n }\n } catch {\n // If we can't parse a workflow, just continue\n }\n }\n\n // Filter out tests that are part of workflows\n const standaloneTests = allTests.filter(test => !testsInWorkflows.has(test));\n\n return { pipelines, workflows: standaloneWorkflows, tests: standaloneTests };\n};\n\nconst writeFileIfMissing = async (filePath: string, contents: string): Promise<void> => {\n if (await fileExists(filePath)) return;\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, contents, 'utf8');\n};\n\nconst initCommand = async (): Promise<void> => {\n const configTemplate = `defaults:\n timeout: 30000\n screenshots: on-failure\n\nplatforms:\n web:\n baseUrl: http://localhost:3000\n headless: true\n\nai:\n provider: anthropic\n model: claude-3-5-sonnet-20241022\n apiKey: \\${ANTHROPIC_API_KEY}\n temperature: 0\n maxTokens: 4096\n\nemail:\n provider: inbucket\n endpoint: http://localhost:9000\n\nappwrite:\n endpoint: https://cloud.appwrite.io/v1\n projectId: your-project-id\n apiKey: your-api-key\n`;\n\n const sampleTest = `name: Example web smoke test\nplatform: web\nconfig:\n web:\n baseUrl: http://localhost:3000\n\nsteps:\n - type: navigate\n value: /\n\n - type: assert\n target:\n text: \"Welcome\"\n`;\n\n await writeFileIfMissing(path.resolve(CONFIG_FILENAME), configTemplate);\n await writeFileIfMissing(path.resolve('tests', 'example.web.test.yaml'), sampleTest);\n console.log('Initialized intellitester.config.yaml and tests/example.web.test.yaml');\n};\n\nconst validateCommand = async (target: string): Promise<void> => {\n const absoluteTarget = path.resolve(target);\n const files = await collectYamlFiles(absoluteTarget);\n if (files.length === 0) {\n throw new Error(`No YAML files found at ${absoluteTarget}`);\n }\n\n for (const file of files) {\n await loadTestDefinition(file);\n console.log(`✓ ${path.relative(process.cwd(), file)} valid`);\n }\n};\n\nconst resolveBaseUrl = (test: TestDefinition, configBaseUrl?: string): string | undefined =>\n test.config?.web?.baseUrl ?? configBaseUrl;\n\nconst runTestCommand = async (\n target: string,\n options: {\n headed?: boolean;\n browser?: BrowserName;\n noServer?: boolean;\n interactive?: boolean;\n debug?: boolean;\n },\n): Promise<void> => {\n const absoluteTarget = path.resolve(target);\n\n // Load .env from the project directory\n await loadProjectEnv(absoluteTarget);\n\n // Validate environment variables before proceeding\n const { parse } = await import('yaml');\n const testContent = await fs.readFile(absoluteTarget, 'utf8');\n const parsedTest = parse(testContent);\n\n const hasConfigFile = await fileExists(CONFIG_FILENAME);\n let parsedConfig: unknown = undefined;\n if (hasConfigFile) {\n const configContent = await fs.readFile(CONFIG_FILENAME, 'utf8');\n parsedConfig = parse(configContent);\n }\n\n // Collect missing env vars from both config and test\n const configMissing = parsedConfig ? collectMissingEnvVars(parsedConfig) : [];\n const testMissing = collectMissingEnvVars(parsedTest);\n const allMissing = [...new Set([...configMissing, ...testMissing])];\n\n if (allMissing.length > 0) {\n const projectRoot = await findProjectRoot(absoluteTarget);\n const canContinue = await validateEnvVars(allMissing, projectRoot || process.cwd());\n if (!canContinue) {\n process.exit(1);\n }\n }\n\n // Now load and validate with schemas\n const test = await loadTestDefinition(absoluteTarget);\n const config = hasConfigFile ? await loadIntellitesterConfig(CONFIG_FILENAME) : undefined;\n\n const baseUrl = resolveBaseUrl(test, config?.platforms?.web?.baseUrl);\n const headed = options.headed ?? false;\n const browser = options.browser ?? 'chromium';\n const skipWebServer = options.noServer ?? false;\n const debug = options.debug ?? false;\n const interactive = options.interactive ?? false;\n\n const modeFlags: string[] = [];\n if (headed) modeFlags.push('headed');\n if (debug) modeFlags.push('debug mode');\n if (interactive) modeFlags.push('interactive');\n\n console.log(\n `Running ${path.basename(absoluteTarget)} on web (${browser}${modeFlags.length > 0 ? ', ' + modeFlags.join(', ') : ''})`,\n );\n\n const result = await runWebTest(test, {\n baseUrl,\n headed,\n browser,\n defaultTimeoutMs: config?.defaults?.timeout,\n webServer: !skipWebServer && config?.webServer ? config.webServer : undefined,\n debug,\n interactive,\n aiConfig: interactive ? config?.ai : undefined,\n });\n\n for (const step of result.steps) {\n const label = `[${step.status === 'passed' ? 'OK' : 'FAIL'}] ${step.action.type}`;\n if (step.error) {\n console.error(`${label} - ${step.error}`);\n } else {\n console.log(label);\n }\n }\n\n if (result.status === 'failed') {\n process.exitCode = 1;\n }\n};\n\nconst generateCommand = async (\n prompt: string,\n options: {\n output?: string;\n platform?: 'web' | 'android' | 'ios';\n baseUrl?: string;\n pagesDir?: string;\n componentsDir?: string;\n noSource?: boolean;\n },\n): Promise<void> => {\n // Load .env from the project directory (output path or current directory)\n const targetPath = options.output ? path.resolve(options.output) : process.cwd();\n await loadProjectEnv(targetPath);\n\n // 1. Load config file to get AI settings\n const hasConfigFile = await fileExists(CONFIG_FILENAME);\n if (!hasConfigFile) {\n throw new Error('No intellitester.config.yaml found. Run \"intellitester init\" first and configure AI settings.');\n }\n\n // Validate environment variables in config\n const { parse } = await import('yaml');\n const configContent = await fs.readFile(CONFIG_FILENAME, 'utf8');\n const parsedConfig = parse(configContent);\n const configMissing = collectMissingEnvVars(parsedConfig);\n\n if (configMissing.length > 0) {\n const projectRoot = await findProjectRoot(CONFIG_FILENAME);\n const canContinue = await validateEnvVars(configMissing, projectRoot || process.cwd());\n if (!canContinue) {\n process.exit(1);\n }\n }\n\n const config = await loadIntellitesterConfig(CONFIG_FILENAME);\n if (!config.ai) {\n throw new Error('AI configuration missing in intellitester.config.yaml. Add \"ai:\" section with provider, model, and apiKey.');\n }\n\n // 2. Build source config\n const source = options.noSource ? null : (options.pagesDir || options.componentsDir) ? {\n pagesDir: options.pagesDir,\n componentsDir: options.componentsDir,\n } : undefined; // undefined = auto-detect\n\n // 3. Build options\n const generateOptions = {\n aiConfig: config.ai,\n baseUrl: options.baseUrl,\n platform: options.platform,\n source,\n };\n\n // 4. Generate test\n console.log('Generating test...');\n const result = await generateTest(prompt, generateOptions);\n\n if (!result.success) {\n throw new Error(result.error || 'Failed to generate test');\n }\n\n // 5. Output\n if (options.output) {\n await fs.mkdir(path.dirname(options.output), { recursive: true });\n await fs.writeFile(options.output, result.yaml!, 'utf8');\n console.log(`✓ Test saved to ${options.output}`);\n } else {\n console.log('\\n--- Generated Test ---\\n');\n console.log(result.yaml);\n }\n};\n\ninterface RunOptions {\n visible?: boolean;\n browser?: BrowserName;\n interactive?: boolean;\n debug?: boolean;\n}\n\nconst runWorkflowCommand = async (file: string, options: RunOptions): Promise<void> => {\n const workflowPath = path.resolve(file);\n\n if (!(await fileExists(workflowPath))) {\n logError(`Workflow file not found: ${file}`);\n process.exit(1);\n }\n\n // Load .env from the project directory\n await loadProjectEnv(workflowPath);\n\n console.log(`Running workflow: ${file}`);\n\n // Validate environment variables before proceeding\n const { parse } = await import('yaml');\n const workflowContent = await fs.readFile(workflowPath, 'utf8');\n const parsedWorkflow = parse(workflowContent);\n\n const hasConfigFile = await fileExists(CONFIG_FILENAME);\n let parsedConfig: unknown = undefined;\n if (hasConfigFile) {\n const configContent = await fs.readFile(CONFIG_FILENAME, 'utf8');\n parsedConfig = parse(configContent);\n }\n\n // Collect missing env vars from both config and workflow\n const configMissing = parsedConfig ? collectMissingEnvVars(parsedConfig) : [];\n const workflowMissing = collectMissingEnvVars(parsedWorkflow);\n const allMissing = [...new Set([...configMissing, ...workflowMissing])];\n\n if (allMissing.length > 0) {\n const projectRoot = await findProjectRoot(workflowPath);\n const canContinue = await validateEnvVars(allMissing, projectRoot || process.cwd());\n if (!canContinue) {\n process.exit(1);\n }\n }\n\n // Now load and validate with schemas\n const workflow = await loadWorkflowDefinition(workflowPath);\n\n // Load config to get AI settings (for interactive mode)\n const config = hasConfigFile ? await loadIntellitesterConfig(CONFIG_FILENAME) : undefined;\n\n const result = await runWorkflow(workflow, workflowPath, {\n headed: options.visible,\n browser: options.browser,\n interactive: options.interactive,\n debug: options.debug,\n aiConfig: config?.ai,\n webServer: config?.webServer,\n });\n\n // Print results\n console.log(`\\nWorkflow: ${workflow.name}`);\n console.log(`Session ID: ${result.sessionId}`);\n console.log(`Status: ${result.status}\\n`);\n\n for (const test of result.tests) {\n const icon = test.status === 'passed' ? '✓' : test.status === 'failed' ? '✗' : '○';\n console.log(` ${icon} ${test.file} (${test.status})`);\n if (test.error) {\n console.log(` Error: ${test.error}`);\n }\n }\n\n if (result.cleanupResult) {\n console.log(`\\nCleanup: ${result.cleanupResult.deleted.length} resources deleted`);\n if (result.cleanupResult.failed.length > 0) {\n console.log(` Failed to delete: ${result.cleanupResult.failed.join(', ')}`);\n }\n }\n\n process.exit(result.status === 'passed' ? 0 : 1);\n};\n\nconst runPipelineCommand = async (file: string, options: RunOptions): Promise<void> => {\n const pipelinePath = path.resolve(file);\n\n if (!(await fileExists(pipelinePath))) {\n logError(`Pipeline file not found: ${file}`);\n process.exit(1);\n }\n\n // Load .env from the project directory\n await loadProjectEnv(pipelinePath);\n\n console.log(`Running pipeline: ${file}`);\n\n // Validate environment variables before proceeding\n const { parse } = await import('yaml');\n const pipelineContent = await fs.readFile(pipelinePath, 'utf8');\n const parsedPipeline = parse(pipelineContent);\n\n const hasConfigFile = await fileExists(CONFIG_FILENAME);\n let parsedConfig: unknown = undefined;\n if (hasConfigFile) {\n const configContent = await fs.readFile(CONFIG_FILENAME, 'utf8');\n parsedConfig = parse(configContent);\n }\n\n // Collect missing env vars from both config and pipeline\n const configMissing = parsedConfig ? collectMissingEnvVars(parsedConfig) : [];\n const pipelineMissing = collectMissingEnvVars(parsedPipeline);\n const allMissing = [...new Set([...configMissing, ...pipelineMissing])];\n\n if (allMissing.length > 0) {\n const projectRoot = await findProjectRoot(pipelinePath);\n const canContinue = await validateEnvVars(allMissing, projectRoot || process.cwd());\n if (!canContinue) {\n process.exit(1);\n }\n }\n\n // Now load and validate with schemas\n const pipeline = await loadPipelineDefinition(pipelinePath);\n\n // Load config to get AI settings (for interactive mode)\n const _config = hasConfigFile ? await loadIntellitesterConfig(CONFIG_FILENAME) : undefined;\n\n const result = await runPipeline(pipeline, pipelinePath, {\n headed: options.visible,\n browser: options.browser,\n interactive: options.interactive,\n debug: options.debug,\n });\n\n // Print results\n console.log(`\\nPipeline: ${pipeline.name}`);\n console.log(`Session ID: ${result.sessionId}`);\n console.log(`Status: ${result.status}\\n`);\n\n for (const workflow of result.workflows) {\n const icon = workflow.status === 'passed' ? '✓' : workflow.status === 'failed' ? '✗' : '○';\n console.log(` ${icon} ${workflow.file} (${workflow.status})`);\n if (workflow.error) {\n console.log(` Error: ${workflow.error}`);\n }\n }\n\n if (result.cleanupResult) {\n console.log(`\\nCleanup: ${result.cleanupResult.deleted.length} resources deleted`);\n if (result.cleanupResult.failed.length > 0) {\n console.log(` Failed to delete: ${result.cleanupResult.failed.join(', ')}`);\n }\n }\n\n process.exit(result.status === 'passed' ? 0 : 1);\n};\n\nconst main = async (): Promise<void> => {\n const program = new Command();\n\n program\n .name('intellitester')\n .description('AI-powered cross-platform test automation')\n .version('1.0.0');\n\n program\n .command('init')\n .description('Initialize IntelliTester in current directory')\n .action(async () => {\n try {\n await initCommand();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logError(message);\n process.exitCode = 1;\n }\n });\n\n program\n .command('validate')\n .description('Validate test YAML files')\n .argument('[file]', 'Test file or directory to validate', 'tests')\n .action(async (file: string) => {\n try {\n await validateCommand(file);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logError(message);\n process.exitCode = 1;\n }\n });\n\n program\n .command('run')\n .description('Run test file(s), workflow, or auto-discover tests in tests/ directory')\n .argument('[file]', 'Test file, workflow, or pipeline to run (auto-discovers if omitted)')\n .option('--visible', 'Run browser in visible mode (not headless)')\n .option('--browser <name>', 'Browser to use (chrome, safari, firefox)', 'chrome')\n .option('--preview', 'Build project and run against preview server')\n .option('--no-server', 'Skip auto-starting web server')\n .option('-i, --interactive', 'Interactive mode - AI suggests fixes on failure')\n .option('--debug', 'Debug mode - verbose logging')\n .action(async (file: string | undefined, options: {\n visible?: boolean;\n browser?: string;\n preview?: boolean;\n server?: boolean;\n interactive?: boolean;\n debug?: boolean;\n }) => {\n let previewCleanup: (() => void) | null = null;\n\n try {\n // Resolve browser alias\n const browser = resolveBrowserName(options.browser || 'chrome');\n\n // Handle preview mode\n if (options.preview) {\n const hasConfigFile = await fileExists(CONFIG_FILENAME);\n const config = hasConfigFile ? await loadIntellitesterConfig(CONFIG_FILENAME) : undefined;\n const { cleanup } = await buildAndPreview(config, process.cwd());\n previewCleanup = cleanup;\n }\n\n const runOpts: RunOptions = {\n visible: options.visible,\n browser,\n interactive: options.interactive,\n debug: options.debug,\n };\n\n // If no file specified, auto-discover tests\n if (!file) {\n const discovered = await discoverTestFiles('tests');\n const total = discovered.pipelines.length + discovered.workflows.length + discovered.tests.length;\n\n if (total === 0) {\n logError('No test files found in tests/ directory. Create .pipeline.yaml, .workflow.yaml, or .test.yaml files.');\n process.exit(1);\n }\n\n console.log(`Discovered ${total} test file(s):`);\n if (discovered.pipelines.length > 0) {\n console.log(` Pipelines: ${discovered.pipelines.length}`);\n }\n if (discovered.workflows.length > 0) {\n console.log(` Workflows: ${discovered.workflows.length}`);\n }\n if (discovered.tests.length > 0) {\n console.log(` Tests: ${discovered.tests.length}`);\n }\n console.log('');\n\n let failed = false;\n\n // Run pipelines first (they orchestrate workflows)\n for (const pipeline of discovered.pipelines) {\n try {\n await runPipelineCommand(pipeline, runOpts);\n } catch (error) {\n console.error(`\\n❌ Pipeline failed: ${path.basename(pipeline)}`);\n console.error(` ${error instanceof Error ? error.message : String(error)}\\n`);\n failed = true;\n }\n }\n\n // Run standalone workflows (not part of pipelines)\n for (const workflow of discovered.workflows) {\n try {\n await runWorkflowCommand(workflow, runOpts);\n } catch (error) {\n console.error(`\\n❌ Workflow failed: ${path.basename(workflow)}`);\n console.error(` ${error instanceof Error ? error.message : String(error)}\\n`);\n failed = true;\n }\n }\n\n // Run individual tests\n for (const test of discovered.tests) {\n try {\n await runTestCommand(test, {\n headed: options.visible,\n browser,\n noServer: !options.server,\n interactive: options.interactive,\n debug: options.debug,\n });\n } catch (error) {\n console.error(`\\n❌ Test failed: ${path.basename(test)}`);\n console.error(` ${error instanceof Error ? error.message : String(error)}\\n`);\n failed = true;\n }\n }\n\n if (failed) {\n process.exitCode = 1;\n }\n return;\n }\n\n // Check if it's a pipeline file FIRST\n if (isPipelineFile(file)) {\n await runPipelineCommand(file, runOpts);\n return;\n }\n\n // Check if it's a workflow file\n if (isWorkflowFile(file)) {\n await runWorkflowCommand(file, runOpts);\n return;\n }\n\n // Content-based detection as fallback\n const fileContent = await fs.readFile(path.resolve(file), 'utf8');\n if (isPipelineContent(fileContent)) {\n console.log(`Note: Detected as pipeline by content structure`);\n await runPipelineCommand(file, runOpts);\n return;\n }\n if (isWorkflowContent(fileContent)) {\n console.log(`Note: Detected as workflow by content structure`);\n await runWorkflowCommand(file, runOpts);\n return;\n }\n\n // Otherwise, run as a single test\n await runTestCommand(file, {\n headed: options.visible,\n browser,\n noServer: !options.server,\n interactive: options.interactive,\n debug: options.debug,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logError(message);\n // Cleanup preview server if running\n if (previewCleanup) {\n previewCleanup();\n }\n process.exit(1);\n } finally {\n // Cleanup preview server if running (for normal exit)\n if (previewCleanup) {\n previewCleanup();\n }\n }\n });\n\n program\n .command('generate')\n .description('Generate test from natural language')\n .argument('<description>', 'Natural language description of the test')\n .option('--output <file>', 'Output file path')\n .option('--platform <platform>', 'Target platform', 'web')\n .option('--baseUrl <url>', 'Base URL for the app')\n .option('--pagesDir <dir>', 'Pages directory for source scanning')\n .option('--componentsDir <dir>', 'Components directory for source scanning')\n .option('--no-source', 'Disable source scanning')\n .action(async (description: string, options: {\n output?: string;\n platform?: 'web' | 'android' | 'ios';\n baseUrl?: string;\n pagesDir?: string;\n componentsDir?: string;\n source?: boolean;\n }) => {\n try {\n await generateCommand(description, {\n output: options.output,\n platform: options.platform,\n baseUrl: options.baseUrl,\n pagesDir: options.pagesDir,\n componentsDir: options.componentsDir,\n noSource: !options.source,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logError(message);\n process.exitCode = 1;\n }\n });\n\n program\n .command('cleanup:list')\n .description('List pending failed cleanup operations from previous test runs')\n .action(async () => {\n try {\n const failedCleanups = await loadFailedCleanups(process.cwd());\n if (failedCleanups.length === 0) {\n console.log('No failed cleanups found.');\n return;\n }\n\n console.log(`\\nFound ${failedCleanups.length} failed cleanup(s):\\n`);\n\n for (const failed of failedCleanups) {\n console.log(`Session: ${failed.sessionId}`);\n console.log(` Timestamp: ${failed.timestamp}`);\n console.log(` Provider: ${failed.providerConfig.provider}`);\n console.log(` Resources: ${failed.resources.length}`);\n for (const resource of failed.resources) {\n console.log(` - ${resource.type}:${resource.id}`);\n }\n console.log(` Errors: ${failed.errors.length}`);\n for (const error of failed.errors.slice(0, 3)) {\n console.log(` - ${error}`);\n }\n if (failed.errors.length > 3) {\n console.log(` ... and ${failed.errors.length - 3} more`);\n }\n console.log('');\n }\n\n console.log(`Use 'intellitester cleanup:retry' to retry these cleanups.\\n`);\n } catch (error) {\n logError(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n program\n .command('cleanup:retry')\n .description('Retry failed cleanup operations from previous test runs')\n .action(async () => {\n try {\n // Load config to get provider credentials\n const hasConfigFile = await fileExists(CONFIG_FILENAME);\n if (!hasConfigFile) {\n throw new Error(`No ${CONFIG_FILENAME} found. Cannot retry cleanup without provider configuration.`);\n }\n\n const config = await loadIntellitesterConfig(CONFIG_FILENAME);\n\n // Load failed cleanups\n const failedCleanups = await loadFailedCleanups(process.cwd());\n if (failedCleanups.length === 0) {\n console.log('No failed cleanups to retry.');\n return;\n }\n\n console.log(`Found ${failedCleanups.length} failed cleanup(s) to retry.`);\n\n for (const failed of failedCleanups) {\n console.log(`\\nRetrying cleanup for session ${failed.sessionId}...`);\n console.log(` Provider: ${failed.providerConfig.provider}`);\n console.log(` Resources: ${failed.resources.length}`);\n\n // Build cleanup config based on the provider type\n const provider = failed.providerConfig.provider;\n const cleanupConfig: CleanupConfig = {\n provider,\n parallel: false,\n retries: 3,\n };\n\n // Add provider-specific config with credentials from current config\n // Use type assertion since config is extensible\n const configAny = config as any;\n\n if (provider === 'appwrite') {\n if (!config.appwrite?.apiKey) {\n console.log(` ✗ Skipping: Appwrite API key not configured in ${CONFIG_FILENAME}`);\n continue;\n }\n cleanupConfig.appwrite = {\n endpoint: failed.providerConfig.endpoint as string,\n projectId: failed.providerConfig.projectId as string,\n apiKey: config.appwrite.apiKey,\n };\n } else if (provider === 'postgres') {\n const pgConfig = configAny.postgres;\n if (!pgConfig?.connectionString && !pgConfig?.password) {\n console.log(` ✗ Skipping: Postgres credentials not configured in ${CONFIG_FILENAME}`);\n continue;\n }\n // Rebuild connection string with password from config\n if (pgConfig.connectionString) {\n cleanupConfig.postgres = {\n connectionString: pgConfig.connectionString,\n };\n } else {\n const host = failed.providerConfig.host as string;\n const port = failed.providerConfig.port as number;\n const database = failed.providerConfig.database as string;\n const user = failed.providerConfig.user as string;\n const password = pgConfig.password;\n cleanupConfig.postgres = {\n connectionString: `postgresql://${user}:${password}@${host}:${port}/${database}`,\n };\n }\n } else if (provider === 'mysql') {\n const mysqlConfig = configAny.mysql;\n if (!mysqlConfig?.password) {\n console.log(` ✗ Skipping: MySQL password not configured in ${CONFIG_FILENAME}`);\n continue;\n }\n cleanupConfig.mysql = {\n host: failed.providerConfig.host as string,\n port: failed.providerConfig.port as number,\n user: failed.providerConfig.user as string,\n password: mysqlConfig.password,\n database: failed.providerConfig.database as string,\n };\n } else if (provider === 'sqlite') {\n const sqliteConfig = configAny.sqlite;\n if (!sqliteConfig?.database && !failed.providerConfig.database) {\n console.log(` ✗ Skipping: SQLite database path not configured`);\n continue;\n }\n cleanupConfig.sqlite = {\n database: (failed.providerConfig.database as string) || sqliteConfig?.database,\n };\n } else {\n console.log(` ✗ Skipping: Unknown provider \"${provider}\"`);\n continue;\n }\n\n try {\n // Load cleanup handlers for this provider\n const { handlers, typeMappings } = await loadCleanupHandlers(\n cleanupConfig,\n process.cwd()\n );\n\n // Execute cleanup\n const result = await executeCleanup(\n failed.resources,\n handlers,\n typeMappings,\n {\n parallel: false,\n retries: 3,\n cwd: process.cwd(),\n // Don't save failed cleanups again during retry\n }\n );\n\n if (result.success) {\n console.log(` ✓ Successfully cleaned up ${result.deleted.length} resources`);\n await removeFailedCleanup(failed.sessionId, process.cwd());\n } else {\n console.log(` ⚠ Partial cleanup: ${result.deleted.length} deleted, ${result.failed.length} failed`);\n for (const failedResource of result.failed) {\n console.log(` ✗ ${failedResource}`);\n }\n }\n } catch (error) {\n console.log(` ✗ Error during cleanup: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n // Summary\n const remaining = await loadFailedCleanups(process.cwd());\n if (remaining.length === 0) {\n console.log('\\n✓ All failed cleanups have been resolved.');\n } else {\n console.log(`\\n⚠ ${remaining.length} failed cleanup(s) still remaining.`);\n console.log(` Use 'intellitester cleanup:list' to see details.`);\n }\n } catch (error) {\n logError(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n await program.parseAsync(process.argv);\n};\n\nmain();\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/executors/web/pipelineExecutor.ts","../../src/generator/elementExtractor.ts","../../src/generator/sourceScanner.ts","../../src/generator/prompts.ts","../../src/generator/testGenerator.ts","../../src/cli/envHelper.ts","../../src/cli/index.ts"],"names":["firefox","webkit","chromium","path","crypto","startTrackingServer","startWebServer","killServer","createTestContext","setupAppwriteTracking","loadWorkflowDefinition","interpolateVariables","runWorkflowWithContext","loadCleanupHandlers","executeCleanup","path2","basename","fs","glob","createAIProvider","yaml","parse","TestDefinitionSchema","prompts","dotenv","resolve","spawn","process","loadTestDefinition","collectMissingEnvVars","loadIntellitesterConfig","runWebTest","runWorkflow","loadPipelineDefinition","Command","isPipelineFile","isWorkflowFile","isPipelineContent","isWorkflowContent","loadFailedCleanups","removeFailedCleanup"],"mappings":"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","file":"index.cjs","sourcesContent":["import crypto from 'node:crypto';\nimport path from 'node:path';\nimport type { ChildProcess } from 'node:child_process';\n\nimport {\n chromium,\n firefox,\n webkit,\n type BrowserType,\n type Page,\n} from 'playwright';\n\nimport type {\n PipelineDefinition,\n PipelineResult,\n PipelineWorkflowResult,\n WorkflowReference,\n} from '../../core/types';\nimport { interpolateVariables } from '../../core/interpolation';\nimport { loadWorkflowDefinition } from '../../core/loader';\nimport {\n runWorkflowWithContext,\n setupAppwriteTracking,\n type ExecutionContext,\n type WorkflowOptions,\n} from './workflowExecutor';\nimport { createTestContext } from '../../integrations/appwrite';\nimport { startTrackingServer, type TrackingServer } from '../../tracking';\nimport { startWebServer, killServer, type BrowserName } from './playwrightExecutor';\nimport { loadCleanupHandlers, executeCleanup } from '../../core/cleanup/index.js';\nimport type { CleanupConfig } from '../../core/cleanup/types.js';\n\nexport interface PipelineOptions {\n headed?: boolean;\n browser?: BrowserName;\n interactive?: boolean;\n debug?: boolean;\n}\n\nconst getBrowser = (browser: BrowserName): BrowserType => {\n switch (browser) {\n case 'firefox':\n return firefox;\n case 'webkit':\n return webkit;\n default:\n return chromium;\n }\n};\n\n/**\n * Build execution order using topological sort (Kahn's algorithm).\n * Returns workflows in order respecting depends_on.\n * Throws if circular dependency detected.\n */\nfunction buildExecutionOrder(workflows: WorkflowReference[]): WorkflowReference[] {\n // Build a map of id -> workflow for quick lookup\n const workflowMap = new Map<string, WorkflowReference>();\n const workflowIds: string[] = [];\n\n for (let i = 0; i < workflows.length; i++) {\n const workflow = workflows[i];\n // Use explicit id or generate one based on index\n const id = workflow.id ?? `workflow_${i}`;\n workflowIds.push(id);\n workflowMap.set(id, { ...workflow, id });\n }\n\n // Build adjacency list and in-degree count\n const adjacencyList = new Map<string, string[]>();\n const inDegree = new Map<string, number>();\n\n // Initialize\n for (const id of workflowIds) {\n adjacencyList.set(id, []);\n inDegree.set(id, 0);\n }\n\n // Build edges from depends_on\n for (const id of workflowIds) {\n const workflow = workflowMap.get(id)!;\n const deps = workflow.depends_on ?? [];\n\n for (const depId of deps) {\n if (!workflowMap.has(depId)) {\n throw new Error(\n `Workflow \"${id}\" depends on \"${depId}\" which does not exist in the pipeline`\n );\n }\n // depId -> id (depId must come before id)\n adjacencyList.get(depId)!.push(id);\n inDegree.set(id, (inDegree.get(id) ?? 0) + 1);\n }\n }\n\n // Kahn's algorithm: start with nodes that have no dependencies\n const queue: string[] = [];\n for (const id of workflowIds) {\n if (inDegree.get(id) === 0) {\n queue.push(id);\n }\n }\n\n const sorted: WorkflowReference[] = [];\n\n while (queue.length > 0) {\n const currentId = queue.shift()!;\n sorted.push(workflowMap.get(currentId)!);\n\n // Reduce in-degree of dependents\n for (const dependentId of adjacencyList.get(currentId) ?? []) {\n const newInDegree = (inDegree.get(dependentId) ?? 1) - 1;\n inDegree.set(dependentId, newInDegree);\n\n if (newInDegree === 0) {\n queue.push(dependentId);\n }\n }\n }\n\n // Detect cycle: if not all nodes processed, there's a cycle\n if (sorted.length !== workflowIds.length) {\n const remaining = workflowIds.filter((id) => !sorted.some((w) => w.id === id));\n throw new Error(\n `Circular dependency detected in pipeline. Workflows involved: ${remaining.join(', ')}`\n );\n }\n\n return sorted;\n}\n\n/**\n * Infer cleanup configuration from pipeline config.\n */\nfunction inferCleanupConfig(\n config: PipelineDefinition['config']\n): CleanupConfig | undefined {\n if (!config) return undefined;\n\n // Check for new cleanup config first\n if (config.cleanup) {\n return config.cleanup as CleanupConfig;\n }\n\n // Backwards compatibility: convert old appwrite config\n if (config.appwrite?.cleanup) {\n return {\n provider: 'appwrite',\n appwrite: {\n endpoint: config.appwrite.endpoint,\n projectId: config.appwrite.projectId,\n apiKey: config.appwrite.apiKey,\n cleanupOnFailure: config.appwrite.cleanupOnFailure,\n },\n };\n }\n\n return undefined;\n}\n\n/**\n * Execute a pipeline: multiple workflows in sequence with shared browser and deferred cleanup.\n *\n * @param pipeline - The pipeline definition to execute\n * @param pipelinePath - Path to the pipeline YAML file (used for resolving relative workflow paths)\n * @param options - Pipeline execution options\n * @returns PipelineResult with workflow results and cleanup data\n */\nexport async function runPipeline(\n pipeline: PipelineDefinition,\n pipelinePath: string,\n options: PipelineOptions = {}\n): Promise<PipelineResult> {\n const pipelineDir = path.dirname(pipelinePath);\n const sessionId = crypto.randomUUID();\n const testStartTime = new Date().toISOString();\n\n console.log(`\\n${'='.repeat(60)}`);\n console.log(`Pipeline: ${pipeline.name}`);\n console.log(`Session ID: ${sessionId}`);\n console.log(`${'='.repeat(60)}\\n`);\n\n // 1. Build execution order (topological sort)\n let executionOrder: WorkflowReference[];\n try {\n executionOrder = buildExecutionOrder(pipeline.workflows);\n console.log(\n `Execution order: ${executionOrder.map((w) => w.id ?? w.file).join(' -> ')}\\n`\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Failed to build execution order: ${message}`);\n return {\n status: 'failed',\n workflows: [],\n sessionId,\n };\n }\n\n // 2. Start tracking server\n let trackingServer: TrackingServer | null = null;\n try {\n trackingServer = await startTrackingServer({ port: 0 });\n console.log(`Tracking server started on port ${trackingServer.port}`);\n } catch (error) {\n console.warn('Failed to start tracking server:', error);\n }\n\n // 3. Set environment variables for the app under test\n if (trackingServer) {\n process.env.INTELLITESTER_SESSION_ID = sessionId;\n process.env.INTELLITESTER_TRACK_URL = `http://localhost:${trackingServer.port}`;\n }\n\n // 4. Start web server if configured\n let serverProcess: ChildProcess | null = null;\n if (pipeline.config?.webServer) {\n try {\n serverProcess = await startWebServer({\n ...pipeline.config.webServer,\n cwd: pipelineDir,\n });\n } catch (error) {\n console.error('Failed to start web server:', error);\n if (trackingServer) await trackingServer.stop();\n throw error;\n }\n }\n\n // 5. Handle cleanup on Ctrl+C\n const signalCleanup = async () => {\n console.log('\\n\\nInterrupted - cleaning up...');\n killServer(serverProcess);\n if (trackingServer) await trackingServer.stop();\n process.exit(1);\n };\n process.on('SIGINT', signalCleanup);\n process.on('SIGTERM', signalCleanup);\n\n // 6. Launch browser ONCE for entire pipeline\n const browserName = options.browser ?? pipeline.config?.web?.browser ?? 'chromium';\n const headless = options.headed === true ? false : (pipeline.config?.web?.headless ?? true);\n const browser = await getBrowser(browserName).launch({ headless });\n const browserContext = await browser.newContext();\n const page = await browserContext.newPage();\n page.setDefaultTimeout(30000);\n\n // 7. Create shared ExecutionContext for ALL workflows\n const executionContext: ExecutionContext = {\n variables: new Map<string, string>(),\n lastEmail: null,\n emailClient: null,\n appwriteContext: createTestContext(),\n appwriteConfig: pipeline.config?.appwrite\n ? {\n endpoint: pipeline.config.appwrite.endpoint,\n projectId: pipeline.config.appwrite.projectId,\n apiKey: pipeline.config.appwrite.apiKey,\n }\n : undefined,\n };\n\n // 8. Setup Appwrite tracking ONCE at the start if any workflow may need it\n if (pipeline.config?.appwrite) {\n setupAppwriteTracking(page, executionContext);\n }\n\n // Track workflow execution status\n const completedIds = new Set<string>();\n const failedIds = new Set<string>();\n const skippedIds = new Set<string>();\n const workflowResults: PipelineWorkflowResult[] = [];\n let pipelineFailed = false;\n let shouldStopPipeline = false;\n\n try {\n // 9. Execute workflows in order\n for (const workflowRef of executionOrder) {\n const workflowId = workflowRef.id ?? workflowRef.file;\n\n if (shouldStopPipeline) {\n // Mark remaining workflows as skipped\n workflowResults.push({\n id: workflowRef.id,\n file: workflowRef.file,\n status: 'skipped',\n error: 'Pipeline stopped due to previous failure',\n });\n skippedIds.add(workflowId);\n continue;\n }\n\n // Check if dependencies passed\n const deps = workflowRef.depends_on ?? [];\n const depsFailed = deps.some((id) => failedIds.has(id) || skippedIds.has(id));\n const depsNotMet = deps.some(\n (id) => !completedIds.has(id) && !failedIds.has(id) && !skippedIds.has(id)\n );\n\n if (depsFailed || depsNotMet) {\n const onFailure = workflowRef.on_failure ?? pipeline.on_failure;\n\n if (onFailure === 'skip') {\n console.log(`\\nSkipping workflow \"${workflowId}\" - dependencies not met`);\n workflowResults.push({\n id: workflowRef.id,\n file: workflowRef.file,\n status: 'skipped',\n error: `Dependencies not met: ${deps.filter((d) => failedIds.has(d) || skippedIds.has(d)).join(', ')}`,\n });\n skippedIds.add(workflowId);\n continue;\n } else if (onFailure === 'fail') {\n console.log(\n `\\nPipeline stopped - workflow \"${workflowId}\" dependencies failed`\n );\n workflowResults.push({\n id: workflowRef.id,\n file: workflowRef.file,\n status: 'failed',\n error: `Dependencies failed: ${deps.filter((d) => failedIds.has(d) || skippedIds.has(d)).join(', ')}`,\n });\n failedIds.add(workflowId);\n pipelineFailed = true;\n shouldStopPipeline = true;\n continue;\n }\n // 'ignore' falls through to run anyway\n console.log(\n `\\nRunning workflow \"${workflowId}\" despite dependency failure (on_failure: ignore)`\n );\n }\n\n // Load and execute workflow\n const workflowFilePath = path.resolve(pipelineDir, workflowRef.file);\n console.log(`\\n${'='.repeat(40)}`);\n console.log(`Workflow: ${workflowId}`);\n console.log(`File: ${workflowRef.file}`);\n console.log(`${'='.repeat(40)}`);\n\n try {\n const workflowDefinition = await loadWorkflowDefinition(workflowFilePath);\n\n // Apply workflow-level variables from pipeline\n if (workflowRef.variables) {\n for (const [key, value] of Object.entries(workflowRef.variables)) {\n // Use centralized interpolation for all built-in variables\n const interpolated = interpolateVariables(value, executionContext.variables);\n executionContext.variables.set(key, interpolated);\n }\n }\n\n // Execute workflow with shared context\n const workflowOptions: WorkflowOptions & {\n page: Page;\n executionContext: ExecutionContext;\n skipCleanup: boolean;\n sessionId: string;\n testStartTime: string;\n } = {\n ...options,\n page,\n executionContext,\n skipCleanup: true, // Defer cleanup to pipeline end\n sessionId,\n testStartTime,\n };\n\n const result = await runWorkflowWithContext(\n workflowDefinition,\n workflowFilePath,\n workflowOptions\n );\n\n if (result.status === 'passed') {\n completedIds.add(workflowId);\n workflowResults.push({\n id: workflowRef.id,\n file: workflowRef.file,\n status: 'passed',\n workflowResult: result,\n });\n } else {\n failedIds.add(workflowId);\n pipelineFailed = true;\n workflowResults.push({\n id: workflowRef.id,\n file: workflowRef.file,\n status: 'failed',\n workflowResult: result,\n error: result.tests.find((t) => t.status === 'failed')?.error,\n });\n\n // Check if we should stop the pipeline\n const onFailure = workflowRef.on_failure ?? pipeline.on_failure;\n if (onFailure === 'fail') {\n console.log(`\\nPipeline stopped due to workflow \"${workflowId}\" failure`);\n shouldStopPipeline = true;\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Failed to load/run workflow \"${workflowId}\": ${message}`);\n\n failedIds.add(workflowId);\n pipelineFailed = true;\n workflowResults.push({\n id: workflowRef.id,\n file: workflowRef.file,\n status: 'failed',\n error: message,\n });\n\n const onFailure = workflowRef.on_failure ?? pipeline.on_failure;\n if (onFailure === 'fail') {\n console.log(`\\nPipeline stopped due to workflow \"${workflowId}\" failure`);\n shouldStopPipeline = true;\n }\n }\n }\n\n // 10. Collect server-tracked resources\n if (trackingServer) {\n const serverResources = trackingServer.getResources(sessionId);\n if (serverResources.length > 0) {\n console.log(`\\nCollected ${serverResources.length} server-tracked resources`);\n // Cast to Appwrite-specific format - tracking server returns generic resources\n executionContext.appwriteContext.resources.push(...(serverResources as any));\n }\n }\n\n // 11. Run cleanup at end (respecting cleanup_on_failure)\n let cleanupResult: { success: boolean; deleted: string[]; failed: string[] } | undefined;\n const cleanupConfig = inferCleanupConfig(pipeline.config);\n\n if (cleanupConfig) {\n const shouldCleanup = pipelineFailed ? pipeline.cleanup_on_failure : true;\n\n if (shouldCleanup) {\n try {\n console.log('\\n---');\n console.log('[Cleanup] Starting pipeline cleanup...');\n\n const { handlers, typeMappings, provider } = await loadCleanupHandlers(\n cleanupConfig,\n process.cwd()\n );\n\n // Convert tracked resources to generic format\n const genericResources = executionContext.appwriteContext.resources.map(\n (r) => ({ ...r })\n );\n\n // Build provider config\n const providerConfig: { provider: string; [key: string]: unknown } = {\n provider: cleanupConfig.provider || 'appwrite',\n };\n\n if (cleanupConfig.provider === 'appwrite' && cleanupConfig.appwrite) {\n const appwriteCleanupConfig = cleanupConfig.appwrite as any;\n providerConfig.endpoint = appwriteCleanupConfig.endpoint;\n providerConfig.projectId = appwriteCleanupConfig.projectId;\n }\n\n cleanupResult = await executeCleanup(\n genericResources,\n handlers,\n typeMappings,\n {\n parallel: cleanupConfig.parallel ?? false,\n retries: cleanupConfig.retries ?? 3,\n sessionId,\n testStartTime,\n userId: executionContext.appwriteContext.userId,\n providerConfig,\n cwd: process.cwd(),\n config: cleanupConfig,\n provider,\n }\n );\n\n if (cleanupResult.success) {\n console.log(\n `[Cleanup] Cleanup complete: ${cleanupResult.deleted.length} resources deleted`\n );\n } else {\n console.log(\n `[Cleanup] Cleanup partial: ${cleanupResult.deleted.length} deleted, ${cleanupResult.failed.length} failed`\n );\n for (const failed of cleanupResult.failed) {\n console.log(` - ${failed}`);\n }\n }\n } catch (error) {\n console.error('[Cleanup] Cleanup failed:', error);\n }\n } else {\n console.log('\\nSkipping cleanup (cleanup_on_failure is false)');\n }\n }\n\n // 12. Calculate final status\n const passedCount = workflowResults.filter((w) => w.status === 'passed').length;\n const failedCount = workflowResults.filter((w) => w.status === 'failed').length;\n const skippedCount = workflowResults.filter((w) => w.status === 'skipped').length;\n\n console.log(`\\n${'='.repeat(60)}`);\n console.log(`Pipeline: ${pipelineFailed ? 'FAILED' : 'PASSED'}`);\n console.log(\n `Workflows: ${passedCount} passed, ${failedCount} failed, ${skippedCount} skipped`\n );\n console.log(`${'='.repeat(60)}\\n`);\n\n return {\n status: pipelineFailed ? 'failed' : 'passed',\n workflows: workflowResults,\n sessionId,\n cleanupResult,\n };\n } finally {\n // Remove signal handlers\n process.off('SIGINT', signalCleanup);\n process.off('SIGTERM', signalCleanup);\n\n // Close browser\n await browserContext.close();\n await browser.close();\n\n // Stop servers\n killServer(serverProcess);\n if (trackingServer) {\n await trackingServer.stop();\n }\n\n // Clean up env vars\n delete process.env.INTELLITESTER_SESSION_ID;\n delete process.env.INTELLITESTER_TRACK_URL;\n }\n}\n","/**\n * Element extractor for parsing interactive elements from component templates\n */\n\nexport interface ElementInfo {\n /** HTML tag name (button, input, a, etc.) */\n tag: string;\n /** data-testid attribute */\n testId?: string;\n /** Inner text or label */\n text?: string;\n /** ARIA role */\n role?: string;\n /** Accessible name (aria-label) */\n name?: string;\n /** Input type */\n type?: string;\n /** Placeholder text */\n placeholder?: string;\n /** Which page/route this element is on */\n route?: string;\n /** Human-readable description */\n description?: string;\n /** Source file path */\n file: string;\n}\n\n/**\n * Interactive HTML elements we're interested in extracting\n */\nconst INTERACTIVE_TAGS = [\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'a',\n 'form',\n 'label',\n 'option',\n] as const;\n\n/**\n * Extract template content based on file type\n */\nfunction extractTemplateContent(content: string, filePath: string): string {\n const ext = filePath.split('.').pop()?.toLowerCase();\n\n switch (ext) {\n case 'vue': {\n // Extract from <template> section\n const templateMatch = content.match(/<template[^>]*>([\\s\\S]*?)<\\/template>/);\n return templateMatch ? templateMatch[1] : '';\n }\n\n case 'astro': {\n // Astro files: content after frontmatter (---)\n const frontmatterEnd = content.lastIndexOf('---');\n if (frontmatterEnd > 0) {\n return content.substring(frontmatterEnd + 3);\n }\n return content;\n }\n\n case 'tsx':\n case 'jsx': {\n // Extract JSX from return statements\n const jsxPatterns = [\n // return ( ... )\n /return\\s*\\(([\\s\\S]*?)\\);/g,\n // return <...>\n /return\\s+(<[\\s\\S]*?>[\\s\\S]*?<\\/[\\w.]+>)/g,\n // return <... />\n /return\\s+(<[^>]+\\/\\s*>)/g,\n ];\n\n const jsxParts: string[] = [];\n for (const pattern of jsxPatterns) {\n const matches = content.matchAll(pattern);\n for (const match of matches) {\n jsxParts.push(match[1]);\n }\n }\n\n return jsxParts.join('\\n');\n }\n\n case 'svelte': {\n // Svelte: HTML-like template (whole file minus script/style)\n let template = content;\n\n // Remove <script> blocks\n template = template.replace(/<script[^>]*>[\\s\\S]*?<\\/script>/g, '');\n\n // Remove <style> blocks\n template = template.replace(/<style[^>]*>[\\s\\S]*?<\\/style>/g, '');\n\n return template;\n }\n\n default:\n return content;\n }\n}\n\n/**\n * Extract attribute value from an element string\n */\nfunction extractAttribute(element: string, attrName: string): string | undefined {\n // Handle both quoted and unquoted attributes\n const patterns = [\n new RegExp(`${attrName}\\\\s*=\\\\s*\"([^\"]*)\"`, 'i'),\n new RegExp(`${attrName}\\\\s*=\\\\s*'([^']*)'`, 'i'),\n new RegExp(`${attrName}\\\\s*=\\\\s*\\{([^}]*)\\}`, 'i'), // JSX expressions\n ];\n\n for (const pattern of patterns) {\n const match = element.match(pattern);\n if (match && match[1]) {\n // Clean up JSX expressions\n let value = match[1].trim();\n\n // Remove common JSX wrapper patterns like `\"string\"` or 't(\"key\")'\n if (value.startsWith('\"') && value.endsWith('\"')) {\n value = value.slice(1, -1);\n } else if (value.startsWith(\"'\") && value.endsWith(\"'\")) {\n value = value.slice(1, -1);\n }\n\n return value;\n }\n }\n\n return undefined;\n}\n\n/**\n * Extract text content from an element\n */\nfunction extractTextContent(element: string, tag: string): string | undefined {\n // Match opening tag to closing tag\n const regex = new RegExp(`<${tag}[^>]*>([^<]*)<\\/${tag}>`, 'i');\n const match = element.match(regex);\n\n if (match && match[1]) {\n let text = match[1].trim();\n\n // Remove common JSX expressions\n text = text.replace(/\\{[^}]*\\}/g, '').trim();\n\n // Only return if there's actual text content\n if (text.length > 0 && text.length < 100) {\n return text;\n }\n }\n\n return undefined;\n}\n\n/**\n * Generate a human-readable description for an element\n */\nfunction generateDescription(element: Partial<ElementInfo>): string {\n const parts: string[] = [];\n\n // Start with tag\n if (element.tag === 'input' && element.type) {\n parts.push(`${element.type} input`);\n } else if (element.tag === 'a') {\n parts.push('link');\n } else if (element.tag) {\n parts.push(element.tag);\n }\n\n // Add identifying information\n if (element.text) {\n parts.push(`\"${element.text}\"`);\n } else if (element.name) {\n parts.push(`\"${element.name}\"`);\n } else if (element.placeholder) {\n parts.push(`with placeholder \"${element.placeholder}\"`);\n } else if (element.testId) {\n parts.push(`(${element.testId})`);\n }\n\n return parts.join(' ');\n}\n\n/**\n * Parse a single element string and extract its information\n */\nfunction parseElement(\n elementStr: string,\n file: string,\n route?: string,\n): ElementInfo | null {\n // Extract tag name\n const tagMatch = elementStr.match(/<(\\w+)/);\n if (!tagMatch) return null;\n\n const tag = tagMatch[1].toLowerCase();\n\n // Only process interactive elements\n if (!INTERACTIVE_TAGS.includes(tag as any)) {\n return null;\n }\n\n const element: Partial<ElementInfo> = {\n tag,\n file,\n route,\n };\n\n // Extract attributes\n element.testId = extractAttribute(elementStr, 'data-testid');\n element.role = extractAttribute(elementStr, 'role');\n element.name = extractAttribute(elementStr, 'aria-label');\n element.type = extractAttribute(elementStr, 'type');\n element.placeholder = extractAttribute(elementStr, 'placeholder');\n\n // Also check for 'name' attribute if no aria-label\n if (!element.name) {\n element.name = extractAttribute(elementStr, 'name');\n }\n\n // Extract text content for buttons, links, labels\n if (['button', 'a', 'label', 'option'].includes(tag)) {\n element.text = extractTextContent(elementStr, tag);\n }\n\n // Generate description\n element.description = generateDescription(element);\n\n return element as ElementInfo;\n}\n\n/**\n * Extract all interactive elements from component content\n */\nexport function extractElements(\n content: string,\n filePath: string,\n route?: string,\n): ElementInfo[] {\n // Extract template content based on framework\n const template = extractTemplateContent(content, filePath);\n\n if (!template.trim()) {\n return [];\n }\n\n const elements: ElementInfo[] = [];\n\n // Find all element tags\n // This regex matches opening tags with their attributes (including self-closing)\n const elementPattern = /<(\\w+)(?:\\s+[^>]*)?(?:\\/>|>[\\s\\S]*?<\\/\\1>)/g;\n const matches = template.matchAll(elementPattern);\n\n for (const match of matches) {\n const elementStr = match[0];\n const element = parseElement(elementStr, filePath, route);\n\n if (element) {\n elements.push(element);\n }\n }\n\n return elements;\n}\n","/**\n * Source scanner for extracting component information from project source files\n */\n\nimport { glob } from 'glob';\nimport { promises as fs } from 'fs';\nimport * as path from 'path';\nimport { extractElements, type ElementInfo } from './elementExtractor';\n\nexport interface SourceConfig {\n /** Directory containing page/route components */\n pagesDir?: string;\n /** Directory containing reusable components */\n componentsDir?: string;\n /** File extensions to scan */\n extensions?: string[];\n /** Working directory (defaults to process.cwd()) */\n cwd?: string;\n}\n\nexport interface RouteInfo {\n /** Route path (e.g., /signup, /login) */\n path: string;\n /** Source file path */\n file: string;\n /** Component name */\n name: string;\n}\n\nexport interface ComponentInfo {\n /** Component name */\n name: string;\n /** Source file path */\n file: string;\n /** Elements found in the component */\n elements: ElementInfo[];\n}\n\nexport interface SourceScanResult {\n /** Detected routes */\n routes: RouteInfo[];\n /** Scanned components with their elements */\n components: ComponentInfo[];\n /** All elements across all components (flattened) */\n allElements: ElementInfo[];\n}\n\nconst DEFAULT_EXTENSIONS = ['.vue', '.astro', '.tsx', '.jsx', '.svelte'];\n\n/**\n * Converts a file path to a route path using file-based routing conventions\n */\nfunction fileToRoute(filePath: string, pagesDir: string): string {\n // Get relative path from pages directory\n let route = path.relative(pagesDir, filePath);\n\n // Remove extension\n route = route.replace(/\\.(vue|astro|tsx|jsx|svelte)$/, '');\n\n // Handle index files\n route = route.replace(/\\/index$/, '');\n route = route.replace(/^index$/, '');\n\n // Handle dynamic routes: [param] -> :param, [...slug] -> *\n route = route.replace(/\\[\\.\\.\\.(\\w+)\\]/g, '*');\n route = route.replace(/\\[(\\w+)\\]/g, ':$1');\n\n // Ensure leading slash\n route = '/' + route;\n\n // Clean up double slashes\n route = route.replace(/\\/+/g, '/');\n\n // Remove trailing slash (except for root)\n if (route.length > 1) {\n route = route.replace(/\\/$/, '');\n }\n\n return route;\n}\n\n/**\n * Extracts component name from file path\n */\nfunction getComponentName(filePath: string): string {\n const basename = path.basename(filePath);\n return basename.replace(/\\.(vue|astro|tsx|jsx|svelte)$/, '');\n}\n\n/**\n * Scans a directory for component files\n */\nasync function scanDirectory(\n dir: string,\n extensions: string[],\n cwd: string,\n): Promise<string[]> {\n const fullDir = path.resolve(cwd, dir);\n\n try {\n await fs.access(fullDir);\n } catch {\n // Directory doesn't exist\n return [];\n }\n\n const patterns = extensions.map((ext) => `**/*${ext}`);\n const files: string[] = [];\n\n for (const pattern of patterns) {\n const matches = await glob(pattern, {\n cwd: fullDir,\n absolute: true,\n nodir: true,\n });\n files.push(...matches);\n }\n\n return files;\n}\n\n/**\n * Scans project source files to extract routes, components, and elements\n */\nexport async function scanProjectSource(config: SourceConfig): Promise<SourceScanResult> {\n const cwd = config.cwd ?? process.cwd();\n const extensions = config.extensions ?? DEFAULT_EXTENSIONS;\n\n const routes: RouteInfo[] = [];\n const components: ComponentInfo[] = [];\n const allElements: ElementInfo[] = [];\n\n // Scan pages directory for routes\n if (config.pagesDir) {\n const pageFiles = await scanDirectory(config.pagesDir, extensions, cwd);\n const pagesFullDir = path.resolve(cwd, config.pagesDir);\n\n for (const file of pageFiles) {\n const routePath = fileToRoute(file, pagesFullDir);\n const name = getComponentName(file);\n\n routes.push({\n path: routePath,\n file,\n name,\n });\n\n // Extract elements from page component\n const content = await fs.readFile(file, 'utf-8');\n const elements = extractElements(content, file, routePath);\n\n components.push({\n name,\n file,\n elements,\n });\n\n allElements.push(...elements);\n }\n }\n\n // Scan components directory\n if (config.componentsDir) {\n const componentFiles = await scanDirectory(config.componentsDir, extensions, cwd);\n\n for (const file of componentFiles) {\n // Skip if already processed as a page\n if (components.some((c) => c.file === file)) {\n continue;\n }\n\n const name = getComponentName(file);\n const content = await fs.readFile(file, 'utf-8');\n const elements = extractElements(content, file, undefined);\n\n components.push({\n name,\n file,\n elements,\n });\n\n allElements.push(...elements);\n }\n }\n\n // If no specific dirs provided, try common defaults\n if (!config.pagesDir && !config.componentsDir) {\n const commonPageDirs = ['src/pages', 'pages', 'app', 'src/app', 'src/routes'];\n const commonComponentDirs = ['src/components', 'components', 'src/lib', 'lib'];\n\n // Try to find pages\n for (const dir of commonPageDirs) {\n const files = await scanDirectory(dir, extensions, cwd);\n if (files.length > 0) {\n const pagesFullDir = path.resolve(cwd, dir);\n\n for (const file of files) {\n const routePath = fileToRoute(file, pagesFullDir);\n const name = getComponentName(file);\n\n routes.push({\n path: routePath,\n file,\n name,\n });\n\n const content = await fs.readFile(file, 'utf-8');\n const elements = extractElements(content, file, routePath);\n\n components.push({\n name,\n file,\n elements,\n });\n\n allElements.push(...elements);\n }\n break; // Use first matching directory\n }\n }\n\n // Try to find components\n for (const dir of commonComponentDirs) {\n const files = await scanDirectory(dir, extensions, cwd);\n if (files.length > 0) {\n for (const file of files) {\n if (components.some((c) => c.file === file)) {\n continue;\n }\n\n const name = getComponentName(file);\n const content = await fs.readFile(file, 'utf-8');\n const elements = extractElements(content, file, undefined);\n\n components.push({\n name,\n file,\n elements,\n });\n\n allElements.push(...elements);\n }\n break; // Use first matching directory\n }\n }\n }\n\n return {\n routes,\n components,\n allElements,\n };\n}\n\n/**\n * Formats scan results for use in AI prompts\n */\nexport function formatScanResultsForPrompt(result: SourceScanResult): string {\n const lines: string[] = [];\n\n // Routes section\n if (result.routes.length > 0) {\n lines.push('## ROUTES');\n lines.push('');\n for (const route of result.routes) {\n lines.push(`- ${route.path}: ${route.name}`);\n }\n lines.push('');\n }\n\n // Elements by route\n const elementsByRoute = new Map<string, ElementInfo[]>();\n\n for (const element of result.allElements) {\n const route = element.route ?? 'shared';\n if (!elementsByRoute.has(route)) {\n elementsByRoute.set(route, []);\n }\n elementsByRoute.get(route)!.push(element);\n }\n\n lines.push('## ELEMENTS');\n lines.push('');\n\n for (const [route, elements] of elementsByRoute) {\n lines.push(`### ${route === 'shared' ? 'Shared Components' : route}`);\n lines.push('');\n\n for (const el of elements) {\n const locators: string[] = [];\n\n if (el.testId) locators.push(`data-testid=\"${el.testId}\"`);\n if (el.text) locators.push(`text=\"${el.text}\"`);\n if (el.role) locators.push(`role=\"${el.role}\"`);\n if (el.name) locators.push(`name=\"${el.name}\"`);\n if (el.placeholder) locators.push(`placeholder=\"${el.placeholder}\"`);\n if (el.type) locators.push(`type=\"${el.type}\"`);\n\n const locatorStr = locators.length > 0 ? `[${locators.join(', ')}]` : '';\n const description = el.description ? ` - ${el.description}` : '';\n\n lines.push(`- <${el.tag}>${locatorStr}${description}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","/**\n * System prompts and prompt building for test generation\n */\n\nimport { type SourceScanResult, formatScanResultsForPrompt } from './sourceScanner';\n\nexport const SYSTEM_PROMPT = `You are a test automation expert that converts natural language test descriptions into YAML test definitions.\n\n## Schema Structure\n\nA test definition must have:\n- name: A descriptive test name (non-empty string)\n- platform: One of 'web', 'android', or 'ios'\n- config: Optional configuration object\n- steps: Array of actions (minimum 1 action required)\n\n## Available Actions\n\n1. navigate - Navigate to a URL\n { type: 'navigate', value: string }\n\n2. tap - Click or tap an element\n { type: 'tap', target: Locator }\n\n3. input - Type text into an input field\n { type: 'input', target: Locator, value: string }\n\n4. assert - Assert element exists or contains text\n { type: 'assert', target: Locator, value?: string }\n\n5. wait - Wait for an element or timeout\n { type: 'wait', target?: Locator, timeout?: number }\n Note: Requires either target or timeout\n\n6. scroll - Scroll the page or to an element\n { type: 'scroll', target?: Locator, direction?: 'up'|'down', amount?: number }\n\n7. screenshot - Take a screenshot\n { type: 'screenshot', name?: string }\n\n## Locator Structure\n\nA locator must have AT LEAST ONE of these properties:\n- description: Human-readable description for AI healing\n- testId: data-testid attribute value\n- text: Text content to match\n- css: CSS selector\n- xpath: XPath expression\n- role: ARIA role attribute\n- name: Accessible name\n\n## Configuration Options\n\nweb:\n baseUrl: Base URL for the application\n browser: Browser to use (e.g., 'chromium', 'firefox', 'webkit')\n headless: Run browser in headless mode (boolean)\n timeout: Default timeout in milliseconds\n\nandroid:\n appId: Android application package ID\n device: Device name or ID\n\nios:\n bundleId: iOS bundle identifier\n simulator: Simulator name\n\n## Example 1: Login Test\n\n\\`\\`\\`yaml\nname: Login with valid credentials\nplatform: web\nconfig:\n web:\n baseUrl: https://example.com\n headless: true\nsteps:\n - type: navigate\n value: /login\n - type: input\n target:\n testId: email-input\n description: Email input field\n value: test@example.com\n - type: input\n target:\n testId: password-input\n description: Password input field\n value: password123\n - type: tap\n target:\n text: Sign In\n role: button\n description: Sign in button\n - type: assert\n target:\n text: Welcome\n description: Welcome message after login\n\\`\\`\\`\n\n## Example 2: Search Test\n\n\\`\\`\\`yaml\nname: Search for products\nplatform: web\nconfig:\n web:\n baseUrl: https://shop.example.com\nsteps:\n - type: navigate\n value: /\n - type: input\n target:\n css: input[type=\"search\"]\n description: Product search input\n value: laptop\n - type: tap\n target:\n role: button\n name: Search\n description: Search button\n - type: wait\n target:\n css: .search-results\n description: Search results container\n timeout: 5000\n - type: assert\n target:\n text: results found\n description: Results count message\n\\`\\`\\`\n\n## Example 3: Mobile App Test\n\n\\`\\`\\`yaml\nname: Add item to cart\nplatform: android\nconfig:\n android:\n appId: com.example.shop\nsteps:\n - type: tap\n target:\n testId: category-electronics\n description: Electronics category button\n - type: scroll\n direction: down\n amount: 300\n - type: tap\n target:\n text: Laptop Pro\n description: Product card for Laptop Pro\n - type: tap\n target:\n testId: add-to-cart-button\n description: Add to cart button\n - type: assert\n target:\n text: Added to cart\n description: Success message\n - type: screenshot\n name: cart-confirmation\n\\`\\`\\`\n\n## Important Instructions\n\n1. Output ONLY valid YAML - no markdown code blocks, no explanations\n2. Every locator MUST have at least one selector property\n3. Include descriptive locator descriptions for AI healing\n4. Use multiple locator strategies when possible for resilience\n5. For wait actions, provide either a target or timeout (or both)\n6. Use appropriate platform-specific configurations\n7. Ensure all strings are properly quoted if they contain special characters\n8. Action steps must be in logical order\n\nGenerate the test definition now based on the user's description.`;\n\nexport interface PromptContext {\n baseUrl?: string;\n platform?: 'web' | 'android' | 'ios';\n additionalContext?: string;\n}\n\nexport function buildPrompt(naturalLanguage: string, context?: PromptContext): string {\n const parts: string[] = [\n 'Generate a test definition for the following scenario:',\n '',\n naturalLanguage,\n ];\n\n if (context) {\n parts.push('', 'Additional Context:');\n\n if (context.platform) {\n parts.push(`- Platform: ${context.platform}`);\n }\n\n if (context.baseUrl) {\n parts.push(`- Base URL: ${context.baseUrl}`);\n }\n\n if (context.additionalContext) {\n parts.push(`- ${context.additionalContext}`);\n }\n }\n\n parts.push('', 'Output only valid YAML without code block markers.');\n\n return parts.join('\\n');\n}\n\n/**\n * Builds a source-aware system prompt that includes actual routes and elements from the project\n */\nexport function buildSourceAwareSystemPrompt(scanResult: SourceScanResult): string {\n const parts: string[] = [\n 'You are a test automation expert that converts natural language test descriptions into YAML test definitions.',\n '',\n '## Schema Structure',\n '',\n 'A test definition must have:',\n '- name: A descriptive test name (non-empty string)',\n '- platform: One of \\'web\\', \\'android\\', or \\'ios\\'',\n '- config: Optional configuration object',\n '- steps: Array of actions (minimum 1 action required)',\n '',\n '## Available Actions',\n '',\n '1. navigate - Navigate to a URL',\n ' { type: \\'navigate\\', value: string }',\n '',\n '2. tap - Click or tap an element',\n ' { type: \\'tap\\', target: Locator }',\n '',\n '3. input - Type text into an input field',\n ' { type: \\'input\\', target: Locator, value: string }',\n '',\n '4. assert - Assert element exists or contains text',\n ' { type: \\'assert\\', target: Locator, value?: string }',\n '',\n '5. wait - Wait for an element or timeout',\n ' { type: \\'wait\\', target?: Locator, timeout?: number }',\n ' Note: Requires either target or timeout',\n '',\n '6. scroll - Scroll the page or to an element',\n ' { type: \\'scroll\\', target?: Locator, direction?: \\'up\\'|\\'down\\', amount?: number }',\n '',\n '7. screenshot - Take a screenshot',\n ' { type: \\'screenshot\\', name?: string }',\n '',\n '## Locator Structure',\n '',\n 'A locator must have AT LEAST ONE of these properties:',\n '- description: Human-readable description for AI healing',\n '- testId: data-testid attribute value',\n '- text: Text content to match',\n '- css: CSS selector',\n '- xpath: XPath expression',\n '- role: ARIA role attribute',\n '- name: Accessible name',\n '',\n '## PROJECT STRUCTURE',\n '',\n 'The following routes and elements were extracted from the project source code.',\n 'Use these REAL selectors in your generated tests.',\n '',\n '### Selector Priority (prefer earlier options):',\n '1. text - Most resilient to DOM changes',\n '2. role + name - ARIA-compliant, accessible',\n '3. testId - Explicit but requires dev setup',\n '4. css - Last resort, fragile',\n '',\n ];\n\n // Add the formatted scan results\n parts.push(formatScanResultsForPrompt(scanResult));\n\n // Add configuration and examples\n parts.push(\n '## Configuration Options',\n '',\n 'web:',\n ' baseUrl: Base URL for the application',\n ' browser: Browser to use (e.g., \\'chromium\\', \\'firefox\\', \\'webkit\\')',\n ' headless: Run browser in headless mode (boolean)',\n ' timeout: Default timeout in milliseconds',\n '',\n 'android:',\n ' appId: Android application package ID',\n ' device: Device name or ID',\n '',\n 'ios:',\n ' bundleId: iOS bundle identifier',\n ' simulator: Simulator name',\n '',\n '## Example Test Structure',\n '',\n '```yaml',\n 'name: Example test name',\n 'platform: web',\n 'config:',\n ' web:',\n ' baseUrl: https://example.com',\n ' headless: true',\n 'steps:',\n ' - type: navigate',\n ' value: /login',\n ' - type: input',\n ' target:',\n ' text: Email',\n ' description: Email input field',\n ' value: test@example.com',\n ' - type: input',\n ' target:',\n ' role: textbox',\n ' name: Password',\n ' description: Password input field',\n ' value: password123',\n ' - type: tap',\n ' target:',\n ' text: Sign In',\n ' role: button',\n ' description: Sign in button',\n ' - type: assert',\n ' target:',\n ' text: Welcome',\n ' description: Welcome message after login',\n '```',\n '',\n '## Important Instructions',\n '',\n '1. Output ONLY valid YAML - no markdown code blocks, no explanations',\n '2. Use REAL selectors from the project structure above whenever possible',\n '3. Every locator MUST have at least one selector property',\n '4. Include descriptive locator descriptions for AI healing',\n '5. Prefer text and role selectors over testId and css for resilience',\n '6. Use multiple locator strategies when possible for resilience',\n '7. For wait actions, provide either a target or timeout (or both)',\n '8. Use appropriate platform-specific configurations',\n '9. Ensure all strings are properly quoted if they contain special characters',\n '10. Action steps must be in logical order',\n '',\n 'Generate the test definition now based on the user\\'s description.',\n );\n\n return parts.join('\\n');\n}\n","/**\n * Test generator that converts natural language to YAML test definitions\n */\n\nimport { parse } from 'yaml';\nimport type { z } from 'zod';\nimport { TestDefinitionSchema } from '../core/schema';\nimport type { AIConfig } from '../ai/types';\nimport { createAIProvider } from '../ai/provider';\nimport {\n SYSTEM_PROMPT,\n buildPrompt,\n buildSourceAwareSystemPrompt,\n type PromptContext,\n} from './prompts';\nimport { scanProjectSource, type SourceConfig } from './sourceScanner';\n\nexport interface GeneratorOptions {\n aiConfig: AIConfig;\n baseUrl?: string;\n platform?: 'web' | 'android' | 'ios';\n additionalContext?: string;\n maxRetries?: number;\n source?: SourceConfig | null; // null = explicitly disabled, undefined = auto-detect\n}\n\nexport interface GeneratorResult {\n success: boolean;\n test?: z.infer<typeof TestDefinitionSchema>;\n yaml?: string;\n error?: string;\n attempts?: number;\n}\n\n/**\n * Strips markdown code blocks from YAML content\n */\nfunction cleanYamlResponse(response: string): string {\n // Remove markdown YAML code blocks\n let cleaned = response.replace(/```ya?ml\\n?/gi, '').replace(/```\\n?/g, '');\n\n // Remove leading/trailing whitespace\n cleaned = cleaned.trim();\n\n return cleaned;\n}\n\n/**\n * Generates a test definition from natural language description\n *\n * @param naturalLanguage - The natural language test description\n * @param options - Generator configuration options\n * @returns Promise resolving to the generation result\n */\nexport async function generateTest(\n naturalLanguage: string,\n options: GeneratorOptions,\n): Promise<GeneratorResult> {\n const provider = createAIProvider(options.aiConfig);\n\n // Scan source if configured (default to auto-detect)\n let systemPrompt = SYSTEM_PROMPT;\n if (options.source !== null) {\n // null = explicitly disabled\n const sourceConfig = options.source ?? {}; // empty = auto-detect\n const scanResult = await scanProjectSource(sourceConfig);\n if (scanResult.allElements.length > 0) {\n systemPrompt = buildSourceAwareSystemPrompt(scanResult);\n }\n }\n\n const context: PromptContext = {\n baseUrl: options.baseUrl,\n platform: options.platform,\n additionalContext: options.additionalContext,\n };\n\n const userPrompt = buildPrompt(naturalLanguage, context);\n const maxRetries = options.maxRetries ?? 3;\n\n let lastError: Error | undefined;\n let lastYaml: string | undefined;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n // Build retry-specific prompt with feedback from previous attempt\n let promptWithFeedback = userPrompt;\n if (attempt > 0 && lastError) {\n promptWithFeedback = `${userPrompt}\\n\\nPrevious attempt failed with error: ${lastError.message}\\n\\nPlease fix the issue and generate valid YAML.`;\n }\n\n // Generate completion from AI using the system prompt (possibly source-aware)\n const response = await provider.generateCompletion(promptWithFeedback, systemPrompt);\n\n // Clean the response\n const yaml = cleanYamlResponse(response);\n lastYaml = yaml;\n\n // Parse YAML\n const parsed = parse(yaml);\n\n // Validate against schema\n const validated = TestDefinitionSchema.parse(parsed);\n\n // Success!\n return {\n success: true,\n test: validated,\n yaml,\n attempts: attempt + 1,\n };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // If this was the last retry, return failure\n if (attempt === maxRetries - 1) {\n return {\n success: false,\n error: `Failed to generate valid test after ${maxRetries} attempts. Last error: ${lastError.message}`,\n yaml: lastYaml,\n attempts: maxRetries,\n };\n }\n\n // Otherwise, continue to next retry\n }\n }\n\n // This should never be reached, but TypeScript wants it\n return {\n success: false,\n error: 'Unknown error occurred during test generation',\n attempts: maxRetries,\n };\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport prompts from 'prompts';\nimport dotenv from 'dotenv';\n\nexport interface MissingEnvVar {\n name: string;\n description?: string;\n}\n\n/**\n * Displays a formatted box showing missing environment variables\n */\nexport function displayMissingEnvVars(missing: string[]): void {\n console.log('\\n┌─────────────────────────────────────────────┐');\n console.log('│ ⚠️ Missing Environment Variables │');\n console.log('├─────────────────────────────────────────────┤');\n for (const name of missing) {\n console.log(`│ • ${name.padEnd(39)}│`);\n }\n console.log('└─────────────────────────────────────────────┘\\n');\n}\n\n/**\n * Prompts the user to add missing environment variables to .env file\n * Returns true if variables were successfully added, false otherwise\n */\nexport async function promptAddToEnv(\n missing: string[],\n envPath: string\n): Promise<boolean> {\n const { shouldAdd } = await prompts({\n type: 'confirm',\n name: 'shouldAdd',\n message: `Add missing variables to ${path.basename(envPath)}?`,\n initial: true,\n });\n\n if (!shouldAdd) return false;\n\n // Collect values for each missing var\n const values: Record<string, string> = {};\n for (const name of missing) {\n const { value } = await prompts({\n type: 'password', // Hide sensitive values\n name: 'value',\n message: `Enter value for ${name}:`,\n });\n if (value !== undefined) {\n values[name] = value;\n }\n }\n\n // Append to .env file (create if doesn't exist)\n const lines = Object.entries(values)\n .map(([key, val]) => `${key}=${val}`)\n .join('\\n');\n\n let existingContent = '';\n try {\n existingContent = await fs.readFile(envPath, 'utf8');\n } catch {\n // File doesn't exist, that's okay\n }\n\n const newContent = existingContent\n ? `${existingContent.trimEnd()}\\n${lines}\\n`\n : `${lines}\\n`;\n\n await fs.writeFile(envPath, newContent, 'utf8');\n console.log(`\\n✓ Added ${missing.length} variable(s) to ${path.basename(envPath)}\\n`);\n\n // Reload env vars\n dotenv.config({ path: envPath, override: true });\n\n return true;\n}\n\n/**\n * Main function to check and handle missing environment variables\n * Returns true if all required vars are available (or were successfully added),\n * false if the user chose not to provide them\n */\nexport async function validateEnvVars(\n missing: string[],\n projectDir: string\n): Promise<boolean> {\n if (missing.length === 0) return true;\n\n displayMissingEnvVars(missing);\n\n const envPath = path.join(projectDir, '.env');\n const added = await promptAddToEnv(missing, envPath);\n\n if (!added) {\n console.log('Cannot continue without required environment variables.');\n return false;\n }\n\n return true;\n}\n","#!/usr/bin/env node\nimport dotenv from 'dotenv';\n\n// Load .env from current working directory\ndotenv.config();\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { Command } from 'commander';\n\nimport { spawn, type ChildProcess } from 'node:child_process';\n\nimport { loadIntellitesterConfig, loadTestDefinition, loadWorkflowDefinition, isWorkflowFile, isPipelineFile, loadPipelineDefinition, collectMissingEnvVars, isWorkflowContent, isPipelineContent } from '../core/loader';\nimport { runPipeline } from '../executors/web/pipelineExecutor';\nimport type { TestDefinition } from '../core/types';\nimport { runWebTest, type BrowserName } from '../executors/web';\nimport { runWorkflow } from '../executors/web/workflowExecutor';\nimport { generateTest } from '../generator';\nimport type { AIConfig as _AIConfig } from '../ai/types';\nimport { loadFailedCleanups, removeFailedCleanup } from '../core/cleanup/persistence.js';\nimport { loadCleanupHandlers, executeCleanup } from '../core/cleanup/index.js';\nimport type { CleanupConfig } from '../core/cleanup/types.js';\nimport { validateEnvVars } from './envHelper';\n\nconst CONFIG_FILENAME = 'intellitester.config.yaml';\n\n/**\n * Map common browser names to Playwright browser names.\n */\nconst BROWSER_ALIASES: Record<string, BrowserName> = {\n chrome: 'chromium',\n chromium: 'chromium',\n safari: 'webkit',\n webkit: 'webkit',\n firefox: 'firefox',\n ff: 'firefox',\n};\n\nconst resolveBrowserName = (input: string): BrowserName => {\n const normalized = input.toLowerCase().trim();\n const resolved = BROWSER_ALIASES[normalized];\n if (!resolved) {\n const valid = Object.keys(BROWSER_ALIASES).join(', ');\n throw new Error(`Unknown browser \"${input}\". Valid options: ${valid}`);\n }\n return resolved;\n};\n\n/**\n * Detect package manager from lockfile.\n */\nconst detectPackageManager = async (): Promise<'pnpm' | 'npm' | 'yarn' | 'bun'> => {\n if (await fileExists('pnpm-lock.yaml')) return 'pnpm';\n if (await fileExists('bun.lockb')) return 'bun';\n if (await fileExists('yarn.lock')) return 'yarn';\n return 'npm';\n};\n\n/**\n * Run a command and wait for it to complete.\n */\nconst execCommand = async (cmd: string, args: string[], cwd: string): Promise<void> => {\n return new Promise((resolve, reject) => {\n console.log(`Running: ${cmd} ${args.join(' ')}`);\n const child = spawn(cmd, args, {\n cwd,\n stdio: 'inherit',\n shell: true,\n });\n child.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`Command failed with exit code ${code}`));\n });\n child.on('error', reject);\n });\n};\n\n/**\n * Build the project and start preview server.\n * Returns the preview server process and cleanup function.\n */\nconst buildAndPreview = async (\n config: any,\n cwd: string\n): Promise<{ previewProcess: ChildProcess | null; cleanup: () => void }> => {\n const pm = await detectPackageManager();\n const previewConfig = config?.preview || {};\n\n // Get build command (default: pm run build)\n const buildCmd = previewConfig.build?.command || `${pm} run build`;\n const [buildExec, ...buildArgs] = buildCmd.split(' ');\n\n // Get preview command (default: pm run preview)\n const previewCmd = previewConfig.preview?.command || `${pm} run preview`;\n const [previewExec, ...previewArgs] = previewCmd.split(' ');\n\n // Get preview URL (default from webServer or baseUrl)\n const previewUrl = previewConfig.url || config?.webServer?.url || config?.platforms?.web?.baseUrl || 'http://localhost:4321';\n const timeout = previewConfig.timeout || 60000;\n\n // Run build\n console.log('\\n📦 Building project...\\n');\n await execCommand(buildExec, buildArgs, cwd);\n console.log('\\n✅ Build complete\\n');\n\n // Start preview server\n console.log('\\n🚀 Starting preview server...\\n');\n const previewProcess = await startPreviewServer(previewExec, previewArgs, cwd, previewUrl, timeout);\n\n const cleanup = () => {\n if (previewProcess && !previewProcess.killed) {\n console.log('\\n🛑 Stopping preview server...');\n previewProcess.kill('SIGTERM');\n }\n };\n\n // Handle cleanup on exit\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n\n return { previewProcess, cleanup };\n};\n\n/**\n * Start a preview server and wait for it to be ready.\n */\nconst startPreviewServer = async (\n cmd: string,\n args: string[],\n cwd: string,\n url: string,\n timeout: number = 60000\n): Promise<ChildProcess> => {\n return new Promise((resolve, reject) => {\n console.log(`Starting preview server: ${cmd} ${args.join(' ')}`);\n const child = spawn(cmd, args, {\n cwd,\n stdio: 'pipe',\n shell: true,\n });\n\n let output = '';\n const startTime = Date.now();\n\n const checkServer = async () => {\n try {\n const response = await fetch(url, { method: 'HEAD' });\n if (response.ok || response.status < 500) {\n console.log(`Preview server ready at ${url}`);\n resolve(child);\n return true;\n }\n } catch {\n // Server not ready yet\n }\n return false;\n };\n\n // Poll for server readiness\n const pollInterval = setInterval(async () => {\n if (await checkServer()) {\n clearInterval(pollInterval);\n } else if (Date.now() - startTime > timeout) {\n clearInterval(pollInterval);\n child.kill();\n reject(new Error(`Preview server failed to start within ${timeout}ms`));\n }\n }, 500);\n\n child.stdout?.on('data', (data) => {\n output += data.toString();\n process.stdout.write(data);\n });\n\n child.stderr?.on('data', (data) => {\n output += data.toString();\n process.stderr.write(data);\n });\n\n child.on('error', (err) => {\n clearInterval(pollInterval);\n reject(err);\n });\n\n child.on('close', (code) => {\n clearInterval(pollInterval);\n if (code !== 0 && code !== null) {\n reject(new Error(`Preview server exited with code ${code}\\n${output}`));\n }\n });\n });\n};\n\nconst logError = (message: string): void => {\n console.error(`Error: ${message}`);\n};\n\n/**\n * Find the project root directory by walking up from the given path\n * until we find a directory containing package.json, .git, or intellitester.config.yaml\n */\nconst findProjectRoot = async (startPath: string): Promise<string | null> => {\n let currentDir = path.isAbsolute(startPath) ? startPath : path.resolve(startPath);\n\n // If startPath is a file, start from its directory\n try {\n const stat = await fs.stat(currentDir);\n if (stat.isFile()) {\n currentDir = path.dirname(currentDir);\n }\n } catch {\n // If stat fails, assume it's a directory or use dirname\n currentDir = path.dirname(currentDir);\n }\n\n // Walk up the directory tree\n const root = path.parse(currentDir).root;\n while (currentDir !== root) {\n // Check for project markers\n const markers = ['package.json', '.git', CONFIG_FILENAME];\n for (const marker of markers) {\n if (await fileExists(path.join(currentDir, marker))) {\n return currentDir;\n }\n }\n\n // Move up one directory\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) break; // Reached root\n currentDir = parentDir;\n }\n\n return null; // No project root found\n};\n\n/**\n * Load .env file from the project directory\n */\nconst loadProjectEnv = async (targetPath: string): Promise<void> => {\n const projectRoot = await findProjectRoot(targetPath);\n if (projectRoot) {\n const envPath = path.join(projectRoot, '.env');\n if (await fileExists(envPath)) {\n dotenv.config({ path: envPath, override: false });\n console.log(`Loaded .env from ${projectRoot}`);\n }\n }\n};\n\nconst fileExists = async (filePath: string): Promise<boolean> => {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n};\n\nconst collectYamlFiles = async (target: string): Promise<string[]> => {\n const stat = await fs.stat(target);\n if (stat.isFile()) return [target];\n\n if (!stat.isDirectory()) {\n throw new Error(`Unsupported target: ${target}`);\n }\n\n const entries = await fs.readdir(target, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n const fullPath = path.join(target, entry.name);\n if (entry.isDirectory()) {\n const nested = await collectYamlFiles(fullPath);\n files.push(...nested);\n } else if (entry.isFile() && (entry.name.endsWith('.yaml') || entry.name.endsWith('.yml'))) {\n files.push(fullPath);\n }\n }\n return files;\n};\n\n/**\n * Auto-discover test files in the tests/ directory.\n * Returns files grouped by type: pipelines first, then workflows, then individual tests.\n * Tests that are referenced by workflows are excluded from standalone test list.\n */\nconst discoverTestFiles = async (testsDir: string = 'tests'): Promise<{\n pipelines: string[];\n workflows: string[];\n tests: string[];\n}> => {\n const absoluteDir = path.resolve(testsDir);\n\n if (!(await fileExists(absoluteDir))) {\n return { pipelines: [], workflows: [], tests: [] };\n }\n\n const allFiles = await collectYamlFiles(absoluteDir);\n\n const pipelines: string[] = [];\n const workflows: string[] = [];\n const allTests: string[] = [];\n\n for (const file of allFiles) {\n const name = path.basename(file).toLowerCase();\n if (name.endsWith('.pipeline.yaml') || name.endsWith('.pipeline.yml')) {\n pipelines.push(file);\n } else if (name.endsWith('.workflow.yaml') || name.endsWith('.workflow.yml')) {\n workflows.push(file);\n } else if (name.endsWith('.test.yaml') || name.endsWith('.test.yml')) {\n allTests.push(file);\n }\n }\n\n const { parse } = await import('yaml');\n\n // Parse pipelines to find workflows they reference\n const workflowsInPipelines = new Set<string>();\n for (const pipelineFile of pipelines) {\n try {\n const content = await fs.readFile(pipelineFile, 'utf8');\n const pipeline = parse(content);\n const pipelineDir = path.dirname(pipelineFile);\n\n if (pipeline?.workflows && Array.isArray(pipeline.workflows)) {\n for (const workflowRef of pipeline.workflows) {\n if (workflowRef?.file) {\n const absoluteWorkflowPath = path.resolve(pipelineDir, workflowRef.file);\n workflowsInPipelines.add(absoluteWorkflowPath);\n }\n }\n }\n } catch {\n // If we can't parse a pipeline, just continue\n }\n }\n\n // Filter out workflows that are part of pipelines\n const standaloneWorkflows = workflows.filter(wf => !workflowsInPipelines.has(wf));\n\n // Parse workflows to find tests they reference, so we don't run them twice\n const testsInWorkflows = new Set<string>();\n for (const workflowFile of workflows) {\n try {\n const content = await fs.readFile(workflowFile, 'utf8');\n const workflow = parse(content);\n const workflowDir = path.dirname(workflowFile);\n\n if (workflow?.tests && Array.isArray(workflow.tests)) {\n for (const testRef of workflow.tests) {\n if (testRef?.file) {\n const absoluteTestPath = path.resolve(workflowDir, testRef.file);\n testsInWorkflows.add(absoluteTestPath);\n }\n }\n }\n } catch {\n // If we can't parse a workflow, just continue\n }\n }\n\n // Filter out tests that are part of workflows\n const standaloneTests = allTests.filter(test => !testsInWorkflows.has(test));\n\n return { pipelines, workflows: standaloneWorkflows, tests: standaloneTests };\n};\n\nconst writeFileIfMissing = async (filePath: string, contents: string): Promise<void> => {\n if (await fileExists(filePath)) return;\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, contents, 'utf8');\n};\n\nconst initCommand = async (): Promise<void> => {\n const configTemplate = `defaults:\n timeout: 30000\n screenshots: on-failure\n\nplatforms:\n web:\n baseUrl: http://localhost:3000\n headless: true\n\nai:\n provider: anthropic\n model: claude-3-5-sonnet-20241022\n apiKey: \\${ANTHROPIC_API_KEY}\n temperature: 0\n maxTokens: 4096\n\nemail:\n provider: inbucket\n endpoint: http://localhost:9000\n\nappwrite:\n endpoint: https://cloud.appwrite.io/v1\n projectId: your-project-id\n apiKey: your-api-key\n`;\n\n const sampleTest = `name: Example web smoke test\nplatform: web\nconfig:\n web:\n baseUrl: http://localhost:3000\n\nsteps:\n - type: navigate\n value: /\n\n - type: assert\n target:\n text: \"Welcome\"\n`;\n\n await writeFileIfMissing(path.resolve(CONFIG_FILENAME), configTemplate);\n await writeFileIfMissing(path.resolve('tests', 'example.web.test.yaml'), sampleTest);\n console.log('Initialized intellitester.config.yaml and tests/example.web.test.yaml');\n};\n\nconst validateCommand = async (target: string): Promise<void> => {\n const absoluteTarget = path.resolve(target);\n const files = await collectYamlFiles(absoluteTarget);\n if (files.length === 0) {\n throw new Error(`No YAML files found at ${absoluteTarget}`);\n }\n\n for (const file of files) {\n await loadTestDefinition(file);\n console.log(`✓ ${path.relative(process.cwd(), file)} valid`);\n }\n};\n\nconst resolveBaseUrl = (test: TestDefinition, configBaseUrl?: string): string | undefined =>\n test.config?.web?.baseUrl ?? configBaseUrl;\n\nconst runTestCommand = async (\n target: string,\n options: {\n headed?: boolean;\n browser?: BrowserName;\n noServer?: boolean;\n interactive?: boolean;\n debug?: boolean;\n },\n): Promise<void> => {\n const absoluteTarget = path.resolve(target);\n\n // Load .env from the project directory\n await loadProjectEnv(absoluteTarget);\n\n // Validate environment variables before proceeding\n const { parse } = await import('yaml');\n const testContent = await fs.readFile(absoluteTarget, 'utf8');\n const parsedTest = parse(testContent);\n\n const hasConfigFile = await fileExists(CONFIG_FILENAME);\n let parsedConfig: unknown = undefined;\n if (hasConfigFile) {\n const configContent = await fs.readFile(CONFIG_FILENAME, 'utf8');\n parsedConfig = parse(configContent);\n }\n\n // Collect missing env vars from both config and test\n const configMissing = parsedConfig ? collectMissingEnvVars(parsedConfig) : [];\n const testMissing = collectMissingEnvVars(parsedTest);\n const allMissing = [...new Set([...configMissing, ...testMissing])];\n\n if (allMissing.length > 0) {\n const projectRoot = await findProjectRoot(absoluteTarget);\n const canContinue = await validateEnvVars(allMissing, projectRoot || process.cwd());\n if (!canContinue) {\n process.exit(1);\n }\n }\n\n // Now load and validate with schemas\n const test = await loadTestDefinition(absoluteTarget);\n const config = hasConfigFile ? await loadIntellitesterConfig(CONFIG_FILENAME) : undefined;\n\n const baseUrl = resolveBaseUrl(test, config?.platforms?.web?.baseUrl);\n const headed = options.headed ?? false;\n const browser = options.browser ?? 'chromium';\n const skipWebServer = options.noServer ?? false;\n const debug = options.debug ?? false;\n const interactive = options.interactive ?? false;\n\n const modeFlags: string[] = [];\n if (headed) modeFlags.push('headed');\n if (debug) modeFlags.push('debug mode');\n if (interactive) modeFlags.push('interactive');\n\n console.log(\n `Running ${path.basename(absoluteTarget)} on web (${browser}${modeFlags.length > 0 ? ', ' + modeFlags.join(', ') : ''})`,\n );\n\n const result = await runWebTest(test, {\n baseUrl,\n headed,\n browser,\n defaultTimeoutMs: config?.defaults?.timeout,\n webServer: !skipWebServer && config?.webServer ? config.webServer : undefined,\n debug,\n interactive,\n aiConfig: interactive ? config?.ai : undefined,\n });\n\n for (const step of result.steps) {\n const label = `[${step.status === 'passed' ? 'OK' : 'FAIL'}] ${step.action.type}`;\n if (step.error) {\n console.error(`${label} - ${step.error}`);\n } else {\n console.log(label);\n }\n }\n\n if (result.status === 'failed') {\n process.exitCode = 1;\n }\n};\n\nconst generateCommand = async (\n prompt: string,\n options: {\n output?: string;\n platform?: 'web' | 'android' | 'ios';\n baseUrl?: string;\n pagesDir?: string;\n componentsDir?: string;\n noSource?: boolean;\n },\n): Promise<void> => {\n // Load .env from the project directory (output path or current directory)\n const targetPath = options.output ? path.resolve(options.output) : process.cwd();\n await loadProjectEnv(targetPath);\n\n // 1. Load config file to get AI settings\n const hasConfigFile = await fileExists(CONFIG_FILENAME);\n if (!hasConfigFile) {\n throw new Error('No intellitester.config.yaml found. Run \"intellitester init\" first and configure AI settings.');\n }\n\n // Validate environment variables in config\n const { parse } = await import('yaml');\n const configContent = await fs.readFile(CONFIG_FILENAME, 'utf8');\n const parsedConfig = parse(configContent);\n const configMissing = collectMissingEnvVars(parsedConfig);\n\n if (configMissing.length > 0) {\n const projectRoot = await findProjectRoot(CONFIG_FILENAME);\n const canContinue = await validateEnvVars(configMissing, projectRoot || process.cwd());\n if (!canContinue) {\n process.exit(1);\n }\n }\n\n const config = await loadIntellitesterConfig(CONFIG_FILENAME);\n if (!config.ai) {\n throw new Error('AI configuration missing in intellitester.config.yaml. Add \"ai:\" section with provider, model, and apiKey.');\n }\n\n // 2. Build source config\n const source = options.noSource ? null : (options.pagesDir || options.componentsDir) ? {\n pagesDir: options.pagesDir,\n componentsDir: options.componentsDir,\n } : undefined; // undefined = auto-detect\n\n // 3. Build options\n const generateOptions = {\n aiConfig: config.ai,\n baseUrl: options.baseUrl,\n platform: options.platform,\n source,\n };\n\n // 4. Generate test\n console.log('Generating test...');\n const result = await generateTest(prompt, generateOptions);\n\n if (!result.success) {\n throw new Error(result.error || 'Failed to generate test');\n }\n\n // 5. Output\n if (options.output) {\n await fs.mkdir(path.dirname(options.output), { recursive: true });\n await fs.writeFile(options.output, result.yaml!, 'utf8');\n console.log(`✓ Test saved to ${options.output}`);\n } else {\n console.log('\\n--- Generated Test ---\\n');\n console.log(result.yaml);\n }\n};\n\ninterface RunOptions {\n visible?: boolean;\n browser?: BrowserName;\n interactive?: boolean;\n debug?: boolean;\n}\n\nconst runWorkflowCommand = async (file: string, options: RunOptions): Promise<void> => {\n const workflowPath = path.resolve(file);\n\n if (!(await fileExists(workflowPath))) {\n logError(`Workflow file not found: ${file}`);\n process.exit(1);\n }\n\n // Load .env from the project directory\n await loadProjectEnv(workflowPath);\n\n console.log(`Running workflow: ${file}`);\n\n // Validate environment variables before proceeding\n const { parse } = await import('yaml');\n const workflowContent = await fs.readFile(workflowPath, 'utf8');\n const parsedWorkflow = parse(workflowContent);\n\n const hasConfigFile = await fileExists(CONFIG_FILENAME);\n let parsedConfig: unknown = undefined;\n if (hasConfigFile) {\n const configContent = await fs.readFile(CONFIG_FILENAME, 'utf8');\n parsedConfig = parse(configContent);\n }\n\n // Collect missing env vars from both config and workflow\n const configMissing = parsedConfig ? collectMissingEnvVars(parsedConfig) : [];\n const workflowMissing = collectMissingEnvVars(parsedWorkflow);\n const allMissing = [...new Set([...configMissing, ...workflowMissing])];\n\n if (allMissing.length > 0) {\n const projectRoot = await findProjectRoot(workflowPath);\n const canContinue = await validateEnvVars(allMissing, projectRoot || process.cwd());\n if (!canContinue) {\n process.exit(1);\n }\n }\n\n // Now load and validate with schemas\n const workflow = await loadWorkflowDefinition(workflowPath);\n\n // Load config to get AI settings (for interactive mode)\n const config = hasConfigFile ? await loadIntellitesterConfig(CONFIG_FILENAME) : undefined;\n\n const result = await runWorkflow(workflow, workflowPath, {\n headed: options.visible,\n browser: options.browser,\n interactive: options.interactive,\n debug: options.debug,\n aiConfig: config?.ai,\n webServer: config?.webServer,\n });\n\n // Print results\n console.log(`\\nWorkflow: ${workflow.name}`);\n console.log(`Session ID: ${result.sessionId}`);\n console.log(`Status: ${result.status}\\n`);\n\n for (const test of result.tests) {\n const icon = test.status === 'passed' ? '✓' : test.status === 'failed' ? '✗' : '○';\n console.log(` ${icon} ${test.file} (${test.status})`);\n if (test.error) {\n console.log(` Error: ${test.error}`);\n }\n }\n\n if (result.cleanupResult) {\n console.log(`\\nCleanup: ${result.cleanupResult.deleted.length} resources deleted`);\n if (result.cleanupResult.failed.length > 0) {\n console.log(` Failed to delete: ${result.cleanupResult.failed.join(', ')}`);\n }\n }\n\n process.exit(result.status === 'passed' ? 0 : 1);\n};\n\nconst runPipelineCommand = async (file: string, options: RunOptions): Promise<void> => {\n const pipelinePath = path.resolve(file);\n\n if (!(await fileExists(pipelinePath))) {\n logError(`Pipeline file not found: ${file}`);\n process.exit(1);\n }\n\n // Load .env from the project directory\n await loadProjectEnv(pipelinePath);\n\n console.log(`Running pipeline: ${file}`);\n\n // Validate environment variables before proceeding\n const { parse } = await import('yaml');\n const pipelineContent = await fs.readFile(pipelinePath, 'utf8');\n const parsedPipeline = parse(pipelineContent);\n\n const hasConfigFile = await fileExists(CONFIG_FILENAME);\n let parsedConfig: unknown = undefined;\n if (hasConfigFile) {\n const configContent = await fs.readFile(CONFIG_FILENAME, 'utf8');\n parsedConfig = parse(configContent);\n }\n\n // Collect missing env vars from both config and pipeline\n const configMissing = parsedConfig ? collectMissingEnvVars(parsedConfig) : [];\n const pipelineMissing = collectMissingEnvVars(parsedPipeline);\n const allMissing = [...new Set([...configMissing, ...pipelineMissing])];\n\n if (allMissing.length > 0) {\n const projectRoot = await findProjectRoot(pipelinePath);\n const canContinue = await validateEnvVars(allMissing, projectRoot || process.cwd());\n if (!canContinue) {\n process.exit(1);\n }\n }\n\n // Now load and validate with schemas\n const pipeline = await loadPipelineDefinition(pipelinePath);\n\n // Load config to get AI settings (for interactive mode)\n const _config = hasConfigFile ? await loadIntellitesterConfig(CONFIG_FILENAME) : undefined;\n\n const result = await runPipeline(pipeline, pipelinePath, {\n headed: options.visible,\n browser: options.browser,\n interactive: options.interactive,\n debug: options.debug,\n });\n\n // Print results\n console.log(`\\nPipeline: ${pipeline.name}`);\n console.log(`Session ID: ${result.sessionId}`);\n console.log(`Status: ${result.status}\\n`);\n\n for (const workflow of result.workflows) {\n const icon = workflow.status === 'passed' ? '✓' : workflow.status === 'failed' ? '✗' : '○';\n console.log(` ${icon} ${workflow.file} (${workflow.status})`);\n if (workflow.error) {\n console.log(` Error: ${workflow.error}`);\n }\n }\n\n if (result.cleanupResult) {\n console.log(`\\nCleanup: ${result.cleanupResult.deleted.length} resources deleted`);\n if (result.cleanupResult.failed.length > 0) {\n console.log(` Failed to delete: ${result.cleanupResult.failed.join(', ')}`);\n }\n }\n\n process.exit(result.status === 'passed' ? 0 : 1);\n};\n\nconst main = async (): Promise<void> => {\n const program = new Command();\n\n program\n .name('intellitester')\n .description('AI-powered cross-platform test automation')\n .version('1.0.0');\n\n program\n .command('init')\n .description('Initialize IntelliTester in current directory')\n .action(async () => {\n try {\n await initCommand();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logError(message);\n process.exitCode = 1;\n }\n });\n\n program\n .command('validate')\n .description('Validate test YAML files')\n .argument('[file]', 'Test file or directory to validate', 'tests')\n .action(async (file: string) => {\n try {\n await validateCommand(file);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logError(message);\n process.exitCode = 1;\n }\n });\n\n program\n .command('run')\n .description('Run test file(s), workflow, or auto-discover tests in tests/ directory')\n .argument('[file]', 'Test file, workflow, or pipeline to run (auto-discovers if omitted)')\n .option('--visible', 'Run browser in visible mode (not headless)')\n .option('--browser <name>', 'Browser to use (chrome, safari, firefox)', 'chrome')\n .option('--preview', 'Build project and run against preview server')\n .option('--no-server', 'Skip auto-starting web server')\n .option('-i, --interactive', 'Interactive mode - AI suggests fixes on failure')\n .option('--debug', 'Debug mode - verbose logging')\n .action(async (file: string | undefined, options: {\n visible?: boolean;\n browser?: string;\n preview?: boolean;\n server?: boolean;\n interactive?: boolean;\n debug?: boolean;\n }) => {\n let previewCleanup: (() => void) | null = null;\n\n try {\n // Resolve browser alias\n const browser = resolveBrowserName(options.browser || 'chrome');\n\n // Handle preview mode\n if (options.preview) {\n const hasConfigFile = await fileExists(CONFIG_FILENAME);\n const config = hasConfigFile ? await loadIntellitesterConfig(CONFIG_FILENAME) : undefined;\n const { cleanup } = await buildAndPreview(config, process.cwd());\n previewCleanup = cleanup;\n }\n\n const runOpts: RunOptions = {\n visible: options.visible,\n browser,\n interactive: options.interactive,\n debug: options.debug,\n };\n\n // If no file specified, auto-discover tests\n if (!file) {\n const discovered = await discoverTestFiles('tests');\n const total = discovered.pipelines.length + discovered.workflows.length + discovered.tests.length;\n\n if (total === 0) {\n logError('No test files found in tests/ directory. Create .pipeline.yaml, .workflow.yaml, or .test.yaml files.');\n process.exit(1);\n }\n\n console.log(`Discovered ${total} test file(s):`);\n if (discovered.pipelines.length > 0) {\n console.log(` Pipelines: ${discovered.pipelines.length}`);\n }\n if (discovered.workflows.length > 0) {\n console.log(` Workflows: ${discovered.workflows.length}`);\n }\n if (discovered.tests.length > 0) {\n console.log(` Tests: ${discovered.tests.length}`);\n }\n console.log('');\n\n let failed = false;\n\n // Run pipelines first (they orchestrate workflows)\n for (const pipeline of discovered.pipelines) {\n try {\n await runPipelineCommand(pipeline, runOpts);\n } catch (error) {\n console.error(`\\n❌ Pipeline failed: ${path.basename(pipeline)}`);\n console.error(` ${error instanceof Error ? error.message : String(error)}\\n`);\n failed = true;\n }\n }\n\n // Run standalone workflows (not part of pipelines)\n for (const workflow of discovered.workflows) {\n try {\n await runWorkflowCommand(workflow, runOpts);\n } catch (error) {\n console.error(`\\n❌ Workflow failed: ${path.basename(workflow)}`);\n console.error(` ${error instanceof Error ? error.message : String(error)}\\n`);\n failed = true;\n }\n }\n\n // Run individual tests\n for (const test of discovered.tests) {\n try {\n await runTestCommand(test, {\n headed: options.visible,\n browser,\n noServer: !options.server,\n interactive: options.interactive,\n debug: options.debug,\n });\n } catch (error) {\n console.error(`\\n❌ Test failed: ${path.basename(test)}`);\n console.error(` ${error instanceof Error ? error.message : String(error)}\\n`);\n failed = true;\n }\n }\n\n if (failed) {\n process.exitCode = 1;\n }\n return;\n }\n\n // Check if it's a pipeline file FIRST\n if (isPipelineFile(file)) {\n await runPipelineCommand(file, runOpts);\n return;\n }\n\n // Check if it's a workflow file\n if (isWorkflowFile(file)) {\n await runWorkflowCommand(file, runOpts);\n return;\n }\n\n // Content-based detection as fallback\n const fileContent = await fs.readFile(path.resolve(file), 'utf8');\n if (isPipelineContent(fileContent)) {\n console.log(`Note: Detected as pipeline by content structure`);\n await runPipelineCommand(file, runOpts);\n return;\n }\n if (isWorkflowContent(fileContent)) {\n console.log(`Note: Detected as workflow by content structure`);\n await runWorkflowCommand(file, runOpts);\n return;\n }\n\n // Otherwise, run as a single test\n await runTestCommand(file, {\n headed: options.visible,\n browser,\n noServer: !options.server,\n interactive: options.interactive,\n debug: options.debug,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logError(message);\n // Cleanup preview server if running\n if (previewCleanup) {\n previewCleanup();\n }\n process.exit(1);\n } finally {\n // Cleanup preview server if running (for normal exit)\n if (previewCleanup) {\n previewCleanup();\n }\n }\n });\n\n program\n .command('generate')\n .description('Generate test from natural language')\n .argument('<description>', 'Natural language description of the test')\n .option('--output <file>', 'Output file path')\n .option('--platform <platform>', 'Target platform', 'web')\n .option('--baseUrl <url>', 'Base URL for the app')\n .option('--pagesDir <dir>', 'Pages directory for source scanning')\n .option('--componentsDir <dir>', 'Components directory for source scanning')\n .option('--no-source', 'Disable source scanning')\n .action(async (description: string, options: {\n output?: string;\n platform?: 'web' | 'android' | 'ios';\n baseUrl?: string;\n pagesDir?: string;\n componentsDir?: string;\n source?: boolean;\n }) => {\n try {\n await generateCommand(description, {\n output: options.output,\n platform: options.platform,\n baseUrl: options.baseUrl,\n pagesDir: options.pagesDir,\n componentsDir: options.componentsDir,\n noSource: !options.source,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logError(message);\n process.exitCode = 1;\n }\n });\n\n program\n .command('cleanup:list')\n .description('List pending failed cleanup operations from previous test runs')\n .action(async () => {\n try {\n const failedCleanups = await loadFailedCleanups(process.cwd());\n if (failedCleanups.length === 0) {\n console.log('No failed cleanups found.');\n return;\n }\n\n console.log(`\\nFound ${failedCleanups.length} failed cleanup(s):\\n`);\n\n for (const failed of failedCleanups) {\n console.log(`Session: ${failed.sessionId}`);\n console.log(` Timestamp: ${failed.timestamp}`);\n console.log(` Provider: ${failed.providerConfig.provider}`);\n console.log(` Resources: ${failed.resources.length}`);\n for (const resource of failed.resources) {\n console.log(` - ${resource.type}:${resource.id}`);\n }\n console.log(` Errors: ${failed.errors.length}`);\n for (const error of failed.errors.slice(0, 3)) {\n console.log(` - ${error}`);\n }\n if (failed.errors.length > 3) {\n console.log(` ... and ${failed.errors.length - 3} more`);\n }\n console.log('');\n }\n\n console.log(`Use 'intellitester cleanup:retry' to retry these cleanups.\\n`);\n } catch (error) {\n logError(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n program\n .command('cleanup:retry')\n .description('Retry failed cleanup operations from previous test runs')\n .action(async () => {\n try {\n // Load config to get provider credentials\n const hasConfigFile = await fileExists(CONFIG_FILENAME);\n if (!hasConfigFile) {\n throw new Error(`No ${CONFIG_FILENAME} found. Cannot retry cleanup without provider configuration.`);\n }\n\n const config = await loadIntellitesterConfig(CONFIG_FILENAME);\n\n // Load failed cleanups\n const failedCleanups = await loadFailedCleanups(process.cwd());\n if (failedCleanups.length === 0) {\n console.log('No failed cleanups to retry.');\n return;\n }\n\n console.log(`Found ${failedCleanups.length} failed cleanup(s) to retry.`);\n\n for (const failed of failedCleanups) {\n console.log(`\\nRetrying cleanup for session ${failed.sessionId}...`);\n console.log(` Provider: ${failed.providerConfig.provider}`);\n console.log(` Resources: ${failed.resources.length}`);\n\n // Build cleanup config based on the provider type\n const provider = failed.providerConfig.provider;\n const cleanupConfig: CleanupConfig = {\n provider,\n parallel: false,\n retries: 3,\n };\n\n // Add provider-specific config with credentials from current config\n // Use type assertion since config is extensible\n const configAny = config as any;\n\n if (provider === 'appwrite') {\n if (!config.appwrite?.apiKey) {\n console.log(` ✗ Skipping: Appwrite API key not configured in ${CONFIG_FILENAME}`);\n continue;\n }\n cleanupConfig.appwrite = {\n endpoint: failed.providerConfig.endpoint as string,\n projectId: failed.providerConfig.projectId as string,\n apiKey: config.appwrite.apiKey,\n };\n } else if (provider === 'postgres') {\n const pgConfig = configAny.postgres;\n if (!pgConfig?.connectionString && !pgConfig?.password) {\n console.log(` ✗ Skipping: Postgres credentials not configured in ${CONFIG_FILENAME}`);\n continue;\n }\n // Rebuild connection string with password from config\n if (pgConfig.connectionString) {\n cleanupConfig.postgres = {\n connectionString: pgConfig.connectionString,\n };\n } else {\n const host = failed.providerConfig.host as string;\n const port = failed.providerConfig.port as number;\n const database = failed.providerConfig.database as string;\n const user = failed.providerConfig.user as string;\n const password = pgConfig.password;\n cleanupConfig.postgres = {\n connectionString: `postgresql://${user}:${password}@${host}:${port}/${database}`,\n };\n }\n } else if (provider === 'mysql') {\n const mysqlConfig = configAny.mysql;\n if (!mysqlConfig?.password) {\n console.log(` ✗ Skipping: MySQL password not configured in ${CONFIG_FILENAME}`);\n continue;\n }\n cleanupConfig.mysql = {\n host: failed.providerConfig.host as string,\n port: failed.providerConfig.port as number,\n user: failed.providerConfig.user as string,\n password: mysqlConfig.password,\n database: failed.providerConfig.database as string,\n };\n } else if (provider === 'sqlite') {\n const sqliteConfig = configAny.sqlite;\n if (!sqliteConfig?.database && !failed.providerConfig.database) {\n console.log(` ✗ Skipping: SQLite database path not configured`);\n continue;\n }\n cleanupConfig.sqlite = {\n database: (failed.providerConfig.database as string) || sqliteConfig?.database,\n };\n } else {\n console.log(` ✗ Skipping: Unknown provider \"${provider}\"`);\n continue;\n }\n\n try {\n // Load cleanup handlers for this provider\n const { handlers, typeMappings } = await loadCleanupHandlers(\n cleanupConfig,\n process.cwd()\n );\n\n // Execute cleanup\n const result = await executeCleanup(\n failed.resources,\n handlers,\n typeMappings,\n {\n parallel: false,\n retries: 3,\n cwd: process.cwd(),\n // Don't save failed cleanups again during retry\n }\n );\n\n if (result.success) {\n console.log(` ✓ Successfully cleaned up ${result.deleted.length} resources`);\n await removeFailedCleanup(failed.sessionId, process.cwd());\n } else {\n console.log(` ⚠ Partial cleanup: ${result.deleted.length} deleted, ${result.failed.length} failed`);\n for (const failedResource of result.failed) {\n console.log(` ✗ ${failedResource}`);\n }\n }\n } catch (error) {\n console.log(` ✗ Error during cleanup: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n // Summary\n const remaining = await loadFailedCleanups(process.cwd());\n if (remaining.length === 0) {\n console.log('\\n✓ All failed cleanups have been resolved.');\n } else {\n console.log(`\\n⚠ ${remaining.length} failed cleanup(s) still remaining.`);\n console.log(` Use 'intellitester cleanup:list' to see details.`);\n }\n } catch (error) {\n logError(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n await program.parseAsync(process.argv);\n};\n\nmain();\n"]}
|