qagentic-reporter 0.1.38 → 0.1.39

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.
@@ -1044,28 +1044,21 @@ var QAgenticCypressReporter = class {
1044
1044
  continue;
1045
1045
  }
1046
1046
  const testFileName = test.invocationDetails.relativeFile.replace(/\.ts$/, "");
1047
- const testName = test.title[test.title.length - 1];
1048
- const fullTestTitle = test.title.join(", ");
1047
+ const fullTestTitle = test.title.join(" -- ");
1049
1048
  const screenshotPaths = [
1050
- // Mochawesome report assets location with full title
1049
+ // Mochawesome report assets location - most recent screenshot (no attempt number)
1051
1050
  path2__namespace.join(
1052
1051
  process.cwd(),
1053
1052
  "cypress/reports/assets",
1054
1053
  testFileName,
1055
- `${fullTestTitle} -- ${testName} (failed).png`
1054
+ `${fullTestTitle} (failed).png`
1056
1055
  ),
1057
- // Alternative: without full title path
1056
+ // With attempt number (fallback)
1058
1057
  path2__namespace.join(
1059
1058
  process.cwd(),
1060
1059
  "cypress/reports/assets",
1061
1060
  testFileName,
1062
- `${testName} (failed).png`
1063
- ),
1064
- // Legacy cypress/screenshots location
1065
- path2__namespace.join(
1066
- process.cwd(),
1067
- "cypress/screenshots",
1068
- `${testFileName} -- ${testName} (failed).png`
1061
+ `${fullTestTitle} (failed) (attempt 1).png`
1069
1062
  )
1070
1063
  ];
1071
1064
  let screenshotFound = false;
@@ -1082,7 +1075,7 @@ var QAgenticCypressReporter = class {
1082
1075
  size: screenshotContent.length,
1083
1076
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
1084
1077
  });
1085
- console.log("[QAagentic] Added screenshot for:", testName);
1078
+ console.log("[QAagentic] Added screenshot for:", fullTestTitle);
1086
1079
  screenshotFound = true;
1087
1080
  break;
1088
1081
  } catch (err) {
@@ -1091,7 +1084,7 @@ var QAgenticCypressReporter = class {
1091
1084
  }
1092
1085
  }
1093
1086
  if (!screenshotFound) {
1094
- console.log("[QAagentic] No screenshot found for:", testName);
1087
+ console.log("[QAagentic] No screenshot found for:", fullTestTitle);
1095
1088
  }
1096
1089
  }
1097
1090
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/config.ts","../../src/core/status.ts","../../src/core/reporter.ts","../../src/core/step.ts","../../src/core/severity.ts","../../src/core/decorators.ts","../../src/core/attachments.ts","../../src/cypress/simple-setup.ts","../../src/cypress/index.ts"],"names":["fs","path","Status","fs2","path2","step","axios","uuidv4","Severity","fs3","path3","fs4"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Configuration management for QAagentic SDK.\r\n */\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\n/**\r\n * API reporting configuration.\r\n */\r\nexport interface APIConfig {\r\n enabled: boolean;\r\n url: string;\r\n key?: string;\r\n timeout: number;\r\n retryCount: number;\r\n batchSize: number;\r\n}\r\n\r\n/**\r\n * Local file reporting configuration.\r\n */\r\nexport interface LocalConfig {\r\n enabled: boolean;\r\n outputDir: string;\r\n formats: ('json' | 'html' | 'junit')[];\r\n cleanOnStart: boolean;\r\n}\r\n\r\n/**\r\n * Feature flags configuration.\r\n */\r\nexport interface FeaturesConfig {\r\n aiAnalysis: boolean;\r\n failureClustering: boolean;\r\n flakyDetection: boolean;\r\n screenshots: 'always' | 'on_failure' | 'never';\r\n videos: 'always' | 'on_failure' | 'never';\r\n consoleOutput: boolean;\r\n}\r\n\r\n/**\r\n * Labels configuration.\r\n */\r\nexport interface LabelsConfig {\r\n team?: string;\r\n component?: string;\r\n environment?: string;\r\n custom: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Main configuration for QAagentic SDK.\r\n */\r\nexport interface QAgenticConfig {\r\n projectName: string;\r\n environment: string;\r\n api: APIConfig;\r\n local: LocalConfig;\r\n features: FeaturesConfig;\r\n labels: LabelsConfig;\r\n}\r\n\r\n/**\r\n * Default configuration values.\r\n */\r\nconst defaultConfig: QAgenticConfig = {\r\n projectName: 'default',\r\n environment: 'local',\r\n api: {\r\n enabled: true,\r\n url: 'http://localhost:8080',\r\n timeout: 30000,\r\n retryCount: 3,\r\n batchSize: 100,\r\n },\r\n local: {\r\n enabled: true,\r\n outputDir: './qagentic-results',\r\n formats: ['json', 'html'],\r\n cleanOnStart: true,\r\n },\r\n features: {\r\n aiAnalysis: true,\r\n failureClustering: true,\r\n flakyDetection: true,\r\n screenshots: 'on_failure',\r\n videos: 'on_failure',\r\n consoleOutput: true,\r\n },\r\n labels: {\r\n custom: {},\r\n },\r\n};\r\n\r\n// Global configuration instance\r\nlet globalConfig: QAgenticConfig = { ...defaultConfig };\r\n\r\n/**\r\n * Load configuration from environment variables.\r\n */\r\nfunction loadFromEnv(config: QAgenticConfig): QAgenticConfig {\r\n const env = process.env;\r\n\r\n // Project settings\r\n if (env.QAGENTIC_PROJECT_NAME) {\r\n config.projectName = env.QAGENTIC_PROJECT_NAME;\r\n }\r\n if (env.QAGENTIC_ENVIRONMENT) {\r\n config.environment = env.QAGENTIC_ENVIRONMENT;\r\n }\r\n\r\n // API settings\r\n if (env.QAGENTIC_API_ENABLED !== undefined) {\r\n config.api.enabled = env.QAGENTIC_API_ENABLED.toLowerCase() === 'true';\r\n }\r\n if (env.QAGENTIC_API_URL) {\r\n config.api.url = env.QAGENTIC_API_URL;\r\n }\r\n if (env.QAGENTIC_API_KEY) {\r\n config.api.key = env.QAGENTIC_API_KEY;\r\n }\r\n\r\n // Local settings\r\n if (env.QAGENTIC_LOCAL_ENABLED !== undefined) {\r\n config.local.enabled = env.QAGENTIC_LOCAL_ENABLED.toLowerCase() === 'true';\r\n }\r\n if (env.QAGENTIC_OUTPUT_DIR) {\r\n config.local.outputDir = env.QAGENTIC_OUTPUT_DIR;\r\n }\r\n if (env.QAGENTIC_OUTPUT_FORMAT) {\r\n config.local.formats = env.QAGENTIC_OUTPUT_FORMAT.split(',').map(\r\n (f) => f.trim() as 'json' | 'html' | 'junit'\r\n );\r\n }\r\n\r\n // Feature flags\r\n if (env.QAGENTIC_AI_ANALYSIS !== undefined) {\r\n config.features.aiAnalysis = env.QAGENTIC_AI_ANALYSIS.toLowerCase() === 'true';\r\n }\r\n if (env.QAGENTIC_SCREENSHOTS) {\r\n config.features.screenshots = env.QAGENTIC_SCREENSHOTS as 'always' | 'on_failure' | 'never';\r\n }\r\n if (env.QAGENTIC_VIDEOS) {\r\n config.features.videos = env.QAGENTIC_VIDEOS as 'always' | 'on_failure' | 'never';\r\n }\r\n\r\n // Labels\r\n if (env.QAGENTIC_TEAM) {\r\n config.labels.team = env.QAGENTIC_TEAM;\r\n }\r\n if (env.QAGENTIC_COMPONENT) {\r\n config.labels.component = env.QAGENTIC_COMPONENT;\r\n }\r\n\r\n return config;\r\n}\r\n\r\n/**\r\n * Load configuration from YAML file.\r\n */\r\nfunction loadFromFile(filePath: string, config: QAgenticConfig): QAgenticConfig {\r\n try {\r\n if (!fs.existsSync(filePath)) {\r\n return config;\r\n }\r\n\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n // Simple YAML parsing for common cases\r\n const yaml = require('yaml');\r\n const data = yaml.parse(content);\r\n\r\n if (data.project) {\r\n if (data.project.name) config.projectName = data.project.name;\r\n if (data.project.environment) config.environment = data.project.environment;\r\n }\r\n\r\n if (data.reporting?.api) {\r\n if (data.reporting.api.enabled !== undefined) config.api.enabled = data.reporting.api.enabled;\r\n if (data.reporting.api.url) config.api.url = data.reporting.api.url;\r\n if (data.reporting.api.key) config.api.key = data.reporting.api.key;\r\n }\r\n\r\n if (data.reporting?.local) {\r\n if (data.reporting.local.enabled !== undefined)\r\n config.local.enabled = data.reporting.local.enabled;\r\n if (data.reporting.local.output_dir) config.local.outputDir = data.reporting.local.output_dir;\r\n if (data.reporting.local.formats) config.local.formats = data.reporting.local.formats;\r\n }\r\n\r\n if (data.features) {\r\n if (data.features.ai_analysis !== undefined)\r\n config.features.aiAnalysis = data.features.ai_analysis;\r\n if (data.features.failure_clustering !== undefined)\r\n config.features.failureClustering = data.features.failure_clustering;\r\n if (data.features.flaky_detection !== undefined)\r\n config.features.flakyDetection = data.features.flaky_detection;\r\n if (data.features.screenshots) config.features.screenshots = data.features.screenshots;\r\n if (data.features.videos) config.features.videos = data.features.videos;\r\n }\r\n\r\n if (data.labels) {\r\n if (data.labels.team) config.labels.team = data.labels.team;\r\n if (data.labels.component) config.labels.component = data.labels.component;\r\n config.labels.custom = { ...config.labels.custom, ...data.labels };\r\n }\r\n } catch (error) {\r\n console.warn(`Failed to load config from ${filePath}:`, error);\r\n }\r\n\r\n return config;\r\n}\r\n\r\n/**\r\n * Auto-discover configuration from common locations.\r\n */\r\nfunction autoDiscover(): QAgenticConfig {\r\n const config = { ...defaultConfig };\r\n const cwd = process.cwd();\r\n\r\n const searchPaths = [\r\n path.join(cwd, 'qagentic.yaml'),\r\n path.join(cwd, 'qagentic.yml'),\r\n path.join(cwd, '.qagentic.yaml'),\r\n path.join(cwd, '.qagentic.yml'),\r\n ];\r\n\r\n for (const filePath of searchPaths) {\r\n if (fs.existsSync(filePath)) {\r\n loadFromFile(filePath, config);\r\n break;\r\n }\r\n }\r\n\r\n return loadFromEnv(config);\r\n}\r\n\r\n/**\r\n * Configure QAagentic SDK.\r\n */\r\nexport function configure(options: Partial<QAgenticConfig> & {\r\n projectName?: string;\r\n apiUrl?: string;\r\n apiKey?: string;\r\n outputDir?: string;\r\n} = {}): QAgenticConfig {\r\n globalConfig = autoDiscover();\r\n\r\n if (options.projectName) {\r\n globalConfig.projectName = options.projectName;\r\n }\r\n if (options.environment) {\r\n globalConfig.environment = options.environment;\r\n }\r\n if (options.apiUrl) {\r\n globalConfig.api.url = options.apiUrl;\r\n }\r\n if (options.apiKey) {\r\n globalConfig.api.key = options.apiKey;\r\n }\r\n if (options.outputDir) {\r\n globalConfig.local.outputDir = options.outputDir;\r\n }\r\n\r\n // Merge nested configs\r\n if (options.api) {\r\n globalConfig.api = { ...globalConfig.api, ...options.api };\r\n }\r\n if (options.local) {\r\n globalConfig.local = { ...globalConfig.local, ...options.local };\r\n }\r\n if (options.features) {\r\n globalConfig.features = { ...globalConfig.features, ...options.features };\r\n }\r\n if (options.labels) {\r\n globalConfig.labels = { ...globalConfig.labels, ...options.labels };\r\n }\r\n\r\n return globalConfig;\r\n}\r\n\r\n/**\r\n * Get the current configuration.\r\n */\r\nexport function getConfig(): QAgenticConfig {\r\n return globalConfig;\r\n}\r\n\r\n/**\r\n * Reset configuration to defaults.\r\n */\r\nexport function resetConfig(): void {\r\n globalConfig = { ...defaultConfig };\r\n}\r\n","/**\r\n * Test execution status.\r\n */\r\n\r\nexport enum Status {\r\n PASSED = 'passed',\r\n FAILED = 'failed',\r\n BROKEN = 'broken',\r\n SKIPPED = 'skipped',\r\n PENDING = 'pending',\r\n RUNNING = 'running',\r\n UNKNOWN = 'unknown',\r\n}\r\n\r\n/**\r\n * Check if status represents a successful outcome.\r\n */\r\nexport function isSuccessful(status: Status): boolean {\r\n return status === Status.PASSED;\r\n}\r\n\r\n/**\r\n * Check if status represents a failure.\r\n */\r\nexport function isFailure(status: Status): boolean {\r\n return status === Status.FAILED || status === Status.BROKEN;\r\n}\r\n\r\n/**\r\n * Parse status from string.\r\n */\r\nexport function parseStatus(value: string): Status {\r\n const normalized = value.toLowerCase();\r\n switch (normalized) {\r\n case 'passed':\r\n case 'pass':\r\n case 'success':\r\n return Status.PASSED;\r\n case 'failed':\r\n case 'fail':\r\n case 'failure':\r\n return Status.FAILED;\r\n case 'broken':\r\n case 'error':\r\n return Status.BROKEN;\r\n case 'skipped':\r\n case 'skip':\r\n case 'pending':\r\n return Status.SKIPPED;\r\n case 'running':\r\n return Status.RUNNING;\r\n default:\r\n return Status.UNKNOWN;\r\n }\r\n}\r\n","/**\r\n * Reporter classes for outputting test results to various destinations.\r\n */\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport axios from 'axios';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { getConfig, QAgenticConfig } from './config';\r\nimport { Status } from './status';\r\nimport type { TestResult, TestRunResult, StepResult } from './types';\r\n\r\n/**\r\n * Base reporter interface.\r\n */\r\nexport interface BaseReporter {\r\n startRun(run: TestRunResult): void | Promise<void>;\r\n endRun(run: TestRunResult): void | Promise<void>;\r\n reportTest(test: TestResult): void | Promise<void>;\r\n}\r\n\r\n/**\r\n * Console reporter with colored output.\r\n */\r\nexport class ConsoleReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n }\r\n\r\n startRun(run: TestRunResult): void {\r\n console.log('\\n' + '='.repeat(60));\r\n console.log(`🚀 QAagentic Test Run - ${run.projectName}`);\r\n console.log(`Environment: ${run.environment}`);\r\n console.log('='.repeat(60) + '\\n');\r\n }\r\n\r\n endRun(run: TestRunResult): void {\r\n const icon = run.failed === 0 ? '✅' : '❌';\r\n console.log('\\n' + '='.repeat(60));\r\n console.log(`${icon} Test Run Complete - ${run.passRate.toFixed(1)}% Pass Rate`);\r\n console.log(`Passed: ${run.passed} | Failed: ${run.failed} | Skipped: ${run.skipped}`);\r\n console.log('='.repeat(60) + '\\n');\r\n }\r\n\r\n reportTest(test: TestResult): void {\r\n if (!this.config.features.consoleOutput) return;\r\n\r\n const symbols: Record<Status, string> = {\r\n [Status.PASSED]: '✓',\r\n [Status.FAILED]: '✗',\r\n [Status.BROKEN]: '!',\r\n [Status.SKIPPED]: '○',\r\n [Status.PENDING]: '…',\r\n [Status.RUNNING]: '→',\r\n [Status.UNKNOWN]: '?',\r\n };\r\n\r\n const symbol = symbols[test.status as Status] || '?';\r\n console.log(` ${symbol} ${test.name}`);\r\n\r\n if (test.errorMessage) {\r\n console.log(` Error: ${test.errorMessage.slice(0, 100)}...`);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * JSON file reporter.\r\n */\r\nexport class JSONReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n private outputDir: string;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n this.outputDir = this.config.local.outputDir;\r\n }\r\n\r\n startRun(run: TestRunResult): void {\r\n // Create output directory\r\n if (!fs.existsSync(this.outputDir)) {\r\n fs.mkdirSync(this.outputDir, { recursive: true });\r\n }\r\n\r\n // Clean previous results if configured\r\n if (this.config.local.cleanOnStart) {\r\n const files = fs.readdirSync(this.outputDir);\r\n for (const file of files) {\r\n if (file.endsWith('.json')) {\r\n fs.unlinkSync(path.join(this.outputDir, file));\r\n }\r\n }\r\n }\r\n }\r\n\r\n endRun(run: TestRunResult): void {\r\n if (!this.config.local.enabled || !this.config.local.formats.includes('json')) {\r\n return;\r\n }\r\n\r\n // Write run summary\r\n const runFile = path.join(this.outputDir, 'run.json');\r\n fs.writeFileSync(runFile, JSON.stringify(this.serializeRun(run), null, 2));\r\n\r\n // Write individual test results\r\n const testsDir = path.join(this.outputDir, 'tests');\r\n if (!fs.existsSync(testsDir)) {\r\n fs.mkdirSync(testsDir, { recursive: true });\r\n }\r\n\r\n for (const test of run.tests) {\r\n const testFile = path.join(testsDir, `${test.id}.json`);\r\n fs.writeFileSync(testFile, JSON.stringify(this.serializeTest(test), null, 2));\r\n }\r\n }\r\n\r\n reportTest(_test: TestResult): void {\r\n // Tests are written at end\r\n }\r\n\r\n private serializeRun(run: TestRunResult): Record<string, unknown> {\r\n return {\r\n ...run,\r\n startTime: run.startTime?.toISOString(),\r\n endTime: run.endTime?.toISOString(),\r\n tests: run.tests.map((t) => this.serializeTest(t)),\r\n };\r\n }\r\n\r\n private serializeTest(test: TestResult): Record<string, unknown> {\r\n return {\r\n ...test,\r\n startTime: test.startTime?.toISOString(),\r\n endTime: test.endTime?.toISOString(),\r\n steps: test.steps.map((s) => this.serializeStep(s)),\r\n };\r\n }\r\n\r\n private serializeStep(step: StepResult): Record<string, unknown> {\r\n return {\r\n ...step,\r\n startTime: step.startTime?.toISOString(),\r\n endTime: step.endTime?.toISOString(),\r\n children: step.children.map((c) => this.serializeStep(c)),\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * JUnit XML reporter for CI/CD compatibility.\r\n */\r\nexport class JUnitReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n private outputDir: string;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n this.outputDir = this.config.local.outputDir;\r\n }\r\n\r\n startRun(_run: TestRunResult): void {\r\n if (!fs.existsSync(this.outputDir)) {\r\n fs.mkdirSync(this.outputDir, { recursive: true });\r\n }\r\n }\r\n\r\n endRun(run: TestRunResult): void {\r\n if (!this.config.local.enabled || !this.config.local.formats.includes('junit')) {\r\n return;\r\n }\r\n\r\n const xml = this.generateXml(run);\r\n const junitFile = path.join(this.outputDir, 'junit.xml');\r\n fs.writeFileSync(junitFile, xml);\r\n }\r\n\r\n reportTest(_test: TestResult): void {\r\n // Tests are written at end\r\n }\r\n\r\n private generateXml(run: TestRunResult): string {\r\n const escape = (str: string) =>\r\n str\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;');\r\n\r\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\r\n xml += `<testsuite name=\"${escape(run.projectName)}\" `;\r\n xml += `tests=\"${run.total}\" `;\r\n xml += `failures=\"${run.failed}\" `;\r\n xml += `errors=\"${run.broken}\" `;\r\n xml += `skipped=\"${run.skipped}\" `;\r\n xml += `time=\"${(run.durationMs / 1000).toFixed(3)}\" `;\r\n xml += `timestamp=\"${run.startTime?.toISOString() || ''}\">\\n`;\r\n\r\n for (const test of run.tests) {\r\n xml += ` <testcase name=\"${escape(test.name)}\" `;\r\n xml += `classname=\"${escape(test.fullName)}\" `;\r\n xml += `time=\"${(test.durationMs / 1000).toFixed(3)}\"`;\r\n\r\n if (test.status === Status.PASSED) {\r\n xml += '/>\\n';\r\n } else if (test.status === Status.FAILED) {\r\n xml += '>\\n';\r\n xml += ` <failure message=\"${escape(test.errorMessage || 'Test failed')}\" `;\r\n xml += `type=\"${escape(test.errorType || 'AssertionError')}\">`;\r\n if (test.stackTrace) {\r\n xml += escape(test.stackTrace);\r\n }\r\n xml += '</failure>\\n';\r\n xml += ' </testcase>\\n';\r\n } else if (test.status === Status.BROKEN) {\r\n xml += '>\\n';\r\n xml += ` <error message=\"${escape(test.errorMessage || 'Test error')}\" `;\r\n xml += `type=\"${escape(test.errorType || 'Error')}\">`;\r\n if (test.stackTrace) {\r\n xml += escape(test.stackTrace);\r\n }\r\n xml += '</error>\\n';\r\n xml += ' </testcase>\\n';\r\n } else if (test.status === Status.SKIPPED) {\r\n xml += '>\\n';\r\n xml += ` <skipped${test.errorMessage ? ` message=\"${escape(test.errorMessage)}\"` : ''}/>\\n`;\r\n xml += ' </testcase>\\n';\r\n } else {\r\n xml += '/>\\n';\r\n }\r\n }\r\n\r\n xml += '</testsuite>\\n';\r\n return xml;\r\n }\r\n}\r\n\r\n/**\r\n * API reporter that sends results to QAagentic server.\r\n */\r\nexport class APIReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n private batch: TestResult[] = [];\r\n private currentRun?: TestRunResult;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n }\r\n\r\n async startRun(run: TestRunResult): Promise<void> {\r\n if (!this.config.api.enabled) {\r\n console.log('[APIReporter] API reporting disabled');\r\n return;\r\n }\r\n\r\n this.currentRun = run;\r\n this.batch = [];\r\n\r\n try {\r\n console.log('[APIReporter] Starting test run:', run.id);\r\n const url = `${this.config.api.url}/api/v1/runs`;\r\n console.log('[APIReporter] POST to:', url);\r\n \r\n const response = await axios.post(\r\n url,\r\n {\r\n id: run.id,\r\n name: run.name,\r\n project_name: run.projectName,\r\n environment: run.environment,\r\n start_time: run.startTime?.toISOString(),\r\n labels: run.labels,\r\n ci_build_id: run.ciBuildId,\r\n branch: run.branch,\r\n commit_hash: run.commitHash,\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.config.api.key || '',\r\n 'X-Project': this.config.projectName,\r\n },\r\n timeout: this.config.api.timeout,\r\n }\r\n );\r\n console.log('[APIReporter] Test run started successfully:', response.status);\r\n } catch (error: any) {\r\n console.warn('[APIReporter] Failed to register run with API:');\r\n console.warn(' Error:', error.message);\r\n console.warn(' Status:', error.response?.status);\r\n console.warn(' Data:', error.response?.data);\r\n }\r\n }\r\n\r\n async endRun(run: TestRunResult): Promise<void> {\r\n if (!this.config.api.enabled) return;\r\n\r\n try {\r\n console.log('[APIReporter] endRun called, batch size:', this.batch.length);\r\n \r\n // Flush remaining batch - ALWAYS flush, even if batch is not full\r\n if (this.batch.length > 0) {\r\n console.log('[APIReporter] Flushing remaining', this.batch.length, 'test results');\r\n await this.flushBatch();\r\n console.log('[APIReporter] Batch flushed, waiting for processing...');\r\n await new Promise((resolve) => setTimeout(resolve, 1500));\r\n }\r\n\r\n console.log('[APIReporter] Finalizing run with test counts:', {\r\n total: run.total,\r\n passed: run.passed,\r\n failed: run.failed,\r\n broken: run.broken,\r\n skipped: run.skipped,\r\n });\r\n \r\n const patchData = {\r\n end_time: run.endTime?.toISOString(),\r\n duration_ms: run.durationMs,\r\n total: run.total,\r\n passed: run.passed,\r\n failed: run.failed,\r\n broken: run.broken,\r\n skipped: run.skipped,\r\n status: 'completed',\r\n };\r\n \r\n console.log('[APIReporter] PATCH to:', `${this.config.api.url}/api/v1/runs/${run.id}`);\r\n console.log('[APIReporter] PATCH data:', patchData);\r\n \r\n const response = await axios.patch(\r\n `${this.config.api.url}/api/v1/runs/${run.id}`,\r\n patchData,\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.config.api.key || '',\r\n 'X-Project': this.config.projectName,\r\n },\r\n timeout: this.config.api.timeout,\r\n }\r\n );\r\n console.log('[APIReporter] Run finalized successfully:', response.status);\r\n } catch (error: any) {\r\n console.warn('[APIReporter] Failed to finalize run with API:');\r\n console.warn(' Error:', error.message);\r\n console.warn(' Status:', error.response?.status);\r\n console.warn(' Data:', error.response?.data);\r\n }\r\n }\r\n\r\n async reportTest(test: TestResult): Promise<void> {\r\n console.log('[APIReporter] reportTest called for:', test.name, 'API enabled:', this.config.api.enabled);\r\n if (!this.config.api.enabled) {\r\n console.log('[APIReporter] API reporting disabled, skipping test report');\r\n return;\r\n }\r\n\r\n console.log('[APIReporter] Adding test to batch:', test.name, '- batch size:', this.batch.length + 1);\r\n this.batch.push(test);\r\n\r\n if (this.batch.length >= this.config.api.batchSize) {\r\n console.log('[APIReporter] Batch size reached, flushing batch');\r\n await this.flushBatch();\r\n } else {\r\n console.log('[APIReporter] Batch size:', this.batch.length, '/', this.config.api.batchSize);\r\n }\r\n }\r\n\r\n private async flushBatch(): Promise<void> {\r\n if (this.batch.length === 0 || !this.currentRun) return;\r\n\r\n try {\r\n console.log('[APIReporter] Flushing batch of', this.batch.length, 'test results');\r\n const response = await axios.post(\r\n `${this.config.api.url}/api/v1/runs/${this.currentRun.id}/results`,\r\n this.batch.map((t) => ({\r\n id: t.id,\r\n name: t.name,\r\n full_name: t.fullName,\r\n status: t.status,\r\n duration_ms: t.durationMs,\r\n start_time: t.startTime?.toISOString(),\r\n end_time: t.endTime?.toISOString(),\r\n file_path: t.filePath,\r\n error_message: t.errorMessage,\r\n stack_trace: t.stackTrace,\r\n error_type: t.errorType,\r\n attachments: t.attachments,\r\n })),\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.config.api.key || '',\r\n },\r\n timeout: this.config.api.timeout,\r\n }\r\n );\r\n console.log('[APIReporter] Batch flushed successfully:', response.status);\r\n } catch (error: any) {\r\n console.warn('[APIReporter] Failed to send test results to API:');\r\n console.warn(' Error:', error.message);\r\n console.warn(' Status:', error.response?.status);\r\n console.warn(' Data:', error.response?.data);\r\n } finally {\r\n this.batch = [];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Main reporter that coordinates multiple output destinations.\r\n */\r\nexport class QAgenticReporter {\r\n private static instance: QAgenticReporter | null = null;\r\n private config: QAgenticConfig;\r\n private reporters: BaseReporter[] = [];\r\n private currentRun: TestRunResult | null = null;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n\r\n console.log('[QAgenticReporter] Initializing with config:', {\r\n projectName: this.config.projectName,\r\n environment: this.config.environment,\r\n apiEnabled: this.config.api.enabled,\r\n apiUrl: this.config.api.url,\r\n });\r\n\r\n // Initialize reporters based on config\r\n if (this.config.features.consoleOutput) {\r\n this.reporters.push(new ConsoleReporter(this.config));\r\n console.log('[QAgenticReporter] Added ConsoleReporter');\r\n }\r\n\r\n if (this.config.local.enabled) {\r\n this.reporters.push(new JSONReporter(this.config));\r\n console.log('[QAgenticReporter] Added JSONReporter');\r\n if (this.config.local.formats.includes('junit')) {\r\n this.reporters.push(new JUnitReporter(this.config));\r\n console.log('[QAgenticReporter] Added JUnitReporter');\r\n }\r\n }\r\n\r\n if (this.config.api.enabled) {\r\n this.reporters.push(new APIReporter(this.config));\r\n console.log('[QAgenticReporter] Added APIReporter');\r\n }\r\n\r\n console.log('[QAgenticReporter] Initialization complete with', this.reporters.length, 'reporters');\r\n }\r\n\r\n /**\r\n * Get singleton instance.\r\n */\r\n static getInstance(config?: QAgenticConfig): QAgenticReporter {\r\n if (!QAgenticReporter.instance) {\r\n QAgenticReporter.instance = new QAgenticReporter(config);\r\n }\r\n return QAgenticReporter.instance;\r\n }\r\n\r\n /**\r\n * Reset singleton instance.\r\n */\r\n static reset(): void {\r\n QAgenticReporter.instance = null;\r\n }\r\n\r\n /**\r\n * Start a new test run.\r\n */\r\n async startRun(options: Partial<TestRunResult> = {}): Promise<TestRunResult> {\r\n this.currentRun = {\r\n id: options.id || uuidv4(),\r\n name: options.name || `run_${new Date().toISOString().replace(/[:.]/g, '')}`,\r\n projectName: options.projectName || this.config.projectName,\r\n environment: options.environment || this.config.environment,\r\n startTime: new Date(),\r\n durationMs: 0,\r\n tests: [],\r\n total: 0,\r\n passed: 0,\r\n failed: 0,\r\n broken: 0,\r\n skipped: 0,\r\n passRate: 0,\r\n labels: { ...this.config.labels.custom, ...options.labels },\r\n parameters: options.parameters || {},\r\n ciBuildId: options.ciBuildId,\r\n ciBuildUrl: options.ciBuildUrl,\r\n branch: options.branch,\r\n commitHash: options.commitHash,\r\n };\r\n\r\n for (const reporter of this.reporters) {\r\n await reporter.startRun(this.currentRun);\r\n }\r\n\r\n return this.currentRun;\r\n }\r\n\r\n /**\r\n * End the current test run.\r\n */\r\n async endRun(): Promise<TestRunResult | null> {\r\n if (!this.currentRun) return null;\r\n\r\n this.currentRun.endTime = new Date();\r\n this.currentRun.durationMs =\r\n this.currentRun.endTime.getTime() - (this.currentRun.startTime?.getTime() || 0);\r\n this.currentRun.passRate =\r\n this.currentRun.total > 0 ? (this.currentRun.passed / this.currentRun.total) * 100 : 0;\r\n\r\n for (const reporter of this.reporters) {\r\n await reporter.endRun(this.currentRun);\r\n }\r\n\r\n const run = this.currentRun;\r\n this.currentRun = null;\r\n return run;\r\n }\r\n\r\n /**\r\n * Report a test result.\r\n */\r\n async reportTest(test: TestResult): Promise<void> {\r\n if (!this.currentRun) {\r\n console.warn('[QAgenticReporter] No active run to report test');\r\n return;\r\n }\r\n\r\n this.currentRun.tests.push(test);\r\n this.currentRun.total++;\r\n\r\n switch (test.status) {\r\n case 'passed':\r\n this.currentRun.passed++;\r\n break;\r\n case 'failed':\r\n this.currentRun.failed++;\r\n break;\r\n case 'broken':\r\n this.currentRun.broken++;\r\n break;\r\n case 'skipped':\r\n this.currentRun.skipped++;\r\n break;\r\n }\r\n\r\n console.log('[QAgenticReporter] Test counts:', {\r\n total: this.currentRun.total,\r\n passed: this.currentRun.passed,\r\n failed: this.currentRun.failed,\r\n broken: this.currentRun.broken,\r\n skipped: this.currentRun.skipped,\r\n });\r\n\r\n for (const reporter of this.reporters) {\r\n await reporter.reportTest(test);\r\n }\r\n }\r\n\r\n /**\r\n * Get the current test run.\r\n */\r\n getCurrentRun(): TestRunResult | null {\r\n return this.currentRun;\r\n }\r\n}\r\n\r\n/**\r\n * Get the global reporter instance.\r\n */\r\nexport function getReporter(config?: QAgenticConfig): QAgenticReporter {\r\n return QAgenticReporter.getInstance(config);\r\n}\r\n","/**\r\n * Step context manager for defining test steps.\r\n */\r\n\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { Status } from './status';\r\nimport type { StepResult, Attachment } from './types';\r\n\r\n// Current step stack (thread-local equivalent for Node.js)\r\nlet currentSteps: Step[] = [];\r\n\r\n/**\r\n * Get the current step stack.\r\n */\r\nexport function getCurrentSteps(): Step[] {\r\n return currentSteps;\r\n}\r\n\r\n/**\r\n * Get the current active step.\r\n */\r\nexport function getCurrentStep(): Step | undefined {\r\n return currentSteps[currentSteps.length - 1];\r\n}\r\n\r\n/**\r\n * Clear the step stack.\r\n */\r\nexport function clearSteps(): void {\r\n currentSteps = [];\r\n}\r\n\r\n/**\r\n * Represents a test step with timing and status tracking.\r\n */\r\nexport class Step {\r\n readonly id: string;\r\n readonly name: string;\r\n readonly description?: string;\r\n status: Status = Status.PENDING;\r\n startTime?: Date;\r\n endTime?: Date;\r\n durationMs: number = 0;\r\n error?: string;\r\n errorTrace?: string;\r\n attachments: Attachment[] = [];\r\n children: Step[] = [];\r\n parameters: Record<string, unknown> = {};\r\n\r\n constructor(name: string, description?: string, parameters?: Record<string, unknown>) {\r\n this.id = uuidv4();\r\n this.name = name;\r\n this.description = description;\r\n this.parameters = parameters || {};\r\n }\r\n\r\n /**\r\n * Start the step.\r\n */\r\n start(): this {\r\n this.startTime = new Date();\r\n this.status = Status.RUNNING;\r\n currentSteps.push(this);\r\n return this;\r\n }\r\n\r\n /**\r\n * End the step.\r\n */\r\n end(error?: Error): this {\r\n this.endTime = new Date();\r\n if (this.startTime) {\r\n this.durationMs = this.endTime.getTime() - this.startTime.getTime();\r\n }\r\n\r\n // Remove from stack\r\n const index = currentSteps.indexOf(this);\r\n if (index > -1) {\r\n currentSteps.splice(index, 1);\r\n }\r\n\r\n // Add to parent if exists\r\n const parent = getCurrentStep();\r\n if (parent) {\r\n parent.children.push(this);\r\n }\r\n\r\n if (error) {\r\n this.status = Status.FAILED;\r\n this.error = error.message;\r\n this.errorTrace = error.stack;\r\n } else {\r\n this.status = Status.PASSED;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Attach data to this step.\r\n */\r\n attach(data: string | Buffer, name: string, type: string = 'text/plain'): this {\r\n const content = typeof data === 'string' ? data : data.toString('base64');\r\n this.attachments.push({\r\n id: uuidv4(),\r\n name,\r\n type,\r\n content,\r\n size: typeof data === 'string' ? data.length : data.length,\r\n timestamp: new Date().toISOString(),\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Attach a screenshot.\r\n */\r\n attachScreenshot(path: string, name: string = 'Screenshot'): this {\r\n return this.attach(path, name, 'image/png');\r\n }\r\n\r\n /**\r\n * Attach JSON data.\r\n */\r\n attachJson(data: unknown, name: string = 'JSON Data'): this {\r\n return this.attach(JSON.stringify(data, null, 2), name, 'application/json');\r\n }\r\n\r\n /**\r\n * Set a step parameter.\r\n */\r\n setParameter(name: string, value: unknown): this {\r\n this.parameters[name] = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * Convert to result object.\r\n */\r\n toResult(): StepResult {\r\n return {\r\n id: this.id,\r\n name: this.name,\r\n status: this.status,\r\n startTime: this.startTime,\r\n endTime: this.endTime,\r\n durationMs: this.durationMs,\r\n error: this.error,\r\n errorTrace: this.errorTrace,\r\n attachments: this.attachments,\r\n children: this.children.map((c) => c.toResult()),\r\n parameters: this.parameters,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Execute a function within a step context.\r\n *\r\n * @example\r\n * ```typescript\r\n * step('Login to application', () => {\r\n * // test code\r\n * });\r\n *\r\n * await step('Async operation', async () => {\r\n * await someAsyncOperation();\r\n * });\r\n * ```\r\n */\r\nexport function step<T>(name: string, fn: () => T): T;\r\nexport function step<T>(name: string, description: string, fn: () => T): T;\r\nexport function step<T>(\r\n name: string,\r\n descriptionOrFn: string | (() => T),\r\n fn?: () => T\r\n): T {\r\n const description = typeof descriptionOrFn === 'string' ? descriptionOrFn : undefined;\r\n const callback = typeof descriptionOrFn === 'function' ? descriptionOrFn : fn!;\r\n\r\n const s = new Step(name, description);\r\n s.start();\r\n\r\n try {\r\n const result = callback();\r\n\r\n // Handle promises\r\n if (result instanceof Promise) {\r\n return result\r\n .then((value) => {\r\n s.end();\r\n return value;\r\n })\r\n .catch((error) => {\r\n s.end(error);\r\n throw error;\r\n }) as T;\r\n }\r\n\r\n s.end();\r\n return result;\r\n } catch (error) {\r\n s.end(error as Error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Create a step without executing (for manual control).\r\n */\r\nexport function createStep(name: string, description?: string): Step {\r\n return new Step(name, description);\r\n}\r\n","/**\r\n * Test severity levels - compatible with Allure.\r\n */\r\n\r\nexport enum Severity {\r\n BLOCKER = 'blocker',\r\n CRITICAL = 'critical',\r\n NORMAL = 'normal',\r\n MINOR = 'minor',\r\n TRIVIAL = 'trivial',\r\n}\r\n\r\n/**\r\n * Convert string to Severity enum.\r\n */\r\nexport function parseSeverity(value: string): Severity {\r\n const normalized = value.toLowerCase();\r\n switch (normalized) {\r\n case 'blocker':\r\n return Severity.BLOCKER;\r\n case 'critical':\r\n return Severity.CRITICAL;\r\n case 'minor':\r\n return Severity.MINOR;\r\n case 'trivial':\r\n return Severity.TRIVIAL;\r\n default:\r\n return Severity.NORMAL;\r\n }\r\n}\r\n","/**\r\n * Decorators for annotating tests with metadata.\r\n * Compatible with Allure-style annotations.\r\n */\r\n\r\nimport { Severity, parseSeverity } from './severity';\r\n\r\n// Metadata storage key\r\nconst QAGENTIC_METADATA = Symbol('qagentic_metadata');\r\n\r\n/**\r\n * Test metadata structure.\r\n */\r\nexport interface TestMetadata {\r\n labels: Record<string, unknown>;\r\n links: Array<{ url: string; name: string; type: string }>;\r\n attachments: unknown[];\r\n}\r\n\r\n/**\r\n * Get or create metadata for a test.\r\n */\r\nfunction getMetadata(target: unknown): TestMetadata {\r\n const obj = target as Record<symbol, TestMetadata>;\r\n if (!obj[QAGENTIC_METADATA]) {\r\n obj[QAGENTIC_METADATA] = {\r\n labels: {},\r\n links: [],\r\n attachments: [],\r\n };\r\n }\r\n return obj[QAGENTIC_METADATA];\r\n}\r\n\r\n/**\r\n * Add a label to test metadata.\r\n */\r\nfunction addLabel(name: string, value: unknown) {\r\n return function <T extends object>(target: T): T {\r\n const metadata = getMetadata(target);\r\n metadata.labels[name] = value;\r\n return target;\r\n };\r\n}\r\n\r\n/**\r\n * Mark test with a feature label.\r\n */\r\nexport function feature(name: string) {\r\n return addLabel('feature', name);\r\n}\r\n\r\n/**\r\n * Mark test with a user story label.\r\n */\r\nexport function story(name: string) {\r\n return addLabel('story', name);\r\n}\r\n\r\n/**\r\n * Mark test with an epic label.\r\n */\r\nexport function epic(name: string) {\r\n return addLabel('epic', name);\r\n}\r\n\r\n/**\r\n * Mark test with a severity level.\r\n */\r\nexport function severity(level: Severity | string) {\r\n const sev = typeof level === 'string' ? parseSeverity(level) : level;\r\n return addLabel('severity', sev);\r\n}\r\n\r\n/**\r\n * Add tags to a test.\r\n */\r\nexport function tag(...tags: string[]) {\r\n return function <T extends object>(target: T): T {\r\n const metadata = getMetadata(target);\r\n const existingTags = (metadata.labels['tags'] as string[]) || [];\r\n metadata.labels['tags'] = [...existingTags, ...tags];\r\n return target;\r\n };\r\n}\r\n\r\n/**\r\n * Add a custom label to a test.\r\n */\r\nexport function label(name: string, value: string) {\r\n return addLabel(name, value);\r\n}\r\n\r\n/**\r\n * Add a link to a test.\r\n */\r\nexport function link(url: string, name?: string, type: string = 'link') {\r\n return function <T extends object>(target: T): T {\r\n const metadata = getMetadata(target);\r\n metadata.links.push({\r\n url,\r\n name: name || url,\r\n type,\r\n });\r\n return target;\r\n };\r\n}\r\n\r\n/**\r\n * Link test to an issue tracker.\r\n */\r\nexport function issue(url: string, name?: string) {\r\n return link(url, name, 'issue');\r\n}\r\n\r\n/**\r\n * Link test to a test management system.\r\n */\r\nexport function testcase(url: string, name?: string) {\r\n return link(url, name, 'tms');\r\n}\r\n\r\n/**\r\n * Add a description to a test.\r\n */\r\nexport function description(text: string) {\r\n return addLabel('description', text);\r\n}\r\n\r\n/**\r\n * Set a custom title for the test.\r\n */\r\nexport function title(name: string) {\r\n return addLabel('title', name);\r\n}\r\n\r\n/**\r\n * Set the test owner.\r\n */\r\nexport function owner(name: string) {\r\n return addLabel('owner', name);\r\n}\r\n\r\n/**\r\n * Set the test layer.\r\n */\r\nexport function layer(name: string) {\r\n return addLabel('layer', name);\r\n}\r\n\r\n/**\r\n * Set the suite name.\r\n */\r\nexport function suite(name: string) {\r\n return addLabel('suite', name);\r\n}\r\n\r\n/**\r\n * Set the sub-suite name.\r\n */\r\nexport function subSuite(name: string) {\r\n return addLabel('subSuite', name);\r\n}\r\n\r\n/**\r\n * Set the parent suite name.\r\n */\r\nexport function parentSuite(name: string) {\r\n return addLabel('parentSuite', name);\r\n}\r\n\r\n/**\r\n * Get all metadata for a test.\r\n */\r\nexport function getTestMetadata(target: unknown): TestMetadata {\r\n return getMetadata(target);\r\n}\r\n","/**\r\n * Attachment utilities for adding files, screenshots, and data to test reports.\r\n */\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { getCurrentStep } from './step';\r\nimport type { Attachment } from './types';\r\n\r\n// Global attachment storage for current test\r\nlet testAttachments: Attachment[] = [];\r\n\r\n/**\r\n * Get current test attachments.\r\n */\r\nexport function getAttachments(): Attachment[] {\r\n return testAttachments;\r\n}\r\n\r\n/**\r\n * Clear attachments for new test.\r\n */\r\nexport function clearAttachments(): void {\r\n testAttachments = [];\r\n}\r\n\r\n/**\r\n * Attach data to the current test or step.\r\n */\r\nexport function attach(\r\n data: string | Buffer,\r\n name: string,\r\n type: string = 'text/plain',\r\n extension?: string\r\n): string {\r\n const attachmentId = uuidv4();\r\n\r\n let content: string;\r\n let size: number;\r\n\r\n if (Buffer.isBuffer(data)) {\r\n content = data.toString('base64');\r\n size = data.length;\r\n } else {\r\n content = data;\r\n size = data.length;\r\n }\r\n\r\n const attachment: Attachment = {\r\n id: attachmentId,\r\n name,\r\n type,\r\n extension,\r\n content,\r\n size,\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n // Add to current step if in step context\r\n const currentStep = getCurrentStep();\r\n if (currentStep) {\r\n currentStep.attachments.push(attachment);\r\n } else {\r\n // Add to test-level attachments\r\n testAttachments.push(attachment);\r\n }\r\n\r\n return attachmentId;\r\n}\r\n\r\n/**\r\n * Attach a file to the current test.\r\n */\r\nexport function attachFile(filePath: string, name?: string): string {\r\n const resolvedPath = path.resolve(filePath);\r\n const displayName = name || path.basename(filePath);\r\n\r\n if (!fs.existsSync(resolvedPath)) {\r\n // If file doesn't exist, attach the path as text\r\n return attach(filePath, displayName, 'text/plain');\r\n }\r\n\r\n const content = fs.readFileSync(resolvedPath);\r\n const ext = path.extname(filePath).slice(1);\r\n const mimeType = getMimeType(ext);\r\n\r\n return attach(content, displayName, mimeType, ext);\r\n}\r\n\r\n/**\r\n * Attach a screenshot to the current test.\r\n */\r\nexport function attachScreenshot(\r\n data: string | Buffer,\r\n name: string = 'Screenshot'\r\n): string {\r\n if (typeof data === 'string' && fs.existsSync(data)) {\r\n const content = fs.readFileSync(data);\r\n return attach(content, name, 'image/png', 'png');\r\n }\r\n return attach(data, name, 'image/png', 'png');\r\n}\r\n\r\n/**\r\n * Attach JSON data to the current test.\r\n */\r\nexport function attachJson(\r\n data: unknown,\r\n name: string = 'JSON Data'\r\n): string {\r\n const jsonStr = JSON.stringify(data, null, 2);\r\n return attach(jsonStr, name, 'application/json', 'json');\r\n}\r\n\r\n/**\r\n * Attach plain text to the current test.\r\n */\r\nexport function attachText(text: string, name: string = 'Text'): string {\r\n return attach(text, name, 'text/plain', 'txt');\r\n}\r\n\r\n/**\r\n * Attach HTML content to the current test.\r\n */\r\nexport function attachHtml(html: string, name: string = 'HTML'): string {\r\n return attach(html, name, 'text/html', 'html');\r\n}\r\n\r\n/**\r\n * Attach a video to the current test.\r\n */\r\nexport function attachVideo(filePath: string, name: string = 'Video'): string {\r\n const resolvedPath = path.resolve(filePath);\r\n\r\n if (!fs.existsSync(resolvedPath)) {\r\n return attach(filePath, name, 'video/mp4', 'mp4');\r\n }\r\n\r\n const content = fs.readFileSync(resolvedPath);\r\n const ext = path.extname(filePath).slice(1);\r\n const mimeType = ext === 'webm' ? 'video/webm' : 'video/mp4';\r\n\r\n return attach(content, name, mimeType, ext);\r\n}\r\n\r\n/**\r\n * Get MIME type from file extension.\r\n */\r\nfunction getMimeType(ext: string): string {\r\n const mimeTypes: Record<string, string> = {\r\n png: 'image/png',\r\n jpg: 'image/jpeg',\r\n jpeg: 'image/jpeg',\r\n gif: 'image/gif',\r\n webp: 'image/webp',\r\n svg: 'image/svg+xml',\r\n pdf: 'application/pdf',\r\n json: 'application/json',\r\n xml: 'application/xml',\r\n html: 'text/html',\r\n txt: 'text/plain',\r\n csv: 'text/csv',\r\n mp4: 'video/mp4',\r\n webm: 'video/webm',\r\n log: 'text/plain',\r\n };\r\n\r\n return mimeTypes[ext.toLowerCase()] || 'application/octet-stream';\r\n}\r\n","/**\r\n * QAagentic Cypress - Simplified Setup\r\n * \r\n * One-line integration for Cypress projects\r\n * No complex configuration needed!\r\n * \r\n * @example\r\n * ```typescript\r\n * // cypress.config.ts - Just add this one line!\r\n * import { setupQAgentic } from '@qagentic/reporter/cypress/simple-setup';\r\n * \r\n * export default defineConfig({\r\n * e2e: {\r\n * setupNodeEvents(on, config) {\r\n * setupQAgentic(on, config); // That's it!\r\n * return config;\r\n * },\r\n * },\r\n * });\r\n * ```\r\n */\r\n\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport { configure } from '../core/config';\r\nimport { QAgenticReporter } from '../core/reporter';\r\nimport { parseStatus } from '../core/status';\r\nimport type { TestResult, TestRunResult } from '../core/types';\r\n\r\n/**\r\n * Simplified QAagentic setup for Cypress\r\n * Auto-detects configuration from environment variables\r\n * Zero manual configuration needed!\r\n */\r\nclass QAgenticCypressReporter {\r\n private reporter: QAgenticReporter;\r\n private currentRun: TestRunResult | null = null;\r\n private projectName: string;\r\n private environment: string;\r\n private runStarted = false;\r\n private runFinalized = false;\r\n private stats = {\r\n suites: 0,\r\n tests: 0,\r\n passes: 0,\r\n pending: 0,\r\n failures: 0,\r\n start: new Date(),\r\n end: new Date(),\r\n duration: 0\r\n };\r\n\r\n constructor(config: any) {\r\n // Auto-configure from environment or defaults\r\n this.projectName = process.env.QAGENTIC_PROJECT_NAME || \r\n config.projectId || \r\n 'Cypress E2E Tests';\r\n \r\n this.environment = process.env.QAGENTIC_ENVIRONMENT || \r\n process.env.NODE_ENV || \r\n 'e2e';\r\n \r\n const apiUrl = process.env.QAGENTIC_API_URL || \r\n 'http://localhost:8080';\r\n\r\n // Configure QAagentic\r\n configure({\r\n projectName: this.projectName,\r\n environment: this.environment,\r\n apiUrl,\r\n outputDir: './qagentic-results',\r\n });\r\n\r\n this.reporter = QAgenticReporter.getInstance();\r\n this.stats.start = new Date();\r\n }\r\n\r\n async onRunBegin() {\r\n try {\r\n console.log('[QAagentic] onRunBegin called, calling reporter.startRun()');\r\n this.currentRun = await this.reporter.startRun({\r\n name: this.projectName,\r\n projectName: this.projectName,\r\n environment: this.environment,\r\n startTime: this.stats.start,\r\n });\r\n console.log('[QAagentic] onRunBegin completed, currentRun:', this.currentRun?.id);\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to start run:', error);\r\n }\r\n }\r\n\r\n async ensureRunStarted() {\r\n if (this.runStarted) return;\r\n \r\n this.runStarted = true;\r\n console.log('[QAagentic] Ensuring run is started');\r\n try {\r\n await this.onRunBegin();\r\n console.log('[QAagentic] Run started successfully');\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to start run:', error);\r\n }\r\n }\r\n\r\n async onTestEnd(test: any) {\r\n // Ensure run is started before processing tests\r\n await this.ensureRunStarted();\r\n \r\n if (!this.currentRun) return;\r\n\r\n try {\r\n const testResult: TestResult = {\r\n id: uuidv4(),\r\n name: test.title[test.title.length - 1],\r\n fullName: test.title.join(' > '),\r\n status: parseStatus(test.state),\r\n durationMs: test.duration,\r\n startTime: new Date(Date.now() - test.duration),\r\n endTime: new Date(),\r\n labels: {\r\n suite: test.title.slice(0, -1).join(' > '),\r\n feature: test.title[0],\r\n },\r\n links: [],\r\n parameters: {},\r\n steps: [],\r\n attachments: [],\r\n filePath: test.invocationDetails?.relativeFile || '',\r\n retryCount: 0,\r\n isRetry: false,\r\n isFlaky: false,\r\n };\r\n\r\n if (test.state === 'failed') {\r\n // Try multiple ways to get error information\r\n const errorInfo = test.err || test.error || test.failure;\r\n const displayError = test.displayError;\r\n \r\n if (errorInfo) {\r\n testResult.errorMessage = errorInfo.message || 'Test failed';\r\n // Extract stack trace from various possible locations\r\n testResult.stackTrace = errorInfo.stack || \r\n errorInfo.codeFrame ||\r\n errorInfo.toString() ||\r\n displayError ||\r\n '';\r\n testResult.errorType = errorInfo.name || 'AssertionError';\r\n } else if (displayError) {\r\n // Use displayError from Cypress test object\r\n testResult.errorMessage = displayError;\r\n // Try to extract stack from displayError if it contains it\r\n if (displayError.includes('\\n')) {\r\n testResult.stackTrace = displayError;\r\n }\r\n testResult.errorType = 'AssertionError';\r\n } else {\r\n // Fallback: create error from test state\r\n testResult.errorMessage = 'Test assertion failed';\r\n testResult.errorType = 'AssertionError';\r\n }\r\n \r\n console.log('[QAagentic] Test failed - Error:', {\r\n message: testResult.errorMessage,\r\n type: testResult.errorType,\r\n hasStackTrace: !!testResult.stackTrace,\r\n });\r\n\r\n }\r\n\r\n // Update stats\r\n this.stats.tests++;\r\n if (test.state === 'passed') this.stats.passes++;\r\n if (test.state === 'failed') this.stats.failures++;\r\n if (test.state === 'pending') this.stats.pending++;\r\n\r\n // Collect test result with original test object for screenshot lookup\r\n this.pendingTests.push({\r\n testResult,\r\n test,\r\n });\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to report test:', error);\r\n }\r\n }\r\n\r\n private pendingTests: Array<{ testResult: TestResult; test: any }> = [];\r\n\r\n async attachScreenshots() {\r\n // This is called after the spec completes, when screenshots have been written\r\n console.log('[QAagentic] Attaching screenshots to pending tests, count:', this.pendingTests.length);\r\n \r\n for (const { testResult, test } of this.pendingTests) {\r\n // Only try to attach screenshots for failed tests\r\n if (test.state !== 'failed' || !test.invocationDetails?.relativeFile) {\r\n continue;\r\n }\r\n \r\n const testFileName = test.invocationDetails.relativeFile.replace(/\\.ts$/, '');\r\n const testName = test.title[test.title.length - 1];\r\n const fullTestTitle = test.title.join(', ');\r\n \r\n // Try multiple screenshot locations\r\n const screenshotPaths = [\r\n // Mochawesome report assets location with full title\r\n path.join(\r\n process.cwd(),\r\n 'cypress/reports/assets',\r\n testFileName,\r\n `${fullTestTitle} -- ${testName} (failed).png`\r\n ),\r\n // Alternative: without full title path\r\n path.join(\r\n process.cwd(),\r\n 'cypress/reports/assets',\r\n testFileName,\r\n `${testName} (failed).png`\r\n ),\r\n // Legacy cypress/screenshots location\r\n path.join(\r\n process.cwd(),\r\n 'cypress/screenshots',\r\n `${testFileName} -- ${testName} (failed).png`\r\n ),\r\n ];\r\n \r\n let screenshotFound = false;\r\n for (const screenshotPath of screenshotPaths) {\r\n if (fs.existsSync(screenshotPath)) {\r\n try {\r\n const screenshotContent = fs.readFileSync(screenshotPath);\r\n testResult.attachments.push({\r\n id: uuidv4(),\r\n name: 'screenshot',\r\n type: 'image/png',\r\n extension: 'png',\r\n content: screenshotContent.toString('base64'),\r\n size: screenshotContent.length,\r\n timestamp: new Date().toISOString(),\r\n });\r\n console.log('[QAagentic] Added screenshot for:', testName);\r\n screenshotFound = true;\r\n break;\r\n } catch (err) {\r\n console.warn('[QAagentic] Failed to read screenshot:', err);\r\n }\r\n }\r\n }\r\n \r\n if (!screenshotFound) {\r\n console.log('[QAagentic] No screenshot found for:', testName);\r\n }\r\n }\r\n }\r\n\r\n async sendPendingTests() {\r\n // Send all collected tests to the API\r\n console.log('[QAagentic] Sending', this.pendingTests.length, 'pending tests to API');\r\n \r\n for (const { testResult } of this.pendingTests) {\r\n await this.reporter.reportTest(testResult);\r\n }\r\n \r\n // Clear pending tests after sending\r\n this.pendingTests = [];\r\n }\r\n\r\n async finalizeRun() {\r\n if (this.runFinalized || !this.currentRun) return;\r\n \r\n this.runFinalized = true;\r\n console.log('[QAagentic] Finalizing run');\r\n \r\n try {\r\n this.stats.end = new Date();\r\n this.stats.duration = this.stats.end.getTime() - this.stats.start.getTime();\r\n\r\n // Update run with final stats\r\n this.currentRun.endTime = this.stats.end;\r\n this.currentRun.durationMs = this.stats.duration;\r\n this.currentRun.total = this.stats.tests;\r\n this.currentRun.passed = this.stats.passes;\r\n this.currentRun.failed = this.stats.failures;\r\n this.currentRun.skipped = this.stats.pending;\r\n\r\n console.log('[QAagentic] Calling reporter.endRun with stats:', {\r\n total: this.currentRun.total,\r\n passed: this.currentRun.passed,\r\n failed: this.currentRun.failed,\r\n skipped: this.currentRun.skipped,\r\n });\r\n \r\n await this.reporter.endRun();\r\n console.log('[QAagentic] Run finalized successfully');\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to finalize run:', error);\r\n }\r\n }\r\n\r\n}\r\n\r\nexport function setupQAgentic(on: any, config: any): void {\r\n const reporter = new QAgenticCypressReporter(config);\r\n\r\n // Process all tests after the entire spec completes\r\n on('after:spec', (_spec: any, results: any) => {\r\n return (async () => {\r\n if (!results?.tests) return;\r\n \r\n try {\r\n // Ensure run is started\r\n await reporter.ensureRunStarted();\r\n \r\n // Wait for mochawesome to write screenshots and reports\r\n console.log('[QAagentic] Waiting for screenshots to be written...');\r\n await new Promise((resolve) => setTimeout(resolve, 2000));\r\n \r\n // Process all tests from this spec - this collects them but doesn't send yet\r\n console.log('[QAagentic] Processing', results.tests.length, 'tests');\r\n for (const test of results.tests) {\r\n await reporter.onTestEnd(test);\r\n }\r\n \r\n // Attach screenshots after they've been written\r\n console.log('[QAagentic] Attaching screenshots...');\r\n await reporter.attachScreenshots();\r\n \r\n // Now send all tests with screenshots to the API\r\n console.log('[QAagentic] Sending tests with screenshots to API...');\r\n await reporter.sendPendingTests();\r\n \r\n // Finalize run after all tests are processed\r\n console.log('[QAagentic] Finalizing run...');\r\n await reporter.finalizeRun();\r\n \r\n // Wait for API calls to complete\r\n await new Promise((resolve) => setTimeout(resolve, 2000));\r\n } catch (error) {\r\n console.warn('[QAagentic] Error processing spec:', error);\r\n }\r\n })();\r\n });\r\n}\r\n","/**\r\n * QAagentic Cypress Plugin\r\n *\r\n * Automatically captures test results from Cypress and reports to QAagentic.\r\n *\r\n * @example\r\n * ```javascript\r\n * // cypress.config.js\r\n * const { qagentic } = require('@qagentic/reporter/cypress');\r\n *\r\n * module.exports = defineConfig({\r\n * e2e: {\r\n * setupNodeEvents(on, config) {\r\n * qagentic(on, config);\r\n * return config;\r\n * },\r\n * },\r\n * });\r\n * ```\r\n */\r\n\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { configure } from '../core/config';\r\nimport { QAgenticReporter } from '../core/reporter';\r\nimport { parseStatus } from '../core/status';\r\nimport type { TestResult, TestRunResult } from '../core/types';\r\n\r\n// Re-export core utilities\r\nexport { step, Step } from '../core/step';\r\nexport { Severity } from '../core/severity';\r\nexport { Status } from '../core/status';\r\nexport {\r\n feature,\r\n story,\r\n epic,\r\n severity,\r\n tag,\r\n label,\r\n} from '../core/decorators';\r\nexport {\r\n attach,\r\n attachScreenshot,\r\n attachJson,\r\n attachText,\r\n} from '../core/attachments';\r\n\r\n/**\r\n * Cypress plugin events interface.\r\n */\r\ninterface CypressPluginEvents {\r\n (action: 'before:run', fn: (details: BeforeRunDetails) => void | Promise<void>): void;\r\n (action: 'after:spec', fn: (spec: unknown, results: CypressSpecResult) => void | Promise<void>): void;\r\n (action: 'after:run', fn: () => void | Promise<void>): void;\r\n}\r\n\r\n/**\r\n * Cypress plugin config interface.\r\n */\r\ninterface CypressPluginConfig {\r\n projectId?: string;\r\n env?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Before run details.\r\n */\r\ninterface BeforeRunDetails {\r\n config?: CypressPluginConfig;\r\n}\r\n\r\n/**\r\n * Cypress plugin options.\r\n */\r\nexport interface CypressPluginOptions {\r\n projectName?: string;\r\n environment?: string;\r\n apiUrl?: string;\r\n apiKey?: string;\r\n outputDir?: string;\r\n screenshotsOnFailure?: boolean;\r\n videosOnFailure?: boolean;\r\n}\r\n\r\n/**\r\n * Cypress test result from after:spec event.\r\n */\r\ninterface CypressTestResult {\r\n title: string[];\r\n state: string;\r\n duration: number;\r\n err?: {\r\n message: string;\r\n stack?: string;\r\n };\r\n}\r\n\r\ninterface CypressSpecResult {\r\n stats: {\r\n tests: number;\r\n passes: number;\r\n failures: number;\r\n pending: number;\r\n skipped: number;\r\n duration: number;\r\n };\r\n tests: CypressTestResult[];\r\n spec: {\r\n name: string;\r\n relative: string;\r\n absolute: string;\r\n };\r\n}\r\n\r\n/**\r\n * Main Cypress plugin setup function.\r\n */\r\nexport function qagentic(\r\n on: CypressPluginEvents,\r\n config: CypressPluginConfig,\r\n options: CypressPluginOptions = {}\r\n): void {\r\n // Configure QAagentic\r\n configure({\r\n projectName: options.projectName || config.projectId || 'cypress-project',\r\n environment: options.environment || config.env?.QAGENTIC_ENVIRONMENT || 'local',\r\n apiUrl: options.apiUrl || config.env?.QAGENTIC_API_URL,\r\n apiKey: options.apiKey || config.env?.QAGENTIC_API_KEY,\r\n outputDir: options.outputDir || './qagentic-results',\r\n });\r\n\r\n const reporter = QAgenticReporter.getInstance();\r\n let currentRun: TestRunResult | null = null;\r\n\r\n // Start run before all specs\r\n on('before:run', async (details: BeforeRunDetails) => {\r\n currentRun = await reporter.startRun({\r\n name: `cypress_${new Date().toISOString().replace(/[:.]/g, '')}`,\r\n projectName: options.projectName || details.config?.projectId || 'cypress-project',\r\n environment: options.environment || 'local',\r\n branch: details.config?.env?.BRANCH || process.env.BRANCH,\r\n commitHash: details.config?.env?.COMMIT || process.env.COMMIT,\r\n });\r\n });\r\n\r\n // Process each spec result\r\n on('after:spec', async (_spec: unknown, results: CypressSpecResult) => {\r\n if (!results || !results.tests) return;\r\n\r\n for (const test of results.tests) {\r\n const testResult: TestResult = {\r\n id: uuidv4(),\r\n name: test.title[test.title.length - 1],\r\n fullName: test.title.join(' > '),\r\n status: parseStatus(test.state),\r\n durationMs: test.duration,\r\n startTime: new Date(Date.now() - test.duration),\r\n endTime: new Date(),\r\n labels: {\r\n suite: test.title.slice(0, -1).join(' > '),\r\n feature: test.title[0],\r\n },\r\n links: [],\r\n parameters: {},\r\n steps: [],\r\n attachments: [],\r\n filePath: results.spec.relative,\r\n retryCount: 0,\r\n isRetry: false,\r\n isFlaky: false,\r\n };\r\n\r\n if (test.err) {\r\n testResult.errorMessage = test.err.message;\r\n testResult.stackTrace = test.err.stack;\r\n testResult.errorType = 'AssertionError';\r\n }\r\n\r\n await reporter.reportTest(testResult);\r\n }\r\n });\r\n\r\n // End run after all specs\r\n on('after:run', async () => {\r\n await reporter.endRun();\r\n });\r\n}\r\n\r\n/**\r\n * Cypress command to add a step.\r\n * Call this in your support file to register custom commands.\r\n */\r\nexport function registerCommands(): void {\r\n // This function should be called from cypress/support/e2e.js\r\n // where Cypress globals are available\r\n // Example:\r\n // import { registerCommands } from '@qagentic/reporter/cypress';\r\n // registerCommands();\r\n}\r\n\r\n// Export simplified setup\r\nexport { setupQAgentic } from './simple-setup';\r\n\r\n// Default export\r\nexport default qagentic;\r\n"]}
1
+ {"version":3,"sources":["../../src/core/config.ts","../../src/core/status.ts","../../src/core/reporter.ts","../../src/core/step.ts","../../src/core/severity.ts","../../src/core/decorators.ts","../../src/core/attachments.ts","../../src/cypress/simple-setup.ts","../../src/cypress/index.ts"],"names":["fs","path","Status","fs2","path2","step","axios","uuidv4","Severity","fs3","path3","fs4"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Configuration management for QAagentic SDK.\r\n */\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\n/**\r\n * API reporting configuration.\r\n */\r\nexport interface APIConfig {\r\n enabled: boolean;\r\n url: string;\r\n key?: string;\r\n timeout: number;\r\n retryCount: number;\r\n batchSize: number;\r\n}\r\n\r\n/**\r\n * Local file reporting configuration.\r\n */\r\nexport interface LocalConfig {\r\n enabled: boolean;\r\n outputDir: string;\r\n formats: ('json' | 'html' | 'junit')[];\r\n cleanOnStart: boolean;\r\n}\r\n\r\n/**\r\n * Feature flags configuration.\r\n */\r\nexport interface FeaturesConfig {\r\n aiAnalysis: boolean;\r\n failureClustering: boolean;\r\n flakyDetection: boolean;\r\n screenshots: 'always' | 'on_failure' | 'never';\r\n videos: 'always' | 'on_failure' | 'never';\r\n consoleOutput: boolean;\r\n}\r\n\r\n/**\r\n * Labels configuration.\r\n */\r\nexport interface LabelsConfig {\r\n team?: string;\r\n component?: string;\r\n environment?: string;\r\n custom: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Main configuration for QAagentic SDK.\r\n */\r\nexport interface QAgenticConfig {\r\n projectName: string;\r\n environment: string;\r\n api: APIConfig;\r\n local: LocalConfig;\r\n features: FeaturesConfig;\r\n labels: LabelsConfig;\r\n}\r\n\r\n/**\r\n * Default configuration values.\r\n */\r\nconst defaultConfig: QAgenticConfig = {\r\n projectName: 'default',\r\n environment: 'local',\r\n api: {\r\n enabled: true,\r\n url: 'http://localhost:8080',\r\n timeout: 30000,\r\n retryCount: 3,\r\n batchSize: 100,\r\n },\r\n local: {\r\n enabled: true,\r\n outputDir: './qagentic-results',\r\n formats: ['json', 'html'],\r\n cleanOnStart: true,\r\n },\r\n features: {\r\n aiAnalysis: true,\r\n failureClustering: true,\r\n flakyDetection: true,\r\n screenshots: 'on_failure',\r\n videos: 'on_failure',\r\n consoleOutput: true,\r\n },\r\n labels: {\r\n custom: {},\r\n },\r\n};\r\n\r\n// Global configuration instance\r\nlet globalConfig: QAgenticConfig = { ...defaultConfig };\r\n\r\n/**\r\n * Load configuration from environment variables.\r\n */\r\nfunction loadFromEnv(config: QAgenticConfig): QAgenticConfig {\r\n const env = process.env;\r\n\r\n // Project settings\r\n if (env.QAGENTIC_PROJECT_NAME) {\r\n config.projectName = env.QAGENTIC_PROJECT_NAME;\r\n }\r\n if (env.QAGENTIC_ENVIRONMENT) {\r\n config.environment = env.QAGENTIC_ENVIRONMENT;\r\n }\r\n\r\n // API settings\r\n if (env.QAGENTIC_API_ENABLED !== undefined) {\r\n config.api.enabled = env.QAGENTIC_API_ENABLED.toLowerCase() === 'true';\r\n }\r\n if (env.QAGENTIC_API_URL) {\r\n config.api.url = env.QAGENTIC_API_URL;\r\n }\r\n if (env.QAGENTIC_API_KEY) {\r\n config.api.key = env.QAGENTIC_API_KEY;\r\n }\r\n\r\n // Local settings\r\n if (env.QAGENTIC_LOCAL_ENABLED !== undefined) {\r\n config.local.enabled = env.QAGENTIC_LOCAL_ENABLED.toLowerCase() === 'true';\r\n }\r\n if (env.QAGENTIC_OUTPUT_DIR) {\r\n config.local.outputDir = env.QAGENTIC_OUTPUT_DIR;\r\n }\r\n if (env.QAGENTIC_OUTPUT_FORMAT) {\r\n config.local.formats = env.QAGENTIC_OUTPUT_FORMAT.split(',').map(\r\n (f) => f.trim() as 'json' | 'html' | 'junit'\r\n );\r\n }\r\n\r\n // Feature flags\r\n if (env.QAGENTIC_AI_ANALYSIS !== undefined) {\r\n config.features.aiAnalysis = env.QAGENTIC_AI_ANALYSIS.toLowerCase() === 'true';\r\n }\r\n if (env.QAGENTIC_SCREENSHOTS) {\r\n config.features.screenshots = env.QAGENTIC_SCREENSHOTS as 'always' | 'on_failure' | 'never';\r\n }\r\n if (env.QAGENTIC_VIDEOS) {\r\n config.features.videos = env.QAGENTIC_VIDEOS as 'always' | 'on_failure' | 'never';\r\n }\r\n\r\n // Labels\r\n if (env.QAGENTIC_TEAM) {\r\n config.labels.team = env.QAGENTIC_TEAM;\r\n }\r\n if (env.QAGENTIC_COMPONENT) {\r\n config.labels.component = env.QAGENTIC_COMPONENT;\r\n }\r\n\r\n return config;\r\n}\r\n\r\n/**\r\n * Load configuration from YAML file.\r\n */\r\nfunction loadFromFile(filePath: string, config: QAgenticConfig): QAgenticConfig {\r\n try {\r\n if (!fs.existsSync(filePath)) {\r\n return config;\r\n }\r\n\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n // Simple YAML parsing for common cases\r\n const yaml = require('yaml');\r\n const data = yaml.parse(content);\r\n\r\n if (data.project) {\r\n if (data.project.name) config.projectName = data.project.name;\r\n if (data.project.environment) config.environment = data.project.environment;\r\n }\r\n\r\n if (data.reporting?.api) {\r\n if (data.reporting.api.enabled !== undefined) config.api.enabled = data.reporting.api.enabled;\r\n if (data.reporting.api.url) config.api.url = data.reporting.api.url;\r\n if (data.reporting.api.key) config.api.key = data.reporting.api.key;\r\n }\r\n\r\n if (data.reporting?.local) {\r\n if (data.reporting.local.enabled !== undefined)\r\n config.local.enabled = data.reporting.local.enabled;\r\n if (data.reporting.local.output_dir) config.local.outputDir = data.reporting.local.output_dir;\r\n if (data.reporting.local.formats) config.local.formats = data.reporting.local.formats;\r\n }\r\n\r\n if (data.features) {\r\n if (data.features.ai_analysis !== undefined)\r\n config.features.aiAnalysis = data.features.ai_analysis;\r\n if (data.features.failure_clustering !== undefined)\r\n config.features.failureClustering = data.features.failure_clustering;\r\n if (data.features.flaky_detection !== undefined)\r\n config.features.flakyDetection = data.features.flaky_detection;\r\n if (data.features.screenshots) config.features.screenshots = data.features.screenshots;\r\n if (data.features.videos) config.features.videos = data.features.videos;\r\n }\r\n\r\n if (data.labels) {\r\n if (data.labels.team) config.labels.team = data.labels.team;\r\n if (data.labels.component) config.labels.component = data.labels.component;\r\n config.labels.custom = { ...config.labels.custom, ...data.labels };\r\n }\r\n } catch (error) {\r\n console.warn(`Failed to load config from ${filePath}:`, error);\r\n }\r\n\r\n return config;\r\n}\r\n\r\n/**\r\n * Auto-discover configuration from common locations.\r\n */\r\nfunction autoDiscover(): QAgenticConfig {\r\n const config = { ...defaultConfig };\r\n const cwd = process.cwd();\r\n\r\n const searchPaths = [\r\n path.join(cwd, 'qagentic.yaml'),\r\n path.join(cwd, 'qagentic.yml'),\r\n path.join(cwd, '.qagentic.yaml'),\r\n path.join(cwd, '.qagentic.yml'),\r\n ];\r\n\r\n for (const filePath of searchPaths) {\r\n if (fs.existsSync(filePath)) {\r\n loadFromFile(filePath, config);\r\n break;\r\n }\r\n }\r\n\r\n return loadFromEnv(config);\r\n}\r\n\r\n/**\r\n * Configure QAagentic SDK.\r\n */\r\nexport function configure(options: Partial<QAgenticConfig> & {\r\n projectName?: string;\r\n apiUrl?: string;\r\n apiKey?: string;\r\n outputDir?: string;\r\n} = {}): QAgenticConfig {\r\n globalConfig = autoDiscover();\r\n\r\n if (options.projectName) {\r\n globalConfig.projectName = options.projectName;\r\n }\r\n if (options.environment) {\r\n globalConfig.environment = options.environment;\r\n }\r\n if (options.apiUrl) {\r\n globalConfig.api.url = options.apiUrl;\r\n }\r\n if (options.apiKey) {\r\n globalConfig.api.key = options.apiKey;\r\n }\r\n if (options.outputDir) {\r\n globalConfig.local.outputDir = options.outputDir;\r\n }\r\n\r\n // Merge nested configs\r\n if (options.api) {\r\n globalConfig.api = { ...globalConfig.api, ...options.api };\r\n }\r\n if (options.local) {\r\n globalConfig.local = { ...globalConfig.local, ...options.local };\r\n }\r\n if (options.features) {\r\n globalConfig.features = { ...globalConfig.features, ...options.features };\r\n }\r\n if (options.labels) {\r\n globalConfig.labels = { ...globalConfig.labels, ...options.labels };\r\n }\r\n\r\n return globalConfig;\r\n}\r\n\r\n/**\r\n * Get the current configuration.\r\n */\r\nexport function getConfig(): QAgenticConfig {\r\n return globalConfig;\r\n}\r\n\r\n/**\r\n * Reset configuration to defaults.\r\n */\r\nexport function resetConfig(): void {\r\n globalConfig = { ...defaultConfig };\r\n}\r\n","/**\r\n * Test execution status.\r\n */\r\n\r\nexport enum Status {\r\n PASSED = 'passed',\r\n FAILED = 'failed',\r\n BROKEN = 'broken',\r\n SKIPPED = 'skipped',\r\n PENDING = 'pending',\r\n RUNNING = 'running',\r\n UNKNOWN = 'unknown',\r\n}\r\n\r\n/**\r\n * Check if status represents a successful outcome.\r\n */\r\nexport function isSuccessful(status: Status): boolean {\r\n return status === Status.PASSED;\r\n}\r\n\r\n/**\r\n * Check if status represents a failure.\r\n */\r\nexport function isFailure(status: Status): boolean {\r\n return status === Status.FAILED || status === Status.BROKEN;\r\n}\r\n\r\n/**\r\n * Parse status from string.\r\n */\r\nexport function parseStatus(value: string): Status {\r\n const normalized = value.toLowerCase();\r\n switch (normalized) {\r\n case 'passed':\r\n case 'pass':\r\n case 'success':\r\n return Status.PASSED;\r\n case 'failed':\r\n case 'fail':\r\n case 'failure':\r\n return Status.FAILED;\r\n case 'broken':\r\n case 'error':\r\n return Status.BROKEN;\r\n case 'skipped':\r\n case 'skip':\r\n case 'pending':\r\n return Status.SKIPPED;\r\n case 'running':\r\n return Status.RUNNING;\r\n default:\r\n return Status.UNKNOWN;\r\n }\r\n}\r\n","/**\r\n * Reporter classes for outputting test results to various destinations.\r\n */\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport axios from 'axios';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { getConfig, QAgenticConfig } from './config';\r\nimport { Status } from './status';\r\nimport type { TestResult, TestRunResult, StepResult } from './types';\r\n\r\n/**\r\n * Base reporter interface.\r\n */\r\nexport interface BaseReporter {\r\n startRun(run: TestRunResult): void | Promise<void>;\r\n endRun(run: TestRunResult): void | Promise<void>;\r\n reportTest(test: TestResult): void | Promise<void>;\r\n}\r\n\r\n/**\r\n * Console reporter with colored output.\r\n */\r\nexport class ConsoleReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n }\r\n\r\n startRun(run: TestRunResult): void {\r\n console.log('\\n' + '='.repeat(60));\r\n console.log(`🚀 QAagentic Test Run - ${run.projectName}`);\r\n console.log(`Environment: ${run.environment}`);\r\n console.log('='.repeat(60) + '\\n');\r\n }\r\n\r\n endRun(run: TestRunResult): void {\r\n const icon = run.failed === 0 ? '✅' : '❌';\r\n console.log('\\n' + '='.repeat(60));\r\n console.log(`${icon} Test Run Complete - ${run.passRate.toFixed(1)}% Pass Rate`);\r\n console.log(`Passed: ${run.passed} | Failed: ${run.failed} | Skipped: ${run.skipped}`);\r\n console.log('='.repeat(60) + '\\n');\r\n }\r\n\r\n reportTest(test: TestResult): void {\r\n if (!this.config.features.consoleOutput) return;\r\n\r\n const symbols: Record<Status, string> = {\r\n [Status.PASSED]: '✓',\r\n [Status.FAILED]: '✗',\r\n [Status.BROKEN]: '!',\r\n [Status.SKIPPED]: '○',\r\n [Status.PENDING]: '…',\r\n [Status.RUNNING]: '→',\r\n [Status.UNKNOWN]: '?',\r\n };\r\n\r\n const symbol = symbols[test.status as Status] || '?';\r\n console.log(` ${symbol} ${test.name}`);\r\n\r\n if (test.errorMessage) {\r\n console.log(` Error: ${test.errorMessage.slice(0, 100)}...`);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * JSON file reporter.\r\n */\r\nexport class JSONReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n private outputDir: string;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n this.outputDir = this.config.local.outputDir;\r\n }\r\n\r\n startRun(run: TestRunResult): void {\r\n // Create output directory\r\n if (!fs.existsSync(this.outputDir)) {\r\n fs.mkdirSync(this.outputDir, { recursive: true });\r\n }\r\n\r\n // Clean previous results if configured\r\n if (this.config.local.cleanOnStart) {\r\n const files = fs.readdirSync(this.outputDir);\r\n for (const file of files) {\r\n if (file.endsWith('.json')) {\r\n fs.unlinkSync(path.join(this.outputDir, file));\r\n }\r\n }\r\n }\r\n }\r\n\r\n endRun(run: TestRunResult): void {\r\n if (!this.config.local.enabled || !this.config.local.formats.includes('json')) {\r\n return;\r\n }\r\n\r\n // Write run summary\r\n const runFile = path.join(this.outputDir, 'run.json');\r\n fs.writeFileSync(runFile, JSON.stringify(this.serializeRun(run), null, 2));\r\n\r\n // Write individual test results\r\n const testsDir = path.join(this.outputDir, 'tests');\r\n if (!fs.existsSync(testsDir)) {\r\n fs.mkdirSync(testsDir, { recursive: true });\r\n }\r\n\r\n for (const test of run.tests) {\r\n const testFile = path.join(testsDir, `${test.id}.json`);\r\n fs.writeFileSync(testFile, JSON.stringify(this.serializeTest(test), null, 2));\r\n }\r\n }\r\n\r\n reportTest(_test: TestResult): void {\r\n // Tests are written at end\r\n }\r\n\r\n private serializeRun(run: TestRunResult): Record<string, unknown> {\r\n return {\r\n ...run,\r\n startTime: run.startTime?.toISOString(),\r\n endTime: run.endTime?.toISOString(),\r\n tests: run.tests.map((t) => this.serializeTest(t)),\r\n };\r\n }\r\n\r\n private serializeTest(test: TestResult): Record<string, unknown> {\r\n return {\r\n ...test,\r\n startTime: test.startTime?.toISOString(),\r\n endTime: test.endTime?.toISOString(),\r\n steps: test.steps.map((s) => this.serializeStep(s)),\r\n };\r\n }\r\n\r\n private serializeStep(step: StepResult): Record<string, unknown> {\r\n return {\r\n ...step,\r\n startTime: step.startTime?.toISOString(),\r\n endTime: step.endTime?.toISOString(),\r\n children: step.children.map((c) => this.serializeStep(c)),\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * JUnit XML reporter for CI/CD compatibility.\r\n */\r\nexport class JUnitReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n private outputDir: string;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n this.outputDir = this.config.local.outputDir;\r\n }\r\n\r\n startRun(_run: TestRunResult): void {\r\n if (!fs.existsSync(this.outputDir)) {\r\n fs.mkdirSync(this.outputDir, { recursive: true });\r\n }\r\n }\r\n\r\n endRun(run: TestRunResult): void {\r\n if (!this.config.local.enabled || !this.config.local.formats.includes('junit')) {\r\n return;\r\n }\r\n\r\n const xml = this.generateXml(run);\r\n const junitFile = path.join(this.outputDir, 'junit.xml');\r\n fs.writeFileSync(junitFile, xml);\r\n }\r\n\r\n reportTest(_test: TestResult): void {\r\n // Tests are written at end\r\n }\r\n\r\n private generateXml(run: TestRunResult): string {\r\n const escape = (str: string) =>\r\n str\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;');\r\n\r\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\r\n xml += `<testsuite name=\"${escape(run.projectName)}\" `;\r\n xml += `tests=\"${run.total}\" `;\r\n xml += `failures=\"${run.failed}\" `;\r\n xml += `errors=\"${run.broken}\" `;\r\n xml += `skipped=\"${run.skipped}\" `;\r\n xml += `time=\"${(run.durationMs / 1000).toFixed(3)}\" `;\r\n xml += `timestamp=\"${run.startTime?.toISOString() || ''}\">\\n`;\r\n\r\n for (const test of run.tests) {\r\n xml += ` <testcase name=\"${escape(test.name)}\" `;\r\n xml += `classname=\"${escape(test.fullName)}\" `;\r\n xml += `time=\"${(test.durationMs / 1000).toFixed(3)}\"`;\r\n\r\n if (test.status === Status.PASSED) {\r\n xml += '/>\\n';\r\n } else if (test.status === Status.FAILED) {\r\n xml += '>\\n';\r\n xml += ` <failure message=\"${escape(test.errorMessage || 'Test failed')}\" `;\r\n xml += `type=\"${escape(test.errorType || 'AssertionError')}\">`;\r\n if (test.stackTrace) {\r\n xml += escape(test.stackTrace);\r\n }\r\n xml += '</failure>\\n';\r\n xml += ' </testcase>\\n';\r\n } else if (test.status === Status.BROKEN) {\r\n xml += '>\\n';\r\n xml += ` <error message=\"${escape(test.errorMessage || 'Test error')}\" `;\r\n xml += `type=\"${escape(test.errorType || 'Error')}\">`;\r\n if (test.stackTrace) {\r\n xml += escape(test.stackTrace);\r\n }\r\n xml += '</error>\\n';\r\n xml += ' </testcase>\\n';\r\n } else if (test.status === Status.SKIPPED) {\r\n xml += '>\\n';\r\n xml += ` <skipped${test.errorMessage ? ` message=\"${escape(test.errorMessage)}\"` : ''}/>\\n`;\r\n xml += ' </testcase>\\n';\r\n } else {\r\n xml += '/>\\n';\r\n }\r\n }\r\n\r\n xml += '</testsuite>\\n';\r\n return xml;\r\n }\r\n}\r\n\r\n/**\r\n * API reporter that sends results to QAagentic server.\r\n */\r\nexport class APIReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n private batch: TestResult[] = [];\r\n private currentRun?: TestRunResult;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n }\r\n\r\n async startRun(run: TestRunResult): Promise<void> {\r\n if (!this.config.api.enabled) {\r\n console.log('[APIReporter] API reporting disabled');\r\n return;\r\n }\r\n\r\n this.currentRun = run;\r\n this.batch = [];\r\n\r\n try {\r\n console.log('[APIReporter] Starting test run:', run.id);\r\n const url = `${this.config.api.url}/api/v1/runs`;\r\n console.log('[APIReporter] POST to:', url);\r\n \r\n const response = await axios.post(\r\n url,\r\n {\r\n id: run.id,\r\n name: run.name,\r\n project_name: run.projectName,\r\n environment: run.environment,\r\n start_time: run.startTime?.toISOString(),\r\n labels: run.labels,\r\n ci_build_id: run.ciBuildId,\r\n branch: run.branch,\r\n commit_hash: run.commitHash,\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.config.api.key || '',\r\n 'X-Project': this.config.projectName,\r\n },\r\n timeout: this.config.api.timeout,\r\n }\r\n );\r\n console.log('[APIReporter] Test run started successfully:', response.status);\r\n } catch (error: any) {\r\n console.warn('[APIReporter] Failed to register run with API:');\r\n console.warn(' Error:', error.message);\r\n console.warn(' Status:', error.response?.status);\r\n console.warn(' Data:', error.response?.data);\r\n }\r\n }\r\n\r\n async endRun(run: TestRunResult): Promise<void> {\r\n if (!this.config.api.enabled) return;\r\n\r\n try {\r\n console.log('[APIReporter] endRun called, batch size:', this.batch.length);\r\n \r\n // Flush remaining batch - ALWAYS flush, even if batch is not full\r\n if (this.batch.length > 0) {\r\n console.log('[APIReporter] Flushing remaining', this.batch.length, 'test results');\r\n await this.flushBatch();\r\n console.log('[APIReporter] Batch flushed, waiting for processing...');\r\n await new Promise((resolve) => setTimeout(resolve, 1500));\r\n }\r\n\r\n console.log('[APIReporter] Finalizing run with test counts:', {\r\n total: run.total,\r\n passed: run.passed,\r\n failed: run.failed,\r\n broken: run.broken,\r\n skipped: run.skipped,\r\n });\r\n \r\n const patchData = {\r\n end_time: run.endTime?.toISOString(),\r\n duration_ms: run.durationMs,\r\n total: run.total,\r\n passed: run.passed,\r\n failed: run.failed,\r\n broken: run.broken,\r\n skipped: run.skipped,\r\n status: 'completed',\r\n };\r\n \r\n console.log('[APIReporter] PATCH to:', `${this.config.api.url}/api/v1/runs/${run.id}`);\r\n console.log('[APIReporter] PATCH data:', patchData);\r\n \r\n const response = await axios.patch(\r\n `${this.config.api.url}/api/v1/runs/${run.id}`,\r\n patchData,\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.config.api.key || '',\r\n 'X-Project': this.config.projectName,\r\n },\r\n timeout: this.config.api.timeout,\r\n }\r\n );\r\n console.log('[APIReporter] Run finalized successfully:', response.status);\r\n } catch (error: any) {\r\n console.warn('[APIReporter] Failed to finalize run with API:');\r\n console.warn(' Error:', error.message);\r\n console.warn(' Status:', error.response?.status);\r\n console.warn(' Data:', error.response?.data);\r\n }\r\n }\r\n\r\n async reportTest(test: TestResult): Promise<void> {\r\n console.log('[APIReporter] reportTest called for:', test.name, 'API enabled:', this.config.api.enabled);\r\n if (!this.config.api.enabled) {\r\n console.log('[APIReporter] API reporting disabled, skipping test report');\r\n return;\r\n }\r\n\r\n console.log('[APIReporter] Adding test to batch:', test.name, '- batch size:', this.batch.length + 1);\r\n this.batch.push(test);\r\n\r\n if (this.batch.length >= this.config.api.batchSize) {\r\n console.log('[APIReporter] Batch size reached, flushing batch');\r\n await this.flushBatch();\r\n } else {\r\n console.log('[APIReporter] Batch size:', this.batch.length, '/', this.config.api.batchSize);\r\n }\r\n }\r\n\r\n private async flushBatch(): Promise<void> {\r\n if (this.batch.length === 0 || !this.currentRun) return;\r\n\r\n try {\r\n console.log('[APIReporter] Flushing batch of', this.batch.length, 'test results');\r\n const response = await axios.post(\r\n `${this.config.api.url}/api/v1/runs/${this.currentRun.id}/results`,\r\n this.batch.map((t) => ({\r\n id: t.id,\r\n name: t.name,\r\n full_name: t.fullName,\r\n status: t.status,\r\n duration_ms: t.durationMs,\r\n start_time: t.startTime?.toISOString(),\r\n end_time: t.endTime?.toISOString(),\r\n file_path: t.filePath,\r\n error_message: t.errorMessage,\r\n stack_trace: t.stackTrace,\r\n error_type: t.errorType,\r\n attachments: t.attachments,\r\n })),\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.config.api.key || '',\r\n },\r\n timeout: this.config.api.timeout,\r\n }\r\n );\r\n console.log('[APIReporter] Batch flushed successfully:', response.status);\r\n } catch (error: any) {\r\n console.warn('[APIReporter] Failed to send test results to API:');\r\n console.warn(' Error:', error.message);\r\n console.warn(' Status:', error.response?.status);\r\n console.warn(' Data:', error.response?.data);\r\n } finally {\r\n this.batch = [];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Main reporter that coordinates multiple output destinations.\r\n */\r\nexport class QAgenticReporter {\r\n private static instance: QAgenticReporter | null = null;\r\n private config: QAgenticConfig;\r\n private reporters: BaseReporter[] = [];\r\n private currentRun: TestRunResult | null = null;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n\r\n console.log('[QAgenticReporter] Initializing with config:', {\r\n projectName: this.config.projectName,\r\n environment: this.config.environment,\r\n apiEnabled: this.config.api.enabled,\r\n apiUrl: this.config.api.url,\r\n });\r\n\r\n // Initialize reporters based on config\r\n if (this.config.features.consoleOutput) {\r\n this.reporters.push(new ConsoleReporter(this.config));\r\n console.log('[QAgenticReporter] Added ConsoleReporter');\r\n }\r\n\r\n if (this.config.local.enabled) {\r\n this.reporters.push(new JSONReporter(this.config));\r\n console.log('[QAgenticReporter] Added JSONReporter');\r\n if (this.config.local.formats.includes('junit')) {\r\n this.reporters.push(new JUnitReporter(this.config));\r\n console.log('[QAgenticReporter] Added JUnitReporter');\r\n }\r\n }\r\n\r\n if (this.config.api.enabled) {\r\n this.reporters.push(new APIReporter(this.config));\r\n console.log('[QAgenticReporter] Added APIReporter');\r\n }\r\n\r\n console.log('[QAgenticReporter] Initialization complete with', this.reporters.length, 'reporters');\r\n }\r\n\r\n /**\r\n * Get singleton instance.\r\n */\r\n static getInstance(config?: QAgenticConfig): QAgenticReporter {\r\n if (!QAgenticReporter.instance) {\r\n QAgenticReporter.instance = new QAgenticReporter(config);\r\n }\r\n return QAgenticReporter.instance;\r\n }\r\n\r\n /**\r\n * Reset singleton instance.\r\n */\r\n static reset(): void {\r\n QAgenticReporter.instance = null;\r\n }\r\n\r\n /**\r\n * Start a new test run.\r\n */\r\n async startRun(options: Partial<TestRunResult> = {}): Promise<TestRunResult> {\r\n this.currentRun = {\r\n id: options.id || uuidv4(),\r\n name: options.name || `run_${new Date().toISOString().replace(/[:.]/g, '')}`,\r\n projectName: options.projectName || this.config.projectName,\r\n environment: options.environment || this.config.environment,\r\n startTime: new Date(),\r\n durationMs: 0,\r\n tests: [],\r\n total: 0,\r\n passed: 0,\r\n failed: 0,\r\n broken: 0,\r\n skipped: 0,\r\n passRate: 0,\r\n labels: { ...this.config.labels.custom, ...options.labels },\r\n parameters: options.parameters || {},\r\n ciBuildId: options.ciBuildId,\r\n ciBuildUrl: options.ciBuildUrl,\r\n branch: options.branch,\r\n commitHash: options.commitHash,\r\n };\r\n\r\n for (const reporter of this.reporters) {\r\n await reporter.startRun(this.currentRun);\r\n }\r\n\r\n return this.currentRun;\r\n }\r\n\r\n /**\r\n * End the current test run.\r\n */\r\n async endRun(): Promise<TestRunResult | null> {\r\n if (!this.currentRun) return null;\r\n\r\n this.currentRun.endTime = new Date();\r\n this.currentRun.durationMs =\r\n this.currentRun.endTime.getTime() - (this.currentRun.startTime?.getTime() || 0);\r\n this.currentRun.passRate =\r\n this.currentRun.total > 0 ? (this.currentRun.passed / this.currentRun.total) * 100 : 0;\r\n\r\n for (const reporter of this.reporters) {\r\n await reporter.endRun(this.currentRun);\r\n }\r\n\r\n const run = this.currentRun;\r\n this.currentRun = null;\r\n return run;\r\n }\r\n\r\n /**\r\n * Report a test result.\r\n */\r\n async reportTest(test: TestResult): Promise<void> {\r\n if (!this.currentRun) {\r\n console.warn('[QAgenticReporter] No active run to report test');\r\n return;\r\n }\r\n\r\n this.currentRun.tests.push(test);\r\n this.currentRun.total++;\r\n\r\n switch (test.status) {\r\n case 'passed':\r\n this.currentRun.passed++;\r\n break;\r\n case 'failed':\r\n this.currentRun.failed++;\r\n break;\r\n case 'broken':\r\n this.currentRun.broken++;\r\n break;\r\n case 'skipped':\r\n this.currentRun.skipped++;\r\n break;\r\n }\r\n\r\n console.log('[QAgenticReporter] Test counts:', {\r\n total: this.currentRun.total,\r\n passed: this.currentRun.passed,\r\n failed: this.currentRun.failed,\r\n broken: this.currentRun.broken,\r\n skipped: this.currentRun.skipped,\r\n });\r\n\r\n for (const reporter of this.reporters) {\r\n await reporter.reportTest(test);\r\n }\r\n }\r\n\r\n /**\r\n * Get the current test run.\r\n */\r\n getCurrentRun(): TestRunResult | null {\r\n return this.currentRun;\r\n }\r\n}\r\n\r\n/**\r\n * Get the global reporter instance.\r\n */\r\nexport function getReporter(config?: QAgenticConfig): QAgenticReporter {\r\n return QAgenticReporter.getInstance(config);\r\n}\r\n","/**\r\n * Step context manager for defining test steps.\r\n */\r\n\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { Status } from './status';\r\nimport type { StepResult, Attachment } from './types';\r\n\r\n// Current step stack (thread-local equivalent for Node.js)\r\nlet currentSteps: Step[] = [];\r\n\r\n/**\r\n * Get the current step stack.\r\n */\r\nexport function getCurrentSteps(): Step[] {\r\n return currentSteps;\r\n}\r\n\r\n/**\r\n * Get the current active step.\r\n */\r\nexport function getCurrentStep(): Step | undefined {\r\n return currentSteps[currentSteps.length - 1];\r\n}\r\n\r\n/**\r\n * Clear the step stack.\r\n */\r\nexport function clearSteps(): void {\r\n currentSteps = [];\r\n}\r\n\r\n/**\r\n * Represents a test step with timing and status tracking.\r\n */\r\nexport class Step {\r\n readonly id: string;\r\n readonly name: string;\r\n readonly description?: string;\r\n status: Status = Status.PENDING;\r\n startTime?: Date;\r\n endTime?: Date;\r\n durationMs: number = 0;\r\n error?: string;\r\n errorTrace?: string;\r\n attachments: Attachment[] = [];\r\n children: Step[] = [];\r\n parameters: Record<string, unknown> = {};\r\n\r\n constructor(name: string, description?: string, parameters?: Record<string, unknown>) {\r\n this.id = uuidv4();\r\n this.name = name;\r\n this.description = description;\r\n this.parameters = parameters || {};\r\n }\r\n\r\n /**\r\n * Start the step.\r\n */\r\n start(): this {\r\n this.startTime = new Date();\r\n this.status = Status.RUNNING;\r\n currentSteps.push(this);\r\n return this;\r\n }\r\n\r\n /**\r\n * End the step.\r\n */\r\n end(error?: Error): this {\r\n this.endTime = new Date();\r\n if (this.startTime) {\r\n this.durationMs = this.endTime.getTime() - this.startTime.getTime();\r\n }\r\n\r\n // Remove from stack\r\n const index = currentSteps.indexOf(this);\r\n if (index > -1) {\r\n currentSteps.splice(index, 1);\r\n }\r\n\r\n // Add to parent if exists\r\n const parent = getCurrentStep();\r\n if (parent) {\r\n parent.children.push(this);\r\n }\r\n\r\n if (error) {\r\n this.status = Status.FAILED;\r\n this.error = error.message;\r\n this.errorTrace = error.stack;\r\n } else {\r\n this.status = Status.PASSED;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Attach data to this step.\r\n */\r\n attach(data: string | Buffer, name: string, type: string = 'text/plain'): this {\r\n const content = typeof data === 'string' ? data : data.toString('base64');\r\n this.attachments.push({\r\n id: uuidv4(),\r\n name,\r\n type,\r\n content,\r\n size: typeof data === 'string' ? data.length : data.length,\r\n timestamp: new Date().toISOString(),\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Attach a screenshot.\r\n */\r\n attachScreenshot(path: string, name: string = 'Screenshot'): this {\r\n return this.attach(path, name, 'image/png');\r\n }\r\n\r\n /**\r\n * Attach JSON data.\r\n */\r\n attachJson(data: unknown, name: string = 'JSON Data'): this {\r\n return this.attach(JSON.stringify(data, null, 2), name, 'application/json');\r\n }\r\n\r\n /**\r\n * Set a step parameter.\r\n */\r\n setParameter(name: string, value: unknown): this {\r\n this.parameters[name] = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * Convert to result object.\r\n */\r\n toResult(): StepResult {\r\n return {\r\n id: this.id,\r\n name: this.name,\r\n status: this.status,\r\n startTime: this.startTime,\r\n endTime: this.endTime,\r\n durationMs: this.durationMs,\r\n error: this.error,\r\n errorTrace: this.errorTrace,\r\n attachments: this.attachments,\r\n children: this.children.map((c) => c.toResult()),\r\n parameters: this.parameters,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Execute a function within a step context.\r\n *\r\n * @example\r\n * ```typescript\r\n * step('Login to application', () => {\r\n * // test code\r\n * });\r\n *\r\n * await step('Async operation', async () => {\r\n * await someAsyncOperation();\r\n * });\r\n * ```\r\n */\r\nexport function step<T>(name: string, fn: () => T): T;\r\nexport function step<T>(name: string, description: string, fn: () => T): T;\r\nexport function step<T>(\r\n name: string,\r\n descriptionOrFn: string | (() => T),\r\n fn?: () => T\r\n): T {\r\n const description = typeof descriptionOrFn === 'string' ? descriptionOrFn : undefined;\r\n const callback = typeof descriptionOrFn === 'function' ? descriptionOrFn : fn!;\r\n\r\n const s = new Step(name, description);\r\n s.start();\r\n\r\n try {\r\n const result = callback();\r\n\r\n // Handle promises\r\n if (result instanceof Promise) {\r\n return result\r\n .then((value) => {\r\n s.end();\r\n return value;\r\n })\r\n .catch((error) => {\r\n s.end(error);\r\n throw error;\r\n }) as T;\r\n }\r\n\r\n s.end();\r\n return result;\r\n } catch (error) {\r\n s.end(error as Error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Create a step without executing (for manual control).\r\n */\r\nexport function createStep(name: string, description?: string): Step {\r\n return new Step(name, description);\r\n}\r\n","/**\r\n * Test severity levels - compatible with Allure.\r\n */\r\n\r\nexport enum Severity {\r\n BLOCKER = 'blocker',\r\n CRITICAL = 'critical',\r\n NORMAL = 'normal',\r\n MINOR = 'minor',\r\n TRIVIAL = 'trivial',\r\n}\r\n\r\n/**\r\n * Convert string to Severity enum.\r\n */\r\nexport function parseSeverity(value: string): Severity {\r\n const normalized = value.toLowerCase();\r\n switch (normalized) {\r\n case 'blocker':\r\n return Severity.BLOCKER;\r\n case 'critical':\r\n return Severity.CRITICAL;\r\n case 'minor':\r\n return Severity.MINOR;\r\n case 'trivial':\r\n return Severity.TRIVIAL;\r\n default:\r\n return Severity.NORMAL;\r\n }\r\n}\r\n","/**\r\n * Decorators for annotating tests with metadata.\r\n * Compatible with Allure-style annotations.\r\n */\r\n\r\nimport { Severity, parseSeverity } from './severity';\r\n\r\n// Metadata storage key\r\nconst QAGENTIC_METADATA = Symbol('qagentic_metadata');\r\n\r\n/**\r\n * Test metadata structure.\r\n */\r\nexport interface TestMetadata {\r\n labels: Record<string, unknown>;\r\n links: Array<{ url: string; name: string; type: string }>;\r\n attachments: unknown[];\r\n}\r\n\r\n/**\r\n * Get or create metadata for a test.\r\n */\r\nfunction getMetadata(target: unknown): TestMetadata {\r\n const obj = target as Record<symbol, TestMetadata>;\r\n if (!obj[QAGENTIC_METADATA]) {\r\n obj[QAGENTIC_METADATA] = {\r\n labels: {},\r\n links: [],\r\n attachments: [],\r\n };\r\n }\r\n return obj[QAGENTIC_METADATA];\r\n}\r\n\r\n/**\r\n * Add a label to test metadata.\r\n */\r\nfunction addLabel(name: string, value: unknown) {\r\n return function <T extends object>(target: T): T {\r\n const metadata = getMetadata(target);\r\n metadata.labels[name] = value;\r\n return target;\r\n };\r\n}\r\n\r\n/**\r\n * Mark test with a feature label.\r\n */\r\nexport function feature(name: string) {\r\n return addLabel('feature', name);\r\n}\r\n\r\n/**\r\n * Mark test with a user story label.\r\n */\r\nexport function story(name: string) {\r\n return addLabel('story', name);\r\n}\r\n\r\n/**\r\n * Mark test with an epic label.\r\n */\r\nexport function epic(name: string) {\r\n return addLabel('epic', name);\r\n}\r\n\r\n/**\r\n * Mark test with a severity level.\r\n */\r\nexport function severity(level: Severity | string) {\r\n const sev = typeof level === 'string' ? parseSeverity(level) : level;\r\n return addLabel('severity', sev);\r\n}\r\n\r\n/**\r\n * Add tags to a test.\r\n */\r\nexport function tag(...tags: string[]) {\r\n return function <T extends object>(target: T): T {\r\n const metadata = getMetadata(target);\r\n const existingTags = (metadata.labels['tags'] as string[]) || [];\r\n metadata.labels['tags'] = [...existingTags, ...tags];\r\n return target;\r\n };\r\n}\r\n\r\n/**\r\n * Add a custom label to a test.\r\n */\r\nexport function label(name: string, value: string) {\r\n return addLabel(name, value);\r\n}\r\n\r\n/**\r\n * Add a link to a test.\r\n */\r\nexport function link(url: string, name?: string, type: string = 'link') {\r\n return function <T extends object>(target: T): T {\r\n const metadata = getMetadata(target);\r\n metadata.links.push({\r\n url,\r\n name: name || url,\r\n type,\r\n });\r\n return target;\r\n };\r\n}\r\n\r\n/**\r\n * Link test to an issue tracker.\r\n */\r\nexport function issue(url: string, name?: string) {\r\n return link(url, name, 'issue');\r\n}\r\n\r\n/**\r\n * Link test to a test management system.\r\n */\r\nexport function testcase(url: string, name?: string) {\r\n return link(url, name, 'tms');\r\n}\r\n\r\n/**\r\n * Add a description to a test.\r\n */\r\nexport function description(text: string) {\r\n return addLabel('description', text);\r\n}\r\n\r\n/**\r\n * Set a custom title for the test.\r\n */\r\nexport function title(name: string) {\r\n return addLabel('title', name);\r\n}\r\n\r\n/**\r\n * Set the test owner.\r\n */\r\nexport function owner(name: string) {\r\n return addLabel('owner', name);\r\n}\r\n\r\n/**\r\n * Set the test layer.\r\n */\r\nexport function layer(name: string) {\r\n return addLabel('layer', name);\r\n}\r\n\r\n/**\r\n * Set the suite name.\r\n */\r\nexport function suite(name: string) {\r\n return addLabel('suite', name);\r\n}\r\n\r\n/**\r\n * Set the sub-suite name.\r\n */\r\nexport function subSuite(name: string) {\r\n return addLabel('subSuite', name);\r\n}\r\n\r\n/**\r\n * Set the parent suite name.\r\n */\r\nexport function parentSuite(name: string) {\r\n return addLabel('parentSuite', name);\r\n}\r\n\r\n/**\r\n * Get all metadata for a test.\r\n */\r\nexport function getTestMetadata(target: unknown): TestMetadata {\r\n return getMetadata(target);\r\n}\r\n","/**\r\n * Attachment utilities for adding files, screenshots, and data to test reports.\r\n */\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { getCurrentStep } from './step';\r\nimport type { Attachment } from './types';\r\n\r\n// Global attachment storage for current test\r\nlet testAttachments: Attachment[] = [];\r\n\r\n/**\r\n * Get current test attachments.\r\n */\r\nexport function getAttachments(): Attachment[] {\r\n return testAttachments;\r\n}\r\n\r\n/**\r\n * Clear attachments for new test.\r\n */\r\nexport function clearAttachments(): void {\r\n testAttachments = [];\r\n}\r\n\r\n/**\r\n * Attach data to the current test or step.\r\n */\r\nexport function attach(\r\n data: string | Buffer,\r\n name: string,\r\n type: string = 'text/plain',\r\n extension?: string\r\n): string {\r\n const attachmentId = uuidv4();\r\n\r\n let content: string;\r\n let size: number;\r\n\r\n if (Buffer.isBuffer(data)) {\r\n content = data.toString('base64');\r\n size = data.length;\r\n } else {\r\n content = data;\r\n size = data.length;\r\n }\r\n\r\n const attachment: Attachment = {\r\n id: attachmentId,\r\n name,\r\n type,\r\n extension,\r\n content,\r\n size,\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n // Add to current step if in step context\r\n const currentStep = getCurrentStep();\r\n if (currentStep) {\r\n currentStep.attachments.push(attachment);\r\n } else {\r\n // Add to test-level attachments\r\n testAttachments.push(attachment);\r\n }\r\n\r\n return attachmentId;\r\n}\r\n\r\n/**\r\n * Attach a file to the current test.\r\n */\r\nexport function attachFile(filePath: string, name?: string): string {\r\n const resolvedPath = path.resolve(filePath);\r\n const displayName = name || path.basename(filePath);\r\n\r\n if (!fs.existsSync(resolvedPath)) {\r\n // If file doesn't exist, attach the path as text\r\n return attach(filePath, displayName, 'text/plain');\r\n }\r\n\r\n const content = fs.readFileSync(resolvedPath);\r\n const ext = path.extname(filePath).slice(1);\r\n const mimeType = getMimeType(ext);\r\n\r\n return attach(content, displayName, mimeType, ext);\r\n}\r\n\r\n/**\r\n * Attach a screenshot to the current test.\r\n */\r\nexport function attachScreenshot(\r\n data: string | Buffer,\r\n name: string = 'Screenshot'\r\n): string {\r\n if (typeof data === 'string' && fs.existsSync(data)) {\r\n const content = fs.readFileSync(data);\r\n return attach(content, name, 'image/png', 'png');\r\n }\r\n return attach(data, name, 'image/png', 'png');\r\n}\r\n\r\n/**\r\n * Attach JSON data to the current test.\r\n */\r\nexport function attachJson(\r\n data: unknown,\r\n name: string = 'JSON Data'\r\n): string {\r\n const jsonStr = JSON.stringify(data, null, 2);\r\n return attach(jsonStr, name, 'application/json', 'json');\r\n}\r\n\r\n/**\r\n * Attach plain text to the current test.\r\n */\r\nexport function attachText(text: string, name: string = 'Text'): string {\r\n return attach(text, name, 'text/plain', 'txt');\r\n}\r\n\r\n/**\r\n * Attach HTML content to the current test.\r\n */\r\nexport function attachHtml(html: string, name: string = 'HTML'): string {\r\n return attach(html, name, 'text/html', 'html');\r\n}\r\n\r\n/**\r\n * Attach a video to the current test.\r\n */\r\nexport function attachVideo(filePath: string, name: string = 'Video'): string {\r\n const resolvedPath = path.resolve(filePath);\r\n\r\n if (!fs.existsSync(resolvedPath)) {\r\n return attach(filePath, name, 'video/mp4', 'mp4');\r\n }\r\n\r\n const content = fs.readFileSync(resolvedPath);\r\n const ext = path.extname(filePath).slice(1);\r\n const mimeType = ext === 'webm' ? 'video/webm' : 'video/mp4';\r\n\r\n return attach(content, name, mimeType, ext);\r\n}\r\n\r\n/**\r\n * Get MIME type from file extension.\r\n */\r\nfunction getMimeType(ext: string): string {\r\n const mimeTypes: Record<string, string> = {\r\n png: 'image/png',\r\n jpg: 'image/jpeg',\r\n jpeg: 'image/jpeg',\r\n gif: 'image/gif',\r\n webp: 'image/webp',\r\n svg: 'image/svg+xml',\r\n pdf: 'application/pdf',\r\n json: 'application/json',\r\n xml: 'application/xml',\r\n html: 'text/html',\r\n txt: 'text/plain',\r\n csv: 'text/csv',\r\n mp4: 'video/mp4',\r\n webm: 'video/webm',\r\n log: 'text/plain',\r\n };\r\n\r\n return mimeTypes[ext.toLowerCase()] || 'application/octet-stream';\r\n}\r\n","/**\r\n * QAagentic Cypress - Simplified Setup\r\n * \r\n * One-line integration for Cypress projects\r\n * No complex configuration needed!\r\n * \r\n * @example\r\n * ```typescript\r\n * // cypress.config.ts - Just add this one line!\r\n * import { setupQAgentic } from '@qagentic/reporter/cypress/simple-setup';\r\n * \r\n * export default defineConfig({\r\n * e2e: {\r\n * setupNodeEvents(on, config) {\r\n * setupQAgentic(on, config); // That's it!\r\n * return config;\r\n * },\r\n * },\r\n * });\r\n * ```\r\n */\r\n\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport { configure } from '../core/config';\r\nimport { QAgenticReporter } from '../core/reporter';\r\nimport { parseStatus } from '../core/status';\r\nimport type { TestResult, TestRunResult } from '../core/types';\r\n\r\n/**\r\n * Simplified QAagentic setup for Cypress\r\n * Auto-detects configuration from environment variables\r\n * Zero manual configuration needed!\r\n */\r\nclass QAgenticCypressReporter {\r\n private reporter: QAgenticReporter;\r\n private currentRun: TestRunResult | null = null;\r\n private projectName: string;\r\n private environment: string;\r\n private runStarted = false;\r\n private runFinalized = false;\r\n private stats = {\r\n suites: 0,\r\n tests: 0,\r\n passes: 0,\r\n pending: 0,\r\n failures: 0,\r\n start: new Date(),\r\n end: new Date(),\r\n duration: 0\r\n };\r\n\r\n constructor(config: any) {\r\n // Auto-configure from environment or defaults\r\n this.projectName = process.env.QAGENTIC_PROJECT_NAME || \r\n config.projectId || \r\n 'Cypress E2E Tests';\r\n \r\n this.environment = process.env.QAGENTIC_ENVIRONMENT || \r\n process.env.NODE_ENV || \r\n 'e2e';\r\n \r\n const apiUrl = process.env.QAGENTIC_API_URL || \r\n 'http://localhost:8080';\r\n\r\n // Configure QAagentic\r\n configure({\r\n projectName: this.projectName,\r\n environment: this.environment,\r\n apiUrl,\r\n outputDir: './qagentic-results',\r\n });\r\n\r\n this.reporter = QAgenticReporter.getInstance();\r\n this.stats.start = new Date();\r\n }\r\n\r\n async onRunBegin() {\r\n try {\r\n console.log('[QAagentic] onRunBegin called, calling reporter.startRun()');\r\n this.currentRun = await this.reporter.startRun({\r\n name: this.projectName,\r\n projectName: this.projectName,\r\n environment: this.environment,\r\n startTime: this.stats.start,\r\n });\r\n console.log('[QAagentic] onRunBegin completed, currentRun:', this.currentRun?.id);\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to start run:', error);\r\n }\r\n }\r\n\r\n async ensureRunStarted() {\r\n if (this.runStarted) return;\r\n \r\n this.runStarted = true;\r\n console.log('[QAagentic] Ensuring run is started');\r\n try {\r\n await this.onRunBegin();\r\n console.log('[QAagentic] Run started successfully');\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to start run:', error);\r\n }\r\n }\r\n\r\n async onTestEnd(test: any) {\r\n // Ensure run is started before processing tests\r\n await this.ensureRunStarted();\r\n \r\n if (!this.currentRun) return;\r\n\r\n try {\r\n const testResult: TestResult = {\r\n id: uuidv4(),\r\n name: test.title[test.title.length - 1],\r\n fullName: test.title.join(' > '),\r\n status: parseStatus(test.state),\r\n durationMs: test.duration,\r\n startTime: new Date(Date.now() - test.duration),\r\n endTime: new Date(),\r\n labels: {\r\n suite: test.title.slice(0, -1).join(' > '),\r\n feature: test.title[0],\r\n },\r\n links: [],\r\n parameters: {},\r\n steps: [],\r\n attachments: [],\r\n filePath: test.invocationDetails?.relativeFile || '',\r\n retryCount: 0,\r\n isRetry: false,\r\n isFlaky: false,\r\n };\r\n\r\n if (test.state === 'failed') {\r\n // Try multiple ways to get error information\r\n const errorInfo = test.err || test.error || test.failure;\r\n const displayError = test.displayError;\r\n \r\n if (errorInfo) {\r\n testResult.errorMessage = errorInfo.message || 'Test failed';\r\n // Extract stack trace from various possible locations\r\n testResult.stackTrace = errorInfo.stack || \r\n errorInfo.codeFrame ||\r\n errorInfo.toString() ||\r\n displayError ||\r\n '';\r\n testResult.errorType = errorInfo.name || 'AssertionError';\r\n } else if (displayError) {\r\n // Use displayError from Cypress test object\r\n testResult.errorMessage = displayError;\r\n // Try to extract stack from displayError if it contains it\r\n if (displayError.includes('\\n')) {\r\n testResult.stackTrace = displayError;\r\n }\r\n testResult.errorType = 'AssertionError';\r\n } else {\r\n // Fallback: create error from test state\r\n testResult.errorMessage = 'Test assertion failed';\r\n testResult.errorType = 'AssertionError';\r\n }\r\n \r\n console.log('[QAagentic] Test failed - Error:', {\r\n message: testResult.errorMessage,\r\n type: testResult.errorType,\r\n hasStackTrace: !!testResult.stackTrace,\r\n });\r\n\r\n }\r\n\r\n // Update stats\r\n this.stats.tests++;\r\n if (test.state === 'passed') this.stats.passes++;\r\n if (test.state === 'failed') this.stats.failures++;\r\n if (test.state === 'pending') this.stats.pending++;\r\n\r\n // Collect test result with original test object for screenshot lookup\r\n this.pendingTests.push({\r\n testResult,\r\n test,\r\n });\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to report test:', error);\r\n }\r\n }\r\n\r\n private pendingTests: Array<{ testResult: TestResult; test: any }> = [];\r\n\r\n async attachScreenshots() {\r\n // This is called after the spec completes, when screenshots have been written\r\n console.log('[QAagentic] Attaching screenshots to pending tests, count:', this.pendingTests.length);\r\n \r\n for (const { testResult, test } of this.pendingTests) {\r\n // Only try to attach screenshots for failed tests\r\n if (test.state !== 'failed' || !test.invocationDetails?.relativeFile) {\r\n continue;\r\n }\r\n \r\n const testFileName = test.invocationDetails.relativeFile.replace(/\\.ts$/, '');\r\n const fullTestTitle = test.title.join(' -- ');\r\n \r\n // Try multiple screenshot locations - Mochawesome saves with full title path\r\n const screenshotPaths = [\r\n // Mochawesome report assets location - most recent screenshot (no attempt number)\r\n path.join(\r\n process.cwd(),\r\n 'cypress/reports/assets',\r\n testFileName,\r\n `${fullTestTitle} (failed).png`\r\n ),\r\n // With attempt number (fallback)\r\n path.join(\r\n process.cwd(),\r\n 'cypress/reports/assets',\r\n testFileName,\r\n `${fullTestTitle} (failed) (attempt 1).png`\r\n ),\r\n ];\r\n \r\n let screenshotFound = false;\r\n for (const screenshotPath of screenshotPaths) {\r\n if (fs.existsSync(screenshotPath)) {\r\n try {\r\n const screenshotContent = fs.readFileSync(screenshotPath);\r\n testResult.attachments.push({\r\n id: uuidv4(),\r\n name: 'screenshot',\r\n type: 'image/png',\r\n extension: 'png',\r\n content: screenshotContent.toString('base64'),\r\n size: screenshotContent.length,\r\n timestamp: new Date().toISOString(),\r\n });\r\n console.log('[QAagentic] Added screenshot for:', fullTestTitle);\r\n screenshotFound = true;\r\n break;\r\n } catch (err) {\r\n console.warn('[QAagentic] Failed to read screenshot:', err);\r\n }\r\n }\r\n }\r\n \r\n if (!screenshotFound) {\r\n console.log('[QAagentic] No screenshot found for:', fullTestTitle);\r\n }\r\n }\r\n }\r\n\r\n async sendPendingTests() {\r\n // Send all collected tests to the API\r\n console.log('[QAagentic] Sending', this.pendingTests.length, 'pending tests to API');\r\n \r\n for (const { testResult } of this.pendingTests) {\r\n await this.reporter.reportTest(testResult);\r\n }\r\n \r\n // Clear pending tests after sending\r\n this.pendingTests = [];\r\n }\r\n\r\n async finalizeRun() {\r\n if (this.runFinalized || !this.currentRun) return;\r\n \r\n this.runFinalized = true;\r\n console.log('[QAagentic] Finalizing run');\r\n \r\n try {\r\n this.stats.end = new Date();\r\n this.stats.duration = this.stats.end.getTime() - this.stats.start.getTime();\r\n\r\n // Update run with final stats\r\n this.currentRun.endTime = this.stats.end;\r\n this.currentRun.durationMs = this.stats.duration;\r\n this.currentRun.total = this.stats.tests;\r\n this.currentRun.passed = this.stats.passes;\r\n this.currentRun.failed = this.stats.failures;\r\n this.currentRun.skipped = this.stats.pending;\r\n\r\n console.log('[QAagentic] Calling reporter.endRun with stats:', {\r\n total: this.currentRun.total,\r\n passed: this.currentRun.passed,\r\n failed: this.currentRun.failed,\r\n skipped: this.currentRun.skipped,\r\n });\r\n \r\n await this.reporter.endRun();\r\n console.log('[QAagentic] Run finalized successfully');\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to finalize run:', error);\r\n }\r\n }\r\n\r\n}\r\n\r\nexport function setupQAgentic(on: any, config: any): void {\r\n const reporter = new QAgenticCypressReporter(config);\r\n\r\n // Process all tests after the entire spec completes\r\n on('after:spec', (_spec: any, results: any) => {\r\n return (async () => {\r\n if (!results?.tests) return;\r\n \r\n try {\r\n // Ensure run is started\r\n await reporter.ensureRunStarted();\r\n \r\n // Wait for mochawesome to write screenshots and reports\r\n console.log('[QAagentic] Waiting for screenshots to be written...');\r\n await new Promise((resolve) => setTimeout(resolve, 2000));\r\n \r\n // Process all tests from this spec - this collects them but doesn't send yet\r\n console.log('[QAagentic] Processing', results.tests.length, 'tests');\r\n for (const test of results.tests) {\r\n await reporter.onTestEnd(test);\r\n }\r\n \r\n // Attach screenshots after they've been written\r\n console.log('[QAagentic] Attaching screenshots...');\r\n await reporter.attachScreenshots();\r\n \r\n // Now send all tests with screenshots to the API\r\n console.log('[QAagentic] Sending tests with screenshots to API...');\r\n await reporter.sendPendingTests();\r\n \r\n // Finalize run after all tests are processed\r\n console.log('[QAagentic] Finalizing run...');\r\n await reporter.finalizeRun();\r\n \r\n // Wait for API calls to complete\r\n await new Promise((resolve) => setTimeout(resolve, 2000));\r\n } catch (error) {\r\n console.warn('[QAagentic] Error processing spec:', error);\r\n }\r\n })();\r\n });\r\n}\r\n","/**\r\n * QAagentic Cypress Plugin\r\n *\r\n * Automatically captures test results from Cypress and reports to QAagentic.\r\n *\r\n * @example\r\n * ```javascript\r\n * // cypress.config.js\r\n * const { qagentic } = require('@qagentic/reporter/cypress');\r\n *\r\n * module.exports = defineConfig({\r\n * e2e: {\r\n * setupNodeEvents(on, config) {\r\n * qagentic(on, config);\r\n * return config;\r\n * },\r\n * },\r\n * });\r\n * ```\r\n */\r\n\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { configure } from '../core/config';\r\nimport { QAgenticReporter } from '../core/reporter';\r\nimport { parseStatus } from '../core/status';\r\nimport type { TestResult, TestRunResult } from '../core/types';\r\n\r\n// Re-export core utilities\r\nexport { step, Step } from '../core/step';\r\nexport { Severity } from '../core/severity';\r\nexport { Status } from '../core/status';\r\nexport {\r\n feature,\r\n story,\r\n epic,\r\n severity,\r\n tag,\r\n label,\r\n} from '../core/decorators';\r\nexport {\r\n attach,\r\n attachScreenshot,\r\n attachJson,\r\n attachText,\r\n} from '../core/attachments';\r\n\r\n/**\r\n * Cypress plugin events interface.\r\n */\r\ninterface CypressPluginEvents {\r\n (action: 'before:run', fn: (details: BeforeRunDetails) => void | Promise<void>): void;\r\n (action: 'after:spec', fn: (spec: unknown, results: CypressSpecResult) => void | Promise<void>): void;\r\n (action: 'after:run', fn: () => void | Promise<void>): void;\r\n}\r\n\r\n/**\r\n * Cypress plugin config interface.\r\n */\r\ninterface CypressPluginConfig {\r\n projectId?: string;\r\n env?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Before run details.\r\n */\r\ninterface BeforeRunDetails {\r\n config?: CypressPluginConfig;\r\n}\r\n\r\n/**\r\n * Cypress plugin options.\r\n */\r\nexport interface CypressPluginOptions {\r\n projectName?: string;\r\n environment?: string;\r\n apiUrl?: string;\r\n apiKey?: string;\r\n outputDir?: string;\r\n screenshotsOnFailure?: boolean;\r\n videosOnFailure?: boolean;\r\n}\r\n\r\n/**\r\n * Cypress test result from after:spec event.\r\n */\r\ninterface CypressTestResult {\r\n title: string[];\r\n state: string;\r\n duration: number;\r\n err?: {\r\n message: string;\r\n stack?: string;\r\n };\r\n}\r\n\r\ninterface CypressSpecResult {\r\n stats: {\r\n tests: number;\r\n passes: number;\r\n failures: number;\r\n pending: number;\r\n skipped: number;\r\n duration: number;\r\n };\r\n tests: CypressTestResult[];\r\n spec: {\r\n name: string;\r\n relative: string;\r\n absolute: string;\r\n };\r\n}\r\n\r\n/**\r\n * Main Cypress plugin setup function.\r\n */\r\nexport function qagentic(\r\n on: CypressPluginEvents,\r\n config: CypressPluginConfig,\r\n options: CypressPluginOptions = {}\r\n): void {\r\n // Configure QAagentic\r\n configure({\r\n projectName: options.projectName || config.projectId || 'cypress-project',\r\n environment: options.environment || config.env?.QAGENTIC_ENVIRONMENT || 'local',\r\n apiUrl: options.apiUrl || config.env?.QAGENTIC_API_URL,\r\n apiKey: options.apiKey || config.env?.QAGENTIC_API_KEY,\r\n outputDir: options.outputDir || './qagentic-results',\r\n });\r\n\r\n const reporter = QAgenticReporter.getInstance();\r\n let currentRun: TestRunResult | null = null;\r\n\r\n // Start run before all specs\r\n on('before:run', async (details: BeforeRunDetails) => {\r\n currentRun = await reporter.startRun({\r\n name: `cypress_${new Date().toISOString().replace(/[:.]/g, '')}`,\r\n projectName: options.projectName || details.config?.projectId || 'cypress-project',\r\n environment: options.environment || 'local',\r\n branch: details.config?.env?.BRANCH || process.env.BRANCH,\r\n commitHash: details.config?.env?.COMMIT || process.env.COMMIT,\r\n });\r\n });\r\n\r\n // Process each spec result\r\n on('after:spec', async (_spec: unknown, results: CypressSpecResult) => {\r\n if (!results || !results.tests) return;\r\n\r\n for (const test of results.tests) {\r\n const testResult: TestResult = {\r\n id: uuidv4(),\r\n name: test.title[test.title.length - 1],\r\n fullName: test.title.join(' > '),\r\n status: parseStatus(test.state),\r\n durationMs: test.duration,\r\n startTime: new Date(Date.now() - test.duration),\r\n endTime: new Date(),\r\n labels: {\r\n suite: test.title.slice(0, -1).join(' > '),\r\n feature: test.title[0],\r\n },\r\n links: [],\r\n parameters: {},\r\n steps: [],\r\n attachments: [],\r\n filePath: results.spec.relative,\r\n retryCount: 0,\r\n isRetry: false,\r\n isFlaky: false,\r\n };\r\n\r\n if (test.err) {\r\n testResult.errorMessage = test.err.message;\r\n testResult.stackTrace = test.err.stack;\r\n testResult.errorType = 'AssertionError';\r\n }\r\n\r\n await reporter.reportTest(testResult);\r\n }\r\n });\r\n\r\n // End run after all specs\r\n on('after:run', async () => {\r\n await reporter.endRun();\r\n });\r\n}\r\n\r\n/**\r\n * Cypress command to add a step.\r\n * Call this in your support file to register custom commands.\r\n */\r\nexport function registerCommands(): void {\r\n // This function should be called from cypress/support/e2e.js\r\n // where Cypress globals are available\r\n // Example:\r\n // import { registerCommands } from '@qagentic/reporter/cypress';\r\n // registerCommands();\r\n}\r\n\r\n// Export simplified setup\r\nexport { setupQAgentic } from './simple-setup';\r\n\r\n// Default export\r\nexport default qagentic;\r\n"]}
@@ -1016,28 +1016,21 @@ var QAgenticCypressReporter = class {
1016
1016
  continue;
1017
1017
  }
1018
1018
  const testFileName = test.invocationDetails.relativeFile.replace(/\.ts$/, "");
1019
- const testName = test.title[test.title.length - 1];
1020
- const fullTestTitle = test.title.join(", ");
1019
+ const fullTestTitle = test.title.join(" -- ");
1021
1020
  const screenshotPaths = [
1022
- // Mochawesome report assets location with full title
1021
+ // Mochawesome report assets location - most recent screenshot (no attempt number)
1023
1022
  path2.join(
1024
1023
  process.cwd(),
1025
1024
  "cypress/reports/assets",
1026
1025
  testFileName,
1027
- `${fullTestTitle} -- ${testName} (failed).png`
1026
+ `${fullTestTitle} (failed).png`
1028
1027
  ),
1029
- // Alternative: without full title path
1028
+ // With attempt number (fallback)
1030
1029
  path2.join(
1031
1030
  process.cwd(),
1032
1031
  "cypress/reports/assets",
1033
1032
  testFileName,
1034
- `${testName} (failed).png`
1035
- ),
1036
- // Legacy cypress/screenshots location
1037
- path2.join(
1038
- process.cwd(),
1039
- "cypress/screenshots",
1040
- `${testFileName} -- ${testName} (failed).png`
1033
+ `${fullTestTitle} (failed) (attempt 1).png`
1041
1034
  )
1042
1035
  ];
1043
1036
  let screenshotFound = false;
@@ -1054,7 +1047,7 @@ var QAgenticCypressReporter = class {
1054
1047
  size: screenshotContent.length,
1055
1048
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
1056
1049
  });
1057
- console.log("[QAagentic] Added screenshot for:", testName);
1050
+ console.log("[QAagentic] Added screenshot for:", fullTestTitle);
1058
1051
  screenshotFound = true;
1059
1052
  break;
1060
1053
  } catch (err) {
@@ -1063,7 +1056,7 @@ var QAgenticCypressReporter = class {
1063
1056
  }
1064
1057
  }
1065
1058
  if (!screenshotFound) {
1066
- console.log("[QAagentic] No screenshot found for:", testName);
1059
+ console.log("[QAagentic] No screenshot found for:", fullTestTitle);
1067
1060
  }
1068
1061
  }
1069
1062
  }