@kosuke-ai/cli 0.0.13 → 0.0.14

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 (35) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +54 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/kosuke/commands/test.d.ts +27 -0
  6. package/dist/kosuke/commands/test.d.ts.map +1 -0
  7. package/dist/kosuke/commands/test.js +338 -0
  8. package/dist/kosuke/commands/test.js.map +1 -0
  9. package/dist/kosuke/types.d.ts +37 -1
  10. package/dist/kosuke/types.d.ts.map +1 -1
  11. package/dist/kosuke/utils/error-analyzer.d.ts +32 -0
  12. package/dist/kosuke/utils/error-analyzer.d.ts.map +1 -0
  13. package/dist/kosuke/utils/error-analyzer.js +129 -0
  14. package/dist/kosuke/utils/error-analyzer.js.map +1 -0
  15. package/dist/kosuke/utils/log-collector.d.ts +81 -0
  16. package/dist/kosuke/utils/log-collector.d.ts.map +1 -0
  17. package/dist/kosuke/utils/log-collector.js +226 -0
  18. package/dist/kosuke/utils/log-collector.js.map +1 -0
  19. package/dist/kosuke/utils/playwright-agent.d.ts +39 -0
  20. package/dist/kosuke/utils/playwright-agent.d.ts.map +1 -0
  21. package/dist/kosuke/utils/playwright-agent.js +245 -0
  22. package/dist/kosuke/utils/playwright-agent.js.map +1 -0
  23. package/dist/kosuke/utils/test-generator.d.ts +22 -0
  24. package/dist/kosuke/utils/test-generator.d.ts.map +1 -0
  25. package/dist/kosuke/utils/test-generator.js +174 -0
  26. package/dist/kosuke/utils/test-generator.js.map +1 -0
  27. package/dist/kosuke/utils/visual-tester.d.ts +71 -0
  28. package/dist/kosuke/utils/visual-tester.d.ts.map +1 -0
  29. package/dist/kosuke/utils/visual-tester.js +202 -0
  30. package/dist/kosuke/utils/visual-tester.js.map +1 -0
  31. package/dist/lib.d.ts +2 -1
  32. package/dist/lib.d.ts.map +1 -1
  33. package/dist/lib.js +1 -0
  34. package/dist/lib.js.map +1 -1
  35. package/package.json +6 -1
package/dist/index.d.ts CHANGED
@@ -12,6 +12,7 @@
12
12
  * ship --ticket=<ID> Implement a single ticket from tickets.json
13
13
  * build Batch process all tickets from tickets.json
14
14
  * review Review codebase against CLAUDE.md rules
15
+ * test --ticket=<ID> Run E2E tests with automated fixing
15
16
  *
16
17
  * Usage:
17
18
  * bun run kosuke sync-rules
@@ -23,6 +24,7 @@
23
24
  * bun run kosuke ship --ticket=SCHEMA-1
24
25
  * bun run kosuke build
25
26
  * bun run kosuke review
27
+ * bun run kosuke test --ticket=FRONTEND-1
26
28
  *
27
29
  * Environment Variables:
28
30
  * ANTHROPIC_API_KEY - Required for Claude API
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -12,6 +12,7 @@
12
12
  * ship --ticket=<ID> Implement a single ticket from tickets.json
13
13
  * build Batch process all tickets from tickets.json
14
14
  * review Review codebase against CLAUDE.md rules
15
+ * test --ticket=<ID> Run E2E tests with automated fixing
15
16
  *
16
17
  * Usage:
17
18
  * bun run kosuke sync-rules
@@ -23,6 +24,7 @@
23
24
  * bun run kosuke ship --ticket=SCHEMA-1
24
25
  * bun run kosuke build
25
26
  * bun run kosuke review
27
+ * bun run kosuke test --ticket=FRONTEND-1
26
28
  *
27
29
  * Environment Variables:
28
30
  * ANTHROPIC_API_KEY - Required for Claude API
@@ -38,6 +40,7 @@ import { ticketsCommand } from './kosuke/commands/tickets.js';
38
40
  import { shipCommand } from './kosuke/commands/ship.js';
39
41
  import { buildCommand } from './kosuke/commands/build.js';
40
42
  import { reviewCommand } from './kosuke/commands/review.js';
43
+ import { testCommand } from './kosuke/commands/test.js';
41
44
  async function main() {
42
45
  const args = process.argv.slice(2);
43
46
  const command = args[0];
@@ -130,6 +133,33 @@ async function main() {
130
133
  await reviewCommand(options);
131
134
  break;
132
135
  }
136
+ case 'test': {
137
+ const ticketArg = args.find((arg) => arg.startsWith('--ticket='))?.split('=')[1];
138
+ if (!ticketArg) {
139
+ console.error('❌ --ticket flag is required\n');
140
+ console.log('Usage: kosuke test --ticket=FRONTEND-1 [--url=URL] [--headed] [--pr]');
141
+ console.log('\nExamples:');
142
+ console.log(' kosuke test --ticket=FRONTEND-1 # Test with auto-fix');
143
+ console.log(' kosuke test --ticket=FRONTEND-1 --url=http://localhost:4000');
144
+ console.log(' kosuke test --ticket=FRONTEND-1 --headed # Show browser');
145
+ console.log(' kosuke test --ticket=FRONTEND-1 --update-baseline # Update visuals');
146
+ console.log(' kosuke test --ticket=FRONTEND-1 --pr # Create PR');
147
+ process.exit(1);
148
+ }
149
+ const options = {
150
+ ticket: ticketArg,
151
+ url: args.find((arg) => arg.startsWith('--url='))?.split('=')[1],
152
+ headed: args.includes('--headed'),
153
+ debug: args.includes('--debug'),
154
+ updateBaseline: args.includes('--update-baseline'),
155
+ maxRetries: parseInt(args.find((arg) => arg.startsWith('--max-retries='))?.split('=')[1] || '3'),
156
+ ticketsFile: args.find((arg) => arg.startsWith('--tickets='))?.split('=')[1],
157
+ pr: args.includes('--pr'),
158
+ baseBranch: args.find((arg) => arg.startsWith('--base-branch='))?.split('=')[1],
159
+ };
160
+ await testCommand(options);
161
+ break;
162
+ }
133
163
  default:
134
164
  console.error(`❌ Unknown command: ${command}\n`);
135
165
  showHelp();
@@ -275,6 +305,30 @@ COMMANDS:
275
305
  Examples:
276
306
  kosuke review # Review uncommitted changes
277
307
 
308
+ test --ticket=<ID> [options]
309
+ Run E2E tests for a ticket with automated fixing
310
+ Uses Playwright for testing, Claude AI for analyzing and fixing issues
311
+ Iteratively tests and fixes until passing or max retries reached
312
+
313
+ Options:
314
+ --ticket=<ID> Ticket ID to test (required, e.g., FRONTEND-1)
315
+ --url=<URL> Base URL (default: http://localhost:3000)
316
+ --headed Show browser during testing
317
+ --debug Enable Playwright inspector
318
+ --update-baseline Update visual regression baselines
319
+ --max-retries=<N> Maximum fix-retest iterations (default: 3)
320
+ --tickets=<file> Path to tickets file (default: tickets.json)
321
+ --pr Create pull request with fixes
322
+ --base-branch=<name> Base branch for PR (default: current branch)
323
+
324
+ Examples:
325
+ kosuke test --ticket=FRONTEND-1 # Test with auto-fix
326
+ kosuke test --ticket=FRONTEND-1 --url=http://localhost:4000
327
+ kosuke test --ticket=FRONTEND-1 --headed # Show browser
328
+ kosuke test --ticket=FRONTEND-1 --update-baseline # Update visuals
329
+ kosuke test --ticket=FRONTEND-1 --max-retries=5 # More attempts
330
+ kosuke test --ticket=FRONTEND-1 --pr # Create PR with fixes
331
+
278
332
  WORKFLOW:
279
333
 
280
334
  By default, all commands apply changes locally without git operations.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Test command - Automated E2E testing with iterative fixing
3
+ *
4
+ * This command:
5
+ * 1. Loads a ticket and generates/locates Playwright tests
6
+ * 2. Runs tests with visual regression, console/network/docker log collection
7
+ * 3. If tests fail: analyzes errors and applies fixes
8
+ * 4. Re-runs tests until passing or max retries reached
9
+ * 5. Runs linting after tests pass
10
+ *
11
+ * Usage:
12
+ * kosuke test --ticket=FRONTEND-1 # Test with auto-fix
13
+ * kosuke test --ticket=FRONTEND-1 --url=http://localhost:4000
14
+ * kosuke test --ticket=FRONTEND-1 --headed # Show browser
15
+ * kosuke test --ticket=FRONTEND-1 --update-baseline # Update visual baselines
16
+ * kosuke test --ticket=FRONTEND-1 --pr # Create PR with fixes
17
+ */
18
+ import type { TestOptions, TestResult } from '../types.js';
19
+ /**
20
+ * Core test logic (git-agnostic, reusable)
21
+ */
22
+ export declare function testCore(options: TestOptions): Promise<TestResult>;
23
+ /**
24
+ * Main test command
25
+ */
26
+ export declare function testCommand(options: TestOptions): Promise<void>;
27
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../kosuke/commands/test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAgBH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAU,MAAM,aAAa,CAAC;AAoCnE;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAsPxE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDrE"}
@@ -0,0 +1,338 @@
1
+ /**
2
+ * Test command - Automated E2E testing with iterative fixing
3
+ *
4
+ * This command:
5
+ * 1. Loads a ticket and generates/locates Playwright tests
6
+ * 2. Runs tests with visual regression, console/network/docker log collection
7
+ * 3. If tests fail: analyzes errors and applies fixes
8
+ * 4. Re-runs tests until passing or max retries reached
9
+ * 5. Runs linting after tests pass
10
+ *
11
+ * Usage:
12
+ * kosuke test --ticket=FRONTEND-1 # Test with auto-fix
13
+ * kosuke test --ticket=FRONTEND-1 --url=http://localhost:4000
14
+ * kosuke test --ticket=FRONTEND-1 --headed # Show browser
15
+ * kosuke test --ticket=FRONTEND-1 --update-baseline # Update visual baselines
16
+ * kosuke test --ticket=FRONTEND-1 --pr # Create PR with fixes
17
+ */
18
+ import { readFileSync, existsSync } from 'fs';
19
+ import { join } from 'path';
20
+ import { generateTest } from '../utils/test-generator.js';
21
+ import { runPlaywrightTests, isPlaywrightInstalled, installPlaywright, ensurePlaywrightConfig, } from '../utils/playwright-agent.js';
22
+ import { LogCollector } from '../utils/log-collector.js';
23
+ import { VisualTester } from '../utils/visual-tester.js';
24
+ import { analyzeAndFix } from '../utils/error-analyzer.js';
25
+ import { runComprehensiveLinting } from '../utils/validator.js';
26
+ import { runWithPR } from '../utils/pr-orchestrator.js';
27
+ /**
28
+ * Load tickets from file
29
+ */
30
+ function loadTicketsFile(ticketsPath) {
31
+ if (!existsSync(ticketsPath)) {
32
+ throw new Error(`Tickets file not found: ${ticketsPath}\n` +
33
+ `Please generate tickets first using: kosuke tickets`);
34
+ }
35
+ try {
36
+ const content = readFileSync(ticketsPath, 'utf-8');
37
+ return JSON.parse(content);
38
+ }
39
+ catch (error) {
40
+ throw new Error(`Failed to parse tickets file: ${error instanceof Error ? error.message : String(error)}`);
41
+ }
42
+ }
43
+ /**
44
+ * Find ticket by ID
45
+ */
46
+ function findTicket(ticketsData, ticketId) {
47
+ return ticketsData.tickets.find((t) => t.id === ticketId);
48
+ }
49
+ /**
50
+ * Core test logic (git-agnostic, reusable)
51
+ */
52
+ export async function testCore(options) {
53
+ const { ticket: ticketId, url = 'http://localhost:3000', headed = false, debug = false, maxRetries = 3, ticketsFile = 'tickets.json', } = options;
54
+ const cwd = process.cwd();
55
+ const ticketsPath = join(cwd, ticketsFile);
56
+ // Track metrics
57
+ let totalInputTokens = 0;
58
+ let totalOutputTokens = 0;
59
+ let totalCacheCreationTokens = 0;
60
+ let totalCacheReadTokens = 0;
61
+ let totalCost = 0;
62
+ let totalFixesApplied = 0;
63
+ let iterations = 0;
64
+ let testsRun = 0;
65
+ let testsPassed = 0;
66
+ let testsFailed = 0;
67
+ let visualDiffs = 0;
68
+ let testFilePath = '';
69
+ let tracePath = '';
70
+ try {
71
+ // 1. Load and validate ticket
72
+ console.log('📋 Loading ticket...');
73
+ const ticketsData = loadTicketsFile(ticketsPath);
74
+ const ticket = findTicket(ticketsData, ticketId);
75
+ if (!ticket) {
76
+ throw new Error(`Ticket ${ticketId} not found in ${ticketsFile}\n` +
77
+ `Available tickets: ${ticketsData.tickets.map((t) => t.id).join(', ')}`);
78
+ }
79
+ if (ticket.status !== 'Done' && ticket.status !== 'InProgress') {
80
+ throw new Error(`Ticket ${ticketId} status is "${ticket.status}".\n` +
81
+ `Tests should only be run on tickets that have been implemented (Done or InProgress).`);
82
+ }
83
+ console.log(` ✅ Loaded: ${ticket.id} - ${ticket.title}\n`);
84
+ // 2. Ensure Playwright is set up
85
+ console.log('🎭 Checking Playwright setup...');
86
+ if (!isPlaywrightInstalled(cwd)) {
87
+ console.log(' ℹ️ Playwright not found, installing...');
88
+ await installPlaywright(cwd);
89
+ }
90
+ else {
91
+ console.log(' ✅ Playwright is installed\n');
92
+ }
93
+ ensurePlaywrightConfig(cwd);
94
+ // 3. Generate or locate test
95
+ console.log('🎭 Checking for existing tests...');
96
+ testFilePath = join(cwd, '.kosuke', 'tests', `${ticketId}.spec.ts`);
97
+ if (!existsSync(testFilePath)) {
98
+ console.log(' ℹ️ No test found, generating new test...');
99
+ const genResult = await generateTest(ticket, url, cwd);
100
+ testFilePath = genResult.filePath;
101
+ totalInputTokens += genResult.tokensUsed.input;
102
+ totalOutputTokens += genResult.tokensUsed.output;
103
+ totalCacheCreationTokens += genResult.tokensUsed.cacheCreation;
104
+ totalCacheReadTokens += genResult.tokensUsed.cacheRead;
105
+ totalCost += genResult.cost;
106
+ }
107
+ else {
108
+ console.log(' ✅ Test found:', testFilePath);
109
+ }
110
+ // 4. Test execution loop
111
+ let testsPassing = false;
112
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
113
+ iterations = attempt;
114
+ console.log(`\n${'='.repeat(60)}`);
115
+ console.log(`🧪 Test Execution (Attempt ${attempt}/${maxRetries})`);
116
+ console.log(`${'='.repeat(60)}\n`);
117
+ // Initialize log collector and visual tester
118
+ const logCollector = new LogCollector();
119
+ const visualTester = new VisualTester(cwd);
120
+ // Run tests with Playwright
121
+ const testResult = await runPlaywrightTests({
122
+ testFile: testFilePath,
123
+ baseUrl: url,
124
+ headed,
125
+ debug,
126
+ cwd,
127
+ });
128
+ testsRun = testResult.testsRun;
129
+ testsPassed = testResult.testsPassed;
130
+ testsFailed = testResult.testsFailed;
131
+ tracePath = testResult.tracePath;
132
+ // Collect Docker logs
133
+ await logCollector.collectDockerLogs('30s');
134
+ // Get visual diffs
135
+ visualDiffs = visualTester.getFailedDiffs().length;
136
+ // Display results
137
+ console.log(`\n📊 Test Results:`);
138
+ console.log(` ✅ Passed: ${testResult.testsPassed}`);
139
+ console.log(` ❌ Failed: ${testResult.testsFailed}`);
140
+ console.log(` 📸 Visual diffs: ${visualDiffs}`);
141
+ console.log(` ⏱️ Duration: ${(testResult.duration / 1000).toFixed(2)}s`);
142
+ // Check if all tests passed
143
+ if (testResult.success && !visualTester.hasRegressions()) {
144
+ testsPassing = true;
145
+ console.log('\n✅ All tests passed!');
146
+ break;
147
+ }
148
+ // If this is the last attempt, don't try to fix
149
+ if (attempt === maxRetries) {
150
+ console.log(`\n❌ Max retries (${maxRetries}) reached. Tests still failing.`);
151
+ break;
152
+ }
153
+ // 5. Analyze errors and apply fixes
154
+ console.log(`\n${'='.repeat(60)}`);
155
+ console.log(`🔍 Phase ${attempt}: Error Analysis & Fixing`);
156
+ console.log(`${'='.repeat(60)}\n`);
157
+ console.log('📝 Collecting logs...');
158
+ const logs = logCollector.getErrors();
159
+ console.log(` 🔧 Console errors: ${logs.console.length}`);
160
+ console.log(` 🔧 Network failures: ${logs.network.length}`);
161
+ console.log(` 🔧 Docker logs: ${logs.docker.length}`);
162
+ // Analyze and fix
163
+ const analysisResult = await analyzeAndFix(ticket, testResult.failures, logs, testResult.tracePath, cwd);
164
+ totalFixesApplied += analysisResult.fixesApplied;
165
+ totalInputTokens += analysisResult.tokensUsed.input;
166
+ totalOutputTokens += analysisResult.tokensUsed.output;
167
+ totalCacheCreationTokens += analysisResult.tokensUsed.cacheCreation;
168
+ totalCacheReadTokens += analysisResult.tokensUsed.cacheRead;
169
+ totalCost += analysisResult.cost;
170
+ console.log(`\n 🔧 Applied ${analysisResult.fixesApplied} fixes`);
171
+ console.log(` 💰 Cost: $${analysisResult.cost.toFixed(4)}`);
172
+ // Continue to next iteration
173
+ console.log(`\n🔄 Re-running tests in next iteration...`);
174
+ }
175
+ // 6. Linting phase (if tests passed)
176
+ if (testsPassing) {
177
+ console.log(`\n${'='.repeat(60)}`);
178
+ console.log(`🔧 Linting & Quality Checks`);
179
+ console.log(`${'='.repeat(60)}\n`);
180
+ const lintResult = await runComprehensiveLinting();
181
+ console.log(`\n✅ Linting completed (${lintResult.fixCount} fixes applied)`);
182
+ // Return success result
183
+ return {
184
+ ticketId,
185
+ success: true,
186
+ testsRun,
187
+ testsPassed,
188
+ testsFailed: 0,
189
+ visualDiffs: 0,
190
+ fixesApplied: totalFixesApplied,
191
+ lintFixCount: lintResult.fixCount,
192
+ iterations,
193
+ tokensUsed: {
194
+ input: totalInputTokens,
195
+ output: totalOutputTokens,
196
+ cacheCreation: totalCacheCreationTokens,
197
+ cacheRead: totalCacheReadTokens,
198
+ },
199
+ cost: totalCost,
200
+ testFilePath,
201
+ tracePath,
202
+ };
203
+ }
204
+ else {
205
+ // Return failure result
206
+ return {
207
+ ticketId,
208
+ success: false,
209
+ testsRun,
210
+ testsPassed,
211
+ testsFailed,
212
+ visualDiffs,
213
+ fixesApplied: totalFixesApplied,
214
+ lintFixCount: 0,
215
+ iterations,
216
+ tokensUsed: {
217
+ input: totalInputTokens,
218
+ output: totalOutputTokens,
219
+ cacheCreation: totalCacheCreationTokens,
220
+ cacheRead: totalCacheReadTokens,
221
+ },
222
+ cost: totalCost,
223
+ testFilePath,
224
+ tracePath,
225
+ error: 'Tests failed after maximum retry attempts',
226
+ };
227
+ }
228
+ }
229
+ catch (error) {
230
+ const errorMessage = error instanceof Error ? error.message : String(error);
231
+ console.error(`\n❌ Test execution failed: ${errorMessage}`);
232
+ return {
233
+ ticketId,
234
+ success: false,
235
+ testsRun,
236
+ testsPassed,
237
+ testsFailed,
238
+ visualDiffs,
239
+ fixesApplied: totalFixesApplied,
240
+ lintFixCount: 0,
241
+ iterations,
242
+ tokensUsed: {
243
+ input: totalInputTokens,
244
+ output: totalOutputTokens,
245
+ cacheCreation: totalCacheCreationTokens,
246
+ cacheRead: totalCacheReadTokens,
247
+ },
248
+ cost: totalCost,
249
+ testFilePath,
250
+ tracePath,
251
+ error: errorMessage,
252
+ };
253
+ }
254
+ }
255
+ /**
256
+ * Main test command
257
+ */
258
+ export async function testCommand(options) {
259
+ const { ticket: ticketId, pr = false } = options;
260
+ console.log(`🧪 Testing Ticket: ${ticketId}\n`);
261
+ try {
262
+ // Validate environment
263
+ if (!process.env.ANTHROPIC_API_KEY) {
264
+ throw new Error('ANTHROPIC_API_KEY environment variable is required');
265
+ }
266
+ if (pr && !process.env.GITHUB_TOKEN) {
267
+ throw new Error('GITHUB_TOKEN environment variable is required for --pr flag');
268
+ }
269
+ // If --pr flag is provided, wrap with PR workflow
270
+ if (pr) {
271
+ const { result: testResult, prInfo } = await runWithPR({
272
+ branchPrefix: `test/fix-${ticketId}`,
273
+ baseBranch: options.baseBranch,
274
+ commitMessage: `test: fix issues found in ${ticketId}`,
275
+ prTitle: `test: Fix issues in ${ticketId}`,
276
+ prBody: `## 🧪 Test Fixes for ${ticketId}
277
+
278
+ This PR contains automated fixes for issues found during E2E testing of ticket ${ticketId}.
279
+
280
+ ### 📊 Test Results
281
+ - Tests run: ${0} (will be filled by result)
282
+ - Fixes applied: ${0}
283
+ - Iterations: ${0}
284
+
285
+ ---
286
+
287
+ 🤖 *Generated by Kosuke CLI (\`kosuke test --ticket=${ticketId} --pr\`)*`,
288
+ }, async () => testCore(options));
289
+ // Display summary
290
+ displayTestSummary(testResult, prInfo.prUrl);
291
+ }
292
+ else {
293
+ // Run core logic without PR
294
+ const result = await testCore(options);
295
+ displayTestSummary(result);
296
+ }
297
+ }
298
+ catch (error) {
299
+ console.error('\n❌ Test command failed:', error);
300
+ throw error;
301
+ }
302
+ }
303
+ /**
304
+ * Display test summary
305
+ */
306
+ function displayTestSummary(result, prUrl) {
307
+ console.log(`\n${'='.repeat(60)}`);
308
+ console.log('📊 Test Summary');
309
+ console.log('='.repeat(60));
310
+ if (result.success) {
311
+ console.log('✅ Status: All tests passed');
312
+ }
313
+ else {
314
+ console.log('❌ Status: Tests failed');
315
+ }
316
+ console.log(`🧪 Tests: ${result.testsPassed} passed, ${result.testsFailed} failed (${result.testsRun} total)`);
317
+ console.log(`📸 Visual: ${result.visualDiffs} regressions found`);
318
+ console.log(`🔧 Fixes: ${result.fixesApplied} applied`);
319
+ console.log(`🧹 Lint: ${result.lintFixCount} fixes applied`);
320
+ console.log(`🔄 Iterations: ${result.iterations}`);
321
+ console.log(`💰 Total cost: $${result.cost.toFixed(4)}`);
322
+ console.log(`🎭 Test file: ${result.testFilePath}`);
323
+ console.log(`📊 Trace: ${result.tracePath}`);
324
+ if (prUrl) {
325
+ console.log(`🔗 PR: ${prUrl}`);
326
+ }
327
+ console.log('='.repeat(60));
328
+ if (result.success) {
329
+ console.log('\n✅ Testing completed successfully!');
330
+ }
331
+ else {
332
+ console.log(`\n❌ Testing failed: ${result.error || 'Unknown error'}`);
333
+ if (!prUrl) {
334
+ console.log('ℹ️ Review the logs and trace file above for more details.');
335
+ }
336
+ }
337
+ }
338
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../../kosuke/commands/test.ts"],"names":[],"mappings":"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"}
@@ -131,5 +131,41 @@ export interface ReviewResult {
131
131
  };
132
132
  cost: number;
133
133
  }
134
- export {};
134
+ export interface TestOptions {
135
+ ticket: string;
136
+ url?: string;
137
+ headed?: boolean;
138
+ debug?: boolean;
139
+ updateBaseline?: boolean;
140
+ maxRetries?: number;
141
+ ticketsFile?: string;
142
+ pr?: boolean;
143
+ baseBranch?: string;
144
+ }
145
+ export interface TestResult {
146
+ ticketId: string;
147
+ success: boolean;
148
+ testsRun: number;
149
+ testsPassed: number;
150
+ testsFailed: number;
151
+ visualDiffs: number;
152
+ fixesApplied: number;
153
+ lintFixCount: number;
154
+ iterations: number;
155
+ tokensUsed: {
156
+ input: number;
157
+ output: number;
158
+ cacheCreation: number;
159
+ cacheRead: number;
160
+ };
161
+ cost: number;
162
+ testFilePath: string;
163
+ tracePath: string;
164
+ error?: string;
165
+ }
166
+ export type { AnalysisResult, TestFailure } from './utils/error-analyzer.js';
167
+ export type { ConsoleLog, NetworkLog, DockerLog, CollectedLogs } from './utils/log-collector.js';
168
+ export type { PlaywrightResult, PlaywrightOptions } from './utils/playwright-agent.js';
169
+ export type { GeneratedTest } from './utils/test-generator.js';
170
+ export type { VisualDiff, VisualTestOptions } from './utils/visual-tester.js';
135
171
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../kosuke/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../kosuke/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Error Analyzer - Analyze test failures and apply fixes
3
+ *
4
+ * Uses Claude to:
5
+ * - Analyze test failures, console errors, network failures, and backend logs
6
+ * - Identify root causes
7
+ * - Apply fixes to the codebase
8
+ */
9
+ import type { Ticket } from '../types.js';
10
+ import type { CollectedLogs } from './log-collector.js';
11
+ export interface AnalysisResult {
12
+ rootCause: string;
13
+ fixesApplied: number;
14
+ tokensUsed: {
15
+ input: number;
16
+ output: number;
17
+ cacheCreation: number;
18
+ cacheRead: number;
19
+ };
20
+ cost: number;
21
+ }
22
+ export interface TestFailure {
23
+ testName: string;
24
+ errorMessage: string;
25
+ expected?: string;
26
+ received?: string;
27
+ }
28
+ /**
29
+ * Analyze test failures and apply fixes
30
+ */
31
+ export declare function analyzeAndFix(ticket: Ticket, testFailures: TestFailure[], logs: CollectedLogs, tracePath: string, cwd?: string): Promise<AnalysisResult>;
32
+ //# sourceMappingURL=error-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-analyzer.d.ts","sourceRoot":"","sources":["../../../kosuke/utils/error-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,WAAW,EAAE,EAC3B,IAAI,EAAE,aAAa,EACnB,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,cAAc,CAAC,CAuBzB"}