@kosuke-ai/cli 0.0.36 ā 0.0.38
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/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +33 -84
- package/dist/index.js.map +1 -1
- package/dist/kosuke/commands/build.d.ts +7 -3
- package/dist/kosuke/commands/build.d.ts.map +1 -1
- package/dist/kosuke/commands/build.js +53 -16
- package/dist/kosuke/commands/build.js.map +1 -1
- package/dist/kosuke/commands/ship.d.ts +22 -15
- package/dist/kosuke/commands/ship.d.ts.map +1 -1
- package/dist/kosuke/commands/ship.js +49 -151
- package/dist/kosuke/commands/ship.js.map +1 -1
- package/dist/kosuke/commands/test.d.ts +2 -1
- package/dist/kosuke/commands/test.d.ts.map +1 -1
- package/dist/kosuke/commands/test.js +75 -23
- package/dist/kosuke/commands/test.js.map +1 -1
- package/dist/kosuke/commands/tickets.d.ts.map +1 -1
- package/dist/kosuke/commands/tickets.js +278 -109
- package/dist/kosuke/commands/tickets.js.map +1 -1
- package/dist/kosuke/types.d.ts +30 -9
- package/dist/kosuke/types.d.ts.map +1 -1
- package/dist/kosuke/utils/prompt-generator.d.ts +0 -4
- package/dist/kosuke/utils/prompt-generator.d.ts.map +1 -1
- package/dist/kosuke/utils/prompt-generator.js +0 -14
- package/dist/kosuke/utils/prompt-generator.js.map +1 -1
- package/dist/kosuke/utils/test-runner.d.ts +15 -0
- package/dist/kosuke/utils/test-runner.d.ts.map +1 -0
- package/dist/kosuke/utils/test-runner.js +94 -0
- package/dist/kosuke/utils/test-runner.js.map +1 -0
- package/dist/lib.d.ts +29 -2
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +28 -1
- package/dist/lib.js.map +1 -1
- package/dist/package.json +2 -2
- package/package.json +2 -2
- package/dist/kosuke/utils/browser-agent.d.ts +0 -33
- package/dist/kosuke/utils/browser-agent.d.ts.map +0 -1
- package/dist/kosuke/utils/browser-agent.js +0 -102
- package/dist/kosuke/utils/browser-agent.js.map +0 -1
package/dist/kosuke/types.d.ts
CHANGED
|
@@ -77,8 +77,10 @@ export interface Ticket {
|
|
|
77
77
|
id: string;
|
|
78
78
|
title: string;
|
|
79
79
|
description: string;
|
|
80
|
+
type: 'scaffold' | 'logic';
|
|
80
81
|
estimatedEffort: number;
|
|
81
82
|
status: 'Todo' | 'InProgress' | 'Done' | 'Error';
|
|
83
|
+
category?: string;
|
|
82
84
|
error?: string;
|
|
83
85
|
}
|
|
84
86
|
export interface TicketsResult {
|
|
@@ -106,13 +108,8 @@ export interface TicketsResult {
|
|
|
106
108
|
}>;
|
|
107
109
|
}
|
|
108
110
|
export interface ShipOptions {
|
|
109
|
-
|
|
111
|
+
ticketData: Ticket;
|
|
110
112
|
review?: boolean;
|
|
111
|
-
ticketsFile?: string;
|
|
112
|
-
test?: boolean;
|
|
113
|
-
url?: string;
|
|
114
|
-
headed?: boolean;
|
|
115
|
-
debug?: boolean;
|
|
116
113
|
directory?: string;
|
|
117
114
|
dbUrl?: string;
|
|
118
115
|
noLogs?: boolean;
|
|
@@ -124,6 +121,11 @@ export interface BuildOptions {
|
|
|
124
121
|
reset?: boolean;
|
|
125
122
|
askConfirm?: boolean;
|
|
126
123
|
askCommit?: boolean;
|
|
124
|
+
review?: boolean;
|
|
125
|
+
test?: boolean;
|
|
126
|
+
url?: string;
|
|
127
|
+
headless?: boolean;
|
|
128
|
+
verbose?: boolean;
|
|
127
129
|
noLogs?: boolean;
|
|
128
130
|
}
|
|
129
131
|
export interface ReviewContext {
|
|
@@ -137,7 +139,6 @@ export interface ReviewOptions {
|
|
|
137
139
|
noLogs?: boolean;
|
|
138
140
|
}
|
|
139
141
|
export interface ShipResult {
|
|
140
|
-
ticketId: string;
|
|
141
142
|
success: boolean;
|
|
142
143
|
implementationFixCount: number;
|
|
143
144
|
lintFixCount: number;
|
|
@@ -167,8 +168,8 @@ export interface TestOptions {
|
|
|
167
168
|
ticket?: string;
|
|
168
169
|
prompt?: string;
|
|
169
170
|
url?: string;
|
|
170
|
-
|
|
171
|
-
|
|
171
|
+
headless?: boolean;
|
|
172
|
+
verbose?: boolean;
|
|
172
173
|
ticketsFile?: string;
|
|
173
174
|
directory?: string;
|
|
174
175
|
noLogs?: boolean;
|
|
@@ -190,6 +191,26 @@ export interface TestResult {
|
|
|
190
191
|
cost: number;
|
|
191
192
|
error?: string;
|
|
192
193
|
}
|
|
194
|
+
export interface TestRunnerOptions {
|
|
195
|
+
ticket: Ticket;
|
|
196
|
+
cwd: string;
|
|
197
|
+
url?: string;
|
|
198
|
+
headless?: boolean;
|
|
199
|
+
verbose?: boolean;
|
|
200
|
+
maxRetries?: number;
|
|
201
|
+
}
|
|
202
|
+
export interface TestRunnerResult {
|
|
203
|
+
success: boolean;
|
|
204
|
+
attempts: number;
|
|
205
|
+
fixesApplied: number;
|
|
206
|
+
tokensUsed: {
|
|
207
|
+
input: number;
|
|
208
|
+
output: number;
|
|
209
|
+
cacheCreation: number;
|
|
210
|
+
cacheRead: number;
|
|
211
|
+
};
|
|
212
|
+
cost: number;
|
|
213
|
+
}
|
|
193
214
|
export type { CommandName, ExecutionStatus, CliLogData, CommandExecutionContext, } from './utils/logger.js';
|
|
194
215
|
export type { AnalysisResult, TestFailure } from './utils/error-analyzer.js';
|
|
195
216
|
export type { ConsoleLog, NetworkLog, DockerLog, CollectedLogs } from './utils/log-collector.js';
|
|
@@ -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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"}
|
|
@@ -6,8 +6,4 @@ import type { Ticket } from '../types.js';
|
|
|
6
6
|
* Generate a structured test prompt from a ticket
|
|
7
7
|
*/
|
|
8
8
|
export declare function generateTestPrompt(ticket: Ticket): string;
|
|
9
|
-
/**
|
|
10
|
-
* Generate a test prompt from a custom string
|
|
11
|
-
*/
|
|
12
|
-
export declare function generateCustomTestPrompt(customPrompt: string, url: string): string;
|
|
13
9
|
//# sourceMappingURL=prompt-generator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-generator.d.ts","sourceRoot":"","sources":["../../../kosuke/utils/prompt-generator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAsBzD
|
|
1
|
+
{"version":3,"file":"prompt-generator.d.ts","sourceRoot":"","sources":["../../../kosuke/utils/prompt-generator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAsBzD"}
|
|
@@ -27,18 +27,4 @@ ${ticket.description}
|
|
|
27
27
|
|
|
28
28
|
Return a clear success or failure status with details about what was tested and any issues found.`;
|
|
29
29
|
}
|
|
30
|
-
/**
|
|
31
|
-
* Generate a test prompt from a custom string
|
|
32
|
-
*/
|
|
33
|
-
export function generateCustomTestPrompt(customPrompt, url) {
|
|
34
|
-
return `${customPrompt}
|
|
35
|
-
|
|
36
|
-
**Testing Instructions:**
|
|
37
|
-
1. Navigate to ${url}
|
|
38
|
-
2. Execute the test scenario described above
|
|
39
|
-
3. Check for console errors or warnings
|
|
40
|
-
4. Verify expected behavior
|
|
41
|
-
|
|
42
|
-
Return success if the test passes, or failure with details about what went wrong.`;
|
|
43
|
-
}
|
|
44
30
|
//# sourceMappingURL=prompt-generator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-generator.js","sourceRoot":"","sources":["../../../kosuke/utils/prompt-generator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,OAAO;;eAEM,MAAM,CAAC,KAAK;;;EAGzB,MAAM,CAAC,WAAW;;;;;;;;;;;;;;;kGAe8E,CAAC;AACnG,CAAC
|
|
1
|
+
{"version":3,"file":"prompt-generator.js","sourceRoot":"","sources":["../../../kosuke/utils/prompt-generator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,OAAO;;eAEM,MAAM,CAAC,KAAK;;;EAGzB,MAAM,CAAC,WAAW;;;;;;;;;;;;;;;kGAe8E,CAAC;AACnG,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test runner utility for build command
|
|
3
|
+
*
|
|
4
|
+
* Handles iterative testing with retry logic and error analysis.
|
|
5
|
+
* Separated from ship command to allow build command to control testing phase.
|
|
6
|
+
*/
|
|
7
|
+
import type { TestRunnerOptions, TestRunnerResult } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Run tests with automatic retry and error fixing
|
|
10
|
+
*
|
|
11
|
+
* @param options - Test runner configuration
|
|
12
|
+
* @returns Result with success status, attempts, fixes applied, and costs
|
|
13
|
+
*/
|
|
14
|
+
export declare function runTestsWithRetry(options: TestRunnerOptions): Promise<TestRunnerResult>;
|
|
15
|
+
//# sourceMappingURL=test-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../../../kosuke/utils/test-runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKvE;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAgG7F"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test runner utility for build command
|
|
3
|
+
*
|
|
4
|
+
* Handles iterative testing with retry logic and error analysis.
|
|
5
|
+
* Separated from ship command to allow build command to control testing phase.
|
|
6
|
+
*/
|
|
7
|
+
import { testCore } from '../commands/test.js';
|
|
8
|
+
import { LogCollector } from './log-collector.js';
|
|
9
|
+
import { analyzeAndFix } from './error-analyzer.js';
|
|
10
|
+
/**
|
|
11
|
+
* Run tests with automatic retry and error fixing
|
|
12
|
+
*
|
|
13
|
+
* @param options - Test runner configuration
|
|
14
|
+
* @returns Result with success status, attempts, fixes applied, and costs
|
|
15
|
+
*/
|
|
16
|
+
export async function runTestsWithRetry(options) {
|
|
17
|
+
const { ticket, cwd, url, headless, verbose, maxRetries = 3 } = options;
|
|
18
|
+
let totalInputTokens = 0;
|
|
19
|
+
let totalOutputTokens = 0;
|
|
20
|
+
let totalCacheCreationTokens = 0;
|
|
21
|
+
let totalCacheReadTokens = 0;
|
|
22
|
+
let totalCost = 0;
|
|
23
|
+
let totalFixesApplied = 0;
|
|
24
|
+
let testsPassing = false;
|
|
25
|
+
let attempts = 0;
|
|
26
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
27
|
+
attempts = attempt;
|
|
28
|
+
console.log(`\nš§Ŗ Test Attempt ${attempt}/${maxRetries}\n`);
|
|
29
|
+
try {
|
|
30
|
+
// Run atomic test
|
|
31
|
+
const testResult = await testCore({
|
|
32
|
+
ticket: ticket.id,
|
|
33
|
+
url,
|
|
34
|
+
headless,
|
|
35
|
+
verbose,
|
|
36
|
+
directory: cwd,
|
|
37
|
+
});
|
|
38
|
+
totalInputTokens += testResult.tokensUsed.input;
|
|
39
|
+
totalOutputTokens += testResult.tokensUsed.output;
|
|
40
|
+
totalCacheCreationTokens += testResult.tokensUsed.cacheCreation;
|
|
41
|
+
totalCacheReadTokens += testResult.tokensUsed.cacheRead;
|
|
42
|
+
totalCost += testResult.cost;
|
|
43
|
+
if (testResult.success) {
|
|
44
|
+
testsPassing = true;
|
|
45
|
+
console.log('\nā
Tests passed!');
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
// If not last attempt, analyze and fix
|
|
49
|
+
if (attempt < maxRetries) {
|
|
50
|
+
console.log('\nš Analyzing test failures...');
|
|
51
|
+
// Collect Docker logs for backend debugging
|
|
52
|
+
const logCollector = new LogCollector();
|
|
53
|
+
await logCollector.collectDockerLogs('30s');
|
|
54
|
+
const dockerLogs = logCollector.getErrors();
|
|
55
|
+
// Analyze errors and apply fixes
|
|
56
|
+
const fixResult = await analyzeAndFix(ticket, testResult.output, testResult.logs, dockerLogs, cwd);
|
|
57
|
+
totalFixesApplied += fixResult.fixesApplied;
|
|
58
|
+
totalInputTokens += fixResult.tokensUsed.input;
|
|
59
|
+
totalOutputTokens += fixResult.tokensUsed.output;
|
|
60
|
+
totalCacheCreationTokens += fixResult.tokensUsed.cacheCreation;
|
|
61
|
+
totalCacheReadTokens += fixResult.tokensUsed.cacheRead;
|
|
62
|
+
totalCost += fixResult.cost;
|
|
63
|
+
console.log(`\nš§ Applied ${fixResult.fixesApplied} fixes`);
|
|
64
|
+
console.log(`š° Fix cost: $${fixResult.cost.toFixed(4)}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
69
|
+
console.error(`\nā Test attempt ${attempt} failed: ${errorMessage}`);
|
|
70
|
+
// If last attempt, throw
|
|
71
|
+
if (attempt === maxRetries) {
|
|
72
|
+
throw new Error(`Tests failed after ${maxRetries} attempts: ${errorMessage}`);
|
|
73
|
+
}
|
|
74
|
+
// Otherwise, continue to next attempt
|
|
75
|
+
console.log(`\nā ļø Retrying... (${maxRetries - attempt} attempts remaining)`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (!testsPassing) {
|
|
79
|
+
throw new Error(`Tests failed after ${maxRetries} attempts`);
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
success: testsPassing,
|
|
83
|
+
attempts,
|
|
84
|
+
fixesApplied: totalFixesApplied,
|
|
85
|
+
tokensUsed: {
|
|
86
|
+
input: totalInputTokens,
|
|
87
|
+
output: totalOutputTokens,
|
|
88
|
+
cacheCreation: totalCacheCreationTokens,
|
|
89
|
+
cacheRead: totalCacheReadTokens,
|
|
90
|
+
},
|
|
91
|
+
cost: totalCost,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=test-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-runner.js","sourceRoot":"","sources":["../../../kosuke/utils/test-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/lib.d.ts
CHANGED
|
@@ -9,10 +9,13 @@
|
|
|
9
9
|
* import {
|
|
10
10
|
* analyseCommand,
|
|
11
11
|
* getCodeCore,
|
|
12
|
+
* shipCore,
|
|
13
|
+
* runTestsWithRetry,
|
|
12
14
|
* discoverFiles,
|
|
13
15
|
* runLint,
|
|
14
16
|
* logger,
|
|
15
17
|
* withCommandTracking,
|
|
18
|
+
* type Ticket,
|
|
16
19
|
* type ValidationResult,
|
|
17
20
|
* type CommandExecutionContext
|
|
18
21
|
* } from '@kosuke-ai/cli';
|
|
@@ -26,6 +29,29 @@
|
|
|
26
29
|
* query: 'How does authentication work?'
|
|
27
30
|
* });
|
|
28
31
|
*
|
|
32
|
+
* // Ship a ticket (ticket-agnostic)
|
|
33
|
+
* const ticket: Ticket = {
|
|
34
|
+
* id: 'FRONTEND-1',
|
|
35
|
+
* title: 'Implement login page',
|
|
36
|
+
* description: 'Create a login page with email/password...',
|
|
37
|
+
* estimatedEffort: 5,
|
|
38
|
+
* status: 'InProgress'
|
|
39
|
+
* };
|
|
40
|
+
* const shipResult = await shipCore({
|
|
41
|
+
* ticketData: ticket,
|
|
42
|
+
* review: true,
|
|
43
|
+
* directory: './my-project'
|
|
44
|
+
* });
|
|
45
|
+
*
|
|
46
|
+
* // Run tests with retry logic
|
|
47
|
+
* if (ticket.id.startsWith('FRONTEND-')) {
|
|
48
|
+
* const testResult = await runTestsWithRetry({
|
|
49
|
+
* ticket,
|
|
50
|
+
* cwd: './my-project',
|
|
51
|
+
* maxRetries: 3
|
|
52
|
+
* });
|
|
53
|
+
* }
|
|
54
|
+
*
|
|
29
55
|
* // Use validation utilities
|
|
30
56
|
* const lintResult: ValidationResult = await runLint();
|
|
31
57
|
*
|
|
@@ -46,17 +72,18 @@ export { syncRulesCommand } from './kosuke/commands/sync-rules.js';
|
|
|
46
72
|
export { requirementsCommand, requirementsCore } from './kosuke/commands/requirements.js';
|
|
47
73
|
export { getCodeCore } from './kosuke/commands/getcode.js';
|
|
48
74
|
export { ticketsCore } from './kosuke/commands/tickets.js';
|
|
49
|
-
export {
|
|
75
|
+
export { shipCore } from './kosuke/commands/ship.js';
|
|
50
76
|
export { buildCommand } from './kosuke/commands/build.js';
|
|
51
77
|
export { reviewCommand, reviewCore } from './kosuke/commands/review.js';
|
|
52
78
|
export { testCommand, testCore } from './kosuke/commands/test.js';
|
|
79
|
+
export { runTestsWithRetry } from './kosuke/utils/test-runner.js';
|
|
53
80
|
export { discoverFiles } from './kosuke/utils/file-discovery.js';
|
|
54
81
|
export { createBatches } from './kosuke/utils/batch-creator.js';
|
|
55
82
|
export { runLint, runTypecheck, runFormat, runTests, runComprehensiveLinting, detectPackageManager, readPackageJsonScripts, } from './kosuke/utils/validator.js';
|
|
56
83
|
export { getRepoLocalPath } from './kosuke/utils/repository-manager.js';
|
|
57
84
|
export { validateRepoAccess } from './kosuke/utils/repository-resolver.js';
|
|
58
85
|
export { logger, withCommandTracking, setupCancellationHandler } from './kosuke/utils/logger.js';
|
|
59
|
-
export type { Batch, Fix, AnalyseOptions, LintOptions, SyncRulesOptions, RulesAdaptation, GitInfo, GetCodeOptions, CodeExplorationResult, TicketsOptions, TicketsResult, Ticket, ShipOptions, ShipResult, BuildOptions, ReviewOptions, ReviewResult, TestOptions, TestResult, AnalysisResult, TestFailure, ConsoleLog, NetworkLog, DockerLog, CollectedLogs, CommandName, ExecutionStatus, CliLogData, CommandExecutionContext, } from './kosuke/types.js';
|
|
86
|
+
export type { Batch, Fix, AnalyseOptions, LintOptions, SyncRulesOptions, RulesAdaptation, GitInfo, GetCodeOptions, CodeExplorationResult, TicketsOptions, TicketsResult, Ticket, ShipOptions, ShipResult, BuildOptions, ReviewOptions, ReviewResult, TestOptions, TestResult, TestRunnerOptions, TestRunnerResult, AnalysisResult, TestFailure, ConsoleLog, NetworkLog, DockerLog, CollectedLogs, CommandName, ExecutionStatus, CliLogData, CommandExecutionContext, } from './kosuke/types.js';
|
|
60
87
|
export type { ValidationResult } from './kosuke/utils/validator.js';
|
|
61
88
|
export type { AgentVerbosity, AgentConfig, AgentResult } from './kosuke/utils/claude-agent.js';
|
|
62
89
|
export type { RequirementsOptions, RequirementsResult } from './kosuke/commands/requirements.js';
|
package/dist/lib.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../lib.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../lib.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AAKH,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGlE,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EACL,OAAO,EACP,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,uBAAuB,EACvB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAGjG,YAAY,EACV,KAAK,EACL,GAAG,EACH,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,OAAO,EACP,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,aAAa,EACb,MAAM,EACN,WAAW,EACX,UAAU,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAEhB,cAAc,EACd,WAAW,EACX,UAAU,EACV,UAAU,EACV,SAAS,EACT,aAAa,EAEb,WAAW,EACX,eAAe,EACf,UAAU,EACV,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC/F,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAGjG,eAAO,MAAM,OAAO,QAAsB,CAAC"}
|
package/dist/lib.js
CHANGED
|
@@ -9,10 +9,13 @@
|
|
|
9
9
|
* import {
|
|
10
10
|
* analyseCommand,
|
|
11
11
|
* getCodeCore,
|
|
12
|
+
* shipCore,
|
|
13
|
+
* runTestsWithRetry,
|
|
12
14
|
* discoverFiles,
|
|
13
15
|
* runLint,
|
|
14
16
|
* logger,
|
|
15
17
|
* withCommandTracking,
|
|
18
|
+
* type Ticket,
|
|
16
19
|
* type ValidationResult,
|
|
17
20
|
* type CommandExecutionContext
|
|
18
21
|
* } from '@kosuke-ai/cli';
|
|
@@ -26,6 +29,29 @@
|
|
|
26
29
|
* query: 'How does authentication work?'
|
|
27
30
|
* });
|
|
28
31
|
*
|
|
32
|
+
* // Ship a ticket (ticket-agnostic)
|
|
33
|
+
* const ticket: Ticket = {
|
|
34
|
+
* id: 'FRONTEND-1',
|
|
35
|
+
* title: 'Implement login page',
|
|
36
|
+
* description: 'Create a login page with email/password...',
|
|
37
|
+
* estimatedEffort: 5,
|
|
38
|
+
* status: 'InProgress'
|
|
39
|
+
* };
|
|
40
|
+
* const shipResult = await shipCore({
|
|
41
|
+
* ticketData: ticket,
|
|
42
|
+
* review: true,
|
|
43
|
+
* directory: './my-project'
|
|
44
|
+
* });
|
|
45
|
+
*
|
|
46
|
+
* // Run tests with retry logic
|
|
47
|
+
* if (ticket.id.startsWith('FRONTEND-')) {
|
|
48
|
+
* const testResult = await runTestsWithRetry({
|
|
49
|
+
* ticket,
|
|
50
|
+
* cwd: './my-project',
|
|
51
|
+
* maxRetries: 3
|
|
52
|
+
* });
|
|
53
|
+
* }
|
|
54
|
+
*
|
|
29
55
|
* // Use validation utilities
|
|
30
56
|
* const lintResult: ValidationResult = await runLint();
|
|
31
57
|
*
|
|
@@ -48,10 +74,11 @@ export { syncRulesCommand } from './kosuke/commands/sync-rules.js';
|
|
|
48
74
|
export { requirementsCommand, requirementsCore } from './kosuke/commands/requirements.js';
|
|
49
75
|
export { getCodeCore } from './kosuke/commands/getcode.js';
|
|
50
76
|
export { ticketsCore } from './kosuke/commands/tickets.js';
|
|
51
|
-
export {
|
|
77
|
+
export { shipCore } from './kosuke/commands/ship.js';
|
|
52
78
|
export { buildCommand } from './kosuke/commands/build.js';
|
|
53
79
|
export { reviewCommand, reviewCore } from './kosuke/commands/review.js';
|
|
54
80
|
export { testCommand, testCore } from './kosuke/commands/test.js';
|
|
81
|
+
export { runTestsWithRetry } from './kosuke/utils/test-runner.js';
|
|
55
82
|
// Re-export utilities
|
|
56
83
|
export { discoverFiles } from './kosuke/utils/file-discovery.js';
|
|
57
84
|
export { createBatches } from './kosuke/utils/batch-creator.js';
|
package/dist/lib.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../lib.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../lib.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AAEH,OAAO,WAAW,MAAM,gBAAgB,CAAC;AAEzC,qBAAqB;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,sBAAsB;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EACL,OAAO,EACP,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,uBAAuB,EACvB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AA2CjG,mCAAmC;AACnC,MAAM,CAAC,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC"}
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kosuke-ai/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.38",
|
|
4
4
|
"description": "Kosuke CLI - Development automation tool for syncing rules and analyzing code quality",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"CLI",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"dependencies": {
|
|
61
61
|
"@anthropic-ai/claude-agent-sdk": "^0.1.0",
|
|
62
62
|
"@anthropic-ai/sdk": "^0.32.1",
|
|
63
|
-
"@browserbasehq/stagehand": "^
|
|
63
|
+
"@browserbasehq/stagehand": "^3.0.5",
|
|
64
64
|
"@octokit/rest": "^20.0.0",
|
|
65
65
|
"dotenv": "^16.4.0",
|
|
66
66
|
"glob": "^10.3.0",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kosuke-ai/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.38",
|
|
4
4
|
"description": "Kosuke CLI - Development automation tool for syncing rules and analyzing code quality",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"CLI",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"dependencies": {
|
|
61
61
|
"@anthropic-ai/claude-agent-sdk": "^0.1.0",
|
|
62
62
|
"@anthropic-ai/sdk": "^0.32.1",
|
|
63
|
-
"@browserbasehq/stagehand": "^
|
|
63
|
+
"@browserbasehq/stagehand": "^3.0.5",
|
|
64
64
|
"@octokit/rest": "^20.0.0",
|
|
65
65
|
"dotenv": "^16.4.0",
|
|
66
66
|
"glob": "^10.3.0",
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Browser Agent - Stagehand-powered browser automation
|
|
3
|
-
*
|
|
4
|
-
* Uses Stagehand with Anthropic Claude for AI-driven browser testing.
|
|
5
|
-
* Provides simple boolean success/failure results with logs.
|
|
6
|
-
*/
|
|
7
|
-
interface BrowserTestOptions {
|
|
8
|
-
url: string;
|
|
9
|
-
task: string;
|
|
10
|
-
headed?: boolean;
|
|
11
|
-
debug?: boolean;
|
|
12
|
-
}
|
|
13
|
-
interface BrowserTestResult {
|
|
14
|
-
success: boolean;
|
|
15
|
-
output: string;
|
|
16
|
-
logs: {
|
|
17
|
-
console: string[];
|
|
18
|
-
errors: string[];
|
|
19
|
-
};
|
|
20
|
-
tokensUsed: {
|
|
21
|
-
input: number;
|
|
22
|
-
output: number;
|
|
23
|
-
cacheCreation: number;
|
|
24
|
-
cacheRead: number;
|
|
25
|
-
};
|
|
26
|
-
cost: number;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Run browser test using Stagehand
|
|
30
|
-
*/
|
|
31
|
-
export declare function runBrowserTest(options: BrowserTestOptions): Promise<BrowserTestResult>;
|
|
32
|
-
export {};
|
|
33
|
-
//# sourceMappingURL=browser-agent.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"browser-agent.d.ts","sourceRoot":"","sources":["../../../kosuke/utils/browser-agent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,UAAU,kBAAkB;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,UAAU,iBAAiB;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF,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;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA6G5F"}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Browser Agent - Stagehand-powered browser automation
|
|
3
|
-
*
|
|
4
|
-
* Uses Stagehand with Anthropic Claude for AI-driven browser testing.
|
|
5
|
-
* Provides simple boolean success/failure results with logs.
|
|
6
|
-
*/
|
|
7
|
-
import { Stagehand } from '@browserbasehq/stagehand';
|
|
8
|
-
/**
|
|
9
|
-
* Run browser test using Stagehand
|
|
10
|
-
*/
|
|
11
|
-
export async function runBrowserTest(options) {
|
|
12
|
-
const { url, task, headed = false, debug = false } = options;
|
|
13
|
-
if (!process.env.ANTHROPIC_API_KEY) {
|
|
14
|
-
throw new Error('ANTHROPIC_API_KEY environment variable is required for Stagehand');
|
|
15
|
-
}
|
|
16
|
-
console.log(`š Navigating to: ${url}`);
|
|
17
|
-
console.log(`šÆ Task: ${task}\n`);
|
|
18
|
-
const stagehand = new Stagehand({
|
|
19
|
-
env: 'LOCAL',
|
|
20
|
-
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
21
|
-
headless: !headed,
|
|
22
|
-
debugDom: debug,
|
|
23
|
-
modelName: (process.env.STAGEHAND_MODEL ||
|
|
24
|
-
'claude-3-5-sonnet-20240620'),
|
|
25
|
-
modelClientOptions: {
|
|
26
|
-
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
27
|
-
},
|
|
28
|
-
});
|
|
29
|
-
const consoleLogs = [];
|
|
30
|
-
const errors = [];
|
|
31
|
-
try {
|
|
32
|
-
// Initialize Stagehand
|
|
33
|
-
await stagehand.init();
|
|
34
|
-
// Set up log collectors
|
|
35
|
-
stagehand.page.on('console', (msg) => {
|
|
36
|
-
const text = msg.text();
|
|
37
|
-
consoleLogs.push(`[${msg.type()}] ${text}`);
|
|
38
|
-
// Track errors
|
|
39
|
-
if (msg.type() === 'error') {
|
|
40
|
-
errors.push(text);
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
stagehand.page.on('pageerror', (error) => {
|
|
44
|
-
errors.push(error.message);
|
|
45
|
-
});
|
|
46
|
-
// Navigate to URL
|
|
47
|
-
await stagehand.page.goto(url, { waitUntil: 'networkidle' });
|
|
48
|
-
// Execute task with Stagehand
|
|
49
|
-
console.log('š¤ Executing task with Claude...');
|
|
50
|
-
const result = await stagehand.act({ action: task });
|
|
51
|
-
// Close browser
|
|
52
|
-
await stagehand.close();
|
|
53
|
-
// Convert result to string for processing
|
|
54
|
-
const resultText = typeof result === 'string' ? result : JSON.stringify(result);
|
|
55
|
-
// Determine success based on result
|
|
56
|
-
const success = !resultText.toLowerCase().includes('error') &&
|
|
57
|
-
!resultText.toLowerCase().includes('failed') &&
|
|
58
|
-
errors.length === 0;
|
|
59
|
-
const output = success
|
|
60
|
-
? `ā
Test passed: ${resultText}`
|
|
61
|
-
: `ā Test failed: ${resultText}${errors.length > 0 ? `\n\nErrors found:\n${errors.join('\n')}` : ''}`;
|
|
62
|
-
console.log(`\n${output}\n`);
|
|
63
|
-
return {
|
|
64
|
-
success,
|
|
65
|
-
output,
|
|
66
|
-
logs: {
|
|
67
|
-
console: consoleLogs,
|
|
68
|
-
errors,
|
|
69
|
-
},
|
|
70
|
-
tokensUsed: {
|
|
71
|
-
input: 0, // Stagehand doesn't expose this yet
|
|
72
|
-
output: 0,
|
|
73
|
-
cacheCreation: 0,
|
|
74
|
-
cacheRead: 0,
|
|
75
|
-
},
|
|
76
|
-
cost: 0, // Will be added later when Stagehand exposes metrics
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
// Ensure browser is closed on error
|
|
81
|
-
await stagehand.close();
|
|
82
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
83
|
-
errors.push(errorMessage);
|
|
84
|
-
console.error(`\nā Browser test failed: ${errorMessage}\n`);
|
|
85
|
-
return {
|
|
86
|
-
success: false,
|
|
87
|
-
output: `ā Test failed with error: ${errorMessage}`,
|
|
88
|
-
logs: {
|
|
89
|
-
console: consoleLogs,
|
|
90
|
-
errors,
|
|
91
|
-
},
|
|
92
|
-
tokensUsed: {
|
|
93
|
-
input: 0,
|
|
94
|
-
output: 0,
|
|
95
|
-
cacheCreation: 0,
|
|
96
|
-
cacheRead: 0,
|
|
97
|
-
},
|
|
98
|
-
cost: 0,
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
//# sourceMappingURL=browser-agent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"browser-agent.js","sourceRoot":"","sources":["../../../kosuke/utils/browser-agent.ts"],"names":[],"mappings":"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"}
|