qagentic-reporter 0.1.6 → 0.1.8

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.
@@ -412,12 +412,18 @@ var APIReporter = class {
412
412
  this.config = config || getConfig();
413
413
  }
414
414
  async startRun(run) {
415
- if (!this.config.api.enabled) return;
415
+ if (!this.config.api.enabled) {
416
+ console.log("[APIReporter] API reporting disabled");
417
+ return;
418
+ }
416
419
  this.currentRun = run;
417
420
  this.batch = [];
418
421
  try {
419
- await axios__default.default.post(
420
- `${this.config.api.url}/api/v1/runs`,
422
+ console.log("[APIReporter] Starting test run:", run.id);
423
+ const url = `${this.config.api.url}/api/v1/runs`;
424
+ console.log("[APIReporter] POST to:", url);
425
+ const response = await axios__default.default.post(
426
+ url,
421
427
  {
422
428
  id: run.id,
423
429
  name: run.name,
@@ -438,8 +444,12 @@ var APIReporter = class {
438
444
  timeout: this.config.api.timeout
439
445
  }
440
446
  );
447
+ console.log("[APIReporter] Test run started successfully:", response.status);
441
448
  } catch (error) {
442
- console.warn("Warning: Failed to register run with API:", error);
449
+ console.warn("[APIReporter] Failed to register run with API:");
450
+ console.warn(" Error:", error.message);
451
+ console.warn(" Status:", error.response?.status);
452
+ console.warn(" Data:", error.response?.data);
443
453
  }
444
454
  }
445
455
  async endRun(run) {
@@ -855,6 +865,7 @@ function setupQAgentic(on, config) {
855
865
  const projectName = process.env.QAGENTIC_PROJECT_NAME || config.projectId || "Cypress E2E Tests";
856
866
  const environment = process.env.QAGENTIC_ENVIRONMENT || process.env.NODE_ENV || "e2e";
857
867
  const apiUrl = process.env.QAGENTIC_API_URL || "http://localhost:8080";
868
+ console.log("[QAagentic] Initializing with config:", { projectName, environment, apiUrl });
858
869
  configure({
859
870
  projectName,
860
871
  environment,
@@ -863,6 +874,7 @@ function setupQAgentic(on, config) {
863
874
  });
864
875
  const reporter = QAgenticReporter.getInstance();
865
876
  let currentRun = null;
877
+ console.log("[QAagentic] Reporter initialized, setting up hooks");
866
878
  on("before:run", async () => {
867
879
  try {
868
880
  currentRun = await reporter.startRun({
@@ -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"],"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) return;\r\n\r\n this.currentRun = run;\r\n this.batch = [];\r\n\r\n try {\r\n await axios.post(\r\n `${this.config.api.url}/api/v1/runs`,\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 } catch (error) {\r\n console.warn('Warning: Failed to register run with API:', error);\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 // Flush remaining batch\r\n await this.flushBatch();\r\n\r\n try {\r\n await axios.patch(\r\n `${this.config.api.url}/api/v1/runs/${run.id}`,\r\n {\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 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 } catch (error) {\r\n console.warn('Warning: Failed to finalize run with API:', error);\r\n }\r\n }\r\n\r\n async reportTest(test: TestResult): Promise<void> {\r\n if (!this.config.api.enabled) return;\r\n\r\n this.batch.push(test);\r\n\r\n if (this.batch.length >= this.config.api.batchSize) {\r\n await this.flushBatch();\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 await axios.post(\r\n `${this.config.api.url}/api/v1/runs/${this.currentRun.id}/results`,\r\n this.batch.map((t) => ({\r\n ...t,\r\n startTime: t.startTime?.toISOString(),\r\n endTime: t.endTime?.toISOString(),\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 } catch (error) {\r\n console.warn('Warning: Failed to send test results to API:', error);\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 // Initialize reporters based on config\r\n if (this.config.features.consoleOutput) {\r\n this.reporters.push(new ConsoleReporter(this.config));\r\n }\r\n\r\n if (this.config.local.enabled) {\r\n this.reporters.push(new JSONReporter(this.config));\r\n if (this.config.local.formats.includes('junit')) {\r\n this.reporters.push(new JUnitReporter(this.config));\r\n }\r\n }\r\n\r\n if (this.config.api.enabled) {\r\n this.reporters.push(new APIReporter(this.config));\r\n }\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 this.currentRun.tests.push(test);\r\n this.currentRun.total++;\r\n\r\n switch (test.status) {\r\n case Status.PASSED:\r\n this.currentRun.passed++;\r\n break;\r\n case Status.FAILED:\r\n this.currentRun.failed++;\r\n break;\r\n case Status.BROKEN:\r\n this.currentRun.broken++;\r\n break;\r\n case Status.SKIPPED:\r\n this.currentRun.skipped++;\r\n break;\r\n }\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 { 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\nexport function setupQAgentic(on: any, config: any): void {\r\n // Auto-configure from environment or defaults\r\n const projectName = process.env.QAGENTIC_PROJECT_NAME || \r\n config.projectId || \r\n 'Cypress E2E Tests';\r\n \r\n const 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,\r\n environment,\r\n apiUrl,\r\n 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 test run\r\n on('before:run', async () => {\r\n try {\r\n currentRun = await reporter.startRun({\r\n name: `cypress_${new Date().toISOString().replace(/[:.]/g, '')}`,\r\n projectName,\r\n environment,\r\n });\r\n console.log('[QAagentic] Test 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 // Capture test results\r\n on('after:spec', async (_spec: any, results: any) => {\r\n if (!results?.tests) return;\r\n\r\n for (const test of results.tests) {\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: 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 } catch (error) {\r\n console.warn('[QAagentic] Failed to report test:', error);\r\n }\r\n }\r\n });\r\n\r\n // End test run\r\n on('after:run', async () => {\r\n try {\r\n await reporter.endRun();\r\n console.log('[QAagentic] Test run completed');\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to end run:', error);\r\n }\r\n });\r\n}\r\n\r\nexport default setupQAgentic;\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"],"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 // Flush remaining batch\r\n await this.flushBatch();\r\n\r\n try {\r\n await axios.patch(\r\n `${this.config.api.url}/api/v1/runs/${run.id}`,\r\n {\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 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 } catch (error) {\r\n console.warn('Warning: Failed to finalize run with API:', error);\r\n }\r\n }\r\n\r\n async reportTest(test: TestResult): Promise<void> {\r\n if (!this.config.api.enabled) return;\r\n\r\n this.batch.push(test);\r\n\r\n if (this.batch.length >= this.config.api.batchSize) {\r\n await this.flushBatch();\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 await axios.post(\r\n `${this.config.api.url}/api/v1/runs/${this.currentRun.id}/results`,\r\n this.batch.map((t) => ({\r\n ...t,\r\n startTime: t.startTime?.toISOString(),\r\n endTime: t.endTime?.toISOString(),\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 } catch (error) {\r\n console.warn('Warning: Failed to send test results to API:', error);\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 // Initialize reporters based on config\r\n if (this.config.features.consoleOutput) {\r\n this.reporters.push(new ConsoleReporter(this.config));\r\n }\r\n\r\n if (this.config.local.enabled) {\r\n this.reporters.push(new JSONReporter(this.config));\r\n if (this.config.local.formats.includes('junit')) {\r\n this.reporters.push(new JUnitReporter(this.config));\r\n }\r\n }\r\n\r\n if (this.config.api.enabled) {\r\n this.reporters.push(new APIReporter(this.config));\r\n }\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 this.currentRun.tests.push(test);\r\n this.currentRun.total++;\r\n\r\n switch (test.status) {\r\n case Status.PASSED:\r\n this.currentRun.passed++;\r\n break;\r\n case Status.FAILED:\r\n this.currentRun.failed++;\r\n break;\r\n case Status.BROKEN:\r\n this.currentRun.broken++;\r\n break;\r\n case Status.SKIPPED:\r\n this.currentRun.skipped++;\r\n break;\r\n }\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 { 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\nexport function setupQAgentic(on: any, config: any): void {\r\n // Auto-configure from environment or defaults\r\n const projectName = process.env.QAGENTIC_PROJECT_NAME || \r\n config.projectId || \r\n 'Cypress E2E Tests';\r\n \r\n const 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 console.log('[QAagentic] Initializing with config:', { projectName, environment, apiUrl });\r\n\r\n // Configure QAagentic\r\n configure({\r\n projectName,\r\n environment,\r\n apiUrl,\r\n outputDir: './qagentic-results',\r\n });\r\n\r\n const reporter = QAgenticReporter.getInstance();\r\n let currentRun: TestRunResult | null = null;\r\n \r\n console.log('[QAagentic] Reporter initialized, setting up hooks');\r\n\r\n // Start test run\r\n on('before:run', async () => {\r\n try {\r\n currentRun = await reporter.startRun({\r\n name: `cypress_${new Date().toISOString().replace(/[:.]/g, '')}`,\r\n projectName,\r\n environment,\r\n });\r\n console.log('[QAagentic] Test 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 // Capture test results\r\n on('after:spec', async (_spec: any, results: any) => {\r\n if (!results?.tests) return;\r\n\r\n for (const test of results.tests) {\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: 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 } catch (error) {\r\n console.warn('[QAagentic] Failed to report test:', error);\r\n }\r\n }\r\n });\r\n\r\n // End test run\r\n on('after:run', async () => {\r\n try {\r\n await reporter.endRun();\r\n console.log('[QAagentic] Test run completed');\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to end run:', error);\r\n }\r\n });\r\n}\r\n\r\nexport default setupQAgentic;\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"]}
@@ -384,12 +384,18 @@ var APIReporter = class {
384
384
  this.config = config || getConfig();
385
385
  }
386
386
  async startRun(run) {
387
- if (!this.config.api.enabled) return;
387
+ if (!this.config.api.enabled) {
388
+ console.log("[APIReporter] API reporting disabled");
389
+ return;
390
+ }
388
391
  this.currentRun = run;
389
392
  this.batch = [];
390
393
  try {
391
- await axios.post(
392
- `${this.config.api.url}/api/v1/runs`,
394
+ console.log("[APIReporter] Starting test run:", run.id);
395
+ const url = `${this.config.api.url}/api/v1/runs`;
396
+ console.log("[APIReporter] POST to:", url);
397
+ const response = await axios.post(
398
+ url,
393
399
  {
394
400
  id: run.id,
395
401
  name: run.name,
@@ -410,8 +416,12 @@ var APIReporter = class {
410
416
  timeout: this.config.api.timeout
411
417
  }
412
418
  );
419
+ console.log("[APIReporter] Test run started successfully:", response.status);
413
420
  } catch (error) {
414
- console.warn("Warning: Failed to register run with API:", error);
421
+ console.warn("[APIReporter] Failed to register run with API:");
422
+ console.warn(" Error:", error.message);
423
+ console.warn(" Status:", error.response?.status);
424
+ console.warn(" Data:", error.response?.data);
415
425
  }
416
426
  }
417
427
  async endRun(run) {
@@ -827,6 +837,7 @@ function setupQAgentic(on, config) {
827
837
  const projectName = process.env.QAGENTIC_PROJECT_NAME || config.projectId || "Cypress E2E Tests";
828
838
  const environment = process.env.QAGENTIC_ENVIRONMENT || process.env.NODE_ENV || "e2e";
829
839
  const apiUrl = process.env.QAGENTIC_API_URL || "http://localhost:8080";
840
+ console.log("[QAagentic] Initializing with config:", { projectName, environment, apiUrl });
830
841
  configure({
831
842
  projectName,
832
843
  environment,
@@ -835,6 +846,7 @@ function setupQAgentic(on, config) {
835
846
  });
836
847
  const reporter = QAgenticReporter.getInstance();
837
848
  let currentRun = null;
849
+ console.log("[QAagentic] Reporter initialized, setting up hooks");
838
850
  on("before:run", async () => {
839
851
  try {
840
852
  currentRun = await reporter.startRun({