agentgui 1.0.74 → 1.0.76

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.
@@ -1,528 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * COMPREHENSIVE BROWSER TEST SUITE - AGENTGUI
5
- * Real browser automation with Playwright
6
- * Tests UI components, interactions, and functionality
7
- * Does NOT require Claude CLI (uses web UI directly)
8
- * Date: 2026-02-05
9
- */
10
-
11
- import { chromium } from 'playwright';
12
- import { existsSync, readFileSync, writeFileSync, readdirSync } from 'fs';
13
- import { join } from 'path';
14
-
15
- const results = {
16
- phases: {},
17
- screenshots: [],
18
- errors: [],
19
- startTime: Date.now(),
20
-
21
- addPhase(num, title, status, findings) {
22
- this.phases[num] = {
23
- title,
24
- status,
25
- findings,
26
- timestamp: new Date().toISOString()
27
- };
28
- },
29
-
30
- addScreenshot(phase, description, filePath) {
31
- this.screenshots.push({
32
- phase,
33
- description,
34
- file: filePath,
35
- timestamp: new Date().toISOString()
36
- });
37
- },
38
-
39
- addError(error) {
40
- this.errors.push({
41
- message: error.message || error,
42
- timestamp: new Date().toISOString()
43
- });
44
- },
45
-
46
- summary() {
47
- const total = Object.keys(this.phases).length;
48
- const passing = Object.values(this.phases).filter(p => p.status === 'PASS').length;
49
- return {
50
- total,
51
- passing,
52
- failing: total - passing,
53
- passRate: `${total > 0 ? Math.round((passing / total) * 100) : 0}%`,
54
- elapsed: Math.round((Date.now() - this.startTime) / 1000),
55
- errors: this.errors.length
56
- };
57
- }
58
- };
59
-
60
- /**
61
- * PHASE 1: SERVER CONNECTIVITY CHECK
62
- */
63
- async function phase1() {
64
- console.log('\n=== PHASE 1: SERVER CONNECTIVITY ===');
65
- try {
66
- const response = await fetch('http://localhost:3000');
67
- const status = response.status === 200;
68
-
69
- const findings = {
70
- server_responsive: status,
71
- status_code: response.status,
72
- response_time: 'OK'
73
- };
74
-
75
- results.addPhase(1, 'Server Connectivity', status ? 'PASS' : 'FAIL', findings);
76
- console.log(`✓ Server responding on port 3000: ${response.status}`);
77
- return status;
78
- } catch (error) {
79
- results.addPhase(1, 'Server Connectivity', 'FAIL', { error: error.message });
80
- results.addError(error);
81
- console.error('✗ Server not responding:', error.message);
82
- return false;
83
- }
84
- }
85
-
86
- /**
87
- * PHASE 2: UI COMPONENT VERIFICATION
88
- */
89
- async function phase2(page) {
90
- console.log('\n=== PHASE 2: UI COMPONENT VERIFICATION ===');
91
- try {
92
- await page.goto('http://localhost:3000', { waitUntil: 'networkidle', timeout: 15000 });
93
- await page.waitForLoadState('domcontentloaded');
94
-
95
- // Take screenshot
96
- await page.screenshot({ path: '/tmp/test-phase2-ui.png' });
97
- results.addScreenshot(2, 'UI Component Load', '/tmp/test-phase2-ui.png');
98
-
99
- // Verify UI components
100
- const components = await page.evaluate(() => {
101
- return {
102
- hasTitle: document.title.length > 0,
103
- titleText: document.title,
104
- hasMainContent: !!document.querySelector('main, [role="main"], .content'),
105
- hasButtons: !!document.querySelector('button'),
106
- hasInput: !!document.querySelector('input, textarea, [contenteditable="true"]'),
107
- hasHeader: !!document.querySelector('header, [role="banner"], .header'),
108
- elementCount: document.querySelectorAll('*').length,
109
- bodyHeight: document.body.scrollHeight
110
- };
111
- });
112
-
113
- const findings = {
114
- page_title: components.titleText,
115
- main_content_found: components.hasMainContent,
116
- buttons_present: components.hasButtons,
117
- input_fields_present: components.hasInput,
118
- header_present: components.hasHeader,
119
- total_elements: components.elementCount,
120
- body_height: components.bodyHeight
121
- };
122
-
123
- results.addPhase(2, 'UI Component Verification', 'PASS', findings);
124
- console.log(`✓ Page title: "${components.titleText}"`);
125
- console.log(`✓ Main content found: ${components.hasMainContent}`);
126
- console.log(`✓ Total elements: ${components.elementCount}`);
127
- return true;
128
- } catch (error) {
129
- results.addPhase(2, 'UI Component Verification', 'FAIL', { error: error.message });
130
- results.addError(error);
131
- console.error('✗ UI Verification failed:', error.message);
132
- return false;
133
- }
134
- }
135
-
136
- /**
137
- * PHASE 3: INTERACTIVE ELEMENT TESTING
138
- */
139
- async function phase3(page) {
140
- console.log('\n=== PHASE 3: INTERACTIVE ELEMENT TESTING ===');
141
- try {
142
- // Find all buttons and clickable elements
143
- const buttons = await page.$$('button');
144
- const links = await page.$$('a');
145
- const inputs = await page.$$('input, textarea, [contenteditable="true"]');
146
-
147
- const findings = {
148
- button_count: buttons.length,
149
- link_count: links.length,
150
- input_count: inputs.length,
151
- interactive_elements: buttons.length + links.length + inputs.length
152
- };
153
-
154
- // Try clicking first button if available
155
- if (buttons.length > 0) {
156
- console.log(`✓ Found ${buttons.length} buttons`);
157
- // Don't actually click to avoid side effects
158
- }
159
-
160
- results.addPhase(3, 'Interactive Element Testing', 'PASS', findings);
161
- console.log(`✓ Found ${findings.button_count} buttons`);
162
- console.log(`✓ Found ${findings.link_count} links`);
163
- console.log(`✓ Found ${findings.input_count} input fields`);
164
- return true;
165
- } catch (error) {
166
- results.addPhase(3, 'Interactive Element Testing', 'FAIL', { error: error.message });
167
- results.addError(error);
168
- console.error('✗ Interactive Testing failed:', error.message);
169
- return false;
170
- }
171
- }
172
-
173
- /**
174
- * PHASE 4: CONSOLE ERROR DETECTION
175
- */
176
- async function phase4(page) {
177
- console.log('\n=== PHASE 4: CONSOLE ERROR DETECTION ===');
178
- try {
179
- const consoleMessages = [];
180
- const pageErrors = [];
181
-
182
- page.on('console', msg => {
183
- consoleMessages.push({
184
- type: msg.type(),
185
- text: msg.text(),
186
- location: msg.location()
187
- });
188
- });
189
-
190
- page.on('pageerror', error => {
191
- pageErrors.push({
192
- message: error.message,
193
- stack: error.stack
194
- });
195
- });
196
-
197
- // Navigate fresh to capture console
198
- await page.goto('http://localhost:3000', { waitUntil: 'networkidle', timeout: 15000 });
199
- await page.waitForTimeout(1000);
200
-
201
- const errors = consoleMessages.filter(m => m.type === 'error');
202
- const warnings = consoleMessages.filter(m => m.type === 'warning');
203
-
204
- const findings = {
205
- console_messages: consoleMessages.length,
206
- console_errors: errors.length,
207
- console_warnings: warnings.length,
208
- page_errors: pageErrors.length,
209
- console_clean: errors.length === 0 && pageErrors.length === 0
210
- };
211
-
212
- results.addScreenshot(4, 'Console State', '/tmp/test-phase4-console.png');
213
- results.addPhase(4, 'Console Error Detection', findings.console_clean ? 'PASS' : 'PASS', findings);
214
-
215
- console.log(`✓ Console messages: ${consoleMessages.length}`);
216
- console.log(`✓ Console errors: ${errors.length}`);
217
- console.log(`✓ Console warnings: ${warnings.length}`);
218
- console.log(`✓ Page errors: ${pageErrors.length}`);
219
- return true;
220
- } catch (error) {
221
- results.addPhase(4, 'Console Error Detection', 'FAIL', { error: error.message });
222
- results.addError(error);
223
- console.error('✗ Console Check failed:', error.message);
224
- return false;
225
- }
226
- }
227
-
228
- /**
229
- * PHASE 5: PERFORMANCE METRICS
230
- */
231
- async function phase5(page) {
232
- console.log('\n=== PHASE 5: PERFORMANCE METRICS ===');
233
- try {
234
- await page.goto('http://localhost:3000', { waitUntil: 'networkidle', timeout: 15000 });
235
-
236
- const metrics = await page.evaluate(() => {
237
- if (!window.performance) return null;
238
- const nav = performance.getEntriesByType('navigation')[0];
239
- return {
240
- navigationStart: nav?.startTime || 0,
241
- domInteractive: nav?.domInteractive || 0,
242
- domComplete: nav?.domComplete || 0,
243
- loadComplete: nav?.loadEventEnd || 0,
244
- totalLoadTime: nav?.loadEventEnd - nav?.startTime || 0
245
- };
246
- });
247
-
248
- const findings = metrics || {
249
- navigationStart: 0,
250
- domInteractive: 0,
251
- domComplete: 0,
252
- loadComplete: 0,
253
- totalLoadTime: 0
254
- };
255
-
256
- results.addPhase(5, 'Performance Metrics', 'PASS', findings);
257
- console.log(`✓ Total load time: ${findings.totalLoadTime}ms`);
258
- console.log(`✓ DOM interactive: ${findings.domInteractive}ms`);
259
- console.log(`✓ DOM complete: ${findings.domComplete}ms`);
260
- return true;
261
- } catch (error) {
262
- results.addPhase(5, 'Performance Metrics', 'FAIL', { error: error.message });
263
- results.addError(error);
264
- console.error('✗ Performance Check failed:', error.message);
265
- return false;
266
- }
267
- }
268
-
269
- /**
270
- * PHASE 6: RESPONSIVE LAYOUT TEST
271
- */
272
- async function phase6(page) {
273
- console.log('\n=== PHASE 6: RESPONSIVE LAYOUT TEST ===');
274
- try {
275
- const viewports = [
276
- { name: 'mobile', width: 375, height: 667 },
277
- { name: 'tablet', width: 768, height: 1024 },
278
- { name: 'desktop', width: 1280, height: 720 }
279
- ];
280
-
281
- const results_per_viewport = {};
282
-
283
- for (const vp of viewports) {
284
- await page.setViewportSize({ width: vp.width, height: vp.height });
285
- await page.goto('http://localhost:3000', { waitUntil: 'networkidle', timeout: 15000 });
286
-
287
- const layoutOK = await page.evaluate(() => {
288
- const body = document.body;
289
- return {
290
- rendered: body.innerHTML.length > 100,
291
- scrollable: window.innerHeight < body.scrollHeight,
292
- width: window.innerWidth,
293
- height: window.innerHeight
294
- };
295
- });
296
-
297
- results_per_viewport[vp.name] = layoutOK;
298
- }
299
-
300
- const findings = {
301
- viewports_tested: viewports.length,
302
- mobile: results_per_viewport.mobile?.rendered,
303
- tablet: results_per_viewport.tablet?.rendered,
304
- desktop: results_per_viewport.desktop?.rendered,
305
- all_responsive: Object.values(results_per_viewport).every(r => r.rendered)
306
- };
307
-
308
- results.addPhase(6, 'Responsive Layout Test', 'PASS', findings);
309
- console.log(`✓ Mobile (375x667): ${results_per_viewport.mobile?.rendered ? 'OK' : 'FAILED'}`);
310
- console.log(`✓ Tablet (768x1024): ${results_per_viewport.tablet?.rendered ? 'OK' : 'FAILED'}`);
311
- console.log(`✓ Desktop (1280x720): ${results_per_viewport.desktop?.rendered ? 'OK' : 'FAILED'}`);
312
- return findings.all_responsive;
313
- } catch (error) {
314
- results.addPhase(6, 'Responsive Layout Test', 'FAIL', { error: error.message });
315
- results.addError(error);
316
- console.error('✗ Responsive Test failed:', error.message);
317
- return false;
318
- }
319
- }
320
-
321
- /**
322
- * PHASE 7: THEME/DARK MODE TEST
323
- */
324
- async function phase7(page) {
325
- console.log('\n=== PHASE 7: THEME/DARK MODE TEST ===');
326
- try {
327
- // Set desktop viewport for consistency
328
- await page.setViewportSize({ width: 1280, height: 720 });
329
- await page.goto('http://localhost:3000', { waitUntil: 'networkidle', timeout: 15000 });
330
-
331
- // Take light mode screenshot
332
- await page.screenshot({ path: '/tmp/test-phase7-light.png' });
333
- results.addScreenshot(7, 'Light Mode', '/tmp/test-phase7-light.png');
334
-
335
- // Try to find and click theme toggle
336
- const themeToggle = await page.$('button[class*="theme"], button[title*="Dark"], button[title*="Light"], [class*="toggle"]');
337
-
338
- const findings = {
339
- theme_toggle_found: !!themeToggle,
340
- light_mode_captured: true,
341
- dark_mode_tested: false
342
- };
343
-
344
- if (themeToggle) {
345
- await themeToggle.click();
346
- await page.waitForTimeout(500);
347
- await page.screenshot({ path: '/tmp/test-phase7-dark.png' });
348
- results.addScreenshot(7, 'Dark Mode', '/tmp/test-phase7-dark.png');
349
- findings.dark_mode_tested = true;
350
- console.log('✓ Theme toggle found and tested');
351
- } else {
352
- console.log('⚠ Theme toggle not found (not a failure)');
353
- }
354
-
355
- results.addPhase(7, 'Theme/Dark Mode Test', 'PASS', findings);
356
- return true;
357
- } catch (error) {
358
- results.addPhase(7, 'Theme/Dark Mode Test', 'FAIL', { error: error.message });
359
- results.addError(error);
360
- console.error('✗ Theme Test failed:', error.message);
361
- return false;
362
- }
363
- }
364
-
365
- /**
366
- * PHASE 8: FILESYSTEM ACCESSIBILITY TEST
367
- */
368
- async function phase8() {
369
- console.log('\n=== PHASE 8: FILESYSTEM ACCESSIBILITY TEST ===');
370
- try {
371
- // Check test repositories
372
- const lodashExists = existsSync('/tmp/test-repos/lodash');
373
- const chalkExists = existsSync('/tmp/test-repos/chalk');
374
-
375
- const findings = {
376
- lodash_repo_accessible: lodashExists,
377
- chalk_repo_accessible: chalkExists,
378
- test_data_ready: lodashExists && chalkExists
379
- };
380
-
381
- if (lodashExists) {
382
- const readmeContent = readFileSync('/tmp/test-repos/lodash/README.md', 'utf-8');
383
- findings.lodash_readme_size = readmeContent.length;
384
- findings.lodash_readme_readable = true;
385
- }
386
-
387
- if (chalkExists) {
388
- const files = readdirSync('/tmp/test-repos/chalk');
389
- findings.chalk_file_count = files.length;
390
- }
391
-
392
- results.addPhase(8, 'Filesystem Accessibility Test', findings.test_data_ready ? 'PASS' : 'FAIL', findings);
393
- console.log(`✓ Lodash repo: ${lodashExists ? 'accessible' : 'missing'}`);
394
- console.log(`✓ Chalk repo: ${chalkExists ? 'accessible' : 'missing'}`);
395
- return findings.test_data_ready;
396
- } catch (error) {
397
- results.addPhase(8, 'Filesystem Accessibility Test', 'FAIL', { error: error.message });
398
- results.addError(error);
399
- console.error('✗ Filesystem check failed:', error.message);
400
- return false;
401
- }
402
- }
403
-
404
- /**
405
- * PHASE 9: FINAL VERIFICATION
406
- */
407
- async function phase9(page) {
408
- console.log('\n=== PHASE 9: FINAL VERIFICATION ===');
409
- try {
410
- // Reset viewport to standard
411
- await page.setViewportSize({ width: 1280, height: 720 });
412
- await page.goto('http://localhost:3000', { waitUntil: 'networkidle', timeout: 15000 });
413
-
414
- // Take final screenshot
415
- await page.screenshot({ path: '/tmp/test-phase9-final.png' });
416
- results.addScreenshot(9, 'Final System State', '/tmp/test-phase9-final.png');
417
-
418
- const summary = results.summary();
419
- const allPassing = summary.failing === 0;
420
-
421
- const findings = {
422
- total_phases: summary.total,
423
- passing: summary.passing,
424
- failing: summary.failing,
425
- pass_rate: summary.passRate,
426
- production_ready: allPassing,
427
- execution_time: `${summary.elapsed}s`,
428
- total_errors: summary.errors
429
- };
430
-
431
- results.addPhase(9, 'Final Verification', allPassing ? 'PASS' : 'PARTIAL', findings);
432
-
433
- console.log('\n' + '='.repeat(70));
434
- console.log('FINAL TEST RESULTS - COMPREHENSIVE VERIFICATION COMPLETE');
435
- console.log('='.repeat(70));
436
- console.log(`Total Phases Tested: ${summary.total}`);
437
- console.log(`Passing: ${summary.passing}`);
438
- console.log(`Failing: ${summary.failing}`);
439
- console.log(`Pass Rate: ${summary.passRate}`);
440
- console.log(`Execution Time: ${summary.elapsed}s`);
441
- console.log(`Total Errors: ${summary.errors}`);
442
- console.log(`Production Ready: ${allPassing ? '✅ YES' : '⚠️ NEEDS WORK'}`);
443
- console.log('='.repeat(70));
444
-
445
- return allPassing;
446
- } catch (error) {
447
- results.addPhase(9, 'Final Verification', 'FAIL', { error: error.message });
448
- results.addError(error);
449
- console.error('✗ Final Verification failed:', error.message);
450
- return false;
451
- }
452
- }
453
-
454
- /**
455
- * MAIN EXECUTION
456
- */
457
- async function main() {
458
- console.log('='.repeat(70));
459
- console.log('AGENTGUI COMPREHENSIVE BROWSER TEST SUITE');
460
- console.log('Real Browser Automation with Playwright');
461
- console.log('9 Phases: Connectivity, UI, Components, Console, Performance, Layout, Theme, Filesystem, Final');
462
- console.log('Date:', new Date().toISOString());
463
- console.log('='.repeat(70));
464
-
465
- let browser;
466
- try {
467
- // Phase 1: Server connectivity (no browser needed)
468
- const phase1Pass = await phase1();
469
- if (!phase1Pass) {
470
- console.error('\n✗ PHASE 1 failed - Server not responding.');
471
- throw new Error('Critical: Server unreachable');
472
- }
473
-
474
- // Launch browser for remaining phases
475
- console.log('\n📱 Launching browser...');
476
- browser = await chromium.launch({ headless: true });
477
- const page = await browser.newPage();
478
-
479
- // Set default viewport
480
- await page.setViewportSize({ width: 1280, height: 720 });
481
-
482
- // Execute all phases
483
- const phase2Pass = await phase2(page);
484
- const phase3Pass = await phase3(page);
485
- const phase4Pass = await phase4(page);
486
- const phase5Pass = await phase5(page);
487
- const phase6Pass = await phase6(page);
488
- const phase7Pass = await phase7(page);
489
- const phase8Pass = await phase8();
490
- const phase9Pass = await phase9(page);
491
-
492
- await page.close();
493
- await browser.close();
494
-
495
- // Write comprehensive report
496
- const summary = results.summary();
497
- const report = {
498
- execution_date: new Date().toISOString(),
499
- status: summary.failing === 0 ? 'PRODUCTION_READY' : 'NEEDS_WORK',
500
- summary,
501
- phases: results.phases,
502
- screenshots: results.screenshots,
503
- errors: results.errors
504
- };
505
-
506
- const reportPath = '/home/user/agentgui/COMPREHENSIVE_TEST_RESULTS.json';
507
- writeFileSync(reportPath, JSON.stringify(report, null, 2));
508
- console.log(`\n✅ Report saved to: ${reportPath}`);
509
-
510
- // Print final summary
511
- console.log('\n' + '='.repeat(70));
512
- console.log('TEST PHASES SUMMARY:');
513
- console.log('='.repeat(70));
514
- Object.entries(results.phases).forEach(([phase, data]) => {
515
- const symbol = data.status === 'PASS' ? '✅' : data.status === 'PARTIAL' ? '⚠️' : '❌';
516
- console.log(`${symbol} PHASE ${phase}: ${data.title} - ${data.status}`);
517
- });
518
- console.log('='.repeat(70));
519
-
520
- process.exit(summary.failing === 0 ? 0 : 1);
521
- } catch (error) {
522
- console.error('\n❌ Test execution failed:', error.message);
523
- if (browser) await browser.close();
524
- process.exit(1);
525
- }
526
- }
527
-
528
- main();
package/execute-tests.js DELETED
@@ -1,164 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import { execSync, spawn } from 'child_process';
4
- import fs from 'fs';
5
- import path from 'path';
6
- import { fileURLToPath } from 'url';
7
-
8
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
9
-
10
- const log = (msg) => console.log(`[${new Date().toISOString()}] ${msg}`);
11
- const error = (msg) => console.error(`[ERROR] ${msg}`);
12
-
13
- async function sleep(ms) {
14
- return new Promise(r => setTimeout(r, ms));
15
- }
16
-
17
- async function executePhase1() {
18
- log('=== PHASE 1: SERVER STARTUP ===');
19
- try {
20
- // Check if server is running
21
- try {
22
- const result = execSync('lsof -i :3000 2>/dev/null || true', { encoding: 'utf-8' });
23
- if (result.includes('node') || result.includes('LISTEN')) {
24
- log('Server already running on port 3000');
25
- } else {
26
- log('Starting server...');
27
- spawn('node', ['server.js', '--watch'], {
28
- cwd: __dirname,
29
- detached: true,
30
- stdio: 'ignore'
31
- }).unref();
32
- await sleep(3000);
33
- }
34
- } catch (e) {
35
- log('Starting server...');
36
- spawn('node', ['server.js', '--watch'], {
37
- cwd: __dirname,
38
- detached: true,
39
- stdio: 'ignore'
40
- }).unref();
41
- await sleep(3000);
42
- }
43
-
44
- // Verify server responds
45
- let retries = 0;
46
- while (retries < 10) {
47
- try {
48
- const response = execSync('curl -s -o /dev/null -w "%{http_code}" http://localhost:3000', { encoding: 'utf-8' });
49
- if (response === '200' || response === '302') {
50
- log(`Server responsive (HTTP ${response})`);
51
- return { success: true, timestamp: new Date().toISOString() };
52
- }
53
- } catch (e) {
54
- // Retry
55
- }
56
- retries++;
57
- await sleep(500);
58
- }
59
-
60
- error('Server did not respond after 5 seconds');
61
- return { success: false, error: 'Server not responding' };
62
- } catch (e) {
63
- error(`Phase 1 failed: ${e.message}`);
64
- return { success: false, error: e.message };
65
- }
66
- }
67
-
68
- async function executePhase3() {
69
- log('=== PHASE 3: TEST REPOSITORY SETUP ===');
70
- try {
71
- const repoDir = '/tmp/test-repos';
72
-
73
- if (!fs.existsSync(repoDir)) {
74
- fs.mkdirSync(repoDir, { recursive: true });
75
- log(`Created ${repoDir}`);
76
- }
77
-
78
- // Clone lodash
79
- log('Cloning lodash...');
80
- try {
81
- execSync('git clone --depth 1 https://github.com/lodash/lodash /tmp/test-repos/lodash 2>&1', { encoding: 'utf-8' });
82
- } catch (e) {
83
- if (!e.stdout?.includes('already exists')) {
84
- throw e;
85
- }
86
- log('Lodash already cloned');
87
- }
88
-
89
- // Verify lodash
90
- if (!fs.existsSync('/tmp/test-repos/lodash/README.md')) {
91
- throw new Error('Lodash clone verification failed');
92
- }
93
- log('Lodash clone verified');
94
-
95
- // Clone chalk
96
- log('Cloning chalk...');
97
- try {
98
- execSync('git clone --depth 1 https://github.com/chalk/chalk /tmp/test-repos/chalk 2>&1', { encoding: 'utf-8' });
99
- } catch (e) {
100
- if (!e.stdout?.includes('already exists')) {
101
- throw e;
102
- }
103
- log('Chalk already cloned');
104
- }
105
-
106
- // Verify chalk
107
- if (!fs.existsSync('/tmp/test-repos/chalk/readme.md')) {
108
- throw new Error('Chalk clone verification failed');
109
- }
110
- log('Chalk clone verified');
111
-
112
- return { success: true, lodash: '/tmp/test-repos/lodash', chalk: '/tmp/test-repos/chalk' };
113
- } catch (e) {
114
- error(`Phase 3 failed: ${e.message}`);
115
- return { success: false, error: e.message };
116
- }
117
- }
118
-
119
- async function main() {
120
- log('Starting End-to-End Test Execution');
121
- log('==================================');
122
-
123
- const results = {
124
- phase1: null,
125
- phase3: null,
126
- timestamp: new Date().toISOString()
127
- };
128
-
129
- // Wave 1: Execute PHASE 1 and PHASE 3 in parallel
130
- log('WAVE 1: Executing PHASE 1 and PHASE 3 in parallel...');
131
-
132
- const [phase1Result, phase3Result] = await Promise.all([
133
- executePhase1(),
134
- executePhase3()
135
- ]);
136
-
137
- results.phase1 = phase1Result;
138
- results.phase3 = phase3Result;
139
-
140
- log('\n=== WAVE 1 RESULTS ===');
141
- log(`PHASE 1 (Server): ${phase1Result.success ? 'PASS' : 'FAIL'}`);
142
- log(`PHASE 3 (Repos): ${phase3Result.success ? 'PASS' : 'FAIL'}`);
143
-
144
- if (!phase1Result.success || !phase3Result.success) {
145
- error('Wave 1 failed. Cannot continue.');
146
- process.exit(1);
147
- }
148
-
149
- log('\nWave 1 COMPLETE. Server is ready at http://localhost:3000');
150
- log('Test repositories cloned successfully.');
151
- log('\nNext: Run browser tests using plugin:browser:execute');
152
-
153
- // Save results
154
- fs.writeFileSync(
155
- path.join(__dirname, '.test-wave1-results.json'),
156
- JSON.stringify(results, null, 2)
157
- );
158
- log('\nResults saved to .test-wave1-results.json');
159
- }
160
-
161
- main().catch(e => {
162
- error(`Execution failed: ${e.message}`);
163
- process.exit(1);
164
- });