@kosuke-ai/cli 0.0.56 ā 1.0.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.
- package/README.md +31 -448
- package/dist/commands/auth.js +117 -0
- package/dist/generated/commands/deploy/cancel.js +17 -0
- package/dist/generated/commands/deploy/messages.js +17 -0
- package/dist/generated/commands/deploy/run.js +60 -0
- package/dist/generated/commands/index.js +132 -0
- package/dist/generated/commands/preview/get.js +25 -0
- package/dist/generated/commands/preview/health.js +25 -0
- package/dist/generated/commands/preview/reset.js +27 -0
- package/dist/generated/commands/preview/share-create.js +36 -0
- package/dist/generated/commands/preview/share-delete.js +26 -0
- package/dist/generated/commands/preview/share-get.js +26 -0
- package/dist/generated/commands/preview/shared.js +17 -0
- package/dist/generated/commands/projects/create.js +37 -0
- package/dist/generated/commands/projects/delete.js +17 -0
- package/dist/generated/commands/projects/env-vars-add.js +21 -0
- package/dist/generated/commands/projects/env-vars-remove.js +21 -0
- package/dist/generated/commands/projects/get.js +17 -0
- package/dist/generated/commands/projects/list.js +15 -0
- package/dist/generated/commands/projects/services-add.js +87 -0
- package/dist/generated/commands/projects/services-list.js +18 -0
- package/dist/generated/commands/projects/services-remove.js +19 -0
- package/dist/generated/commands/projects/services-update.js +81 -0
- package/dist/generated/commands/projects/settings-get.js +18 -0
- package/dist/generated/commands/projects/settings-import.js +91 -0
- package/dist/generated/commands/projects/settings-update.js +77 -0
- package/dist/generated/commands/projects/skills.js +35 -0
- package/dist/generated/commands/projects/update.js +27 -0
- package/dist/generated/commands/sessions/activate.js +18 -0
- package/dist/generated/commands/sessions/checklist-generate.js +19 -0
- package/dist/generated/commands/sessions/checklist-get.js +19 -0
- package/dist/generated/commands/sessions/comments-add.js +63 -0
- package/dist/generated/commands/sessions/comments-delete.js +20 -0
- package/dist/generated/commands/sessions/comments-list.js +19 -0
- package/dist/generated/commands/sessions/comments-update.js +23 -0
- package/dist/generated/commands/sessions/create.js +126 -0
- package/dist/generated/commands/sessions/delete.js +18 -0
- package/dist/generated/commands/sessions/diff-files.js +19 -0
- package/dist/generated/commands/sessions/diff-patch.js +86 -0
- package/dist/generated/commands/sessions/edit-prompt.js +59 -0
- package/dist/generated/commands/sessions/files-get.js +27 -0
- package/dist/generated/commands/sessions/files-list.js +19 -0
- package/dist/generated/commands/sessions/files-write.js +41 -0
- package/dist/generated/commands/sessions/get.js +18 -0
- package/dist/generated/commands/sessions/git-commit-message.js +19 -0
- package/dist/generated/commands/sessions/git-commit.js +29 -0
- package/dist/generated/commands/sessions/git-push.js +19 -0
- package/dist/generated/commands/sessions/git-state.js +19 -0
- package/dist/generated/commands/sessions/jobs-cancel.js +20 -0
- package/dist/generated/commands/sessions/jobs-get.js +20 -0
- package/dist/generated/commands/sessions/list.js +81 -0
- package/dist/generated/commands/sessions/messages.js +18 -0
- package/dist/generated/commands/sessions/search.js +23 -0
- package/dist/generated/commands/sessions/send.js +98 -0
- package/dist/generated/commands/sessions/update.js +72 -0
- package/dist/generated/commands/workspaces/access-status.js +29 -0
- package/dist/generated/commands/workspaces/ai-provider-get.js +18 -0
- package/dist/generated/commands/workspaces/ai-provider-remove.js +42 -0
- package/dist/generated/commands/workspaces/ai-provider-set.js +21 -0
- package/dist/generated/commands/workspaces/credits.js +17 -0
- package/dist/generated/commands/workspaces/get.js +17 -0
- package/dist/generated/commands/workspaces/getting-started-get.js +18 -0
- package/dist/generated/commands/workspaces/getting-started-update.js +32 -0
- package/dist/generated/commands/workspaces/list.js +15 -0
- package/dist/generated/commands/workspaces/members.js +25 -0
- package/dist/generated/commands/workspaces/sandbox-limit.js +17 -0
- package/dist/generated/commands/workspaces/stop-sandboxes.js +27 -0
- package/dist/generated/commands/workspaces/usage.js +32 -0
- package/dist/index.js +5 -516
- package/dist/program.js +46 -0
- package/dist/runtime/attach.js +139 -0
- package/dist/runtime/attachments.js +58 -0
- package/dist/runtime/client.js +12 -0
- package/dist/runtime/config.js +49 -0
- package/dist/runtime/credentials.js +24 -0
- package/dist/runtime/descriptor.js +7 -0
- package/dist/runtime/invoke.js +152 -0
- package/dist/runtime/runtime.js +41 -0
- package/dist/runtime/version.js +5 -0
- package/openapi.json +5222 -0
- package/package.json +21 -79
- package/LICENSE +0 -21
- package/claude.costs.json +0 -34
- package/dist/__tests__/utils/file-discovery.test.d.ts +0 -5
- package/dist/__tests__/utils/file-discovery.test.d.ts.map +0 -1
- package/dist/__tests__/utils/file-discovery.test.js +0 -51
- package/dist/__tests__/utils/file-discovery.test.js.map +0 -1
- package/dist/__tests__/utils/logger-nologs.test.d.ts +0 -5
- package/dist/__tests__/utils/logger-nologs.test.d.ts.map +0 -1
- package/dist/__tests__/utils/logger-nologs.test.js +0 -34
- package/dist/__tests__/utils/logger-nologs.test.js.map +0 -1
- package/dist/__tests__/utils/logger.test.d.ts +0 -5
- package/dist/__tests__/utils/logger.test.d.ts.map +0 -1
- package/dist/__tests__/utils/logger.test.js +0 -243
- package/dist/__tests__/utils/logger.test.js.map +0 -1
- package/dist/__tests__/utils/validator.test.d.ts +0 -5
- package/dist/__tests__/utils/validator.test.d.ts.map +0 -1
- package/dist/__tests__/utils/validator.test.js +0 -206
- package/dist/__tests__/utils/validator.test.js.map +0 -1
- package/dist/index.d.ts +0 -35
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/kosuke/commands/analyse.d.ts +0 -15
- package/dist/kosuke/commands/analyse.d.ts.map +0 -1
- package/dist/kosuke/commands/analyse.js +0 -273
- package/dist/kosuke/commands/analyse.js.map +0 -1
- package/dist/kosuke/commands/build.d.ts +0 -35
- package/dist/kosuke/commands/build.d.ts.map +0 -1
- package/dist/kosuke/commands/build.js +0 -659
- package/dist/kosuke/commands/build.js.map +0 -1
- package/dist/kosuke/commands/getcode.d.ts +0 -29
- package/dist/kosuke/commands/getcode.d.ts.map +0 -1
- package/dist/kosuke/commands/getcode.js +0 -221
- package/dist/kosuke/commands/getcode.js.map +0 -1
- package/dist/kosuke/commands/lint.d.ts +0 -21
- package/dist/kosuke/commands/lint.d.ts.map +0 -1
- package/dist/kosuke/commands/lint.js +0 -321
- package/dist/kosuke/commands/lint.js.map +0 -1
- package/dist/kosuke/commands/migrate.d.ts +0 -38
- package/dist/kosuke/commands/migrate.d.ts.map +0 -1
- package/dist/kosuke/commands/migrate.js +0 -284
- package/dist/kosuke/commands/migrate.js.map +0 -1
- package/dist/kosuke/commands/plan.d.ts +0 -28
- package/dist/kosuke/commands/plan.d.ts.map +0 -1
- package/dist/kosuke/commands/plan.js +0 -630
- package/dist/kosuke/commands/plan.js.map +0 -1
- package/dist/kosuke/commands/requirements.d.ts +0 -52
- package/dist/kosuke/commands/requirements.d.ts.map +0 -1
- package/dist/kosuke/commands/requirements.js +0 -615
- package/dist/kosuke/commands/requirements.js.map +0 -1
- package/dist/kosuke/commands/review.d.ts +0 -26
- package/dist/kosuke/commands/review.d.ts.map +0 -1
- package/dist/kosuke/commands/review.js +0 -303
- package/dist/kosuke/commands/review.js.map +0 -1
- package/dist/kosuke/commands/serve.d.ts +0 -9
- package/dist/kosuke/commands/serve.d.ts.map +0 -1
- package/dist/kosuke/commands/serve.js +0 -17
- package/dist/kosuke/commands/serve.js.map +0 -1
- package/dist/kosuke/commands/ship.d.ts +0 -37
- package/dist/kosuke/commands/ship.d.ts.map +0 -1
- package/dist/kosuke/commands/ship.js +0 -375
- package/dist/kosuke/commands/ship.js.map +0 -1
- package/dist/kosuke/commands/sync-rules.d.ts +0 -9
- package/dist/kosuke/commands/sync-rules.d.ts.map +0 -1
- package/dist/kosuke/commands/sync-rules.js +0 -379
- package/dist/kosuke/commands/sync-rules.js.map +0 -1
- package/dist/kosuke/commands/test.d.ts +0 -42
- package/dist/kosuke/commands/test.d.ts.map +0 -1
- package/dist/kosuke/commands/test.js +0 -540
- package/dist/kosuke/commands/test.js.map +0 -1
- package/dist/kosuke/commands/tickets.d.ts +0 -43
- package/dist/kosuke/commands/tickets.d.ts.map +0 -1
- package/dist/kosuke/commands/tickets.js +0 -499
- package/dist/kosuke/commands/tickets.js.map +0 -1
- package/dist/kosuke/serve/middleware/error-handler.d.ts +0 -14
- package/dist/kosuke/serve/middleware/error-handler.d.ts.map +0 -1
- package/dist/kosuke/serve/middleware/error-handler.js +0 -42
- package/dist/kosuke/serve/middleware/error-handler.js.map +0 -1
- package/dist/kosuke/serve/middleware/validation.d.ts +0 -13
- package/dist/kosuke/serve/middleware/validation.d.ts.map +0 -1
- package/dist/kosuke/serve/middleware/validation.js +0 -38
- package/dist/kosuke/serve/middleware/validation.js.map +0 -1
- package/dist/kosuke/serve/routes/build.d.ts +0 -6
- package/dist/kosuke/serve/routes/build.d.ts.map +0 -1
- package/dist/kosuke/serve/routes/build.js +0 -226
- package/dist/kosuke/serve/routes/build.js.map +0 -1
- package/dist/kosuke/serve/routes/health.d.ts +0 -6
- package/dist/kosuke/serve/routes/health.d.ts.map +0 -1
- package/dist/kosuke/serve/routes/health.js +0 -11
- package/dist/kosuke/serve/routes/health.js.map +0 -1
- package/dist/kosuke/serve/routes/plan.d.ts +0 -6
- package/dist/kosuke/serve/routes/plan.d.ts.map +0 -1
- package/dist/kosuke/serve/routes/plan.js +0 -106
- package/dist/kosuke/serve/routes/plan.js.map +0 -1
- package/dist/kosuke/serve/server.d.ts +0 -16
- package/dist/kosuke/serve/server.d.ts.map +0 -1
- package/dist/kosuke/serve/server.js +0 -67
- package/dist/kosuke/serve/server.js.map +0 -1
- package/dist/kosuke/serve/validation/build.d.ts +0 -41
- package/dist/kosuke/serve/validation/build.d.ts.map +0 -1
- package/dist/kosuke/serve/validation/build.js +0 -20
- package/dist/kosuke/serve/validation/build.js.map +0 -1
- package/dist/kosuke/serve/validation/plan.d.ts +0 -26
- package/dist/kosuke/serve/validation/plan.d.ts.map +0 -1
- package/dist/kosuke/serve/validation/plan.js +0 -15
- package/dist/kosuke/serve/validation/plan.js.map +0 -1
- package/dist/kosuke/types.d.ts +0 -469
- package/dist/kosuke/types.d.ts.map +0 -1
- package/dist/kosuke/types.js +0 -5
- package/dist/kosuke/types.js.map +0 -1
- package/dist/kosuke/utils/batch-creator.d.ts +0 -14
- package/dist/kosuke/utils/batch-creator.d.ts.map +0 -1
- package/dist/kosuke/utils/batch-creator.js +0 -76
- package/dist/kosuke/utils/batch-creator.js.map +0 -1
- package/dist/kosuke/utils/claude-agent.d.ts +0 -145
- package/dist/kosuke/utils/claude-agent.d.ts.map +0 -1
- package/dist/kosuke/utils/claude-agent.js +0 -504
- package/dist/kosuke/utils/claude-agent.js.map +0 -1
- package/dist/kosuke/utils/constants.d.ts +0 -40
- package/dist/kosuke/utils/constants.d.ts.map +0 -1
- package/dist/kosuke/utils/constants.js +0 -54
- package/dist/kosuke/utils/constants.js.map +0 -1
- package/dist/kosuke/utils/file-discovery.d.ts +0 -15
- package/dist/kosuke/utils/file-discovery.d.ts.map +0 -1
- package/dist/kosuke/utils/file-discovery.js +0 -80
- package/dist/kosuke/utils/file-discovery.js.map +0 -1
- package/dist/kosuke/utils/git.d.ts +0 -41
- package/dist/kosuke/utils/git.d.ts.map +0 -1
- package/dist/kosuke/utils/git.js +0 -145
- package/dist/kosuke/utils/git.js.map +0 -1
- package/dist/kosuke/utils/github.d.ts +0 -17
- package/dist/kosuke/utils/github.d.ts.map +0 -1
- package/dist/kosuke/utils/github.js +0 -22
- package/dist/kosuke/utils/github.js.map +0 -1
- package/dist/kosuke/utils/interactive-input.d.ts +0 -22
- package/dist/kosuke/utils/interactive-input.d.ts.map +0 -1
- package/dist/kosuke/utils/interactive-input.js +0 -124
- package/dist/kosuke/utils/interactive-input.js.map +0 -1
- package/dist/kosuke/utils/logger.d.ts +0 -161
- package/dist/kosuke/utils/logger.d.ts.map +0 -1
- package/dist/kosuke/utils/logger.js +0 -234
- package/dist/kosuke/utils/logger.js.map +0 -1
- package/dist/kosuke/utils/playwright-mcp-client.d.ts +0 -46
- package/dist/kosuke/utils/playwright-mcp-client.d.ts.map +0 -1
- package/dist/kosuke/utils/playwright-mcp-client.js +0 -135
- package/dist/kosuke/utils/playwright-mcp-client.js.map +0 -1
- package/dist/kosuke/utils/pr-orchestrator.d.ts +0 -49
- package/dist/kosuke/utils/pr-orchestrator.d.ts.map +0 -1
- package/dist/kosuke/utils/pr-orchestrator.js +0 -154
- package/dist/kosuke/utils/pr-orchestrator.js.map +0 -1
- package/dist/kosuke/utils/repository-manager.d.ts +0 -13
- package/dist/kosuke/utils/repository-manager.d.ts.map +0 -1
- package/dist/kosuke/utils/repository-manager.js +0 -94
- package/dist/kosuke/utils/repository-manager.js.map +0 -1
- package/dist/kosuke/utils/repository-resolver.d.ts +0 -12
- package/dist/kosuke/utils/repository-resolver.d.ts.map +0 -1
- package/dist/kosuke/utils/repository-resolver.js +0 -186
- package/dist/kosuke/utils/repository-resolver.js.map +0 -1
- package/dist/kosuke/utils/tickets-manager.d.ts +0 -64
- package/dist/kosuke/utils/tickets-manager.d.ts.map +0 -1
- package/dist/kosuke/utils/tickets-manager.js +0 -331
- package/dist/kosuke/utils/tickets-manager.js.map +0 -1
- package/dist/kosuke/utils/validator.d.ts +0 -45
- package/dist/kosuke/utils/validator.d.ts.map +0 -1
- package/dist/kosuke/utils/validator.js +0 -248
- package/dist/kosuke/utils/validator.js.map +0 -1
- package/dist/lib.d.ts +0 -96
- package/dist/lib.d.ts.map +0 -1
- package/dist/lib.js +0 -95
- package/dist/lib.js.map +0 -1
- package/dist/package.json +0 -99
|
@@ -1,540 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test command - Atomic web E2E testing with Playwright MCP
|
|
3
|
-
*
|
|
4
|
-
* This command:
|
|
5
|
-
* 1. Accepts a test prompt with optional ticket context
|
|
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
|
-
*
|
|
9
|
-
* Test type:
|
|
10
|
-
* - web-test: Browser E2E testing with Playwright MCP + Claude AI
|
|
11
|
-
*
|
|
12
|
-
* NOTE: This is ATOMIC - no retries, no fixing, no linting
|
|
13
|
-
* For iterative test+fix, use: kosuke build
|
|
14
|
-
*
|
|
15
|
-
* Usage:
|
|
16
|
-
* kosuke test --prompt="Test user login"
|
|
17
|
-
* kosuke test --prompt="..." --url=http://localhost:4000
|
|
18
|
-
* kosuke test --prompt="..." --verbose # Enable verbose output
|
|
19
|
-
* kosuke test --prompt="..." --headless # Run in headless mode
|
|
20
|
-
* kosuke test --prompt="..." --trace # Enable trace recording
|
|
21
|
-
*
|
|
22
|
-
* Programmatic usage (from build command):
|
|
23
|
-
* const result = await testCore({
|
|
24
|
-
* prompt: "Test login functionality",
|
|
25
|
-
* context: { ticketId, ticketTitle, ticketDescription },
|
|
26
|
-
* });
|
|
27
|
-
*/
|
|
28
|
-
import Anthropic from '@anthropic-ai/sdk';
|
|
29
|
-
import { logger, setupCancellationHandler } from '../utils/logger.js';
|
|
30
|
-
import { PlaywrightMCPClient } from '../utils/playwright-mcp-client.js';
|
|
31
|
-
import { DEFAULT_TEST_URL, DEFAULT_ANTHROPIC_MODEL } from '../utils/constants.js';
|
|
32
|
-
/**
|
|
33
|
-
* Calculate cost from text generation token usage
|
|
34
|
-
* Pricing (per million tokens):
|
|
35
|
-
* - Input: $3.00
|
|
36
|
-
* - Output: $15.00
|
|
37
|
-
* - Cache creation: $3.75
|
|
38
|
-
* - Cache read: $0.30
|
|
39
|
-
*/
|
|
40
|
-
function calculateTextGenerationCost(usage) {
|
|
41
|
-
const inputCost = (usage.input_tokens / 1000000) * 3.0;
|
|
42
|
-
const outputCost = (usage.output_tokens / 1000000) * 15.0;
|
|
43
|
-
const cacheCreationCost = (usage.cache_creation_tokens / 1000000) * 3.75;
|
|
44
|
-
const cacheReadCost = (usage.cache_read_tokens / 1000000) * 0.3;
|
|
45
|
-
return inputCost + outputCost + cacheCreationCost + cacheReadCost;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Execute test using Playwright MCP mode (streaming version)
|
|
49
|
-
*/
|
|
50
|
-
async function* executeWithPlaywrightMCPStream(params) {
|
|
51
|
-
const { testPrompt, context, testIdentifier, url, headless, verbose, trace } = params;
|
|
52
|
-
// Yield test started event
|
|
53
|
-
yield {
|
|
54
|
-
type: 'test_started',
|
|
55
|
-
data: { testIdentifier, url, headless },
|
|
56
|
-
};
|
|
57
|
-
// Validate ANTHROPIC_API_KEY
|
|
58
|
-
if (!process.env.ANTHROPIC_API_KEY) {
|
|
59
|
-
throw new Error('ANTHROPIC_API_KEY environment variable is required');
|
|
60
|
-
}
|
|
61
|
-
// Initialize MCP client
|
|
62
|
-
const mcpClient = new PlaywrightMCPClient();
|
|
63
|
-
try {
|
|
64
|
-
// Connect to MCP server
|
|
65
|
-
await mcpClient.connect({ verbose, trace });
|
|
66
|
-
// Get MCP tools
|
|
67
|
-
const mcpTools = mcpClient.getTools();
|
|
68
|
-
// Yield MCP connected event
|
|
69
|
-
yield {
|
|
70
|
-
type: 'mcp_connected',
|
|
71
|
-
data: { toolsAvailable: mcpTools.length },
|
|
72
|
-
};
|
|
73
|
-
// Start tracing if enabled
|
|
74
|
-
if (trace) {
|
|
75
|
-
console.log('š¹ Starting trace recording...');
|
|
76
|
-
try {
|
|
77
|
-
await mcpClient.executeTool('browser_start_tracing', {});
|
|
78
|
-
console.log('ā
Trace recording started\n');
|
|
79
|
-
}
|
|
80
|
-
catch (error) {
|
|
81
|
-
console.warn(`ā ļø Failed to start tracing: ${error instanceof Error ? error.message : String(error)}`);
|
|
82
|
-
console.warn('ā ļø Continuing without tracing...\n');
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
// Initialize Anthropic client
|
|
86
|
-
const anthropic = new Anthropic({
|
|
87
|
-
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
88
|
-
});
|
|
89
|
-
// Prepare system prompt
|
|
90
|
-
const systemPrompt = `You are a browser testing assistant using Playwright tools.
|
|
91
|
-
|
|
92
|
-
Execute the test instructions step by step using the available Playwright MCP tools.
|
|
93
|
-
|
|
94
|
-
REQUIREMENTS:
|
|
95
|
-
- Use chromium browser (already configured)
|
|
96
|
-
- Headless mode: ${headless ? 'enabled' : 'disabled'}
|
|
97
|
-
- Target URL: ${url}
|
|
98
|
-
- Be thorough and wait for elements to load when necessary
|
|
99
|
-
- Report success or failure clearly
|
|
100
|
-
|
|
101
|
-
${context ? `\nTest Context:\n- Ticket: ${context.ticketId}\n- Title: ${context.ticketTitle}\n${context.ticketDescription ? `- Description: ${context.ticketDescription}\n` : ''}` : ''}`;
|
|
102
|
-
// Build messages
|
|
103
|
-
let messages = [
|
|
104
|
-
{
|
|
105
|
-
role: 'user',
|
|
106
|
-
content: testPrompt,
|
|
107
|
-
},
|
|
108
|
-
];
|
|
109
|
-
// Track tokens and cost
|
|
110
|
-
let totalInputTokens = 0;
|
|
111
|
-
let totalOutputTokens = 0;
|
|
112
|
-
let totalCacheCreation = 0;
|
|
113
|
-
let totalCacheRead = 0;
|
|
114
|
-
// Execute test loop (max 20 turns)
|
|
115
|
-
let turnCount = 0;
|
|
116
|
-
const maxTurns = 20;
|
|
117
|
-
let responseText = '';
|
|
118
|
-
let testSuccess = false;
|
|
119
|
-
while (turnCount < maxTurns) {
|
|
120
|
-
turnCount++;
|
|
121
|
-
// Yield test turn event
|
|
122
|
-
yield {
|
|
123
|
-
type: 'test_turn',
|
|
124
|
-
data: { turnNumber: turnCount, maxTurns },
|
|
125
|
-
};
|
|
126
|
-
// Truncate old tool results to prevent token overflow
|
|
127
|
-
// Keep only last 3 tool result exchanges (6 messages: 3 assistant + 3 user with results)
|
|
128
|
-
if (messages.length > 13) {
|
|
129
|
-
// Keep initial user message + last 6 messages (3 exchanges)
|
|
130
|
-
const initialMessage = messages[0];
|
|
131
|
-
const recentMessages = messages.slice(-6);
|
|
132
|
-
messages = [initialMessage, ...recentMessages];
|
|
133
|
-
if (verbose) {
|
|
134
|
-
console.log(`\nš Truncated message history (keeping last 3 exchanges to prevent token overflow)`);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
// Stream response
|
|
138
|
-
const stream = await anthropic.messages.stream({
|
|
139
|
-
model: DEFAULT_ANTHROPIC_MODEL,
|
|
140
|
-
max_tokens: 4096,
|
|
141
|
-
system: systemPrompt,
|
|
142
|
-
tools: mcpTools,
|
|
143
|
-
messages,
|
|
144
|
-
});
|
|
145
|
-
let currentText = '';
|
|
146
|
-
const toolUses = [];
|
|
147
|
-
// Process stream
|
|
148
|
-
for await (const event of stream) {
|
|
149
|
-
if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {
|
|
150
|
-
const delta = event.delta.text;
|
|
151
|
-
currentText += delta;
|
|
152
|
-
if (verbose) {
|
|
153
|
-
process.stdout.write(delta);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
responseText += currentText;
|
|
158
|
-
// Get final message
|
|
159
|
-
const finalMessage = await stream.finalMessage();
|
|
160
|
-
// Track tokens
|
|
161
|
-
const usage = finalMessage.usage;
|
|
162
|
-
totalInputTokens += usage.input_tokens;
|
|
163
|
-
totalOutputTokens += usage.output_tokens;
|
|
164
|
-
totalCacheCreation += usage.cache_creation_input_tokens || 0;
|
|
165
|
-
totalCacheRead += usage.cache_read_input_tokens || 0;
|
|
166
|
-
// Extract tool uses
|
|
167
|
-
for (const block of finalMessage.content) {
|
|
168
|
-
if (block.type === 'tool_use') {
|
|
169
|
-
toolUses.push({
|
|
170
|
-
id: block.id,
|
|
171
|
-
name: block.name,
|
|
172
|
-
input: block.input,
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
// Add assistant message to history
|
|
177
|
-
messages.push({ role: 'assistant', content: finalMessage.content });
|
|
178
|
-
// Yield assistant message event
|
|
179
|
-
yield {
|
|
180
|
-
type: 'assistant_message',
|
|
181
|
-
data: {
|
|
182
|
-
text: currentText,
|
|
183
|
-
toolUses: toolUses.map((t) => ({ name: t.name })),
|
|
184
|
-
},
|
|
185
|
-
};
|
|
186
|
-
// If no tools called, test is complete
|
|
187
|
-
if (toolUses.length === 0) {
|
|
188
|
-
testSuccess =
|
|
189
|
-
responseText.toLowerCase().includes('success') ||
|
|
190
|
-
responseText.toLowerCase().includes('passed');
|
|
191
|
-
break;
|
|
192
|
-
}
|
|
193
|
-
// Execute tools and collect results
|
|
194
|
-
const toolResults = [];
|
|
195
|
-
for (const toolUse of toolUses) {
|
|
196
|
-
let success = false;
|
|
197
|
-
try {
|
|
198
|
-
const result = await mcpClient.executeTool(toolUse.name, toolUse.input);
|
|
199
|
-
toolResults.push({
|
|
200
|
-
type: 'tool_result',
|
|
201
|
-
tool_use_id: toolUse.id,
|
|
202
|
-
content: JSON.stringify(result),
|
|
203
|
-
});
|
|
204
|
-
success = true;
|
|
205
|
-
}
|
|
206
|
-
catch (error) {
|
|
207
|
-
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
208
|
-
toolResults.push({
|
|
209
|
-
type: 'tool_result',
|
|
210
|
-
tool_use_id: toolUse.id,
|
|
211
|
-
content: `Error: ${errorMsg}`,
|
|
212
|
-
is_error: true,
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
// Yield tool executed event
|
|
216
|
-
yield {
|
|
217
|
-
type: 'tool_executed',
|
|
218
|
-
data: { toolName: toolUse.name, success },
|
|
219
|
-
};
|
|
220
|
-
}
|
|
221
|
-
// Add tool results to messages
|
|
222
|
-
messages.push({ role: 'user', content: toolResults });
|
|
223
|
-
}
|
|
224
|
-
// Stop tracing if enabled
|
|
225
|
-
if (trace) {
|
|
226
|
-
console.log('\nš¹ Stopping trace recording...');
|
|
227
|
-
try {
|
|
228
|
-
const traceResult = await mcpClient.executeTool('browser_stop_tracing', {});
|
|
229
|
-
console.log('ā
Trace recording stopped\n');
|
|
230
|
-
// Parse trace result to find output paths
|
|
231
|
-
let traceText = '';
|
|
232
|
-
if (Array.isArray(traceResult)) {
|
|
233
|
-
const textContent = traceResult.find((item) => item.type === 'text');
|
|
234
|
-
if (textContent?.text) {
|
|
235
|
-
traceText = textContent.text;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
else if (typeof traceResult === 'string') {
|
|
239
|
-
traceText = traceResult;
|
|
240
|
-
}
|
|
241
|
-
else if (traceResult && typeof traceResult === 'object' && 'text' in traceResult) {
|
|
242
|
-
traceText = traceResult.text;
|
|
243
|
-
}
|
|
244
|
-
if (traceText) {
|
|
245
|
-
// Extract paths from MCP response
|
|
246
|
-
const actionLogMatch = traceText.match(/Action log:\s*(.+\.trace)/);
|
|
247
|
-
const networkLogMatch = traceText.match(/Network log:\s*(.+\.network)/);
|
|
248
|
-
const resourcesMatch = traceText.match(/Resources.*:\s*(.+resources)/);
|
|
249
|
-
if (actionLogMatch) {
|
|
250
|
-
const tracePath = actionLogMatch[1];
|
|
251
|
-
const networkPath = networkLogMatch ? networkLogMatch[1] : null;
|
|
252
|
-
const resourcesPath = resourcesMatch ? resourcesMatch[1] : null;
|
|
253
|
-
console.log('š Trace files:');
|
|
254
|
-
console.log(` š¹ Action log: ${tracePath}`);
|
|
255
|
-
if (networkPath) {
|
|
256
|
-
console.log(` š Network log: ${networkPath}`);
|
|
257
|
-
}
|
|
258
|
-
if (resourcesPath) {
|
|
259
|
-
console.log(` š¦ Resources: ${resourcesPath}`);
|
|
260
|
-
}
|
|
261
|
-
console.log(`\nš¬ View trace (with video): npx playwright show-trace ${tracePath}`);
|
|
262
|
-
console.log(' ā¹ļø Video is embedded in the trace file and will play in the viewer');
|
|
263
|
-
}
|
|
264
|
-
else {
|
|
265
|
-
console.log('ā
Trace saved (paths not parsed)');
|
|
266
|
-
console.log(`Raw result: ${traceText}`);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
else {
|
|
270
|
-
console.log('ā ļø Trace saved but location not returned by MCP server');
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
catch (error) {
|
|
274
|
-
console.warn(`ā ļø Failed to stop tracing: ${error instanceof Error ? error.message : String(error)}`);
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
// Yield test completed event
|
|
278
|
-
yield {
|
|
279
|
-
type: 'test_completed',
|
|
280
|
-
data: { success: testSuccess },
|
|
281
|
-
};
|
|
282
|
-
// Get MCP tool usage
|
|
283
|
-
const toolUsage = mcpClient.getToolUsage();
|
|
284
|
-
// Calculate costs
|
|
285
|
-
const textGenerationCost = calculateTextGenerationCost({
|
|
286
|
-
input_tokens: totalInputTokens,
|
|
287
|
-
output_tokens: totalOutputTokens,
|
|
288
|
-
cache_creation_tokens: totalCacheCreation,
|
|
289
|
-
cache_read_tokens: totalCacheRead,
|
|
290
|
-
});
|
|
291
|
-
// MCP tool calls cost (estimated: $0.01 per tool call)
|
|
292
|
-
const toolCallCost = toolUsage.total * 0.01;
|
|
293
|
-
const totalCost = textGenerationCost + toolCallCost;
|
|
294
|
-
// Close MCP client
|
|
295
|
-
await mcpClient.close();
|
|
296
|
-
// Yield done event
|
|
297
|
-
yield {
|
|
298
|
-
type: 'done',
|
|
299
|
-
data: {
|
|
300
|
-
ticketId: testIdentifier,
|
|
301
|
-
success: testSuccess,
|
|
302
|
-
output: responseText,
|
|
303
|
-
logs: {
|
|
304
|
-
console: [],
|
|
305
|
-
errors: testSuccess ? [] : [responseText],
|
|
306
|
-
},
|
|
307
|
-
tokensUsed: {
|
|
308
|
-
input: totalInputTokens,
|
|
309
|
-
output: totalOutputTokens,
|
|
310
|
-
cacheCreation: totalCacheCreation,
|
|
311
|
-
cacheRead: totalCacheRead,
|
|
312
|
-
},
|
|
313
|
-
cost: totalCost,
|
|
314
|
-
mcpToolUsage: {
|
|
315
|
-
navigations: toolUsage.navigations,
|
|
316
|
-
clicks: toolUsage.clicks,
|
|
317
|
-
types: toolUsage.types,
|
|
318
|
-
extracts: toolUsage.extracts,
|
|
319
|
-
other: toolUsage.other,
|
|
320
|
-
},
|
|
321
|
-
mcpToolCost: toolCallCost,
|
|
322
|
-
error: testSuccess ? undefined : 'Test did not complete successfully',
|
|
323
|
-
},
|
|
324
|
-
};
|
|
325
|
-
}
|
|
326
|
-
catch (error) {
|
|
327
|
-
await mcpClient.close();
|
|
328
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
329
|
-
// Yield done event with error
|
|
330
|
-
yield {
|
|
331
|
-
type: 'done',
|
|
332
|
-
data: {
|
|
333
|
-
ticketId: testIdentifier,
|
|
334
|
-
success: false,
|
|
335
|
-
output: `Test failed: ${errorMessage}`,
|
|
336
|
-
logs: {
|
|
337
|
-
console: [],
|
|
338
|
-
errors: [errorMessage],
|
|
339
|
-
},
|
|
340
|
-
tokensUsed: {
|
|
341
|
-
input: 0,
|
|
342
|
-
output: 0,
|
|
343
|
-
cacheCreation: 0,
|
|
344
|
-
cacheRead: 0,
|
|
345
|
-
},
|
|
346
|
-
cost: 0,
|
|
347
|
-
error: errorMessage,
|
|
348
|
-
},
|
|
349
|
-
};
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
/**
|
|
353
|
-
* Streaming version of testCore - yields events for SSE integration
|
|
354
|
-
*/
|
|
355
|
-
export async function* testCoreStream(options) {
|
|
356
|
-
const { prompt: testPrompt, context, url = DEFAULT_TEST_URL, headless = false, verbose = false, trace = false, } = options;
|
|
357
|
-
// Validate: prompt is required
|
|
358
|
-
if (!testPrompt || testPrompt.trim().length === 0) {
|
|
359
|
-
yield {
|
|
360
|
-
type: 'done',
|
|
361
|
-
data: {
|
|
362
|
-
ticketId: 'error',
|
|
363
|
-
success: false,
|
|
364
|
-
output: 'Test prompt is required',
|
|
365
|
-
logs: { console: [], errors: ['Test prompt is required'] },
|
|
366
|
-
tokensUsed: { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 },
|
|
367
|
-
cost: 0,
|
|
368
|
-
error: 'Test prompt is required',
|
|
369
|
-
},
|
|
370
|
-
};
|
|
371
|
-
return;
|
|
372
|
-
}
|
|
373
|
-
// Validate ANTHROPIC_API_KEY (required for Playwright MCP)
|
|
374
|
-
if (!process.env.ANTHROPIC_API_KEY) {
|
|
375
|
-
yield {
|
|
376
|
-
type: 'done',
|
|
377
|
-
data: {
|
|
378
|
-
ticketId: 'error',
|
|
379
|
-
success: false,
|
|
380
|
-
output: 'ANTHROPIC_API_KEY is required',
|
|
381
|
-
logs: { console: [], errors: ['ANTHROPIC_API_KEY is required'] },
|
|
382
|
-
tokensUsed: { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 },
|
|
383
|
-
cost: 0,
|
|
384
|
-
error: 'ANTHROPIC_API_KEY is required',
|
|
385
|
-
},
|
|
386
|
-
};
|
|
387
|
-
return;
|
|
388
|
-
}
|
|
389
|
-
const testIdentifier = context?.ticketId || `test-${Date.now()}`;
|
|
390
|
-
// Execute with Playwright MCP (streaming)
|
|
391
|
-
yield* executeWithPlaywrightMCPStream({
|
|
392
|
-
testPrompt,
|
|
393
|
-
context,
|
|
394
|
-
testIdentifier,
|
|
395
|
-
url,
|
|
396
|
-
headless,
|
|
397
|
-
verbose,
|
|
398
|
-
trace,
|
|
399
|
-
});
|
|
400
|
-
}
|
|
401
|
-
/**
|
|
402
|
-
* Core test logic (atomic - single execution, no retries, no fixes)
|
|
403
|
-
* Consumes testCoreStream and adds console logging
|
|
404
|
-
*/
|
|
405
|
-
export async function testCore(options) {
|
|
406
|
-
const { prompt: testPrompt, context } = options;
|
|
407
|
-
// Log context if provided
|
|
408
|
-
if (context) {
|
|
409
|
-
console.log(`š« Testing: ${context.ticketId} - ${context.ticketTitle}`);
|
|
410
|
-
}
|
|
411
|
-
else {
|
|
412
|
-
console.log(`š Test: ${testPrompt.substring(0, 60)}${testPrompt.length > 60 ? '...' : ''}`);
|
|
413
|
-
}
|
|
414
|
-
console.log(`\n${'='.repeat(60)}`);
|
|
415
|
-
console.log(`š§Ŗ Running Browser Test`);
|
|
416
|
-
console.log(`${'='.repeat(60)}\n`);
|
|
417
|
-
let result = null;
|
|
418
|
-
// Consume stream and add console logging
|
|
419
|
-
for await (const event of testCoreStream(options)) {
|
|
420
|
-
if (event.type === 'test_started') {
|
|
421
|
-
console.log(`š URL: ${event.data.url}`);
|
|
422
|
-
console.log(`šļø Headless: ${event.data.headless ? 'enabled' : 'disabled'}`);
|
|
423
|
-
console.log(`š Browser: chromium (forced)\n`);
|
|
424
|
-
}
|
|
425
|
-
else if (event.type === 'mcp_connected') {
|
|
426
|
-
console.log(`ā
Connected to Playwright MCP (${event.data.toolsAvailable} tools available)\n`);
|
|
427
|
-
console.log('š¤ Starting test execution with Claude + Playwright MCP...\n');
|
|
428
|
-
}
|
|
429
|
-
else if (event.type === 'test_turn') {
|
|
430
|
-
if (options.verbose) {
|
|
431
|
-
console.log(`\nš Turn ${event.data.turnNumber}/${event.data.maxTurns}`);
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
else if (event.type === 'assistant_message') {
|
|
435
|
-
if (options.verbose && event.data.text) {
|
|
436
|
-
console.log(event.data.text);
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
else if (event.type === 'tool_executed') {
|
|
440
|
-
if (options.verbose) {
|
|
441
|
-
console.log(`š§ Executed: ${event.data.toolName} - ${event.data.success ? 'ā
' : 'ā'}`);
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
else if (event.type === 'test_completed') {
|
|
445
|
-
console.log(`\nā
Test ${event.data.success ? 'passed' : 'failed'}\n`);
|
|
446
|
-
}
|
|
447
|
-
else if (event.type === 'done') {
|
|
448
|
-
result = event.data;
|
|
449
|
-
console.log('š Closing MCP connection...');
|
|
450
|
-
console.log('ā
MCP connection closed\n');
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
if (!result) {
|
|
454
|
-
throw new Error('Test stream ended without result');
|
|
455
|
-
}
|
|
456
|
-
return result;
|
|
457
|
-
}
|
|
458
|
-
/**
|
|
459
|
-
* Main test command
|
|
460
|
-
*/
|
|
461
|
-
export async function testCommand(options) {
|
|
462
|
-
const { prompt, context, noLogs = false } = options;
|
|
463
|
-
const testDescription = context
|
|
464
|
-
? `${context.ticketId} - ${context.ticketTitle}`
|
|
465
|
-
: `"${prompt.substring(0, 60)}${prompt.length > 60 ? '...' : ''}"`;
|
|
466
|
-
console.log(`š§Ŗ Testing ${testDescription}\n`);
|
|
467
|
-
// Initialize logging context
|
|
468
|
-
const logContext = logger.createContext('test', { noLogs });
|
|
469
|
-
const cleanupHandler = setupCancellationHandler(logContext);
|
|
470
|
-
try {
|
|
471
|
-
// Run atomic test
|
|
472
|
-
const result = await testCore(options);
|
|
473
|
-
// Track metrics
|
|
474
|
-
logger.trackTokens(logContext, result.tokensUsed);
|
|
475
|
-
// Display summary
|
|
476
|
-
displayTestSummary(result);
|
|
477
|
-
// Log execution (success or error based on test result)
|
|
478
|
-
await logger.complete(logContext, result.success ? 'success' : 'error', result.error ? new Error(result.error) : undefined);
|
|
479
|
-
cleanupHandler();
|
|
480
|
-
}
|
|
481
|
-
catch (error) {
|
|
482
|
-
console.error('\nā Test command failed:', error);
|
|
483
|
-
// Log failed execution
|
|
484
|
-
await logger.complete(logContext, 'error', error);
|
|
485
|
-
cleanupHandler();
|
|
486
|
-
throw error;
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
/**
|
|
490
|
-
* Display test summary
|
|
491
|
-
*/
|
|
492
|
-
function displayTestSummary(result) {
|
|
493
|
-
console.log(`\n${'='.repeat(60)}`);
|
|
494
|
-
console.log('š Test Summary');
|
|
495
|
-
console.log('='.repeat(60));
|
|
496
|
-
if (result.success) {
|
|
497
|
-
console.log('ā
Status: Test passed');
|
|
498
|
-
}
|
|
499
|
-
else {
|
|
500
|
-
console.log('ā Status: Test failed');
|
|
501
|
-
}
|
|
502
|
-
console.log(`š Output: ${result.output}`);
|
|
503
|
-
console.log(`š§ Console logs: ${result.logs.console.length}`);
|
|
504
|
-
console.log(`ā Errors: ${result.logs.errors.length}`);
|
|
505
|
-
// Display MCP tool usage
|
|
506
|
-
if (result.mcpToolUsage) {
|
|
507
|
-
console.log(`\nš Playwright Tool Usage:`);
|
|
508
|
-
console.log(` š Navigations: ${result.mcpToolUsage.navigations}`);
|
|
509
|
-
console.log(` š±ļø Clicks: ${result.mcpToolUsage.clicks}`);
|
|
510
|
-
console.log(` āØļø Types: ${result.mcpToolUsage.types}`);
|
|
511
|
-
console.log(` š¤ Extracts: ${result.mcpToolUsage.extracts}`);
|
|
512
|
-
console.log(` š§ Other: ${result.mcpToolUsage.other}`);
|
|
513
|
-
const totalTools = result.mcpToolUsage.navigations +
|
|
514
|
-
result.mcpToolUsage.clicks +
|
|
515
|
-
result.mcpToolUsage.types +
|
|
516
|
-
result.mcpToolUsage.extracts +
|
|
517
|
-
result.mcpToolUsage.other;
|
|
518
|
-
console.log(` š Total: ${totalTools}`);
|
|
519
|
-
}
|
|
520
|
-
// Display cost breakdown
|
|
521
|
-
if (result.mcpToolCost !== undefined) {
|
|
522
|
-
console.log(`\nš° Cost Breakdown:`);
|
|
523
|
-
console.log(` š¬ Text generation: $${(result.cost - result.mcpToolCost).toFixed(4)}`);
|
|
524
|
-
console.log(` š Playwright tool calls: $${result.mcpToolCost.toFixed(4)}`);
|
|
525
|
-
console.log(` š Total: $${result.cost.toFixed(4)}`);
|
|
526
|
-
}
|
|
527
|
-
else {
|
|
528
|
-
console.log(`š° Cost: $${result.cost.toFixed(4)}`);
|
|
529
|
-
}
|
|
530
|
-
console.log('='.repeat(60));
|
|
531
|
-
if (result.success) {
|
|
532
|
-
console.log('\nā
Test completed successfully!');
|
|
533
|
-
}
|
|
534
|
-
else {
|
|
535
|
-
console.log(`\nā Test failed: ${result.error || 'See output above for details'}`);
|
|
536
|
-
console.log('\nā¹ļø This is an atomic test command - it does not apply fixes.');
|
|
537
|
-
console.log('ā¹ļø To test with automatic fixing, use: kosuke build');
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
//# sourceMappingURL=test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../../kosuke/commands/test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tickets command - Generate tickets from requirements document
|
|
3
|
-
*
|
|
4
|
-
* Generates tickets directly from a requirements document.
|
|
5
|
-
* No clarification questions - assumes requirements are complete.
|
|
6
|
-
* Best for: New projects with detailed requirements from `kosuke requirements`.
|
|
7
|
-
*
|
|
8
|
-
* For interactive ticket creation with questions, use: kosuke plan --prompt="..."
|
|
9
|
-
*
|
|
10
|
-
* SCAFFOLD MODE (--scaffold flag):
|
|
11
|
-
* SCAFFOLD BATCH (template adaptation):
|
|
12
|
-
* 1. SCAFFOLD-SCHEMA-1 (ONE ticket for ALL database infrastructure changes)
|
|
13
|
-
* 2. SCAFFOLD-BACKEND-X ā SCAFFOLD-FRONTEND-X ā SCAFFOLD-WEB-TEST-X (feature-by-feature)
|
|
14
|
-
*
|
|
15
|
-
* LOGIC BATCH (business functionality):
|
|
16
|
-
* 1. LOGIC-SCHEMA-1 (ONE ticket for ALL business entities)
|
|
17
|
-
* 2. LOGIC-BACKEND-X ā LOGIC-FRONTEND-X ā LOGIC-WEB-TEST-X (feature-by-feature)
|
|
18
|
-
*
|
|
19
|
-
* LOGIC-ONLY MODE (default):
|
|
20
|
-
* Only generates LOGIC tickets for new features
|
|
21
|
-
* 1. LOGIC-SCHEMA-1 (ONE ticket for ALL business entities)
|
|
22
|
-
* 2. LOGIC-BACKEND-X ā LOGIC-FRONTEND-X ā LOGIC-WEB-TEST-X (feature-by-feature)
|
|
23
|
-
*
|
|
24
|
-
* Workflow:
|
|
25
|
-
* 1. Claude Code Agent explores codebase and generates tickets
|
|
26
|
-
* 2. Review step validates and fixes ticket structure
|
|
27
|
-
* 3. Outputs validated tickets.json
|
|
28
|
-
*
|
|
29
|
-
* Usage:
|
|
30
|
-
* kosuke tickets # Use docs.md
|
|
31
|
-
* kosuke tickets --scaffold # Scaffold + logic from docs.md
|
|
32
|
-
* kosuke tickets --path=custom.md # Custom requirements file
|
|
33
|
-
*/
|
|
34
|
-
import type { TicketsOptions, TicketsResult } from '../types.js';
|
|
35
|
-
/**
|
|
36
|
-
* Core tickets logic - Simplified to single agent call
|
|
37
|
-
*/
|
|
38
|
-
export declare function ticketsCore(options: TicketsOptions): Promise<TicketsResult>;
|
|
39
|
-
/**
|
|
40
|
-
* Main tickets command
|
|
41
|
-
*/
|
|
42
|
-
export declare function ticketsCommand(options: TicketsOptions): Promise<void>;
|
|
43
|
-
//# sourceMappingURL=tickets.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tickets.d.ts","sourceRoot":"","sources":["../../../kosuke/commands/tickets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAiTjE;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAsHjF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA8G3E"}
|