@kosuke-ai/cli 0.0.12 ā 0.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +14 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +148 -6
- package/dist/index.js.map +1 -1
- package/dist/kosuke/commands/build.d.ts +22 -0
- package/dist/kosuke/commands/build.d.ts.map +1 -0
- package/dist/kosuke/commands/build.js +135 -0
- package/dist/kosuke/commands/build.js.map +1 -0
- package/dist/kosuke/commands/review.d.ts +21 -0
- package/dist/kosuke/commands/review.d.ts.map +1 -0
- package/dist/kosuke/commands/review.js +185 -0
- package/dist/kosuke/commands/review.js.map +1 -0
- package/dist/kosuke/commands/ship.d.ts +23 -0
- package/dist/kosuke/commands/ship.d.ts.map +1 -0
- package/dist/kosuke/commands/ship.js +419 -0
- package/dist/kosuke/commands/ship.js.map +1 -0
- package/dist/kosuke/commands/test.d.ts +27 -0
- package/dist/kosuke/commands/test.d.ts.map +1 -0
- package/dist/kosuke/commands/test.js +338 -0
- package/dist/kosuke/commands/test.js.map +1 -0
- package/dist/kosuke/types.d.ts +82 -2
- package/dist/kosuke/types.d.ts.map +1 -1
- package/dist/kosuke/utils/error-analyzer.d.ts +32 -0
- package/dist/kosuke/utils/error-analyzer.d.ts.map +1 -0
- package/dist/kosuke/utils/error-analyzer.js +129 -0
- package/dist/kosuke/utils/error-analyzer.js.map +1 -0
- package/dist/kosuke/utils/git.d.ts +12 -0
- package/dist/kosuke/utils/git.d.ts.map +1 -1
- package/dist/kosuke/utils/git.js +39 -0
- package/dist/kosuke/utils/git.js.map +1 -1
- package/dist/kosuke/utils/log-collector.d.ts +81 -0
- package/dist/kosuke/utils/log-collector.d.ts.map +1 -0
- package/dist/kosuke/utils/log-collector.js +226 -0
- package/dist/kosuke/utils/log-collector.js.map +1 -0
- package/dist/kosuke/utils/playwright-agent.d.ts +39 -0
- package/dist/kosuke/utils/playwright-agent.d.ts.map +1 -0
- package/dist/kosuke/utils/playwright-agent.js +245 -0
- package/dist/kosuke/utils/playwright-agent.js.map +1 -0
- package/dist/kosuke/utils/test-generator.d.ts +22 -0
- package/dist/kosuke/utils/test-generator.d.ts.map +1 -0
- package/dist/kosuke/utils/test-generator.js +174 -0
- package/dist/kosuke/utils/test-generator.js.map +1 -0
- package/dist/kosuke/utils/validator.d.ts +11 -0
- package/dist/kosuke/utils/validator.d.ts.map +1 -1
- package/dist/kosuke/utils/validator.js +100 -0
- package/dist/kosuke/utils/validator.js.map +1 -1
- package/dist/kosuke/utils/visual-tester.d.ts +71 -0
- package/dist/kosuke/utils/visual-tester.d.ts.map +1 -0
- package/dist/kosuke/utils/visual-tester.js +202 -0
- package/dist/kosuke/utils/visual-tester.js.map +1 -0
- package/dist/lib.d.ts +6 -2
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +5 -1
- package/dist/lib.js.map +1 -1
- package/package.json +6 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ship command - Implement a ticket from tickets.json
|
|
3
|
+
*
|
|
4
|
+
* This command takes a ticket ID, implements it following CLAUDE.md rules,
|
|
5
|
+
* runs linting and fixing, and optionally performs a review step.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* kosuke ship --ticket=SCHEMA-1 # Implement ticket (local only)
|
|
9
|
+
* kosuke ship --ticket=BACKEND-2 --review # Implement with review
|
|
10
|
+
* kosuke ship --ticket=FRONTEND-1 --commit # Implement and commit to current branch
|
|
11
|
+
* kosuke ship --ticket=BACKEND-3 --pr # Implement and create PR (new branch)
|
|
12
|
+
* kosuke ship --ticket=SCHEMA-1 --tickets=path/to/tickets.json
|
|
13
|
+
*/
|
|
14
|
+
import type { ShipOptions, ShipResult } from '../types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Core ship logic (git-agnostic, reusable)
|
|
17
|
+
*/
|
|
18
|
+
export declare function shipCore(options: ShipOptions): Promise<ShipResult>;
|
|
19
|
+
/**
|
|
20
|
+
* Main ship command
|
|
21
|
+
*/
|
|
22
|
+
export declare function shipCommand(options: ShipOptions): Promise<void>;
|
|
23
|
+
//# sourceMappingURL=ship.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship.d.ts","sourceRoot":"","sources":["../../../kosuke/commands/ship.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAUH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAU,MAAM,aAAa,CAAC;AAuKnE;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAwKxE;AA4BD;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAwHrE"}
|
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ship command - Implement a ticket from tickets.json
|
|
3
|
+
*
|
|
4
|
+
* This command takes a ticket ID, implements it following CLAUDE.md rules,
|
|
5
|
+
* runs linting and fixing, and optionally performs a review step.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* kosuke ship --ticket=SCHEMA-1 # Implement ticket (local only)
|
|
9
|
+
* kosuke ship --ticket=BACKEND-2 --review # Implement with review
|
|
10
|
+
* kosuke ship --ticket=FRONTEND-1 --commit # Implement and commit to current branch
|
|
11
|
+
* kosuke ship --ticket=BACKEND-3 --pr # Implement and create PR (new branch)
|
|
12
|
+
* kosuke ship --ticket=SCHEMA-1 --tickets=path/to/tickets.json
|
|
13
|
+
*/
|
|
14
|
+
import { readFileSync, writeFileSync, existsSync } from 'fs';
|
|
15
|
+
import { join } from 'path';
|
|
16
|
+
import { runAgent, formatCostBreakdown } from '../utils/claude-agent.js';
|
|
17
|
+
import { ensureRepoReady } from '../utils/repository-manager.js';
|
|
18
|
+
import { runWithPR } from '../utils/pr-orchestrator.js';
|
|
19
|
+
import { commitAndPushCurrentBranch } from '../utils/git.js';
|
|
20
|
+
import { reviewCore } from './review.js';
|
|
21
|
+
import { runComprehensiveLinting } from '../utils/validator.js';
|
|
22
|
+
/**
|
|
23
|
+
* Load tickets from file
|
|
24
|
+
*/
|
|
25
|
+
function loadTicketsFile(ticketsPath) {
|
|
26
|
+
if (!existsSync(ticketsPath)) {
|
|
27
|
+
throw new Error(`Tickets file not found: ${ticketsPath}\n` +
|
|
28
|
+
`Please generate tickets first using: kosuke tickets`);
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const content = readFileSync(ticketsPath, 'utf-8');
|
|
32
|
+
return JSON.parse(content);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
throw new Error(`Failed to parse tickets file: ${error instanceof Error ? error.message : String(error)}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Save tickets to file
|
|
40
|
+
*/
|
|
41
|
+
function saveTicketsFile(ticketsPath, ticketsData) {
|
|
42
|
+
writeFileSync(ticketsPath, JSON.stringify(ticketsData, null, 2), 'utf-8');
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Find ticket by ID
|
|
46
|
+
*/
|
|
47
|
+
function findTicket(ticketsData, ticketId) {
|
|
48
|
+
return ticketsData.tickets.find((t) => t.id === ticketId);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Update ticket status in file
|
|
52
|
+
*/
|
|
53
|
+
function updateTicketStatus(ticketsPath, ticketId, status, error) {
|
|
54
|
+
const ticketsData = loadTicketsFile(ticketsPath);
|
|
55
|
+
const ticket = findTicket(ticketsData, ticketId);
|
|
56
|
+
if (!ticket) {
|
|
57
|
+
console.warn(`ā ļø Ticket ${ticketId} not found, skipping status update`);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
ticket.status = status;
|
|
61
|
+
if (error) {
|
|
62
|
+
ticket.error = error;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
delete ticket.error;
|
|
66
|
+
}
|
|
67
|
+
saveTicketsFile(ticketsPath, ticketsData);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Load CLAUDE.md rules
|
|
71
|
+
*/
|
|
72
|
+
function loadClaudeRules(cwd = process.cwd()) {
|
|
73
|
+
const claudePath = join(cwd, 'CLAUDE.md');
|
|
74
|
+
if (!existsSync(claudePath)) {
|
|
75
|
+
throw new Error(`CLAUDE.md not found in workspace root.\n` +
|
|
76
|
+
`Please ensure CLAUDE.md exists at: ${claudePath}`);
|
|
77
|
+
}
|
|
78
|
+
return readFileSync(claudePath, 'utf-8');
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Build system prompt for ticket implementation
|
|
82
|
+
*/
|
|
83
|
+
function buildImplementationPrompt(ticket, claudeRules, repoPath) {
|
|
84
|
+
return `You are an expert software engineer implementing a feature ticket.
|
|
85
|
+
|
|
86
|
+
**Your Task:**
|
|
87
|
+
Implement the following ticket according to the project's coding standards and architecture patterns.
|
|
88
|
+
|
|
89
|
+
**Ticket Information:**
|
|
90
|
+
- ID: ${ticket.id}
|
|
91
|
+
- Title: ${ticket.title}
|
|
92
|
+
- Description:
|
|
93
|
+
${ticket.description}
|
|
94
|
+
|
|
95
|
+
**Project Rules (CLAUDE.md):**
|
|
96
|
+
${claudeRules}
|
|
97
|
+
|
|
98
|
+
**Context:**
|
|
99
|
+
You have access to the kosuke-template repository at: ${repoPath}
|
|
100
|
+
Use this to understand implementation patterns, but DO NOT copy code directly.
|
|
101
|
+
Adapt patterns to fit the current project's needs.
|
|
102
|
+
|
|
103
|
+
**Implementation Requirements:**
|
|
104
|
+
1. Follow ALL guidelines in CLAUDE.md
|
|
105
|
+
2. Use appropriate patterns from kosuke-template as reference
|
|
106
|
+
3. Write clean, well-documented code
|
|
107
|
+
4. Ensure TypeScript type safety
|
|
108
|
+
5. Add error handling where appropriate
|
|
109
|
+
6. Make the implementation production-ready
|
|
110
|
+
|
|
111
|
+
**Critical Instructions:**
|
|
112
|
+
- Read relevant files in the current workspace to understand the codebase
|
|
113
|
+
- Implement ALL requirements from the ticket description
|
|
114
|
+
- Use search_replace or write tools to create/modify files
|
|
115
|
+
- Ensure acceptance criteria are met
|
|
116
|
+
- Do not make assumptions - ask for clarification if needed through comments
|
|
117
|
+
|
|
118
|
+
Begin by exploring the current codebase, then implement the ticket systematically.`;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Build system prompt for review
|
|
122
|
+
*/
|
|
123
|
+
function buildReviewPrompt(ticket, claudeRules) {
|
|
124
|
+
return `You are a senior code reviewer ensuring compliance with project standards.
|
|
125
|
+
|
|
126
|
+
**Your Task:**
|
|
127
|
+
Review the implementation of ticket ${ticket.id} and ensure it follows CLAUDE.md rules.
|
|
128
|
+
|
|
129
|
+
**Ticket Context:**
|
|
130
|
+
- ID: ${ticket.id}
|
|
131
|
+
- Title: ${ticket.title}
|
|
132
|
+
|
|
133
|
+
**Project Rules (CLAUDE.md):**
|
|
134
|
+
${claudeRules}
|
|
135
|
+
|
|
136
|
+
**Review Requirements:**
|
|
137
|
+
1. Check compliance with CLAUDE.md guidelines
|
|
138
|
+
2. Verify code quality and best practices
|
|
139
|
+
3. Ensure TypeScript type safety
|
|
140
|
+
4. Check error handling
|
|
141
|
+
5. Verify naming conventions
|
|
142
|
+
6. Check for security issues
|
|
143
|
+
7. Ensure proper documentation
|
|
144
|
+
|
|
145
|
+
**If Issues Found:**
|
|
146
|
+
- Use search_replace or write tools to FIX them immediately
|
|
147
|
+
- Don't just report issues - FIX them!
|
|
148
|
+
- Make minimal necessary changes
|
|
149
|
+
- Ensure fixes don't break functionality
|
|
150
|
+
|
|
151
|
+
**Critical Instructions:**
|
|
152
|
+
- Read the files that were recently modified for this ticket
|
|
153
|
+
- Identify any violations of CLAUDE.md rules
|
|
154
|
+
- Fix ALL issues found
|
|
155
|
+
- Ensure the code is production-ready after your review
|
|
156
|
+
|
|
157
|
+
Begin by reading recent changes and reviewing them against the standards.`;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Core ship logic (git-agnostic, reusable)
|
|
161
|
+
*/
|
|
162
|
+
export async function shipCore(options) {
|
|
163
|
+
const { ticket: ticketId, review = false, ticketsFile = 'tickets.json' } = options;
|
|
164
|
+
const cwd = process.cwd();
|
|
165
|
+
const ticketsPath = join(cwd, ticketsFile);
|
|
166
|
+
// 1. Load and validate ticket
|
|
167
|
+
console.log('š Loading ticket...');
|
|
168
|
+
const ticketsData = loadTicketsFile(ticketsPath);
|
|
169
|
+
const ticket = findTicket(ticketsData, ticketId);
|
|
170
|
+
if (!ticket) {
|
|
171
|
+
throw new Error(`Ticket ${ticketId} not found in ${ticketsFile}\n` +
|
|
172
|
+
`Available tickets: ${ticketsData.tickets.map((t) => t.id).join(', ')}`);
|
|
173
|
+
}
|
|
174
|
+
if (ticket.status === 'Done') {
|
|
175
|
+
throw new Error(`Ticket ${ticketId} is already marked as Done.\n` +
|
|
176
|
+
`If you want to re-implement it, manually change its status to "Todo" in ${ticketsFile}`);
|
|
177
|
+
}
|
|
178
|
+
console.log(` ā
Loaded ticket: ${ticket.id} - ${ticket.title}\n`);
|
|
179
|
+
// 2. Update status to InProgress
|
|
180
|
+
console.log('š Updating ticket status to InProgress...');
|
|
181
|
+
updateTicketStatus(ticketsPath, ticketId, 'InProgress');
|
|
182
|
+
console.log(' ā
Status updated\n');
|
|
183
|
+
// 3. Load CLAUDE.md rules
|
|
184
|
+
console.log('š Loading CLAUDE.md rules...');
|
|
185
|
+
const claudeRules = loadClaudeRules(cwd);
|
|
186
|
+
console.log(` ā
Loaded rules (${claudeRules.length} characters)\n`);
|
|
187
|
+
// 4. Fetch kosuke-template for context
|
|
188
|
+
console.log('š„ Fetching kosuke-template for context...');
|
|
189
|
+
const repoInfo = await ensureRepoReady('Kosuke-Org/kosuke-template');
|
|
190
|
+
console.log(` ā
Template repository ready at ${repoInfo.localPath}\n`);
|
|
191
|
+
// Track metrics
|
|
192
|
+
let totalInputTokens = 0;
|
|
193
|
+
let totalOutputTokens = 0;
|
|
194
|
+
let totalCacheCreationTokens = 0;
|
|
195
|
+
let totalCacheReadTokens = 0;
|
|
196
|
+
let totalCost = 0;
|
|
197
|
+
let implementationFixCount = 0;
|
|
198
|
+
let reviewFixCount = 0;
|
|
199
|
+
try {
|
|
200
|
+
// 5. Implementation phase
|
|
201
|
+
console.log(`\n${'='.repeat(60)}`);
|
|
202
|
+
console.log(`š Phase 1: Implementation`);
|
|
203
|
+
console.log(`${'='.repeat(60)}\n`);
|
|
204
|
+
const systemPrompt = buildImplementationPrompt(ticket, claudeRules, repoInfo.localPath);
|
|
205
|
+
const implementationResult = await runAgent(`Implement ticket ${ticketId}: ${ticket.title}`, {
|
|
206
|
+
systemPrompt,
|
|
207
|
+
cwd,
|
|
208
|
+
maxTurns: 40,
|
|
209
|
+
verbosity: 'normal',
|
|
210
|
+
});
|
|
211
|
+
implementationFixCount = implementationResult.fixCount;
|
|
212
|
+
totalInputTokens += implementationResult.tokensUsed.input;
|
|
213
|
+
totalOutputTokens += implementationResult.tokensUsed.output;
|
|
214
|
+
totalCacheCreationTokens += implementationResult.tokensUsed.cacheCreation;
|
|
215
|
+
totalCacheReadTokens += implementationResult.tokensUsed.cacheRead;
|
|
216
|
+
totalCost += implementationResult.cost;
|
|
217
|
+
console.log(`\n⨠Implementation completed (${implementationFixCount} changes made)`);
|
|
218
|
+
console.log(`š° Implementation cost: ${formatCostBreakdown(implementationResult)}`);
|
|
219
|
+
// 6. Linting phase
|
|
220
|
+
console.log(`\n${'='.repeat(60)}`);
|
|
221
|
+
console.log(`š§ Phase 2: Linting & Quality Checks`);
|
|
222
|
+
console.log(`${'='.repeat(60)}\n`);
|
|
223
|
+
const lintResult = await runComprehensiveLinting();
|
|
224
|
+
console.log(`\nā
Linting completed (${lintResult.fixCount} fixes applied)`);
|
|
225
|
+
// 7. Review phase (if review flag is set)
|
|
226
|
+
let reviewPerformed = false;
|
|
227
|
+
if (review) {
|
|
228
|
+
console.log(`\n${'='.repeat(60)}`);
|
|
229
|
+
console.log(`š Phase 3: Pre-Review (Full Context)`);
|
|
230
|
+
console.log(`${'='.repeat(60)}\n`);
|
|
231
|
+
const reviewSystemPrompt = buildReviewPrompt(ticket, claudeRules);
|
|
232
|
+
const reviewResult = await runAgent(`Review implementation of ticket ${ticketId} against CLAUDE.md rules`, {
|
|
233
|
+
systemPrompt: reviewSystemPrompt,
|
|
234
|
+
cwd,
|
|
235
|
+
maxTurns: 25,
|
|
236
|
+
verbosity: 'normal',
|
|
237
|
+
});
|
|
238
|
+
reviewFixCount = reviewResult.fixCount;
|
|
239
|
+
totalInputTokens += reviewResult.tokensUsed.input;
|
|
240
|
+
totalOutputTokens += reviewResult.tokensUsed.output;
|
|
241
|
+
totalCacheCreationTokens += reviewResult.tokensUsed.cacheCreation;
|
|
242
|
+
totalCacheReadTokens += reviewResult.tokensUsed.cacheRead;
|
|
243
|
+
totalCost += reviewResult.cost;
|
|
244
|
+
console.log(`\n⨠Pre-Review completed (${reviewFixCount} issues fixed)`);
|
|
245
|
+
console.log(`š° Review cost: ${formatCostBreakdown(reviewResult)}`);
|
|
246
|
+
// Run linting again after review fixes
|
|
247
|
+
if (reviewFixCount > 0) {
|
|
248
|
+
console.log('\nš§ Running linting after review fixes...');
|
|
249
|
+
await runComprehensiveLinting();
|
|
250
|
+
}
|
|
251
|
+
reviewPerformed = true;
|
|
252
|
+
}
|
|
253
|
+
// 8. Update status to Done
|
|
254
|
+
console.log('\nš Updating ticket status to Done...');
|
|
255
|
+
updateTicketStatus(ticketsPath, ticketId, 'Done');
|
|
256
|
+
console.log(' ā
Ticket marked as Done\n');
|
|
257
|
+
return {
|
|
258
|
+
ticketId,
|
|
259
|
+
success: true,
|
|
260
|
+
implementationFixCount,
|
|
261
|
+
lintFixCount: lintResult.fixCount,
|
|
262
|
+
reviewPerformed,
|
|
263
|
+
reviewFixCount,
|
|
264
|
+
gitDiffReviewed: false,
|
|
265
|
+
gitDiffReviewFixCount: 0,
|
|
266
|
+
tokensUsed: {
|
|
267
|
+
input: totalInputTokens,
|
|
268
|
+
output: totalOutputTokens,
|
|
269
|
+
cacheCreation: totalCacheCreationTokens,
|
|
270
|
+
cacheRead: totalCacheReadTokens,
|
|
271
|
+
},
|
|
272
|
+
cost: totalCost,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
// Update ticket status to Error
|
|
277
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
278
|
+
console.error(`\nā Implementation failed: ${errorMessage}`);
|
|
279
|
+
updateTicketStatus(ticketsPath, ticketId, 'Error', errorMessage);
|
|
280
|
+
return {
|
|
281
|
+
ticketId,
|
|
282
|
+
success: false,
|
|
283
|
+
implementationFixCount,
|
|
284
|
+
lintFixCount: 0,
|
|
285
|
+
reviewPerformed: false,
|
|
286
|
+
reviewFixCount,
|
|
287
|
+
gitDiffReviewed: false,
|
|
288
|
+
gitDiffReviewFixCount: 0,
|
|
289
|
+
tokensUsed: {
|
|
290
|
+
input: totalInputTokens,
|
|
291
|
+
output: totalOutputTokens,
|
|
292
|
+
cacheCreation: totalCacheCreationTokens,
|
|
293
|
+
cacheRead: totalCacheReadTokens,
|
|
294
|
+
},
|
|
295
|
+
cost: totalCost,
|
|
296
|
+
error: errorMessage,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Review git diff after implementation
|
|
302
|
+
*/
|
|
303
|
+
async function reviewGitDiff() {
|
|
304
|
+
console.log(`\n${'='.repeat(60)}`);
|
|
305
|
+
console.log(`š Reviewing Git Diff Against CLAUDE.md`);
|
|
306
|
+
console.log(`${'='.repeat(60)}\n`);
|
|
307
|
+
const result = await reviewCore({});
|
|
308
|
+
return {
|
|
309
|
+
fixCount: result.fixesApplied,
|
|
310
|
+
cost: result.cost,
|
|
311
|
+
tokensUsed: result.tokensUsed,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Main ship command
|
|
316
|
+
*/
|
|
317
|
+
export async function shipCommand(options) {
|
|
318
|
+
const { ticket: ticketId, commit = false, pr = false } = options;
|
|
319
|
+
console.log(`š¢ Shipping Ticket: ${ticketId}\n`);
|
|
320
|
+
try {
|
|
321
|
+
// Validate environment
|
|
322
|
+
if (!process.env.ANTHROPIC_API_KEY) {
|
|
323
|
+
throw new Error('ANTHROPIC_API_KEY environment variable is required');
|
|
324
|
+
}
|
|
325
|
+
// Validate mutually exclusive flags
|
|
326
|
+
if (commit && pr) {
|
|
327
|
+
throw new Error('Cannot use --commit and --pr together.\n' +
|
|
328
|
+
'Use --commit to push to current branch, or --pr to create a new branch with pull request.');
|
|
329
|
+
}
|
|
330
|
+
if (pr && !process.env.GITHUB_TOKEN) {
|
|
331
|
+
throw new Error('GITHUB_TOKEN environment variable is required for --pr flag');
|
|
332
|
+
}
|
|
333
|
+
if (commit && !process.env.GITHUB_TOKEN) {
|
|
334
|
+
throw new Error('GITHUB_TOKEN environment variable is required for --commit flag');
|
|
335
|
+
}
|
|
336
|
+
// If --pr flag is provided, wrap with PR workflow
|
|
337
|
+
if (pr) {
|
|
338
|
+
let diffReviewCost = 0;
|
|
339
|
+
let diffReviewFixCount = 0;
|
|
340
|
+
const { result: shipResult, prInfo } = await runWithPR({
|
|
341
|
+
branchPrefix: `feat/ticket-${ticketId}`,
|
|
342
|
+
baseBranch: options.baseBranch,
|
|
343
|
+
commitMessage: `feat: implement ${ticketId}`,
|
|
344
|
+
prTitle: `feat: Implement ${ticketId}`,
|
|
345
|
+
prBody: `## š« Ticket Implementation
|
|
346
|
+
|
|
347
|
+
Implements ticket **${ticketId}** from tickets.json.
|
|
348
|
+
|
|
349
|
+
### š Details
|
|
350
|
+
- Implementation fixes: ${0} (will be filled by result)
|
|
351
|
+
- Linting fixes: ${0}
|
|
352
|
+
- Review performed: ${options.review ? 'Yes' : 'No'}
|
|
353
|
+
|
|
354
|
+
---
|
|
355
|
+
|
|
356
|
+
š¤ *Generated by Kosuke CLI (\`kosuke ship --ticket=${ticketId} ${options.review ? '--review ' : ''}--pr\`)*`,
|
|
357
|
+
}, async () => {
|
|
358
|
+
// Run core implementation
|
|
359
|
+
const result = await shipCore(options);
|
|
360
|
+
// Review git diff before committing
|
|
361
|
+
const diffReview = await reviewGitDiff();
|
|
362
|
+
diffReviewCost = diffReview.cost;
|
|
363
|
+
diffReviewFixCount = diffReview.fixCount;
|
|
364
|
+
return result;
|
|
365
|
+
});
|
|
366
|
+
// Display summary with updated values
|
|
367
|
+
console.log('\nā
Ship completed successfully!');
|
|
368
|
+
console.log(`š Implementation fixes: ${shipResult.implementationFixCount}`);
|
|
369
|
+
console.log(`š§ Linting fixes: ${shipResult.lintFixCount}`);
|
|
370
|
+
if (shipResult.reviewPerformed) {
|
|
371
|
+
console.log(`š Pre-review fixes: ${shipResult.reviewFixCount}`);
|
|
372
|
+
}
|
|
373
|
+
console.log(`š Git diff review fixes: ${diffReviewFixCount}`);
|
|
374
|
+
console.log(`š° Total cost: $${(shipResult.cost + diffReviewCost).toFixed(4)}`);
|
|
375
|
+
console.log(`š PR: ${prInfo.prUrl}`);
|
|
376
|
+
}
|
|
377
|
+
else if (commit) {
|
|
378
|
+
// Run core logic
|
|
379
|
+
const result = await shipCore(options);
|
|
380
|
+
if (!result.success) {
|
|
381
|
+
throw new Error(result.error || 'Ship failed');
|
|
382
|
+
}
|
|
383
|
+
// Review git diff before committing
|
|
384
|
+
const diffReview = await reviewGitDiff();
|
|
385
|
+
// Commit and push to current branch
|
|
386
|
+
console.log('\nš Committing and pushing to current branch...');
|
|
387
|
+
await commitAndPushCurrentBranch(`feat: implement ${ticketId}`);
|
|
388
|
+
console.log(' ā
Changes committed and pushed\n');
|
|
389
|
+
console.log('\nā
Ship completed successfully!');
|
|
390
|
+
console.log(`š Implementation fixes: ${result.implementationFixCount}`);
|
|
391
|
+
console.log(`š§ Linting fixes: ${result.lintFixCount}`);
|
|
392
|
+
if (result.reviewPerformed) {
|
|
393
|
+
console.log(`š Pre-review fixes: ${result.reviewFixCount}`);
|
|
394
|
+
}
|
|
395
|
+
console.log(`š Git diff review fixes: ${diffReview.fixCount}`);
|
|
396
|
+
console.log(`š° Total cost: $${(result.cost + diffReview.cost).toFixed(4)}`);
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
// Run core logic without any git operations
|
|
400
|
+
const result = await shipCore(options);
|
|
401
|
+
if (!result.success) {
|
|
402
|
+
throw new Error(result.error || 'Ship failed');
|
|
403
|
+
}
|
|
404
|
+
console.log('\nā
Ship completed successfully!');
|
|
405
|
+
console.log(`š Implementation fixes: ${result.implementationFixCount}`);
|
|
406
|
+
console.log(`š§ Linting fixes: ${result.lintFixCount}`);
|
|
407
|
+
if (result.reviewPerformed) {
|
|
408
|
+
console.log(`š Review fixes: ${result.reviewFixCount}`);
|
|
409
|
+
}
|
|
410
|
+
console.log(`š° Total cost: $${result.cost.toFixed(4)}`);
|
|
411
|
+
console.log('\nā¹ļø Changes applied locally. Use --commit to push or --pr to create a pull request.');
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
catch (error) {
|
|
415
|
+
console.error('\nā Ship failed:', error);
|
|
416
|
+
throw error;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=ship.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship.js","sourceRoot":"","sources":["../../../kosuke/commands/ship.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAShE;;GAEG;AACH,SAAS,eAAe,CAAC,WAAmB;IAC1C,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,2BAA2B,WAAW,IAAI;YACxC,qDAAqD,CACxD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,iCAAiC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC1F,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,WAAmB,EAAE,WAAwB;IACpE,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5E,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,WAAwB,EAAE,QAAgB;IAC5D,OAAO,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CACzB,WAAmB,EACnB,QAAgB,EAChB,MAAwB,EACxB,KAAc;IAEd,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAEjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,cAAc,QAAQ,oCAAoC,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;IAED,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,eAAe,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAE1C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,0CAA0C;YACxC,sCAAsC,UAAU,EAAE,CACrD,CAAC;IACJ,CAAC;IAED,OAAO,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,SAAS,yBAAyB,CAAC,MAAc,EAAE,WAAmB,EAAE,QAAgB;IACtF,OAAO;;;;;;QAMD,MAAM,CAAC,EAAE;WACN,MAAM,CAAC,KAAK;;EAErB,MAAM,CAAC,WAAW;;;EAGlB,WAAW;;;wDAG2C,QAAQ;;;;;;;;;;;;;;;;;;;mFAmBmB,CAAC;AACpF,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,MAAc,EAAE,WAAmB;IAC5D,OAAO;;;sCAG6B,MAAM,CAAC,EAAE;;;QAGvC,MAAM,CAAC,EAAE;WACN,MAAM,CAAC,KAAK;;;EAGrB,WAAW;;;;;;;;;;;;;;;;;;;;;;;0EAuB6D,CAAC;AAC3E,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAoB;IACjD,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,EAAE,WAAW,GAAG,cAAc,EAAE,GAAG,OAAO,CAAC;IACnF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAE3C,8BAA8B;IAC9B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAEjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,UAAU,QAAQ,iBAAiB,WAAW,IAAI;YAChD,sBAAsB,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC1E,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,UAAU,QAAQ,+BAA+B;YAC/C,2EAA2E,WAAW,EAAE,CAC3F,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IAEpE,iCAAiC;IACjC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC1D,kBAAkB,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAErC,0BAA0B;IAC1B,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,sBAAsB,WAAW,CAAC,MAAM,gBAAgB,CAAC,CAAC;IAEtE,uCAAuC;IACvC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,4BAA4B,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,qCAAqC,QAAQ,CAAC,SAAS,IAAI,CAAC,CAAC;IAEzE,gBAAgB;IAChB,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,sBAAsB,GAAG,CAAC,CAAC;IAC/B,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,IAAI,CAAC;QACH,0BAA0B;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAEnC,MAAM,YAAY,GAAG,yBAAyB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;QAExF,MAAM,oBAAoB,GAAG,MAAM,QAAQ,CAAC,oBAAoB,QAAQ,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE;YAC3F,YAAY;YACZ,GAAG;YACH,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;QAEH,sBAAsB,GAAG,oBAAoB,CAAC,QAAQ,CAAC;QACvD,gBAAgB,IAAI,oBAAoB,CAAC,UAAU,CAAC,KAAK,CAAC;QAC1D,iBAAiB,IAAI,oBAAoB,CAAC,UAAU,CAAC,MAAM,CAAC;QAC5D,wBAAwB,IAAI,oBAAoB,CAAC,UAAU,CAAC,aAAa,CAAC;QAC1E,oBAAoB,IAAI,oBAAoB,CAAC,UAAU,CAAC,SAAS,CAAC;QAClE,SAAS,IAAI,oBAAoB,CAAC,IAAI,CAAC;QAEvC,OAAO,CAAC,GAAG,CAAC,iCAAiC,sBAAsB,gBAAgB,CAAC,CAAC;QACrF,OAAO,CAAC,GAAG,CAAC,2BAA2B,mBAAmB,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAEpF,mBAAmB;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAEnC,MAAM,UAAU,GAAG,MAAM,uBAAuB,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,0BAA0B,UAAU,CAAC,QAAQ,iBAAiB,CAAC,CAAC;QAE5E,0CAA0C;QAC1C,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YAEnC,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAElE,MAAM,YAAY,GAAG,MAAM,QAAQ,CACjC,mCAAmC,QAAQ,0BAA0B,EACrE;gBACE,YAAY,EAAE,kBAAkB;gBAChC,GAAG;gBACH,QAAQ,EAAE,EAAE;gBACZ,SAAS,EAAE,QAAQ;aACpB,CACF,CAAC;YAEF,cAAc,GAAG,YAAY,CAAC,QAAQ,CAAC;YACvC,gBAAgB,IAAI,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC;YAClD,iBAAiB,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC;YACpD,wBAAwB,IAAI,YAAY,CAAC,UAAU,CAAC,aAAa,CAAC;YAClE,oBAAoB,IAAI,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC;YAC1D,SAAS,IAAI,YAAY,CAAC,IAAI,CAAC;YAE/B,OAAO,CAAC,GAAG,CAAC,6BAA6B,cAAc,gBAAgB,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,mBAAmB,mBAAmB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAEpE,uCAAuC;YACvC,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;gBAC1D,MAAM,uBAAuB,EAAE,CAAC;YAClC,CAAC;YAED,eAAe,GAAG,IAAI,CAAC;QACzB,CAAC;QAED,2BAA2B;QAC3B,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,kBAAkB,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAE5C,OAAO;YACL,QAAQ;YACR,OAAO,EAAE,IAAI;YACb,sBAAsB;YACtB,YAAY,EAAE,UAAU,CAAC,QAAQ;YACjC,eAAe;YACf,cAAc;YACd,eAAe,EAAE,KAAK;YACtB,qBAAqB,EAAE,CAAC;YACxB,UAAU,EAAE;gBACV,KAAK,EAAE,gBAAgB;gBACvB,MAAM,EAAE,iBAAiB;gBACzB,aAAa,EAAE,wBAAwB;gBACvC,SAAS,EAAE,oBAAoB;aAChC;YACD,IAAI,EAAE,SAAS;SAChB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,gCAAgC;QAChC,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,OAAO,CAAC,KAAK,CAAC,8BAA8B,YAAY,EAAE,CAAC,CAAC;QAC5D,kBAAkB,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QAEjE,OAAO;YACL,QAAQ;YACR,OAAO,EAAE,KAAK;YACd,sBAAsB;YACtB,YAAY,EAAE,CAAC;YACf,eAAe,EAAE,KAAK;YACtB,cAAc;YACd,eAAe,EAAE,KAAK;YACtB,qBAAqB,EAAE,CAAC;YACxB,UAAU,EAAE;gBACV,KAAK,EAAE,gBAAgB;gBACvB,MAAM,EAAE,iBAAiB;gBACzB,aAAa,EAAE,wBAAwB;gBACvC,SAAS,EAAE,oBAAoB;aAChC;YACD,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,YAAY;SACpB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa;IAU1B,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAEnC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,CAAC,CAAC;IAEpC,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,YAAY;QAC7B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAoB;IACpD,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,uBAAuB,QAAQ,IAAI,CAAC,CAAC;IAEjD,IAAI,CAAC;QACH,uBAAuB;QACvB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QAED,oCAAoC;QACpC,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,0CAA0C;gBACxC,2FAA2F,CAC9F,CAAC;QACJ,CAAC;QAED,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QACjF,CAAC;QAED,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACrF,CAAC;QAED,kDAAkD;QAClD,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,cAAc,GAAG,CAAC,CAAC;YACvB,IAAI,kBAAkB,GAAG,CAAC,CAAC;YAE3B,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CACpD;gBACE,YAAY,EAAE,eAAe,QAAQ,EAAE;gBACvC,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,aAAa,EAAE,mBAAmB,QAAQ,EAAE;gBAC5C,OAAO,EAAE,mBAAmB,QAAQ,EAAE;gBACtC,MAAM,EAAE;;sBAEI,QAAQ;;;0BAGJ,CAAC;mBACR,CAAC;sBACE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;;;;sDAIG,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,UAAU;aACpG,EACD,KAAK,IAAI,EAAE;gBACT,0BAA0B;gBAC1B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAEvC,oCAAoC;gBACpC,MAAM,UAAU,GAAG,MAAM,aAAa,EAAE,CAAC;gBACzC,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC;gBACjC,kBAAkB,GAAG,UAAU,CAAC,QAAQ,CAAC;gBAEzC,OAAO,MAAM,CAAC;YAChB,CAAC,CACF,CAAC;YAEF,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,4BAA4B,UAAU,CAAC,sBAAsB,EAAE,CAAC,CAAC;YAC7E,OAAO,CAAC,GAAG,CAAC,qBAAqB,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;YAC5D,IAAI,UAAU,CAAC,eAAe,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,wBAAwB,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;YACnE,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,6BAA6B,kBAAkB,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,GAAG,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChF,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,MAAM,EAAE,CAAC;YAClB,iBAAiB;YACjB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEvC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;YACjD,CAAC;YAED,oCAAoC;YACpC,MAAM,UAAU,GAAG,MAAM,aAAa,EAAE,CAAC;YAEzC,oCAAoC;YACpC,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;YAChE,MAAM,0BAA0B,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;YAEnD,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,4BAA4B,MAAM,CAAC,sBAAsB,EAAE,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;YACxD,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,6BAA6B,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,4CAA4C;YAC5C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEvC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;YACjD,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,4BAA4B,MAAM,CAAC,sBAAsB,EAAE,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;YACxD,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;YAC3D,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CACT,uFAAuF,CACxF,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACzC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test command - Automated E2E testing with iterative fixing
|
|
3
|
+
*
|
|
4
|
+
* This command:
|
|
5
|
+
* 1. Loads a ticket and generates/locates Playwright tests
|
|
6
|
+
* 2. Runs tests with visual regression, console/network/docker log collection
|
|
7
|
+
* 3. If tests fail: analyzes errors and applies fixes
|
|
8
|
+
* 4. Re-runs tests until passing or max retries reached
|
|
9
|
+
* 5. Runs linting after tests pass
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* kosuke test --ticket=FRONTEND-1 # Test with auto-fix
|
|
13
|
+
* kosuke test --ticket=FRONTEND-1 --url=http://localhost:4000
|
|
14
|
+
* kosuke test --ticket=FRONTEND-1 --headed # Show browser
|
|
15
|
+
* kosuke test --ticket=FRONTEND-1 --update-baseline # Update visual baselines
|
|
16
|
+
* kosuke test --ticket=FRONTEND-1 --pr # Create PR with fixes
|
|
17
|
+
*/
|
|
18
|
+
import type { TestOptions, TestResult } from '../types.js';
|
|
19
|
+
/**
|
|
20
|
+
* Core test logic (git-agnostic, reusable)
|
|
21
|
+
*/
|
|
22
|
+
export declare function testCore(options: TestOptions): Promise<TestResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Main test command
|
|
25
|
+
*/
|
|
26
|
+
export declare function testCommand(options: TestOptions): Promise<void>;
|
|
27
|
+
//# sourceMappingURL=test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../kosuke/commands/test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAgBH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAU,MAAM,aAAa,CAAC;AAoCnE;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAsPxE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDrE"}
|