@kosuke-ai/cli 0.0.36 → 0.0.37
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 +18 -57
- package/dist/index.js.map +1 -1
- package/dist/kosuke/commands/build.d.ts +6 -3
- package/dist/kosuke/commands/build.d.ts.map +1 -1
- package/dist/kosuke/commands/build.js +52 -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/types.d.ts +26 -7
- package/dist/kosuke/types.d.ts.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 +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
* requirements Interactive requirements gathering
|
|
10
10
|
* getcode Explore GitHub repositories and fetch code
|
|
11
11
|
* tickets Generate implementation tickets from requirements
|
|
12
|
-
* ship --ticket=<ID> Implement a single ticket from tickets.json
|
|
13
12
|
* build Batch process all tickets from tickets.json
|
|
14
13
|
* review Review codebase against CLAUDE.md rules
|
|
15
14
|
* test Run E2E tests with automated fixing (ticket or custom prompt)
|
|
@@ -21,7 +20,6 @@
|
|
|
21
20
|
* bun run kosuke requirements
|
|
22
21
|
* bun run kosuke getcode "query"
|
|
23
22
|
* bun run kosuke tickets
|
|
24
|
-
* bun run kosuke ship --ticket=SCHEMA-1
|
|
25
23
|
* bun run kosuke build
|
|
26
24
|
* bun run kosuke review
|
|
27
25
|
* bun run kosuke test --ticket=FRONTEND-1 OR --prompt="Test login flow"
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
* requirements Interactive requirements gathering
|
|
10
10
|
* getcode Explore GitHub repositories and fetch code
|
|
11
11
|
* tickets Generate implementation tickets from requirements
|
|
12
|
-
* ship --ticket=<ID> Implement a single ticket from tickets.json
|
|
13
12
|
* build Batch process all tickets from tickets.json
|
|
14
13
|
* review Review codebase against CLAUDE.md rules
|
|
15
14
|
* test Run E2E tests with automated fixing (ticket or custom prompt)
|
|
@@ -21,7 +20,6 @@
|
|
|
21
20
|
* bun run kosuke requirements
|
|
22
21
|
* bun run kosuke getcode "query"
|
|
23
22
|
* bun run kosuke tickets
|
|
24
|
-
* bun run kosuke ship --ticket=SCHEMA-1
|
|
25
23
|
* bun run kosuke build
|
|
26
24
|
* bun run kosuke review
|
|
27
25
|
* bun run kosuke test --ticket=FRONTEND-1 OR --prompt="Test login flow"
|
|
@@ -31,16 +29,15 @@
|
|
|
31
29
|
* GITHUB_TOKEN - Required for creating PRs
|
|
32
30
|
*/
|
|
33
31
|
import 'dotenv/config';
|
|
34
|
-
import { syncRulesCommand } from './kosuke/commands/sync-rules.js';
|
|
35
32
|
import { analyseCommand } from './kosuke/commands/analyse.js';
|
|
33
|
+
import { buildCommand } from './kosuke/commands/build.js';
|
|
34
|
+
import { getCodeCommand, parseGetCodeArgs } from './kosuke/commands/getcode.js';
|
|
36
35
|
import { lintCommand } from './kosuke/commands/lint.js';
|
|
37
36
|
import { requirementsCommand } from './kosuke/commands/requirements.js';
|
|
38
|
-
import { getCodeCommand, parseGetCodeArgs } from './kosuke/commands/getcode.js';
|
|
39
|
-
import { ticketsCommand } from './kosuke/commands/tickets.js';
|
|
40
|
-
import { shipCommand } from './kosuke/commands/ship.js';
|
|
41
|
-
import { buildCommand } from './kosuke/commands/build.js';
|
|
42
37
|
import { reviewCommand } from './kosuke/commands/review.js';
|
|
38
|
+
import { syncRulesCommand } from './kosuke/commands/sync-rules.js';
|
|
43
39
|
import { testCommand } from './kosuke/commands/test.js';
|
|
40
|
+
import { ticketsCommand } from './kosuke/commands/tickets.js';
|
|
44
41
|
async function main() {
|
|
45
42
|
const args = process.argv.slice(2);
|
|
46
43
|
const command = args[0];
|
|
@@ -104,32 +101,6 @@ async function main() {
|
|
|
104
101
|
await ticketsCommand(options);
|
|
105
102
|
break;
|
|
106
103
|
}
|
|
107
|
-
case 'ship': {
|
|
108
|
-
const ticketArg = args.find((arg) => arg.startsWith('--ticket='))?.split('=')[1];
|
|
109
|
-
if (!ticketArg) {
|
|
110
|
-
console.error('❌ --ticket flag is required\n');
|
|
111
|
-
console.log('Usage: kosuke ship --ticket=SCHEMA-1 [--test] [--commit] [--directory=<path>] [--db-url=<url>]');
|
|
112
|
-
console.log('\nExamples:');
|
|
113
|
-
console.log(' kosuke ship --ticket=SCHEMA-1 # Local only');
|
|
114
|
-
console.log(' kosuke ship --ticket=FRONTEND-1 --test # With testing');
|
|
115
|
-
console.log(' kosuke ship --ticket=FRONTEND-1 --commit # Commit to current branch');
|
|
116
|
-
console.log(' kosuke ship --ticket=SCHEMA-1 --directory=./my-project # Specific directory');
|
|
117
|
-
console.log(' kosuke ship --ticket=SCHEMA-1 --db-url=postgres://user:pass@host:5432/db # Custom DB');
|
|
118
|
-
process.exit(1);
|
|
119
|
-
}
|
|
120
|
-
const options = {
|
|
121
|
-
ticket: ticketArg,
|
|
122
|
-
test: args.includes('--test'),
|
|
123
|
-
commit: args.includes('--commit'),
|
|
124
|
-
ticketsFile: args.find((arg) => arg.startsWith('--tickets='))?.split('=')[1],
|
|
125
|
-
directory: args.find((arg) => arg.startsWith('--directory='))?.split('=')[1] ||
|
|
126
|
-
args.find((arg) => arg.startsWith('--dir='))?.split('=')[1],
|
|
127
|
-
dbUrl: args.find((arg) => arg.startsWith('--db-url='))?.split('=')[1],
|
|
128
|
-
noLogs: args.includes('--no-logs'),
|
|
129
|
-
};
|
|
130
|
-
await shipCommand(options);
|
|
131
|
-
break;
|
|
132
|
-
}
|
|
133
104
|
case 'build': {
|
|
134
105
|
const options = {
|
|
135
106
|
directory: args.find((arg) => arg.startsWith('--directory='))?.split('=')[1] ||
|
|
@@ -139,6 +110,11 @@ async function main() {
|
|
|
139
110
|
reset: args.includes('--reset'),
|
|
140
111
|
askConfirm: args.includes('--ask-confirm'),
|
|
141
112
|
askCommit: args.includes('--ask-commit'),
|
|
113
|
+
review: !args.includes('--no-review'), // Default true, disabled with --no-review
|
|
114
|
+
test: !args.includes('--no-test'), // Default true, disabled with --no-test
|
|
115
|
+
url: args.find((arg) => arg.startsWith('--url='))?.split('=')[1],
|
|
116
|
+
headed: args.includes('--headed'),
|
|
117
|
+
debug: args.includes('--debug'),
|
|
142
118
|
noLogs: args.includes('--no-logs'),
|
|
143
119
|
};
|
|
144
120
|
await buildCommand(options);
|
|
@@ -302,34 +278,12 @@ COMMANDS:
|
|
|
302
278
|
kosuke tickets --directory=./projects/my-app # Analyze specific directory
|
|
303
279
|
kosuke tickets --dir=./my-app --path=docs/spec.md # Custom directory and requirements path
|
|
304
280
|
|
|
305
|
-
ship --ticket=<ID> [options]
|
|
306
|
-
Implement a single ticket from tickets.json
|
|
307
|
-
Follows CLAUDE.md rules, runs linting, and optionally runs tests
|
|
308
|
-
Note: Ship implements tickets but does NOT commit. Use 'build' for commits.
|
|
309
|
-
|
|
310
|
-
Options:
|
|
311
|
-
--ticket=<ID> Ticket ID to implement (required, e.g., SCHEMA-1)
|
|
312
|
-
--test Run E2E tests after implementation
|
|
313
|
-
--review Perform code review with ticket context
|
|
314
|
-
--tickets=<file> Path to tickets file (default: tickets.json, relative to directory)
|
|
315
|
-
--directory=<path> Directory to run ship in (default: current directory)
|
|
316
|
-
--dir=<path> Alias for --directory
|
|
317
|
-
--db-url=<url> Database URL for migrations (default: postgres://postgres:postgres@postgres:5432/postgres)
|
|
318
|
-
|
|
319
|
-
Examples:
|
|
320
|
-
kosuke ship --ticket=SCHEMA-1 # Implement locally only
|
|
321
|
-
kosuke ship --ticket=FRONTEND-1 --test # Implement with testing
|
|
322
|
-
kosuke ship --ticket=BACKEND-2 --review # Implement with code review
|
|
323
|
-
kosuke ship --ticket=SCHEMA-1 --tickets=custom.json
|
|
324
|
-
kosuke ship --ticket=SCHEMA-1 --directory=./my-project # Specific directory
|
|
325
|
-
kosuke ship --ticket=SCHEMA-1 --db-url=postgres://user:pass@host:5432/db # Custom DB
|
|
326
|
-
|
|
327
281
|
build [options]
|
|
328
282
|
Batch process all "Todo" and "Error" tickets from tickets.json
|
|
329
283
|
Implements and commits each ticket individually to current branch
|
|
330
284
|
Processes tickets in order: Schema → Backend → Frontend
|
|
331
|
-
Frontend tickets automatically include E2E testing
|
|
332
|
-
All tickets
|
|
285
|
+
Frontend tickets automatically include E2E testing (unless --no-test)
|
|
286
|
+
All tickets include code review by default (unless --no-review)
|
|
333
287
|
|
|
334
288
|
Options:
|
|
335
289
|
--directory=<path> Directory to run build in (default: current directory)
|
|
@@ -339,6 +293,11 @@ COMMANDS:
|
|
|
339
293
|
--reset Reset all tickets to "Todo" status before processing (start from scratch)
|
|
340
294
|
--ask-confirm Ask for confirmation before proceeding to next ticket (useful for review)
|
|
341
295
|
--ask-commit Ask before committing each ticket (default: auto-commit after each ticket)
|
|
296
|
+
--no-review Skip code review phase (enabled by default)
|
|
297
|
+
--no-test Skip testing phase for frontend tickets (enabled by default)
|
|
298
|
+
--url=<URL> Base URL for testing (default: http://localhost:3000)
|
|
299
|
+
--headed Show browser during testing (visible GUI window for debugging)
|
|
300
|
+
--debug Enable Playwright inspector for tests
|
|
342
301
|
|
|
343
302
|
Examples:
|
|
344
303
|
git checkout -b feat/implement-tickets # Create feature branch first
|
|
@@ -349,6 +308,8 @@ COMMANDS:
|
|
|
349
308
|
kosuke build --ask-confirm # Ask before processing each ticket
|
|
350
309
|
kosuke build --ask-commit --ask-confirm # Fully interactive mode
|
|
351
310
|
kosuke build --reset # Reset all tickets and start from scratch
|
|
311
|
+
kosuke build --no-review --no-test # Skip review and testing (fastest)
|
|
312
|
+
kosuke build --headed # Show browser during tests
|
|
352
313
|
kosuke build --tickets=custom.json # Use custom tickets file
|
|
353
314
|
kosuke build --directory=./my-project # Run build in specific directory
|
|
354
315
|
kosuke build --db-url=postgres://user:pass@host:5432/db # Custom DB
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,15 +2,18 @@
|
|
|
2
2
|
* Build command - Batch process all tickets from tickets.json
|
|
3
3
|
*
|
|
4
4
|
* This command processes all "Todo" and "Error" tickets sequentially,
|
|
5
|
-
* implementing each one using the ship
|
|
6
|
-
* Frontend tickets automatically
|
|
7
|
-
* All tickets
|
|
5
|
+
* implementing each one using the ship core engine and committing individually.
|
|
6
|
+
* Frontend tickets automatically run tests (unless --no-test is specified).
|
|
7
|
+
* All tickets include code review by default (unless --no-review is specified).
|
|
8
8
|
*
|
|
9
9
|
* Usage:
|
|
10
10
|
* kosuke build # Process and auto-commit all tickets
|
|
11
11
|
* kosuke build --ask-commit # Ask before committing each ticket
|
|
12
12
|
* kosuke build --ask-confirm # Ask before processing each ticket
|
|
13
13
|
* kosuke build --reset # Reset all tickets to "Todo" and process from scratch
|
|
14
|
+
* kosuke build --no-review # Skip code review phase
|
|
15
|
+
* kosuke build --no-test # Skip testing phase for frontend tickets
|
|
16
|
+
* kosuke build --headed # Show browser during testing
|
|
14
17
|
* kosuke build --tickets=path/to/tickets.json
|
|
15
18
|
* kosuke build --db-url=postgres://user:pass@host:5432/db
|
|
16
19
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../kosuke/commands/build.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../kosuke/commands/build.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAU,MAAM,aAAa,CAAC;AAwExD;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA2MvE"}
|
|
@@ -2,15 +2,18 @@
|
|
|
2
2
|
* Build command - Batch process all tickets from tickets.json
|
|
3
3
|
*
|
|
4
4
|
* This command processes all "Todo" and "Error" tickets sequentially,
|
|
5
|
-
* implementing each one using the ship
|
|
6
|
-
* Frontend tickets automatically
|
|
7
|
-
* All tickets
|
|
5
|
+
* implementing each one using the ship core engine and committing individually.
|
|
6
|
+
* Frontend tickets automatically run tests (unless --no-test is specified).
|
|
7
|
+
* All tickets include code review by default (unless --no-review is specified).
|
|
8
8
|
*
|
|
9
9
|
* Usage:
|
|
10
10
|
* kosuke build # Process and auto-commit all tickets
|
|
11
11
|
* kosuke build --ask-commit # Ask before committing each ticket
|
|
12
12
|
* kosuke build --ask-confirm # Ask before processing each ticket
|
|
13
13
|
* kosuke build --reset # Reset all tickets to "Todo" and process from scratch
|
|
14
|
+
* kosuke build --no-review # Skip code review phase
|
|
15
|
+
* kosuke build --no-test # Skip testing phase for frontend tickets
|
|
16
|
+
* kosuke build --headed # Show browser during testing
|
|
14
17
|
* kosuke build --tickets=path/to/tickets.json
|
|
15
18
|
* kosuke build --db-url=postgres://user:pass@host:5432/db
|
|
16
19
|
*
|
|
@@ -23,8 +26,9 @@ import { existsSync, statSync } from 'fs';
|
|
|
23
26
|
import { join, resolve } from 'path';
|
|
24
27
|
import * as readline from 'readline';
|
|
25
28
|
import simpleGit from 'simple-git';
|
|
26
|
-
import { loadTicketsFile, saveTicketsFile } from '../utils/tickets-manager.js';
|
|
27
|
-
import {
|
|
29
|
+
import { loadTicketsFile, saveTicketsFile, updateTicketStatus, } from '../utils/tickets-manager.js';
|
|
30
|
+
import { shipCore } from './ship.js';
|
|
31
|
+
import { runTestsWithRetry } from '../utils/test-runner.js';
|
|
28
32
|
/**
|
|
29
33
|
* Prompt user for confirmation to continue
|
|
30
34
|
*/
|
|
@@ -93,7 +97,7 @@ export async function buildCommand(options) {
|
|
|
93
97
|
if (!process.env.GITHUB_TOKEN) {
|
|
94
98
|
throw new Error('GITHUB_TOKEN environment variable is required for build command');
|
|
95
99
|
}
|
|
96
|
-
const { directory, ticketsFile = 'tickets.json', dbUrl = 'postgres://postgres:postgres@localhost:5432/postgres', reset = false, askConfirm = false, askCommit = false, noLogs = false, } = options;
|
|
100
|
+
const { directory, ticketsFile = 'tickets.json', dbUrl = 'postgres://postgres:postgres@localhost:5432/postgres', reset = false, askConfirm = false, askCommit = false, review = true, test = true, url, headed, debug, noLogs = false, } = options;
|
|
97
101
|
// 1. Validate and resolve directory
|
|
98
102
|
const cwd = directory ? resolve(directory) : process.cwd();
|
|
99
103
|
if (!existsSync(cwd)) {
|
|
@@ -144,20 +148,50 @@ export async function buildCommand(options) {
|
|
|
144
148
|
console.log(`📝 ${ticket.title}`);
|
|
145
149
|
console.log('='.repeat(80) + '\n');
|
|
146
150
|
try {
|
|
147
|
-
//
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
review
|
|
151
|
+
// Step 1: Update status to InProgress
|
|
152
|
+
console.log('📝 Updating ticket status to InProgress...');
|
|
153
|
+
updateTicketStatus(ticketsPath, ticket.id, 'InProgress');
|
|
154
|
+
console.log(' ✅ Status updated\n');
|
|
155
|
+
// Step 2: Ship implements the ticket (no ticket lifecycle management)
|
|
156
|
+
const shipResult = await shipCore({
|
|
157
|
+
ticketData: ticket, // Pass ticket object directly
|
|
158
|
+
review, // Controlled by build options
|
|
155
159
|
directory: cwd,
|
|
156
160
|
dbUrl,
|
|
157
161
|
noLogs,
|
|
158
162
|
});
|
|
163
|
+
if (!shipResult.success) {
|
|
164
|
+
throw new Error(shipResult.error || 'Ship failed');
|
|
165
|
+
}
|
|
159
166
|
console.log(`\n✅ ${ticket.id} implemented successfully`);
|
|
160
|
-
|
|
167
|
+
console.log(`📊 Implementation fixes: ${shipResult.implementationFixCount}`);
|
|
168
|
+
console.log(`🔧 Linting fixes: ${shipResult.lintFixCount}`);
|
|
169
|
+
if (shipResult.reviewFixCount > 0) {
|
|
170
|
+
console.log(`🔍 Review fixes: ${shipResult.reviewFixCount}`);
|
|
171
|
+
}
|
|
172
|
+
console.log(`💰 Ship cost: $${shipResult.cost.toFixed(4)}`);
|
|
173
|
+
// Step 3: Run tests if frontend ticket and test enabled
|
|
174
|
+
const isFrontendTicket = ticket.id.startsWith('FRONTEND-');
|
|
175
|
+
if (test && isFrontendTicket) {
|
|
176
|
+
console.log(`\n${'='.repeat(60)}`);
|
|
177
|
+
console.log(`🧪 Phase: Testing (Iterative)`);
|
|
178
|
+
console.log(`${'='.repeat(60)}\n`);
|
|
179
|
+
const testResult = await runTestsWithRetry({
|
|
180
|
+
ticket,
|
|
181
|
+
cwd,
|
|
182
|
+
url,
|
|
183
|
+
headed,
|
|
184
|
+
debug,
|
|
185
|
+
maxRetries: 3,
|
|
186
|
+
});
|
|
187
|
+
console.log(`\n✨ Testing completed (${testResult.fixesApplied} fixes applied over ${testResult.attempts} iterations)`);
|
|
188
|
+
console.log(`💰 Testing cost: $${testResult.cost.toFixed(4)}`);
|
|
189
|
+
}
|
|
190
|
+
// Step 4: Update ticket status to Done
|
|
191
|
+
console.log('\n📝 Updating ticket status to Done...');
|
|
192
|
+
updateTicketStatus(ticketsPath, ticket.id, 'Done');
|
|
193
|
+
console.log(` ✅ Ticket ${ticket.id} marked as Done\n`);
|
|
194
|
+
// Step 5: Commit (if not asking)
|
|
161
195
|
if (askCommit) {
|
|
162
196
|
// Interactive: ask before committing
|
|
163
197
|
const shouldCommit = await promptConfirmation(`\n❓ Commit changes for ${ticket.id}?`);
|
|
@@ -165,7 +199,7 @@ export async function buildCommand(options) {
|
|
|
165
199
|
await commitTicket(ticket, cwd);
|
|
166
200
|
}
|
|
167
201
|
else {
|
|
168
|
-
console.log(' ⏭️ Skipped commit
|
|
202
|
+
console.log(' ⏭️ Skipped commit\n');
|
|
169
203
|
}
|
|
170
204
|
}
|
|
171
205
|
else {
|
|
@@ -186,6 +220,8 @@ export async function buildCommand(options) {
|
|
|
186
220
|
catch (error) {
|
|
187
221
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
188
222
|
console.error(`\n❌ Failed to process ${ticket.id}: ${errorMessage}`);
|
|
223
|
+
// Update ticket status to Error
|
|
224
|
+
updateTicketStatus(ticketsPath, ticket.id, 'Error', errorMessage);
|
|
189
225
|
console.error('\n❌ Build stopped due to ticket failure');
|
|
190
226
|
console.error('ℹ️ Fix the issue and run build again to resume from failed tickets\n');
|
|
191
227
|
throw error;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../kosuke/commands/build.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../kosuke/commands/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Ship
|
|
2
|
+
* Ship Core - Ticket-agnostic implementation engine
|
|
3
3
|
*
|
|
4
|
-
* This
|
|
5
|
-
*
|
|
4
|
+
* This module provides the core implementation logic for tickets.
|
|
5
|
+
* It is designed to be called programmatically with ticket data,
|
|
6
|
+
* making it independent of tickets.json or any ticket management system.
|
|
6
7
|
*
|
|
7
|
-
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Implements tickets following CLAUDE.md rules
|
|
10
|
+
* - Runs comprehensive linting
|
|
11
|
+
* - Optionally performs code review with ticket context
|
|
12
|
+
* - Does NOT manage ticket lifecycle (status updates, commits, etc.)
|
|
8
13
|
*
|
|
9
|
-
* Usage:
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
14
|
+
* Usage (Programmatic):
|
|
15
|
+
* import { shipCore } from './commands/ship.js';
|
|
16
|
+
*
|
|
17
|
+
* const result = await shipCore({
|
|
18
|
+
* ticketData: { id: 'SCHEMA-1', title: '...', description: '...' },
|
|
19
|
+
* review: true,
|
|
20
|
+
* directory: './my-project',
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* Note: The CLI command 'kosuke ship' is deprecated.
|
|
24
|
+
* Use 'kosuke build' instead for complete ticket workflow.
|
|
15
25
|
*/
|
|
16
26
|
import type { ShipOptions, ShipResult } from '../types.js';
|
|
17
27
|
/**
|
|
18
|
-
* Core ship logic (
|
|
28
|
+
* Core ship logic (ticket-agnostic, reusable)
|
|
29
|
+
* Implements a ticket without managing its lifecycle (status updates, etc.)
|
|
19
30
|
*/
|
|
20
31
|
export declare function shipCore(options: ShipOptions): Promise<ShipResult>;
|
|
21
|
-
/**
|
|
22
|
-
* Main ship command
|
|
23
|
-
*/
|
|
24
|
-
export declare function shipCommand(options: ShipOptions): Promise<void>;
|
|
25
32
|
//# sourceMappingURL=ship.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ship.d.ts","sourceRoot":"","sources":["../../../kosuke/commands/ship.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ship.d.ts","sourceRoot":"","sources":["../../../kosuke/commands/ship.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAU,MAAM,aAAa,CAAC;AAyEnE;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAiJxE"}
|
|
@@ -1,26 +1,47 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Ship
|
|
2
|
+
* Ship Core - Ticket-agnostic implementation engine
|
|
3
3
|
*
|
|
4
|
-
* This
|
|
5
|
-
*
|
|
4
|
+
* This module provides the core implementation logic for tickets.
|
|
5
|
+
* It is designed to be called programmatically with ticket data,
|
|
6
|
+
* making it independent of tickets.json or any ticket management system.
|
|
6
7
|
*
|
|
7
|
-
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Implements tickets following CLAUDE.md rules
|
|
10
|
+
* - Runs comprehensive linting
|
|
11
|
+
* - Optionally performs code review with ticket context
|
|
12
|
+
* - Does NOT manage ticket lifecycle (status updates, commits, etc.)
|
|
8
13
|
*
|
|
9
|
-
* Usage:
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
14
|
+
* Usage (Programmatic):
|
|
15
|
+
* import { shipCore } from './commands/ship.js';
|
|
16
|
+
*
|
|
17
|
+
* const result = await shipCore({
|
|
18
|
+
* ticketData: { id: 'SCHEMA-1', title: '...', description: '...' },
|
|
19
|
+
* review: true,
|
|
20
|
+
* directory: './my-project',
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* Note: The CLI command 'kosuke ship' is deprecated.
|
|
24
|
+
* Use 'kosuke build' instead for complete ticket workflow.
|
|
15
25
|
*/
|
|
16
26
|
import { existsSync, statSync } from 'fs';
|
|
17
|
-
import {
|
|
27
|
+
import { resolve } from 'path';
|
|
18
28
|
import { formatCostBreakdown, runAgent } from '../utils/claude-agent.js';
|
|
19
|
-
import { logger, setupCancellationHandler } from '../utils/logger.js';
|
|
20
|
-
import { findTicket, loadTicketsFile, updateTicketStatus } from '../utils/tickets-manager.js';
|
|
21
29
|
import { runComprehensiveLinting } from '../utils/validator.js';
|
|
22
30
|
import { reviewCore } from './review.js';
|
|
23
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Validate ticket data has all required fields
|
|
33
|
+
*/
|
|
34
|
+
function validateTicketData(ticketData) {
|
|
35
|
+
if (!ticketData.id || typeof ticketData.id !== 'string') {
|
|
36
|
+
throw new Error('Invalid ticket: id is required and must be a string');
|
|
37
|
+
}
|
|
38
|
+
if (!ticketData.title || typeof ticketData.title !== 'string') {
|
|
39
|
+
throw new Error('Invalid ticket: title is required and must be a string');
|
|
40
|
+
}
|
|
41
|
+
if (!ticketData.description || typeof ticketData.description !== 'string') {
|
|
42
|
+
throw new Error('Invalid ticket: description is required and must be a string');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
24
45
|
/**
|
|
25
46
|
* Build system prompt for ticket implementation
|
|
26
47
|
*/
|
|
@@ -72,17 +93,21 @@ ${ticket.description}
|
|
|
72
93
|
Begin by exploring the current codebase, then implement the ticket systematically.`;
|
|
73
94
|
}
|
|
74
95
|
/**
|
|
75
|
-
* Core ship logic (
|
|
96
|
+
* Core ship logic (ticket-agnostic, reusable)
|
|
97
|
+
* Implements a ticket without managing its lifecycle (status updates, etc.)
|
|
76
98
|
*/
|
|
77
99
|
export async function shipCore(options) {
|
|
78
|
-
|
|
100
|
+
// Validate ticket data
|
|
101
|
+
validateTicketData(options.ticketData);
|
|
102
|
+
const ticket = options.ticketData;
|
|
103
|
+
const { review = false, directory, dbUrl = 'postgres://postgres:postgres@localhost:5432/postgres', } = options;
|
|
79
104
|
// 1. Validate and resolve directory
|
|
80
105
|
const cwd = directory ? resolve(directory) : process.cwd();
|
|
81
106
|
if (directory) {
|
|
82
107
|
if (!existsSync(cwd)) {
|
|
83
108
|
throw new Error(`Directory not found: ${cwd}\n` +
|
|
84
109
|
`Please provide a valid directory using --directory=<path>\n` +
|
|
85
|
-
`Example:
|
|
110
|
+
`Example: shipCore({ ticketData: ticket, directory: './my-project' })`);
|
|
86
111
|
}
|
|
87
112
|
const stats = statSync(cwd);
|
|
88
113
|
if (!stats.isDirectory()) {
|
|
@@ -90,26 +115,7 @@ export async function shipCore(options) {
|
|
|
90
115
|
}
|
|
91
116
|
console.log(`📁 Using project directory: ${cwd}\n`);
|
|
92
117
|
}
|
|
93
|
-
|
|
94
|
-
// 1. Load and validate ticket
|
|
95
|
-
console.log('📋 Loading ticket...');
|
|
96
|
-
const ticketsData = loadTicketsFile(ticketsPath);
|
|
97
|
-
const ticket = findTicket(ticketsData, ticketId);
|
|
98
|
-
if (!ticket) {
|
|
99
|
-
throw new Error(`Ticket ${ticketId} not found in ${ticketsFile}\n` +
|
|
100
|
-
`Available tickets: ${ticketsData.tickets.map((t) => t.id).join(', ')}`);
|
|
101
|
-
}
|
|
102
|
-
if (ticket.status === 'Done') {
|
|
103
|
-
throw new Error(`Ticket ${ticketId} is already marked as Done.\n` +
|
|
104
|
-
`If you want to re-implement it, manually change its status to "Todo" in ${ticketsFile}`);
|
|
105
|
-
}
|
|
106
|
-
console.log(` ✅ Loaded ticket: ${ticket.id} - ${ticket.title}\n`);
|
|
107
|
-
// 2. Update status to InProgress
|
|
108
|
-
console.log('📝 Updating ticket status to InProgress...');
|
|
109
|
-
updateTicketStatus(ticketsPath, ticketId, 'InProgress');
|
|
110
|
-
console.log(' ✅ Status updated\n');
|
|
111
|
-
// 3. Context ready (using current working directory)
|
|
112
|
-
console.log('📁 Working in current directory context\n');
|
|
118
|
+
console.log(`📋 Implementing ticket: ${ticket.id} - ${ticket.title}\n`);
|
|
113
119
|
// Determine ticket type
|
|
114
120
|
const isSchemaTicket = ticket.id.toUpperCase().startsWith('SCHEMA-');
|
|
115
121
|
// Track metrics
|
|
@@ -121,12 +127,12 @@ export async function shipCore(options) {
|
|
|
121
127
|
let implementationFixCount = 0;
|
|
122
128
|
let reviewFixCount = 0;
|
|
123
129
|
try {
|
|
124
|
-
//
|
|
130
|
+
// 2. Implementation phase
|
|
125
131
|
console.log(`\n${'='.repeat(60)}`);
|
|
126
132
|
console.log(`🚀 Phase 1: Implementation`);
|
|
127
133
|
console.log(`${'='.repeat(60)}\n`);
|
|
128
134
|
const systemPrompt = buildImplementationPrompt(ticket, dbUrl);
|
|
129
|
-
const implementationResult = await runAgent(`Implement ticket ${
|
|
135
|
+
const implementationResult = await runAgent(`Implement ticket ${ticket.id}: ${ticket.title}`, {
|
|
130
136
|
systemPrompt,
|
|
131
137
|
cwd,
|
|
132
138
|
maxTurns: 40,
|
|
@@ -140,13 +146,13 @@ export async function shipCore(options) {
|
|
|
140
146
|
totalCost += implementationResult.cost;
|
|
141
147
|
console.log(`\n✨ Implementation completed (${implementationFixCount} changes made)`);
|
|
142
148
|
console.log(`💰 Implementation cost: ${formatCostBreakdown(implementationResult)}`);
|
|
143
|
-
//
|
|
149
|
+
// 3. Linting phase
|
|
144
150
|
console.log(`\n${'='.repeat(60)}`);
|
|
145
151
|
console.log(`🔧 Phase 2: Linting & Quality Checks`);
|
|
146
152
|
console.log(`${'='.repeat(60)}\n`);
|
|
147
153
|
const lintResult = await runComprehensiveLinting(cwd);
|
|
148
154
|
console.log(`\n✅ Linting completed (${lintResult.fixCount} fixes applied)`);
|
|
149
|
-
//
|
|
155
|
+
// 4. Review phase (if review flag is set) - SKIP for SCHEMA tickets
|
|
150
156
|
if (review && !isSchemaTicket) {
|
|
151
157
|
console.log(`\n${'='.repeat(60)}`);
|
|
152
158
|
console.log(`🔍 Phase 3: Code Review (Git Diff)`);
|
|
@@ -170,70 +176,8 @@ export async function shipCore(options) {
|
|
|
170
176
|
else if (review && isSchemaTicket) {
|
|
171
177
|
console.log('\nℹ️ Skipping code review for SCHEMA ticket (review focuses on application code, not database migrations)');
|
|
172
178
|
}
|
|
173
|
-
//
|
|
174
|
-
let testFixCount = 0;
|
|
175
|
-
let testIterations = 0;
|
|
176
|
-
const maxTestRetries = 3;
|
|
177
|
-
if (test) {
|
|
178
|
-
console.log(`\n${'='.repeat(60)}`);
|
|
179
|
-
console.log(`🧪 Phase ${review ? '4' : '3'}: Testing (Iterative)`);
|
|
180
|
-
console.log(`${'='.repeat(60)}\n`);
|
|
181
|
-
let testsPassing = false;
|
|
182
|
-
for (let attempt = 1; attempt <= maxTestRetries; attempt++) {
|
|
183
|
-
testIterations = attempt;
|
|
184
|
-
console.log(`\n🧪 Test Attempt ${attempt}/${maxTestRetries}\n`);
|
|
185
|
-
// Run atomic test
|
|
186
|
-
const testResult = await testCore({
|
|
187
|
-
ticket: ticketId,
|
|
188
|
-
url: options.url,
|
|
189
|
-
headed: options.headed,
|
|
190
|
-
debug: options.debug,
|
|
191
|
-
ticketsFile,
|
|
192
|
-
directory: cwd,
|
|
193
|
-
});
|
|
194
|
-
totalInputTokens += testResult.tokensUsed.input;
|
|
195
|
-
totalOutputTokens += testResult.tokensUsed.output;
|
|
196
|
-
totalCacheCreationTokens += testResult.tokensUsed.cacheCreation;
|
|
197
|
-
totalCacheReadTokens += testResult.tokensUsed.cacheRead;
|
|
198
|
-
totalCost += testResult.cost;
|
|
199
|
-
if (testResult.success) {
|
|
200
|
-
testsPassing = true;
|
|
201
|
-
console.log('\n✅ Tests passed!');
|
|
202
|
-
break;
|
|
203
|
-
}
|
|
204
|
-
// If not last attempt, analyze and fix
|
|
205
|
-
if (attempt < maxTestRetries) {
|
|
206
|
-
console.log('\n🔍 Analyzing test failures...');
|
|
207
|
-
// Collect Docker logs for backend debugging
|
|
208
|
-
const { LogCollector } = await import('../utils/log-collector.js');
|
|
209
|
-
const logCollector = new LogCollector();
|
|
210
|
-
await logCollector.collectDockerLogs('30s');
|
|
211
|
-
const dockerLogs = logCollector.getErrors();
|
|
212
|
-
// Analyze errors and apply fixes
|
|
213
|
-
const { analyzeAndFix } = await import('../utils/error-analyzer.js');
|
|
214
|
-
const fixResult = await analyzeAndFix(ticket, testResult.output, testResult.logs, dockerLogs, cwd);
|
|
215
|
-
testFixCount += fixResult.fixesApplied;
|
|
216
|
-
totalInputTokens += fixResult.tokensUsed.input;
|
|
217
|
-
totalOutputTokens += fixResult.tokensUsed.output;
|
|
218
|
-
totalCacheCreationTokens += fixResult.tokensUsed.cacheCreation;
|
|
219
|
-
totalCacheReadTokens += fixResult.tokensUsed.cacheRead;
|
|
220
|
-
totalCost += fixResult.cost;
|
|
221
|
-
console.log(`\n🔧 Applied ${fixResult.fixesApplied} fixes`);
|
|
222
|
-
console.log(`💰 Fix cost: $${fixResult.cost.toFixed(4)}`);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
if (!testsPassing) {
|
|
226
|
-
throw new Error(`Tests failed after ${maxTestRetries} attempts`);
|
|
227
|
-
}
|
|
228
|
-
console.log(`\n✨ Testing completed (${testFixCount} fixes applied over ${testIterations} iterations)`);
|
|
229
|
-
console.log(`💰 Testing cost: $${totalCost.toFixed(4)}`);
|
|
230
|
-
}
|
|
231
|
-
// 9. Update status to Done
|
|
232
|
-
console.log('\n📝 Updating ticket status to Done...');
|
|
233
|
-
updateTicketStatus(ticketsPath, ticketId, 'Done');
|
|
234
|
-
console.log(' ✅ Ticket marked as Done\n');
|
|
179
|
+
// 5. Return success result
|
|
235
180
|
return {
|
|
236
|
-
ticketId,
|
|
237
181
|
success: true,
|
|
238
182
|
implementationFixCount,
|
|
239
183
|
lintFixCount: lintResult.fixCount,
|
|
@@ -248,12 +192,10 @@ export async function shipCore(options) {
|
|
|
248
192
|
};
|
|
249
193
|
}
|
|
250
194
|
catch (error) {
|
|
251
|
-
//
|
|
195
|
+
// Return error result
|
|
252
196
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
253
197
|
console.error(`\n❌ Implementation failed: ${errorMessage}`);
|
|
254
|
-
updateTicketStatus(ticketsPath, ticketId, 'Error', errorMessage);
|
|
255
198
|
return {
|
|
256
|
-
ticketId,
|
|
257
199
|
success: false,
|
|
258
200
|
implementationFixCount,
|
|
259
201
|
lintFixCount: 0,
|
|
@@ -269,48 +211,4 @@ export async function shipCore(options) {
|
|
|
269
211
|
};
|
|
270
212
|
}
|
|
271
213
|
}
|
|
272
|
-
/**
|
|
273
|
-
* Main ship command
|
|
274
|
-
*/
|
|
275
|
-
export async function shipCommand(options) {
|
|
276
|
-
const { ticket: ticketId, noLogs = false } = options;
|
|
277
|
-
console.log(`🚢 Shipping Ticket: ${ticketId}\n`);
|
|
278
|
-
// Initialize logging context
|
|
279
|
-
const logContext = logger.createContext('ship', { noLogs });
|
|
280
|
-
const cleanupHandler = setupCancellationHandler(logContext);
|
|
281
|
-
try {
|
|
282
|
-
// Validate environment
|
|
283
|
-
if (!process.env.ANTHROPIC_API_KEY) {
|
|
284
|
-
throw new Error('ANTHROPIC_API_KEY environment variable is required');
|
|
285
|
-
}
|
|
286
|
-
// Run core implementation
|
|
287
|
-
const result = await shipCore(options);
|
|
288
|
-
if (!result.success) {
|
|
289
|
-
throw new Error(result.error || 'Ship failed');
|
|
290
|
-
}
|
|
291
|
-
// Track metrics
|
|
292
|
-
logger.trackTokens(logContext, result.tokensUsed);
|
|
293
|
-
logContext.fixesApplied =
|
|
294
|
-
result.implementationFixCount + result.lintFixCount + result.reviewFixCount;
|
|
295
|
-
// Display summary
|
|
296
|
-
console.log('\n✅ Ship completed successfully!');
|
|
297
|
-
console.log(`📊 Implementation fixes: ${result.implementationFixCount}`);
|
|
298
|
-
console.log(`🔧 Linting fixes: ${result.lintFixCount}`);
|
|
299
|
-
if (result.reviewFixCount > 0) {
|
|
300
|
-
console.log(`🔍 Review fixes: ${result.reviewFixCount}`);
|
|
301
|
-
}
|
|
302
|
-
console.log(`💰 Total cost: $${result.cost.toFixed(4)}`);
|
|
303
|
-
console.log('\nℹ️ Changes applied locally. Commits are handled by the build command.');
|
|
304
|
-
// Log successful execution
|
|
305
|
-
await logger.complete(logContext, 'success');
|
|
306
|
-
cleanupHandler();
|
|
307
|
-
}
|
|
308
|
-
catch (error) {
|
|
309
|
-
console.error('\n❌ Ship failed:', error);
|
|
310
|
-
// Log failed execution
|
|
311
|
-
await logger.complete(logContext, 'error', error);
|
|
312
|
-
cleanupHandler();
|
|
313
|
-
throw error;
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
214
|
//# sourceMappingURL=ship.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ship.js","sourceRoot":"","sources":["../../../kosuke/commands/ship.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ship.js","sourceRoot":"","sources":["../../../kosuke/commands/ship.ts"],"names":[],"mappings":"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"}
|
package/dist/kosuke/types.d.ts
CHANGED
|
@@ -106,13 +106,8 @@ export interface TicketsResult {
|
|
|
106
106
|
}>;
|
|
107
107
|
}
|
|
108
108
|
export interface ShipOptions {
|
|
109
|
-
|
|
109
|
+
ticketData: Ticket;
|
|
110
110
|
review?: boolean;
|
|
111
|
-
ticketsFile?: string;
|
|
112
|
-
test?: boolean;
|
|
113
|
-
url?: string;
|
|
114
|
-
headed?: boolean;
|
|
115
|
-
debug?: boolean;
|
|
116
111
|
directory?: string;
|
|
117
112
|
dbUrl?: string;
|
|
118
113
|
noLogs?: boolean;
|
|
@@ -124,6 +119,11 @@ export interface BuildOptions {
|
|
|
124
119
|
reset?: boolean;
|
|
125
120
|
askConfirm?: boolean;
|
|
126
121
|
askCommit?: boolean;
|
|
122
|
+
review?: boolean;
|
|
123
|
+
test?: boolean;
|
|
124
|
+
url?: string;
|
|
125
|
+
headed?: boolean;
|
|
126
|
+
debug?: boolean;
|
|
127
127
|
noLogs?: boolean;
|
|
128
128
|
}
|
|
129
129
|
export interface ReviewContext {
|
|
@@ -137,7 +137,6 @@ export interface ReviewOptions {
|
|
|
137
137
|
noLogs?: boolean;
|
|
138
138
|
}
|
|
139
139
|
export interface ShipResult {
|
|
140
|
-
ticketId: string;
|
|
141
140
|
success: boolean;
|
|
142
141
|
implementationFixCount: number;
|
|
143
142
|
lintFixCount: number;
|
|
@@ -190,6 +189,26 @@ export interface TestResult {
|
|
|
190
189
|
cost: number;
|
|
191
190
|
error?: string;
|
|
192
191
|
}
|
|
192
|
+
export interface TestRunnerOptions {
|
|
193
|
+
ticket: Ticket;
|
|
194
|
+
cwd: string;
|
|
195
|
+
url?: string;
|
|
196
|
+
headed?: boolean;
|
|
197
|
+
debug?: boolean;
|
|
198
|
+
maxRetries?: number;
|
|
199
|
+
}
|
|
200
|
+
export interface TestRunnerResult {
|
|
201
|
+
success: boolean;
|
|
202
|
+
attempts: number;
|
|
203
|
+
fixesApplied: number;
|
|
204
|
+
tokensUsed: {
|
|
205
|
+
input: number;
|
|
206
|
+
output: number;
|
|
207
|
+
cacheCreation: number;
|
|
208
|
+
cacheRead: number;
|
|
209
|
+
};
|
|
210
|
+
cost: number;
|
|
211
|
+
}
|
|
193
212
|
export type { CommandName, ExecutionStatus, CliLogData, CommandExecutionContext, } from './utils/logger.js';
|
|
194
213
|
export type { AnalysisResult, TestFailure } from './utils/error-analyzer.js';
|
|
195
214
|
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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"}
|
|
@@ -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, headed, debug, 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
|
+
headed,
|
|
35
|
+
debug,
|
|
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":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAA0B;IAChE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAEpE,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,wBAAwB,GAAG,CAAC,CAAC;IACjC,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAC7B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,QAAQ,GAAG,OAAO,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,IAAI,UAAU,IAAI,CAAC,CAAC;QAE5D,IAAI,CAAC;YACH,kBAAkB;YAClB,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC;gBAChC,MAAM,EAAE,MAAM,CAAC,EAAE;gBACjB,GAAG;gBACH,MAAM;gBACN,KAAK;gBACL,SAAS,EAAE,GAAG;aACf,CAAC,CAAC;YAEH,gBAAgB,IAAI,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC;YAChD,iBAAiB,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC;YAClD,wBAAwB,IAAI,UAAU,CAAC,UAAU,CAAC,aAAa,CAAC;YAChE,oBAAoB,IAAI,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC;YACxD,SAAS,IAAI,UAAU,CAAC,IAAI,CAAC;YAE7B,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACvB,YAAY,GAAG,IAAI,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;gBACjC,MAAM;YACR,CAAC;YAED,uCAAuC;YACvC,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;gBAE/C,4CAA4C;gBAC5C,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;gBACxC,MAAM,YAAY,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBAC5C,MAAM,UAAU,GAAG,YAAY,CAAC,SAAS,EAAE,CAAC;gBAE5C,iCAAiC;gBACjC,MAAM,SAAS,GAAG,MAAM,aAAa,CACnC,MAAM,EACN,UAAU,CAAC,MAAM,EACjB,UAAU,CAAC,IAAI,EACf,UAAU,EACV,GAAG,CACJ,CAAC;gBAEF,iBAAiB,IAAI,SAAS,CAAC,YAAY,CAAC;gBAC5C,gBAAgB,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC;gBAC/C,iBAAiB,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;gBACjD,wBAAwB,IAAI,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC;gBAC/D,oBAAoB,IAAI,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC;gBACvD,SAAS,IAAI,SAAS,CAAC,IAAI,CAAC;gBAE5B,OAAO,CAAC,GAAG,CAAC,gBAAgB,SAAS,CAAC,YAAY,QAAQ,CAAC,CAAC;gBAC5D,OAAO,CAAC,GAAG,CAAC,iBAAiB,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,YAAY,YAAY,EAAE,CAAC,CAAC;YAErE,yBAAyB;YACzB,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,sBAAsB,UAAU,cAAc,YAAY,EAAE,CAAC,CAAC;YAChF,CAAC;YAED,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,sBAAsB,UAAU,GAAG,OAAO,sBAAsB,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,sBAAsB,UAAU,WAAW,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO;QACL,OAAO,EAAE,YAAY;QACrB,QAAQ;QACR,YAAY,EAAE,iBAAiB;QAC/B,UAAU,EAAE;YACV,KAAK,EAAE,gBAAgB;YACvB,MAAM,EAAE,iBAAiB;YACzB,aAAa,EAAE,wBAAwB;YACvC,SAAS,EAAE,oBAAoB;SAChC;QACD,IAAI,EAAE,SAAS;KAChB,CAAC;AACJ,CAAC"}
|
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