@devness/coverit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +169 -0
  3. package/dist/agents/orchestrator.d.ts +21 -0
  4. package/dist/agents/orchestrator.d.ts.map +1 -0
  5. package/dist/agents/orchestrator.js +235 -0
  6. package/dist/agents/orchestrator.js.map +1 -0
  7. package/dist/agents/reporter.d.ts +13 -0
  8. package/dist/agents/reporter.d.ts.map +1 -0
  9. package/dist/agents/reporter.js +323 -0
  10. package/dist/agents/reporter.js.map +1 -0
  11. package/dist/ai/anthropic-provider.d.ts +19 -0
  12. package/dist/ai/anthropic-provider.d.ts.map +1 -0
  13. package/dist/ai/anthropic-provider.js +83 -0
  14. package/dist/ai/anthropic-provider.js.map +1 -0
  15. package/dist/ai/claude-cli-provider.d.ts +22 -0
  16. package/dist/ai/claude-cli-provider.d.ts.map +1 -0
  17. package/dist/ai/claude-cli-provider.js +197 -0
  18. package/dist/ai/claude-cli-provider.js.map +1 -0
  19. package/dist/ai/index.d.ts +15 -0
  20. package/dist/ai/index.d.ts.map +1 -0
  21. package/dist/ai/index.js +16 -0
  22. package/dist/ai/index.js.map +1 -0
  23. package/dist/ai/ollama-provider.d.ts +17 -0
  24. package/dist/ai/ollama-provider.d.ts.map +1 -0
  25. package/dist/ai/ollama-provider.js +88 -0
  26. package/dist/ai/ollama-provider.js.map +1 -0
  27. package/dist/ai/openai-provider.d.ts +20 -0
  28. package/dist/ai/openai-provider.d.ts.map +1 -0
  29. package/dist/ai/openai-provider.js +74 -0
  30. package/dist/ai/openai-provider.js.map +1 -0
  31. package/dist/ai/prompts.d.ts +36 -0
  32. package/dist/ai/prompts.d.ts.map +1 -0
  33. package/dist/ai/prompts.js +259 -0
  34. package/dist/ai/prompts.js.map +1 -0
  35. package/dist/ai/provider-factory.d.ts +26 -0
  36. package/dist/ai/provider-factory.d.ts.map +1 -0
  37. package/dist/ai/provider-factory.js +111 -0
  38. package/dist/ai/provider-factory.js.map +1 -0
  39. package/dist/ai/types.d.ts +37 -0
  40. package/dist/ai/types.d.ts.map +1 -0
  41. package/dist/ai/types.js +10 -0
  42. package/dist/ai/types.js.map +1 -0
  43. package/dist/analysis/code-scanner.d.ts +9 -0
  44. package/dist/analysis/code-scanner.d.ts.map +1 -0
  45. package/dist/analysis/code-scanner.js +409 -0
  46. package/dist/analysis/code-scanner.js.map +1 -0
  47. package/dist/analysis/dependency-graph.d.ts +9 -0
  48. package/dist/analysis/dependency-graph.d.ts.map +1 -0
  49. package/dist/analysis/dependency-graph.js +149 -0
  50. package/dist/analysis/dependency-graph.js.map +1 -0
  51. package/dist/analysis/diff-analyzer.d.ts +9 -0
  52. package/dist/analysis/diff-analyzer.d.ts.map +1 -0
  53. package/dist/analysis/diff-analyzer.js +232 -0
  54. package/dist/analysis/diff-analyzer.js.map +1 -0
  55. package/dist/analysis/index.d.ts +5 -0
  56. package/dist/analysis/index.d.ts.map +1 -0
  57. package/dist/analysis/index.js +5 -0
  58. package/dist/analysis/index.js.map +1 -0
  59. package/dist/analysis/strategy-planner.d.ts +11 -0
  60. package/dist/analysis/strategy-planner.d.ts.map +1 -0
  61. package/dist/analysis/strategy-planner.js +384 -0
  62. package/dist/analysis/strategy-planner.js.map +1 -0
  63. package/dist/cli/index.d.ts +9 -0
  64. package/dist/cli/index.d.ts.map +1 -0
  65. package/dist/cli/index.js +288 -0
  66. package/dist/cli/index.js.map +1 -0
  67. package/dist/executors/base-executor.d.ts +35 -0
  68. package/dist/executors/base-executor.d.ts.map +1 -0
  69. package/dist/executors/base-executor.js +138 -0
  70. package/dist/executors/base-executor.js.map +1 -0
  71. package/dist/executors/browser-runner.d.ts +24 -0
  72. package/dist/executors/browser-runner.d.ts.map +1 -0
  73. package/dist/executors/browser-runner.js +194 -0
  74. package/dist/executors/browser-runner.js.map +1 -0
  75. package/dist/executors/cloud-runner.d.ts +41 -0
  76. package/dist/executors/cloud-runner.d.ts.map +1 -0
  77. package/dist/executors/cloud-runner.js +153 -0
  78. package/dist/executors/cloud-runner.js.map +1 -0
  79. package/dist/executors/index.d.ts +12 -0
  80. package/dist/executors/index.d.ts.map +1 -0
  81. package/dist/executors/index.js +28 -0
  82. package/dist/executors/index.js.map +1 -0
  83. package/dist/executors/local-runner.d.ts +40 -0
  84. package/dist/executors/local-runner.d.ts.map +1 -0
  85. package/dist/executors/local-runner.js +395 -0
  86. package/dist/executors/local-runner.js.map +1 -0
  87. package/dist/executors/reporter.d.ts +6 -0
  88. package/dist/executors/reporter.d.ts.map +1 -0
  89. package/dist/executors/reporter.js +6 -0
  90. package/dist/executors/reporter.js.map +1 -0
  91. package/dist/executors/simulator-runner.d.ts +30 -0
  92. package/dist/executors/simulator-runner.d.ts.map +1 -0
  93. package/dist/executors/simulator-runner.js +339 -0
  94. package/dist/executors/simulator-runner.js.map +1 -0
  95. package/dist/generators/api-test.d.ts +22 -0
  96. package/dist/generators/api-test.d.ts.map +1 -0
  97. package/dist/generators/api-test.js +235 -0
  98. package/dist/generators/api-test.js.map +1 -0
  99. package/dist/generators/base-generator.d.ts +79 -0
  100. package/dist/generators/base-generator.d.ts.map +1 -0
  101. package/dist/generators/base-generator.js +234 -0
  102. package/dist/generators/base-generator.js.map +1 -0
  103. package/dist/generators/desktop-test.d.ts +22 -0
  104. package/dist/generators/desktop-test.d.ts.map +1 -0
  105. package/dist/generators/desktop-test.js +290 -0
  106. package/dist/generators/desktop-test.js.map +1 -0
  107. package/dist/generators/e2e-browser.d.ts +19 -0
  108. package/dist/generators/e2e-browser.d.ts.map +1 -0
  109. package/dist/generators/e2e-browser.js +233 -0
  110. package/dist/generators/e2e-browser.js.map +1 -0
  111. package/dist/generators/index.d.ts +21 -0
  112. package/dist/generators/index.d.ts.map +1 -0
  113. package/dist/generators/index.js +66 -0
  114. package/dist/generators/index.js.map +1 -0
  115. package/dist/generators/mobile-test.d.ts +22 -0
  116. package/dist/generators/mobile-test.d.ts.map +1 -0
  117. package/dist/generators/mobile-test.js +286 -0
  118. package/dist/generators/mobile-test.js.map +1 -0
  119. package/dist/generators/unit-test.d.ts +23 -0
  120. package/dist/generators/unit-test.d.ts.map +1 -0
  121. package/dist/generators/unit-test.js +282 -0
  122. package/dist/generators/unit-test.js.map +1 -0
  123. package/dist/index.d.ts +12 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +13 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/mcp/server.d.ts +8 -0
  128. package/dist/mcp/server.d.ts.map +1 -0
  129. package/dist/mcp/server.js +217 -0
  130. package/dist/mcp/server.js.map +1 -0
  131. package/dist/types/index.d.ts +295 -0
  132. package/dist/types/index.d.ts.map +1 -0
  133. package/dist/types/index.js +8 -0
  134. package/dist/types/index.js.map +1 -0
  135. package/dist/utils/framework-detector.d.ts +28 -0
  136. package/dist/utils/framework-detector.d.ts.map +1 -0
  137. package/dist/utils/framework-detector.js +184 -0
  138. package/dist/utils/framework-detector.js.map +1 -0
  139. package/dist/utils/git.d.ts +33 -0
  140. package/dist/utils/git.d.ts.map +1 -0
  141. package/dist/utils/git.js +82 -0
  142. package/dist/utils/git.js.map +1 -0
  143. package/dist/utils/logger.d.ts +17 -0
  144. package/dist/utils/logger.d.ts.map +1 -0
  145. package/dist/utils/logger.js +47 -0
  146. package/dist/utils/logger.js.map +1 -0
  147. package/package.json +86 -0
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Browser Runner — Execute Playwright E2E tests with full browser context.
3
+ *
4
+ * Launches the Playwright test runner in a subprocess, configured for
5
+ * headless execution with JSON reporting. Handles screenshot capture
6
+ * on failure and graceful cleanup of browser processes.
7
+ */
8
+ import { spawn } from "node:child_process";
9
+ import { existsSync } from "node:fs";
10
+ import { mkdir } from "node:fs/promises";
11
+ import { join, dirname, resolve } from "node:path";
12
+ import { BaseExecutor } from "./base-executor.js";
13
+ export class BrowserRunner extends BaseExecutor {
14
+ async execute(test, config) {
15
+ const result = this.createBaseResult(test.planId);
16
+ const start = Date.now();
17
+ try {
18
+ const browserConfig = this.resolveBrowserConfig(test);
19
+ // Ensure screenshots directory exists
20
+ await mkdir(browserConfig.screenshotsDir, { recursive: true });
21
+ const spawnResult = await this.withTimeout(this.withRetry(() => this.runPlaywright(test, browserConfig), config.retries), config.timeout);
22
+ result.duration = Date.now() - start;
23
+ result.output = this.combineOutput(spawnResult.stdout, spawnResult.stderr);
24
+ this.parsePlaywrightOutput(spawnResult, result);
25
+ }
26
+ catch (err) {
27
+ result.duration = Date.now() - start;
28
+ const message = err instanceof Error ? err.message : String(err);
29
+ if (message.includes("timed out")) {
30
+ result.status = "timeout";
31
+ }
32
+ else if (message.includes("browserType.launch") ||
33
+ message.includes("Executable doesn't exist")) {
34
+ result.status = "error";
35
+ result.output =
36
+ "Browser launch failed. Run `bunx playwright install` to install browsers.";
37
+ }
38
+ else {
39
+ result.status = "error";
40
+ }
41
+ result.output = result.output || message;
42
+ result.failures.push({
43
+ testName: "(browser-runner)",
44
+ message,
45
+ });
46
+ }
47
+ return result;
48
+ }
49
+ // ── Config ────────────────────────────────────────────────────
50
+ resolveBrowserConfig(test) {
51
+ const projectDir = this.findProjectRoot(test.filePath);
52
+ return {
53
+ headless: true,
54
+ screenshotsDir: join(projectDir, "test-results", "screenshots"),
55
+ baseURL: this.detectBaseURL(projectDir),
56
+ browserType: "chromium",
57
+ };
58
+ }
59
+ /**
60
+ * Try to detect a dev server URL from common config files.
61
+ * Falls back to null — Playwright config in the project should define it.
62
+ */
63
+ detectBaseURL(projectDir) {
64
+ const configCandidates = [
65
+ join(projectDir, "playwright.config.ts"),
66
+ join(projectDir, "playwright.config.js"),
67
+ ];
68
+ // We don't parse the config at runtime — just check it exists.
69
+ // The Playwright runner will use its own config resolution.
70
+ for (const configPath of configCandidates) {
71
+ if (existsSync(configPath))
72
+ return null;
73
+ }
74
+ // No Playwright config found — assume a default dev server
75
+ return "http://localhost:3000";
76
+ }
77
+ // ── Execution ─────────────────────────────────────────────────
78
+ runPlaywright(test, browserConfig) {
79
+ return new Promise((resolve, reject) => {
80
+ const cwd = this.findProjectRoot(test.filePath);
81
+ const args = [
82
+ "playwright",
83
+ "test",
84
+ test.filePath,
85
+ "--reporter=json",
86
+ ];
87
+ if (browserConfig.headless) {
88
+ args.push("--headed=false");
89
+ }
90
+ // Pass screenshot config via env
91
+ const env = {
92
+ ...process.env,
93
+ CI: "true",
94
+ FORCE_COLOR: "0",
95
+ PLAYWRIGHT_JSON_OUTPUT_NAME: "results.json",
96
+ };
97
+ if (browserConfig.baseURL) {
98
+ env.BASE_URL = browserConfig.baseURL;
99
+ }
100
+ let child;
101
+ try {
102
+ child = spawn("bunx", args, {
103
+ cwd,
104
+ stdio: ["ignore", "pipe", "pipe"],
105
+ env,
106
+ });
107
+ }
108
+ catch (err) {
109
+ reject(new Error(`Failed to launch Playwright: ${err instanceof Error ? err.message : String(err)}`));
110
+ return;
111
+ }
112
+ const stdoutChunks = [];
113
+ const stderrChunks = [];
114
+ child.stdout?.on("data", (chunk) => stdoutChunks.push(chunk));
115
+ child.stderr?.on("data", (chunk) => stderrChunks.push(chunk));
116
+ child.on("error", (err) => reject(new Error(`Playwright error: ${err.message}`)));
117
+ child.on("close", (code) => {
118
+ resolve({
119
+ exitCode: code ?? 1,
120
+ stdout: Buffer.concat(stdoutChunks).toString("utf-8"),
121
+ stderr: Buffer.concat(stderrChunks).toString("utf-8"),
122
+ });
123
+ });
124
+ });
125
+ }
126
+ // ── Parsing ───────────────────────────────────────────────────
127
+ parsePlaywrightOutput(spawn, result) {
128
+ const json = this.parseJsonOutput(spawn.stdout);
129
+ if (!json) {
130
+ result.status = spawn.exitCode === 0 ? "passed" : "failed";
131
+ if (spawn.exitCode !== 0 && spawn.stderr) {
132
+ result.failures.push({
133
+ testName: "(playwright)",
134
+ message: spawn.stderr.slice(0, 2000),
135
+ });
136
+ }
137
+ return;
138
+ }
139
+ // Playwright JSON reporter shape: { stats, suites[] }
140
+ const stats = json.stats ?? {};
141
+ result.passed = stats.expected ?? 0;
142
+ result.failed = stats.unexpected ?? 0;
143
+ result.skipped = stats.skipped ?? 0;
144
+ result.totalTests = result.passed + result.failed + result.skipped;
145
+ result.status =
146
+ spawn.exitCode === 0 && result.failed === 0 ? "passed" : "failed";
147
+ this.extractFailures(json.suites ?? [], result.failures);
148
+ }
149
+ extractFailures(suites, failures) {
150
+ for (const suite of suites) {
151
+ if (Array.isArray(suite.specs)) {
152
+ for (const spec of suite.specs) {
153
+ if (!Array.isArray(spec.tests))
154
+ continue;
155
+ for (const test of spec.tests) {
156
+ if (!Array.isArray(test.results))
157
+ continue;
158
+ for (const run of test.results) {
159
+ if (run.status === "unexpected" || run.status === "failed") {
160
+ failures.push({
161
+ testName: spec.title ?? "unknown",
162
+ message: run.error?.message ?? run.error?.snippet ?? "Test failed",
163
+ stack: run.error?.stack ?? undefined,
164
+ });
165
+ }
166
+ }
167
+ }
168
+ }
169
+ }
170
+ if (Array.isArray(suite.suites)) {
171
+ this.extractFailures(suite.suites, failures);
172
+ }
173
+ }
174
+ }
175
+ // ── Helpers ───────────────────────────────────────────────────
176
+ findProjectRoot(filePath) {
177
+ let dir = dirname(resolve(filePath));
178
+ while (dir !== "/" && dir !== ".") {
179
+ if (existsSync(join(dir, "package.json")))
180
+ return dir;
181
+ dir = dirname(dir);
182
+ }
183
+ return dirname(resolve(filePath));
184
+ }
185
+ combineOutput(stdout, stderr) {
186
+ const parts = [];
187
+ if (stdout)
188
+ parts.push(stdout);
189
+ if (stderr)
190
+ parts.push(`[stderr]\n${stderr}`);
191
+ return parts.join("\n").slice(0, 50_000);
192
+ }
193
+ }
194
+ //# sourceMappingURL=browser-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-runner.js","sourceRoot":"","sources":["../../src/executors/browser-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Cloud Runner — Execute tests in isolated cloud sandboxes.
3
+ *
4
+ * Supports two providers:
5
+ * - E2B: AI-optimized sandboxes with fast cold start
6
+ * - Docker: Container-based execution for self-hosted setups
7
+ *
8
+ * Both paths produce a standard ExecutionResult. Providers are selected
9
+ * via ExecutionConfig.cloudConfig.provider.
10
+ *
11
+ * TODO: Implement when cloud provider is configured — the interfaces
12
+ * and flow are defined but actual SDK calls are stubbed.
13
+ */
14
+ import { BaseExecutor } from "./base-executor.js";
15
+ import type { GeneratedTest, ExecutionConfig, ExecutionResult } from "../types/index.js";
16
+ export declare class CloudRunner extends BaseExecutor {
17
+ execute(test: GeneratedTest, config: ExecutionConfig): Promise<ExecutionResult>;
18
+ /**
19
+ * E2B execution flow:
20
+ * 1. Create sandbox with project dependencies
21
+ * 2. Upload the generated test file
22
+ * 3. Run the test command inside the sandbox
23
+ * 4. Download results and coverage artifacts
24
+ * 5. Clean up the sandbox
25
+ */
26
+ private executeInE2B;
27
+ private createE2BSandbox;
28
+ private uploadToSandbox;
29
+ private runInSandbox;
30
+ private destroySandbox;
31
+ /**
32
+ * Docker execution flow:
33
+ * 1. Build or pull an image with project dependencies
34
+ * 2. Mount the generated test file into the container
35
+ * 3. Run the test command as the container entrypoint
36
+ * 4. Parse stdout/stderr for results
37
+ * 5. Remove the container
38
+ */
39
+ private executeInDocker;
40
+ }
41
+ //# sourceMappingURL=cloud-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-runner.d.ts","sourceRoot":"","sources":["../../src/executors/cloud-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,eAAe,EAEhB,MAAM,mBAAmB,CAAC;AAO3B,qBAAa,WAAY,SAAQ,YAAY;IACrC,OAAO,CACX,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,eAAe,CAAC;IA6C3B;;;;;;;OAOG;YACW,YAAY;YAiDZ,gBAAgB;YAOhB,eAAe;YASf,YAAY;YAQZ,cAAc;IAM5B;;;;;;;OAOG;YACW,eAAe;CAmC9B"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Cloud Runner — Execute tests in isolated cloud sandboxes.
3
+ *
4
+ * Supports two providers:
5
+ * - E2B: AI-optimized sandboxes with fast cold start
6
+ * - Docker: Container-based execution for self-hosted setups
7
+ *
8
+ * Both paths produce a standard ExecutionResult. Providers are selected
9
+ * via ExecutionConfig.cloudConfig.provider.
10
+ *
11
+ * TODO: Implement when cloud provider is configured — the interfaces
12
+ * and flow are defined but actual SDK calls are stubbed.
13
+ */
14
+ import { BaseExecutor } from "./base-executor.js";
15
+ export class CloudRunner extends BaseExecutor {
16
+ async execute(test, config) {
17
+ const result = this.createBaseResult(test.planId);
18
+ const start = Date.now();
19
+ try {
20
+ const provider = config.cloudConfig?.provider ?? "docker";
21
+ switch (provider) {
22
+ case "e2b":
23
+ return await this.withTimeout(this.executeInE2B(test, config, result), config.timeout);
24
+ case "docker":
25
+ return await this.withTimeout(this.executeInDocker(test, config, result), config.timeout);
26
+ default:
27
+ result.status = "error";
28
+ result.output = `Unsupported cloud provider: ${provider}. Supported: e2b, docker.`;
29
+ result.failures.push({
30
+ testName: "(cloud-runner)",
31
+ message: result.output,
32
+ });
33
+ return result;
34
+ }
35
+ }
36
+ catch (err) {
37
+ result.duration = Date.now() - start;
38
+ const message = err instanceof Error ? err.message : String(err);
39
+ if (message.includes("timed out")) {
40
+ result.status = "timeout";
41
+ }
42
+ else {
43
+ result.status = "error";
44
+ }
45
+ result.output = message;
46
+ result.failures.push({ testName: "(cloud-runner)", message });
47
+ return result;
48
+ }
49
+ }
50
+ // ── E2B Sandbox ───────────────────────────────────────────────
51
+ /**
52
+ * E2B execution flow:
53
+ * 1. Create sandbox with project dependencies
54
+ * 2. Upload the generated test file
55
+ * 3. Run the test command inside the sandbox
56
+ * 4. Download results and coverage artifacts
57
+ * 5. Clean up the sandbox
58
+ */
59
+ async executeInE2B(test, config, result) {
60
+ const start = Date.now();
61
+ let sandbox = null;
62
+ try {
63
+ // Step 1: Create sandbox
64
+ sandbox = await this.createE2BSandbox(config.cloudConfig);
65
+ // Step 2: Upload test file
66
+ await this.uploadToSandbox(sandbox, test.filePath, test.content);
67
+ // Step 3: Run test command
68
+ const output = await this.runInSandbox(sandbox, test);
69
+ // Step 4: Parse results
70
+ const json = this.parseJsonOutput(output);
71
+ if (json) {
72
+ result.totalTests = json.numTotalTests ?? 0;
73
+ result.passed = json.numPassedTests ?? 0;
74
+ result.failed = json.numFailedTests ?? 0;
75
+ result.status = result.failed > 0 ? "failed" : "passed";
76
+ }
77
+ else {
78
+ result.status = "passed";
79
+ result.output = output;
80
+ }
81
+ result.duration = Date.now() - start;
82
+ result.output = output;
83
+ }
84
+ catch (err) {
85
+ result.duration = Date.now() - start;
86
+ result.status = "error";
87
+ result.output = err instanceof Error ? err.message : String(err);
88
+ result.failures.push({
89
+ testName: "(e2b-sandbox)",
90
+ message: result.output,
91
+ });
92
+ }
93
+ finally {
94
+ // Step 5: Cleanup
95
+ if (sandbox)
96
+ await this.destroySandbox(sandbox);
97
+ }
98
+ return result;
99
+ }
100
+ // TODO: Implement when E2B SDK is added as a dependency
101
+ async createE2BSandbox(_config) {
102
+ throw new Error("E2B sandbox not configured. Install @e2b/code-interpreter and set E2B_API_KEY.");
103
+ }
104
+ // TODO: Implement when E2B SDK is added as a dependency
105
+ async uploadToSandbox(_sandbox, _path, _content) {
106
+ throw new Error("E2B sandbox upload not implemented.");
107
+ }
108
+ // TODO: Implement when E2B SDK is added as a dependency
109
+ async runInSandbox(_sandbox, _test) {
110
+ throw new Error("E2B sandbox execution not implemented.");
111
+ }
112
+ // TODO: Implement when E2B SDK is added as a dependency
113
+ async destroySandbox(_sandbox) {
114
+ // No-op until SDK is integrated
115
+ }
116
+ // ── Docker Execution ──────────────────────────────────────────
117
+ /**
118
+ * Docker execution flow:
119
+ * 1. Build or pull an image with project dependencies
120
+ * 2. Mount the generated test file into the container
121
+ * 3. Run the test command as the container entrypoint
122
+ * 4. Parse stdout/stderr for results
123
+ * 5. Remove the container
124
+ */
125
+ async executeInDocker(_test, config, result) {
126
+ const start = Date.now();
127
+ try {
128
+ const image = config.cloudConfig?.image ?? "node:20-slim";
129
+ // TODO: Implement when Docker provider is configured
130
+ // const containerId = await this.createContainer(image, test, config);
131
+ // const output = await this.waitForContainer(containerId);
132
+ // await this.removeContainer(containerId);
133
+ result.duration = Date.now() - start;
134
+ result.status = "error";
135
+ result.output = `Docker execution not yet implemented. Would use image: ${image}`;
136
+ result.failures.push({
137
+ testName: "(docker-runner)",
138
+ message: "Docker execution is not yet implemented. Configure a cloud provider or use local execution.",
139
+ });
140
+ }
141
+ catch (err) {
142
+ result.duration = Date.now() - start;
143
+ result.status = "error";
144
+ result.output = err instanceof Error ? err.message : String(err);
145
+ result.failures.push({
146
+ testName: "(docker-runner)",
147
+ message: result.output,
148
+ });
149
+ }
150
+ return result;
151
+ }
152
+ }
153
+ //# sourceMappingURL=cloud-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-runner.js","sourceRoot":"","sources":["../../src/executors/cloud-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Executor Factory — Maps execution environments to concrete runner instances.
3
+ */
4
+ import type { ExecutionEnvironment } from "../types/index.js";
5
+ import { BaseExecutor } from "./base-executor.js";
6
+ export declare function createExecutor(environment: ExecutionEnvironment): BaseExecutor;
7
+ export { BaseExecutor } from "./base-executor.js";
8
+ export { LocalRunner } from "./local-runner.js";
9
+ export { CloudRunner } from "./cloud-runner.js";
10
+ export { BrowserRunner } from "./browser-runner.js";
11
+ export { SimulatorRunner } from "./simulator-runner.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/executors/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAclD,wBAAgB,cAAc,CAAC,WAAW,EAAE,oBAAoB,GAAG,YAAY,CAS9E;AAED,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Executor Factory — Maps execution environments to concrete runner instances.
3
+ */
4
+ import { LocalRunner } from "./local-runner.js";
5
+ import { CloudRunner } from "./cloud-runner.js";
6
+ import { BrowserRunner } from "./browser-runner.js";
7
+ import { SimulatorRunner } from "./simulator-runner.js";
8
+ const executorMap = {
9
+ local: () => new LocalRunner(),
10
+ "cloud-sandbox": () => new CloudRunner(),
11
+ browser: () => new BrowserRunner(),
12
+ "mobile-simulator": () => new SimulatorRunner(),
13
+ "desktop-app": () => new SimulatorRunner(),
14
+ };
15
+ export function createExecutor(environment) {
16
+ const factory = executorMap[environment];
17
+ if (!factory) {
18
+ throw new Error(`Unknown execution environment: ${environment}. ` +
19
+ `Supported: ${Object.keys(executorMap).join(", ")}`);
20
+ }
21
+ return factory();
22
+ }
23
+ export { BaseExecutor } from "./base-executor.js";
24
+ export { LocalRunner } from "./local-runner.js";
25
+ export { CloudRunner } from "./cloud-runner.js";
26
+ export { BrowserRunner } from "./browser-runner.js";
27
+ export { SimulatorRunner } from "./simulator-runner.js";
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/executors/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,WAAW,GAAqD;IACpE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE;IAC9B,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE;IACxC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,aAAa,EAAE;IAClC,kBAAkB,EAAE,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE;IAC/C,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE;CAC3C,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,WAAiC;IAC9D,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,kCAAkC,WAAW,IAAI;YAC/C,cAAc,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACtD,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,EAAE,CAAC;AACnB,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Local Runner — Executes generated tests on the local machine.
3
+ *
4
+ * Auto-detects the test framework from the GeneratedTest metadata and
5
+ * spawns the appropriate CLI command. Parses JSON reporter output into
6
+ * a normalized ExecutionResult with optional coverage.
7
+ *
8
+ * This is the primary executor — all other runners are specialized variants.
9
+ */
10
+ import { BaseExecutor } from "./base-executor.js";
11
+ import type { GeneratedTest, ExecutionConfig, ExecutionResult } from "../types/index.js";
12
+ export declare class LocalRunner extends BaseExecutor {
13
+ execute(test: GeneratedTest, config: ExecutionConfig): Promise<ExecutionResult>;
14
+ private buildCommand;
15
+ private vitestCommand;
16
+ private jestCommand;
17
+ private playwrightCommand;
18
+ private pytestCommand;
19
+ private goTestCommand;
20
+ private runProcess;
21
+ private parseResult;
22
+ private parseVitestResult;
23
+ private parseJestResult;
24
+ private parsePlaywrightResult;
25
+ private extractPlaywrightFailures;
26
+ private parsePytestResult;
27
+ private parseGoTestResult;
28
+ /**
29
+ * Fallback when we cannot parse structured output.
30
+ * Derive pass/fail from the exit code alone.
31
+ */
32
+ private parseFallbackResult;
33
+ /** Try to read coverage-summary.json from common output locations. */
34
+ private readCoverageFromDisk;
35
+ private resolveWorkingDir;
36
+ private ensureTestFile;
37
+ private combineOutput;
38
+ private deriveStatus;
39
+ }
40
+ //# sourceMappingURL=local-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-runner.d.ts","sourceRoot":"","sources":["../../src/executors/local-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,eAAe,EAGhB,MAAM,mBAAmB,CAAC;AAQ3B,qBAAa,WAAY,SAAQ,YAAY;IACrC,OAAO,CACX,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,eAAe,CAAC;IAmD3B,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,UAAU;IA+ClB,OAAO,CAAC,WAAW;IA2BnB,OAAO,CAAC,iBAAiB;IAyCzB,OAAO,CAAC,eAAe;IA+BvB,OAAO,CAAC,qBAAqB;IAuB7B,OAAO,CAAC,yBAAyB;IA+BjC,OAAO,CAAC,iBAAiB;IA4BzB,OAAO,CAAC,iBAAiB;IA8BzB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAe3B,sEAAsE;YACxD,oBAAoB;IAuBlC,OAAO,CAAC,iBAAiB;YAUX,cAAc;IAM5B,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,YAAY;CAQrB"}