@kosuke-ai/cli 0.0.43 โ†’ 0.0.45

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 (86) hide show
  1. package/README.md +94 -1
  2. package/claude.costs.json +34 -0
  3. package/dist/index.js +55 -9
  4. package/dist/index.js.map +1 -1
  5. package/dist/kosuke/commands/build.d.ts +5 -1
  6. package/dist/kosuke/commands/build.d.ts.map +1 -1
  7. package/dist/kosuke/commands/build.js +300 -4
  8. package/dist/kosuke/commands/build.js.map +1 -1
  9. package/dist/kosuke/commands/migrate.d.ts +6 -1
  10. package/dist/kosuke/commands/migrate.d.ts.map +1 -1
  11. package/dist/kosuke/commands/migrate.js +124 -37
  12. package/dist/kosuke/commands/migrate.js.map +1 -1
  13. package/dist/kosuke/commands/plan.d.ts +4 -20
  14. package/dist/kosuke/commands/plan.d.ts.map +1 -1
  15. package/dist/kosuke/commands/plan.js +471 -679
  16. package/dist/kosuke/commands/plan.js.map +1 -1
  17. package/dist/kosuke/commands/requirements.js +2 -2
  18. package/dist/kosuke/commands/requirements.js.map +1 -1
  19. package/dist/kosuke/commands/review.d.ts +6 -1
  20. package/dist/kosuke/commands/review.d.ts.map +1 -1
  21. package/dist/kosuke/commands/review.js +168 -68
  22. package/dist/kosuke/commands/review.js.map +1 -1
  23. package/dist/kosuke/commands/serve.d.ts +9 -0
  24. package/dist/kosuke/commands/serve.d.ts.map +1 -0
  25. package/dist/kosuke/commands/serve.js +17 -0
  26. package/dist/kosuke/commands/serve.js.map +1 -0
  27. package/dist/kosuke/commands/ship.d.ts +6 -1
  28. package/dist/kosuke/commands/ship.d.ts.map +1 -1
  29. package/dist/kosuke/commands/ship.js +226 -67
  30. package/dist/kosuke/commands/ship.js.map +1 -1
  31. package/dist/kosuke/commands/test.d.ts +11 -6
  32. package/dist/kosuke/commands/test.d.ts.map +1 -1
  33. package/dist/kosuke/commands/test.js +438 -105
  34. package/dist/kosuke/commands/test.js.map +1 -1
  35. package/dist/kosuke/commands/tickets.d.ts +7 -15
  36. package/dist/kosuke/commands/tickets.d.ts.map +1 -1
  37. package/dist/kosuke/commands/tickets.js +17 -61
  38. package/dist/kosuke/commands/tickets.js.map +1 -1
  39. package/dist/kosuke/serve/middleware/error-handler.d.ts +13 -0
  40. package/dist/kosuke/serve/middleware/error-handler.d.ts.map +1 -0
  41. package/dist/kosuke/serve/middleware/error-handler.js +34 -0
  42. package/dist/kosuke/serve/middleware/error-handler.js.map +1 -0
  43. package/dist/kosuke/serve/middleware/validation.d.ts +13 -0
  44. package/dist/kosuke/serve/middleware/validation.d.ts.map +1 -0
  45. package/dist/kosuke/serve/middleware/validation.js +39 -0
  46. package/dist/kosuke/serve/middleware/validation.js.map +1 -0
  47. package/dist/kosuke/serve/routes/build.d.ts +6 -0
  48. package/dist/kosuke/serve/routes/build.d.ts.map +1 -0
  49. package/dist/kosuke/serve/routes/build.js +224 -0
  50. package/dist/kosuke/serve/routes/build.js.map +1 -0
  51. package/dist/kosuke/serve/routes/health.d.ts +6 -0
  52. package/dist/kosuke/serve/routes/health.d.ts.map +1 -0
  53. package/dist/kosuke/serve/routes/health.js +11 -0
  54. package/dist/kosuke/serve/routes/health.js.map +1 -0
  55. package/dist/kosuke/serve/routes/plan.d.ts +6 -0
  56. package/dist/kosuke/serve/routes/plan.d.ts.map +1 -0
  57. package/dist/kosuke/serve/routes/plan.js +104 -0
  58. package/dist/kosuke/serve/routes/plan.js.map +1 -0
  59. package/dist/kosuke/serve/server.d.ts +16 -0
  60. package/dist/kosuke/serve/server.d.ts.map +1 -0
  61. package/dist/kosuke/serve/server.js +63 -0
  62. package/dist/kosuke/serve/server.js.map +1 -0
  63. package/dist/kosuke/serve/validation/build.d.ts +41 -0
  64. package/dist/kosuke/serve/validation/build.d.ts.map +1 -0
  65. package/dist/kosuke/serve/validation/build.js +20 -0
  66. package/dist/kosuke/serve/validation/build.js.map +1 -0
  67. package/dist/kosuke/serve/validation/plan.d.ts +26 -0
  68. package/dist/kosuke/serve/validation/plan.d.ts.map +1 -0
  69. package/dist/kosuke/serve/validation/plan.js +15 -0
  70. package/dist/kosuke/serve/validation/plan.js.map +1 -0
  71. package/dist/kosuke/types.d.ts +217 -1
  72. package/dist/kosuke/types.d.ts.map +1 -1
  73. package/dist/kosuke/utils/claude-agent.d.ts +82 -6
  74. package/dist/kosuke/utils/claude-agent.d.ts.map +1 -1
  75. package/dist/kosuke/utils/claude-agent.js +381 -180
  76. package/dist/kosuke/utils/claude-agent.js.map +1 -1
  77. package/dist/kosuke/utils/playwright-mcp-client.d.ts +45 -0
  78. package/dist/kosuke/utils/playwright-mcp-client.d.ts.map +1 -0
  79. package/dist/kosuke/utils/playwright-mcp-client.js +131 -0
  80. package/dist/kosuke/utils/playwright-mcp-client.js.map +1 -0
  81. package/dist/lib.d.ts +4 -4
  82. package/dist/lib.d.ts.map +1 -1
  83. package/dist/lib.js +2 -1
  84. package/dist/lib.js.map +1 -1
  85. package/dist/package.json +7 -3
  86. package/package.json +7 -3
@@ -1,13 +1,13 @@
1
1
  /**
2
- * Test command - Atomic web E2E testing (no fixing, no linting)
2
+ * Test command - Atomic web E2E testing with Playwright MCP
3
3
  *
4
4
  * This command:
5
5
  * 1. Accepts a test prompt with optional ticket context
6
- * 2. Runs a single web E2E test with Stagehand
7
- * 3. Returns result (success/failure) with logs
6
+ * 2. Runs a single web E2E test using Playwright MCP + Claude AI
7
+ * 3. Returns result (success/failure) with logs and trace files
8
8
  *
9
9
  * Test type:
10
- * - web-test: Browser E2E testing with Stagehand + Claude AI
10
+ * - web-test: Browser E2E testing with Playwright MCP + Claude AI
11
11
  *
12
12
  * NOTE: This is ATOMIC - no retries, no fixing, no linting
13
13
  * For iterative test+fix, use: kosuke build
@@ -17,133 +17,442 @@
17
17
  * kosuke test --prompt="..." --url=http://localhost:4000
18
18
  * kosuke test --prompt="..." --verbose # Enable verbose output
19
19
  * kosuke test --prompt="..." --headless # Run in headless mode
20
+ * kosuke test --prompt="..." --trace # Enable trace recording
20
21
  *
21
22
  * Programmatic usage (from build command):
22
23
  * const result = await testCore({
23
24
  * prompt: "Test login functionality",
24
- * type: "web-test",
25
25
  * context: { ticketId, ticketTitle, ticketDescription },
26
26
  * });
27
27
  */
28
- import { Stagehand } from '@browserbasehq/stagehand';
28
+ import Anthropic from '@anthropic-ai/sdk';
29
29
  import { logger, setupCancellationHandler } from '../utils/logger.js';
30
+ import { PlaywrightMCPClient } from '../utils/playwright-mcp-client.js';
30
31
  /**
31
- * Core test logic (atomic - single execution, no retries, no fixes)
32
+ * Calculate cost from text generation token usage
33
+ * Pricing (per million tokens):
34
+ * - Input: $3.00
35
+ * - Output: $15.00
36
+ * - Cache creation: $3.75
37
+ * - Cache read: $0.30
32
38
  */
33
- export async function testCore(options) {
34
- const { prompt: testPrompt, context, url = 'http://localhost:3000', headless = false, verbose = false, } = options;
35
- // Validate: prompt is required
36
- if (!testPrompt || testPrompt.trim().length === 0) {
37
- throw new Error('Test prompt is required\n' +
38
- 'Examples:\n' +
39
- ' kosuke test --prompt="Test user login"\n' +
40
- ' kosuke test --prompt="Test task creation flow"');
41
- }
42
- // Validate ANTHROPIC_API_KEY (required for Stagehand)
39
+ function calculateTextGenerationCost(usage) {
40
+ const inputCost = (usage.input_tokens / 1000000) * 3.0;
41
+ const outputCost = (usage.output_tokens / 1000000) * 15.0;
42
+ const cacheCreationCost = (usage.cache_creation_tokens / 1000000) * 3.75;
43
+ const cacheReadCost = (usage.cache_read_tokens / 1000000) * 0.3;
44
+ return inputCost + outputCost + cacheCreationCost + cacheReadCost;
45
+ }
46
+ /**
47
+ * Execute test using Playwright MCP mode (streaming version)
48
+ */
49
+ async function* executeWithPlaywrightMCPStream(params) {
50
+ const { testPrompt, context, testIdentifier, url, headless, verbose, trace } = params;
51
+ // Yield test started event
52
+ yield {
53
+ type: 'test_started',
54
+ data: { testIdentifier, url, headless },
55
+ };
56
+ // Validate ANTHROPIC_API_KEY
43
57
  if (!process.env.ANTHROPIC_API_KEY) {
44
- throw new Error('ANTHROPIC_API_KEY environment variable is required for testing');
45
- }
46
- const testIdentifier = context?.ticketId || `test-${Date.now()}`;
47
- // Log context if provided
48
- if (context) {
49
- console.log(`๐ŸŽซ Testing: ${context.ticketId} - ${context.ticketTitle}`);
50
- }
51
- else {
52
- console.log(`๐Ÿ“‹ Test: ${testPrompt.substring(0, 60)}${testPrompt.length > 60 ? '...' : ''}`);
58
+ throw new Error('ANTHROPIC_API_KEY environment variable is required');
53
59
  }
60
+ // Initialize MCP client
61
+ const mcpClient = new PlaywrightMCPClient();
54
62
  try {
55
- // Run web E2E test with Stagehand
56
- console.log(`\n${'='.repeat(60)}`);
57
- console.log(`๐Ÿงช Running Browser Test`);
58
- console.log(`${'='.repeat(60)}\n`);
59
- console.log(`๐ŸŒ URL: ${url}`);
60
- console.log(`๐Ÿ” Verbose: ${verbose ? 'enabled' : 'disabled'}`);
61
- console.log(`๐Ÿ‘๏ธ Headless: ${headless ? 'enabled' : 'disabled'}\n`);
62
- const stagehand = new Stagehand({
63
- env: 'LOCAL',
64
- verbose: verbose ? 2 : 1, // verbose flag โ†’ level 2, otherwise level 1
65
- localBrowserLaunchOptions: {
66
- headless,
67
- },
68
- });
69
- await stagehand.init();
70
- console.log('โœ… Stagehand initialized\n');
71
- // Navigate to URL
72
- const page = stagehand.context.pages()[0];
73
- console.log(`๐ŸŒ Navigating to ${url}...`);
74
- await page.goto(url);
75
- console.log('โœ… Navigation complete\n');
76
- // Create agent with system prompt
77
- const agent = stagehand.agent({
78
- systemPrompt: `You are a helpful testing assistant that can control a web browser.
79
- Execute the given instructions step by step.
80
- Be thorough and wait for elements to load when necessary.
81
- Do not ask follow-up questions, trust your judgement to complete the task.`,
82
- });
83
- // Execute test instruction
84
- console.log('๐Ÿค– Agent starting execution...\n');
85
- const result = await agent.execute({
86
- instruction: testPrompt,
63
+ // Connect to MCP server
64
+ await mcpClient.connect({ verbose, trace });
65
+ // Get MCP tools
66
+ const mcpTools = mcpClient.getTools();
67
+ // Yield MCP connected event
68
+ yield {
69
+ type: 'mcp_connected',
70
+ data: { toolsAvailable: mcpTools.length },
71
+ };
72
+ // Start tracing if enabled
73
+ if (trace) {
74
+ console.log('๐Ÿ“น Starting trace recording...');
75
+ try {
76
+ await mcpClient.executeTool('browser_start_tracing', {});
77
+ console.log('โœ… Trace recording started\n');
78
+ }
79
+ catch (error) {
80
+ console.warn(`โš ๏ธ Failed to start tracing: ${error instanceof Error ? error.message : String(error)}`);
81
+ console.warn('โš ๏ธ Continuing without tracing...\n');
82
+ }
83
+ }
84
+ // Initialize Anthropic client
85
+ const anthropic = new Anthropic({
86
+ apiKey: process.env.ANTHROPIC_API_KEY,
87
87
  });
88
- // Close browser
89
- console.log('\n๐Ÿ”’ Closing browser session...');
90
- await stagehand.close();
91
- console.log('โœ… Browser closed\n');
92
- // Calculate cost from token usage
93
- const cost = result.usage ? calculateCost(result.usage) : 0;
94
- // Return TestResult
95
- return {
96
- ticketId: testIdentifier,
97
- success: result.success,
98
- output: result.message,
99
- logs: {
100
- console: [], // Stagehand doesn't expose browser console logs via agent
101
- errors: result.success ? [] : [result.message],
88
+ // Prepare system prompt
89
+ const systemPrompt = `You are a browser testing assistant using Playwright tools.
90
+
91
+ Execute the test instructions step by step using the available Playwright MCP tools.
92
+
93
+ REQUIREMENTS:
94
+ - Use chromium browser (already configured)
95
+ - Headless mode: ${headless ? 'enabled' : 'disabled'}
96
+ - Target URL: ${url}
97
+ - Be thorough and wait for elements to load when necessary
98
+ - Report success or failure clearly
99
+
100
+ ${context ? `\nTest Context:\n- Ticket: ${context.ticketId}\n- Title: ${context.ticketTitle}\n${context.ticketDescription ? `- Description: ${context.ticketDescription}\n` : ''}` : ''}`;
101
+ // Build messages
102
+ let messages = [
103
+ {
104
+ role: 'user',
105
+ content: testPrompt,
102
106
  },
103
- tokensUsed: {
104
- input: result.usage?.input_tokens || 0,
105
- output: result.usage?.output_tokens || 0,
106
- cacheCreation: 0, // Not exposed separately by Stagehand
107
- cacheRead: result.usage?.cached_input_tokens || 0,
107
+ ];
108
+ // Track tokens and cost
109
+ let totalInputTokens = 0;
110
+ let totalOutputTokens = 0;
111
+ let totalCacheCreation = 0;
112
+ let totalCacheRead = 0;
113
+ // Execute test loop (max 20 turns)
114
+ let turnCount = 0;
115
+ const maxTurns = 20;
116
+ let responseText = '';
117
+ let testSuccess = false;
118
+ while (turnCount < maxTurns) {
119
+ turnCount++;
120
+ // Yield test turn event
121
+ yield {
122
+ type: 'test_turn',
123
+ data: { turnNumber: turnCount, maxTurns },
124
+ };
125
+ // Truncate old tool results to prevent token overflow
126
+ // Keep only last 3 tool result exchanges (6 messages: 3 assistant + 3 user with results)
127
+ if (messages.length > 13) {
128
+ // Keep initial user message + last 6 messages (3 exchanges)
129
+ const initialMessage = messages[0];
130
+ const recentMessages = messages.slice(-6);
131
+ messages = [initialMessage, ...recentMessages];
132
+ if (verbose) {
133
+ console.log(`\n๐Ÿ”„ Truncated message history (keeping last 3 exchanges to prevent token overflow)`);
134
+ }
135
+ }
136
+ // Stream response
137
+ const stream = await anthropic.messages.stream({
138
+ model: process.env.ANTHROPIC_MODEL || 'claude-haiku-4-5-20251001',
139
+ max_tokens: 4096,
140
+ system: systemPrompt,
141
+ tools: mcpTools,
142
+ messages,
143
+ });
144
+ let currentText = '';
145
+ const toolUses = [];
146
+ // Process stream
147
+ for await (const event of stream) {
148
+ if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {
149
+ const delta = event.delta.text;
150
+ currentText += delta;
151
+ if (verbose) {
152
+ process.stdout.write(delta);
153
+ }
154
+ }
155
+ }
156
+ responseText += currentText;
157
+ // Get final message
158
+ const finalMessage = await stream.finalMessage();
159
+ // Track tokens
160
+ const usage = finalMessage.usage;
161
+ totalInputTokens += usage.input_tokens;
162
+ totalOutputTokens += usage.output_tokens;
163
+ totalCacheCreation += usage.cache_creation_input_tokens || 0;
164
+ totalCacheRead += usage.cache_read_input_tokens || 0;
165
+ // Extract tool uses
166
+ for (const block of finalMessage.content) {
167
+ if (block.type === 'tool_use') {
168
+ toolUses.push({
169
+ id: block.id,
170
+ name: block.name,
171
+ input: block.input,
172
+ });
173
+ }
174
+ }
175
+ // Add assistant message to history
176
+ messages.push({ role: 'assistant', content: finalMessage.content });
177
+ // Yield assistant message event
178
+ yield {
179
+ type: 'assistant_message',
180
+ data: {
181
+ text: currentText,
182
+ toolUses: toolUses.map((t) => ({ name: t.name })),
183
+ },
184
+ };
185
+ // If no tools called, test is complete
186
+ if (toolUses.length === 0) {
187
+ testSuccess =
188
+ responseText.toLowerCase().includes('success') ||
189
+ responseText.toLowerCase().includes('passed');
190
+ break;
191
+ }
192
+ // Execute tools and collect results
193
+ const toolResults = [];
194
+ for (const toolUse of toolUses) {
195
+ let success = false;
196
+ try {
197
+ const result = await mcpClient.executeTool(toolUse.name, toolUse.input);
198
+ toolResults.push({
199
+ type: 'tool_result',
200
+ tool_use_id: toolUse.id,
201
+ content: JSON.stringify(result),
202
+ });
203
+ success = true;
204
+ }
205
+ catch (error) {
206
+ const errorMsg = error instanceof Error ? error.message : String(error);
207
+ toolResults.push({
208
+ type: 'tool_result',
209
+ tool_use_id: toolUse.id,
210
+ content: `Error: ${errorMsg}`,
211
+ is_error: true,
212
+ });
213
+ }
214
+ // Yield tool executed event
215
+ yield {
216
+ type: 'tool_executed',
217
+ data: { toolName: toolUse.name, success },
218
+ };
219
+ }
220
+ // Add tool results to messages
221
+ messages.push({ role: 'user', content: toolResults });
222
+ }
223
+ // Stop tracing if enabled
224
+ if (trace) {
225
+ console.log('\n๐Ÿ“น Stopping trace recording...');
226
+ try {
227
+ const traceResult = await mcpClient.executeTool('browser_stop_tracing', {});
228
+ console.log('โœ… Trace recording stopped\n');
229
+ // Parse trace result to find output paths
230
+ let traceText = '';
231
+ if (Array.isArray(traceResult)) {
232
+ const textContent = traceResult.find((item) => item.type === 'text');
233
+ if (textContent?.text) {
234
+ traceText = textContent.text;
235
+ }
236
+ }
237
+ else if (typeof traceResult === 'string') {
238
+ traceText = traceResult;
239
+ }
240
+ else if (traceResult && typeof traceResult === 'object' && 'text' in traceResult) {
241
+ traceText = traceResult.text;
242
+ }
243
+ if (traceText) {
244
+ // Extract paths from MCP response
245
+ const actionLogMatch = traceText.match(/Action log:\s*(.+\.trace)/);
246
+ const networkLogMatch = traceText.match(/Network log:\s*(.+\.network)/);
247
+ const resourcesMatch = traceText.match(/Resources.*:\s*(.+resources)/);
248
+ if (actionLogMatch) {
249
+ const tracePath = actionLogMatch[1];
250
+ const networkPath = networkLogMatch ? networkLogMatch[1] : null;
251
+ const resourcesPath = resourcesMatch ? resourcesMatch[1] : null;
252
+ console.log('๐Ÿ“ Trace files:');
253
+ console.log(` ๐Ÿ“น Action log: ${tracePath}`);
254
+ if (networkPath) {
255
+ console.log(` ๐ŸŒ Network log: ${networkPath}`);
256
+ }
257
+ if (resourcesPath) {
258
+ console.log(` ๐Ÿ“ฆ Resources: ${resourcesPath}`);
259
+ }
260
+ console.log(`\n๐ŸŽฌ View trace (with video): npx playwright show-trace ${tracePath}`);
261
+ console.log(' โ„น๏ธ Video is embedded in the trace file and will play in the viewer');
262
+ }
263
+ else {
264
+ console.log('โœ… Trace saved (paths not parsed)');
265
+ console.log(`Raw result: ${traceText}`);
266
+ }
267
+ }
268
+ else {
269
+ console.log('โš ๏ธ Trace saved but location not returned by MCP server');
270
+ }
271
+ }
272
+ catch (error) {
273
+ console.warn(`โš ๏ธ Failed to stop tracing: ${error instanceof Error ? error.message : String(error)}`);
274
+ }
275
+ }
276
+ // Yield test completed event
277
+ yield {
278
+ type: 'test_completed',
279
+ data: { success: testSuccess },
280
+ };
281
+ // Get MCP tool usage
282
+ const toolUsage = mcpClient.getToolUsage();
283
+ // Calculate costs
284
+ const textGenerationCost = calculateTextGenerationCost({
285
+ input_tokens: totalInputTokens,
286
+ output_tokens: totalOutputTokens,
287
+ cache_creation_tokens: totalCacheCreation,
288
+ cache_read_tokens: totalCacheRead,
289
+ });
290
+ // MCP tool calls cost (estimated: $0.01 per tool call)
291
+ const toolCallCost = toolUsage.total * 0.01;
292
+ const totalCost = textGenerationCost + toolCallCost;
293
+ // Close MCP client
294
+ await mcpClient.close();
295
+ // Yield done event
296
+ yield {
297
+ type: 'done',
298
+ data: {
299
+ ticketId: testIdentifier,
300
+ success: testSuccess,
301
+ output: responseText,
302
+ logs: {
303
+ console: [],
304
+ errors: testSuccess ? [] : [responseText],
305
+ },
306
+ tokensUsed: {
307
+ input: totalInputTokens,
308
+ output: totalOutputTokens,
309
+ cacheCreation: totalCacheCreation,
310
+ cacheRead: totalCacheRead,
311
+ },
312
+ cost: totalCost,
313
+ mcpToolUsage: {
314
+ navigations: toolUsage.navigations,
315
+ clicks: toolUsage.clicks,
316
+ types: toolUsage.types,
317
+ extracts: toolUsage.extracts,
318
+ other: toolUsage.other,
319
+ },
320
+ mcpToolCost: toolCallCost,
321
+ error: testSuccess ? undefined : 'Test did not complete successfully',
108
322
  },
109
- cost,
110
- error: result.success ? undefined : result.message,
111
323
  };
112
324
  }
113
325
  catch (error) {
326
+ await mcpClient.close();
114
327
  const errorMessage = error instanceof Error ? error.message : String(error);
115
- console.error(`\nโŒ Test execution failed: ${errorMessage}`);
116
- return {
117
- ticketId: testIdentifier,
118
- success: false,
119
- output: `Test failed: ${errorMessage}`,
120
- logs: {
121
- console: [],
122
- errors: [errorMessage],
328
+ // Yield done event with error
329
+ yield {
330
+ type: 'done',
331
+ data: {
332
+ ticketId: testIdentifier,
333
+ success: false,
334
+ output: `Test failed: ${errorMessage}`,
335
+ logs: {
336
+ console: [],
337
+ errors: [errorMessage],
338
+ },
339
+ tokensUsed: {
340
+ input: 0,
341
+ output: 0,
342
+ cacheCreation: 0,
343
+ cacheRead: 0,
344
+ },
345
+ cost: 0,
346
+ error: errorMessage,
347
+ },
348
+ };
349
+ }
350
+ }
351
+ /**
352
+ * Streaming version of testCore - yields events for SSE integration
353
+ */
354
+ export async function* testCoreStream(options) {
355
+ const { prompt: testPrompt, context, url = 'http://localhost:3000', headless = false, verbose = false, trace = false, } = options;
356
+ // Validate: prompt is required
357
+ if (!testPrompt || testPrompt.trim().length === 0) {
358
+ yield {
359
+ type: 'done',
360
+ data: {
361
+ ticketId: 'error',
362
+ success: false,
363
+ output: 'Test prompt is required',
364
+ logs: { console: [], errors: ['Test prompt is required'] },
365
+ tokensUsed: { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 },
366
+ cost: 0,
367
+ error: 'Test prompt is required',
123
368
  },
124
- tokensUsed: {
125
- input: 0,
126
- output: 0,
127
- cacheCreation: 0,
128
- cacheRead: 0,
369
+ };
370
+ return;
371
+ }
372
+ // Validate ANTHROPIC_API_KEY (required for Playwright MCP)
373
+ if (!process.env.ANTHROPIC_API_KEY) {
374
+ yield {
375
+ type: 'done',
376
+ data: {
377
+ ticketId: 'error',
378
+ success: false,
379
+ output: 'ANTHROPIC_API_KEY is required',
380
+ logs: { console: [], errors: ['ANTHROPIC_API_KEY is required'] },
381
+ tokensUsed: { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 },
382
+ cost: 0,
383
+ error: 'ANTHROPIC_API_KEY is required',
129
384
  },
130
- cost: 0,
131
- error: errorMessage,
132
385
  };
386
+ return;
133
387
  }
388
+ const testIdentifier = context?.ticketId || `test-${Date.now()}`;
389
+ // Execute with Playwright MCP (streaming)
390
+ yield* executeWithPlaywrightMCPStream({
391
+ testPrompt,
392
+ context,
393
+ testIdentifier,
394
+ url,
395
+ headless,
396
+ verbose,
397
+ trace,
398
+ });
134
399
  }
135
400
  /**
136
- * Calculate cost from Stagehand token usage
137
- * Pricing (per million tokens):
138
- * - Input: $3.00
139
- * - Output: $15.00
140
- * - Cache read: $0.30
401
+ * Core test logic (atomic - single execution, no retries, no fixes)
402
+ * Consumes testCoreStream and adds console logging
141
403
  */
142
- function calculateCost(usage) {
143
- const inputCost = (usage.input_tokens / 1000000) * 3.0;
144
- const outputCost = (usage.output_tokens / 1000000) * 15.0;
145
- const cacheReadCost = ((usage.cached_input_tokens || 0) / 1000000) * 0.3;
146
- return inputCost + outputCost + cacheReadCost;
404
+ export async function testCore(options) {
405
+ const { prompt: testPrompt, context } = options;
406
+ // Log context if provided
407
+ if (context) {
408
+ console.log(`๐ŸŽซ Testing: ${context.ticketId} - ${context.ticketTitle}`);
409
+ }
410
+ else {
411
+ console.log(`๐Ÿ“‹ Test: ${testPrompt.substring(0, 60)}${testPrompt.length > 60 ? '...' : ''}`);
412
+ }
413
+ console.log(`\n${'='.repeat(60)}`);
414
+ console.log(`๐Ÿงช Running Browser Test`);
415
+ console.log(`${'='.repeat(60)}\n`);
416
+ let result = null;
417
+ // Consume stream and add console logging
418
+ for await (const event of testCoreStream(options)) {
419
+ if (event.type === 'test_started') {
420
+ console.log(`๐ŸŒ URL: ${event.data.url}`);
421
+ console.log(`๐Ÿ‘๏ธ Headless: ${event.data.headless ? 'enabled' : 'disabled'}`);
422
+ console.log(`๐ŸŽญ Browser: chromium (forced)\n`);
423
+ }
424
+ else if (event.type === 'mcp_connected') {
425
+ console.log(`โœ… Connected to Playwright MCP (${event.data.toolsAvailable} tools available)\n`);
426
+ console.log('๐Ÿค– Starting test execution with Claude + Playwright MCP...\n');
427
+ }
428
+ else if (event.type === 'test_turn') {
429
+ if (options.verbose) {
430
+ console.log(`\n๐Ÿ”„ Turn ${event.data.turnNumber}/${event.data.maxTurns}`);
431
+ }
432
+ }
433
+ else if (event.type === 'assistant_message') {
434
+ if (options.verbose && event.data.text) {
435
+ console.log(event.data.text);
436
+ }
437
+ }
438
+ else if (event.type === 'tool_executed') {
439
+ if (options.verbose) {
440
+ console.log(`๐Ÿ”ง Executed: ${event.data.toolName} - ${event.data.success ? 'โœ…' : 'โŒ'}`);
441
+ }
442
+ }
443
+ else if (event.type === 'test_completed') {
444
+ console.log(`\nโœ… Test ${event.data.success ? 'passed' : 'failed'}\n`);
445
+ }
446
+ else if (event.type === 'done') {
447
+ result = event.data;
448
+ console.log('๐Ÿ”’ Closing MCP connection...');
449
+ console.log('โœ… MCP connection closed\n');
450
+ }
451
+ }
452
+ if (!result) {
453
+ throw new Error('Test stream ended without result');
454
+ }
455
+ return result;
147
456
  }
148
457
  /**
149
458
  * Main test command
@@ -192,7 +501,31 @@ function displayTestSummary(result) {
192
501
  console.log(`๐Ÿ“ Output: ${result.output}`);
193
502
  console.log(`๐Ÿ”ง Console logs: ${result.logs.console.length}`);
194
503
  console.log(`โŒ Errors: ${result.logs.errors.length}`);
195
- console.log(`๐Ÿ’ฐ Cost: $${result.cost.toFixed(4)}`);
504
+ // Display MCP tool usage
505
+ if (result.mcpToolUsage) {
506
+ console.log(`\n๐ŸŽญ Playwright Tool Usage:`);
507
+ console.log(` ๐ŸŒ Navigations: ${result.mcpToolUsage.navigations}`);
508
+ console.log(` ๐Ÿ–ฑ๏ธ Clicks: ${result.mcpToolUsage.clicks}`);
509
+ console.log(` โŒจ๏ธ Types: ${result.mcpToolUsage.types}`);
510
+ console.log(` ๐Ÿ“ค Extracts: ${result.mcpToolUsage.extracts}`);
511
+ console.log(` ๐Ÿ”ง Other: ${result.mcpToolUsage.other}`);
512
+ const totalTools = result.mcpToolUsage.navigations +
513
+ result.mcpToolUsage.clicks +
514
+ result.mcpToolUsage.types +
515
+ result.mcpToolUsage.extracts +
516
+ result.mcpToolUsage.other;
517
+ console.log(` ๐Ÿ“Š Total: ${totalTools}`);
518
+ }
519
+ // Display cost breakdown
520
+ if (result.mcpToolCost !== undefined) {
521
+ console.log(`\n๐Ÿ’ฐ Cost Breakdown:`);
522
+ console.log(` ๐Ÿ’ฌ Text generation: $${(result.cost - result.mcpToolCost).toFixed(4)}`);
523
+ console.log(` ๐ŸŽญ Playwright tool calls: $${result.mcpToolCost.toFixed(4)}`);
524
+ console.log(` ๐Ÿ“Š Total: $${result.cost.toFixed(4)}`);
525
+ }
526
+ else {
527
+ console.log(`๐Ÿ’ฐ Cost: $${result.cost.toFixed(4)}`);
528
+ }
196
529
  console.log('='.repeat(60));
197
530
  if (result.success) {
198
531
  console.log('\nโœ… Test completed successfully!');
@@ -1 +1 @@
1
- {"version":3,"file":"test.js","sourceRoot":"","sources":["../../../kosuke/commands/test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../../kosuke/commands/test.ts"],"names":[],"mappings":"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"}