@kosuke-ai/cli 0.0.42 โ 0.0.44
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.js +37 -15
- package/dist/index.js.map +1 -1
- package/dist/kosuke/commands/build.d.ts.map +1 -1
- package/dist/kosuke/commands/build.js +3 -1
- package/dist/kosuke/commands/build.js.map +1 -1
- package/dist/kosuke/commands/plan.d.ts.map +1 -1
- package/dist/kosuke/commands/plan.js +57 -36
- package/dist/kosuke/commands/plan.js.map +1 -1
- package/dist/kosuke/commands/test.d.ts +5 -5
- package/dist/kosuke/commands/test.d.ts.map +1 -1
- package/dist/kosuke/commands/test.js +321 -86
- package/dist/kosuke/commands/test.js.map +1 -1
- package/dist/kosuke/commands/tickets.d.ts.map +1 -1
- package/dist/kosuke/commands/tickets.js +28 -14
- package/dist/kosuke/commands/tickets.js.map +1 -1
- package/dist/kosuke/types.d.ts +14 -3
- package/dist/kosuke/types.d.ts.map +1 -1
- package/dist/kosuke/utils/playwright-mcp-client.d.ts +45 -0
- package/dist/kosuke/utils/playwright-mcp-client.d.ts.map +1 -0
- package/dist/kosuke/utils/playwright-mcp-client.js +131 -0
- package/dist/kosuke/utils/playwright-mcp-client.js.map +1 -0
- package/dist/kosuke/utils/tickets-manager.d.ts +41 -1
- package/dist/kosuke/utils/tickets-manager.d.ts.map +1 -1
- package/dist/kosuke/utils/tickets-manager.js +278 -1
- package/dist/kosuke/utils/tickets-manager.js.map +1 -1
- package/dist/lib.d.ts +3 -3
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +1 -1
- package/dist/lib.js.map +1 -1
- package/dist/package.json +2 -2
- package/package.json +2 -2
- package/dist/kosuke/utils/ticket-writer.d.ts +0 -48
- package/dist/kosuke/utils/ticket-writer.d.ts.map +0 -1
- package/dist/kosuke/utils/ticket-writer.js +0 -259
- package/dist/kosuke/utils/ticket-writer.js.map +0 -1
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared ticket writing and validation utilities
|
|
3
|
-
*
|
|
4
|
-
* Used by both `plan` and `tickets` commands to ensure consistent
|
|
5
|
-
* ticket structure, validation, and file output.
|
|
6
|
-
*/
|
|
7
|
-
import { writeFileSync } from 'fs';
|
|
8
|
-
import { runAgent } from './claude-agent.js';
|
|
9
|
-
/**
|
|
10
|
-
* Parse tickets from a JSON string or response
|
|
11
|
-
* Validates basic structure and normalizes data
|
|
12
|
-
*/
|
|
13
|
-
export function parseTickets(response) {
|
|
14
|
-
// Extract JSON from response (in case Claude includes extra text)
|
|
15
|
-
const jsonMatch = response.match(/\[[\s\S]*\]/);
|
|
16
|
-
if (!jsonMatch) {
|
|
17
|
-
throw new Error('No JSON array found in response');
|
|
18
|
-
}
|
|
19
|
-
const tickets = JSON.parse(jsonMatch[0]);
|
|
20
|
-
if (!Array.isArray(tickets)) {
|
|
21
|
-
throw new Error(`Expected array of tickets, got ${typeof tickets}`);
|
|
22
|
-
}
|
|
23
|
-
const validTypes = ['schema', 'backend', 'frontend', 'test'];
|
|
24
|
-
for (const ticket of tickets) {
|
|
25
|
-
if (!ticket.id || !ticket.title || !ticket.description) {
|
|
26
|
-
throw new Error(`Invalid ticket structure: ${JSON.stringify(ticket)}`);
|
|
27
|
-
}
|
|
28
|
-
if (!ticket.type || !validTypes.includes(ticket.type)) {
|
|
29
|
-
throw new Error(`Invalid or missing type for ticket ${ticket.id}: ${ticket.type}`);
|
|
30
|
-
}
|
|
31
|
-
if (typeof ticket.estimatedEffort !== 'number' ||
|
|
32
|
-
ticket.estimatedEffort < 1 ||
|
|
33
|
-
ticket.estimatedEffort > 10) {
|
|
34
|
-
throw new Error(`Invalid estimatedEffort for ticket ${ticket.id}: ${ticket.estimatedEffort}`);
|
|
35
|
-
}
|
|
36
|
-
if (!ticket.status) {
|
|
37
|
-
ticket.status = 'Todo';
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
return tickets;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Sort tickets by processing order
|
|
44
|
-
*/
|
|
45
|
-
export function sortTicketsByOrder(tickets) {
|
|
46
|
-
return [...tickets].sort((a, b) => {
|
|
47
|
-
const getPhaseOrder = (id) => {
|
|
48
|
-
const upper = id.toUpperCase();
|
|
49
|
-
// SCAFFOLD batch first
|
|
50
|
-
if (upper.startsWith('SCAFFOLD-SCHEMA-'))
|
|
51
|
-
return 1;
|
|
52
|
-
if (upper.startsWith('SCAFFOLD-BACKEND-'))
|
|
53
|
-
return 2;
|
|
54
|
-
if (upper.startsWith('SCAFFOLD-FRONTEND-'))
|
|
55
|
-
return 3;
|
|
56
|
-
if (upper.startsWith('SCAFFOLD-WEB-TEST-'))
|
|
57
|
-
return 4;
|
|
58
|
-
// LOGIC batch second
|
|
59
|
-
if (upper.startsWith('LOGIC-SCHEMA-'))
|
|
60
|
-
return 5;
|
|
61
|
-
if (upper.startsWith('LOGIC-BACKEND-'))
|
|
62
|
-
return 6;
|
|
63
|
-
if (upper.startsWith('LOGIC-FRONTEND-'))
|
|
64
|
-
return 7;
|
|
65
|
-
if (upper.startsWith('LOGIC-WEB-TEST-'))
|
|
66
|
-
return 8;
|
|
67
|
-
// PLAN batch (from plan command)
|
|
68
|
-
if (upper.startsWith('PLAN-SCHEMA-'))
|
|
69
|
-
return 10;
|
|
70
|
-
if (upper.startsWith('PLAN-BACKEND-'))
|
|
71
|
-
return 11;
|
|
72
|
-
if (upper.startsWith('PLAN-FRONTEND-'))
|
|
73
|
-
return 12;
|
|
74
|
-
if (upper.startsWith('PLAN-WEB-TEST-'))
|
|
75
|
-
return 13;
|
|
76
|
-
return 14;
|
|
77
|
-
};
|
|
78
|
-
return getPhaseOrder(a.id) - getPhaseOrder(b.id);
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Build the review/fix prompt for ticket validation
|
|
83
|
-
*/
|
|
84
|
-
function buildReviewPrompt(tickets) {
|
|
85
|
-
return `You are a ticket validation and correction expert.
|
|
86
|
-
|
|
87
|
-
**Generated Tickets to Review:**
|
|
88
|
-
${JSON.stringify(tickets, null, 2)}
|
|
89
|
-
|
|
90
|
-
**Your Task: VALIDATE AND FIX the tickets according to these rules:**
|
|
91
|
-
|
|
92
|
-
**RULE 1: ONE Schema Ticket Per Batch**
|
|
93
|
-
- Each batch (SCAFFOLD, LOGIC, or simple SCHEMA) should have at most ONE schema ticket
|
|
94
|
-
- If multiple schema tickets exist, merge them into one
|
|
95
|
-
- โ WRONG: SCHEMA-1, SCHEMA-2, SCHEMA-3
|
|
96
|
-
- โ
CORRECT: SCHEMA-1 (combines ALL schemas)
|
|
97
|
-
|
|
98
|
-
**RULE 2: Feature-by-Feature Ordering**
|
|
99
|
-
Each feature should follow this pattern when possible:
|
|
100
|
-
1. Backend ticket
|
|
101
|
-
2. Frontend ticket
|
|
102
|
-
3. Test ticket (if applicable)
|
|
103
|
-
|
|
104
|
-
**RULE 3: Sequential Numbering**
|
|
105
|
-
- Ensure ticket IDs are numbered sequentially
|
|
106
|
-
- Example: BACKEND-1, BACKEND-2 (not BACKEND-1, BACKEND-5)
|
|
107
|
-
|
|
108
|
-
**RULE 4: Test Tickets Must Include Credentials**
|
|
109
|
-
- Every WEB-TEST ticket should include test user credentials if available
|
|
110
|
-
- Format: "**Test User Credentials:**\\n- Email: user+kosuke_test@example.com\\n- OTP Code: 424242"
|
|
111
|
-
|
|
112
|
-
**AUTOMATIC FIXES TO APPLY:**
|
|
113
|
-
|
|
114
|
-
1. **Combine Schema Tickets** if multiple exist
|
|
115
|
-
2. **Reorder Tickets** to follow feature-by-feature pattern
|
|
116
|
-
3. **Renumber Ticket IDs** to be sequential
|
|
117
|
-
4. **Add placeholder credentials** to test tickets if missing
|
|
118
|
-
|
|
119
|
-
**OUTPUT FORMAT:**
|
|
120
|
-
Return ONLY a valid JSON object with this exact structure:
|
|
121
|
-
{
|
|
122
|
-
"validationIssues": [
|
|
123
|
-
"Issue 1 found and fixed",
|
|
124
|
-
"Issue 2 found and fixed"
|
|
125
|
-
],
|
|
126
|
-
"fixedTickets": [
|
|
127
|
-
{ /* all ticket objects in corrected order */ }
|
|
128
|
-
]
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
**CRITICAL:**
|
|
132
|
-
- Return ONLY valid JSON (no markdown, no code blocks)
|
|
133
|
-
- fixedTickets array must contain ALL tickets
|
|
134
|
-
- Preserve all ticket content (descriptions, effort, category)
|
|
135
|
-
- Only fix structure, ordering, and numbering issues
|
|
136
|
-
- If no issues found, return empty validationIssues with original tickets`;
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Validate and fix tickets using Claude
|
|
140
|
-
* Returns fixed tickets and list of issues found
|
|
141
|
-
*/
|
|
142
|
-
export async function validateAndFixTickets(tickets, projectPath) {
|
|
143
|
-
console.log(`\n${'โ'.repeat(60)}`);
|
|
144
|
-
console.log('๐ Validating ticket structure...');
|
|
145
|
-
console.log(`${'โ'.repeat(60)}\n`);
|
|
146
|
-
const reviewPrompt = buildReviewPrompt(tickets);
|
|
147
|
-
const reviewResult = await runAgent('Validate and fix ticket structure', {
|
|
148
|
-
systemPrompt: reviewPrompt,
|
|
149
|
-
maxTurns: 10,
|
|
150
|
-
verbosity: 'minimal',
|
|
151
|
-
cwd: projectPath,
|
|
152
|
-
});
|
|
153
|
-
try {
|
|
154
|
-
const jsonMatch = reviewResult.response.match(/\{[\s\S]*"fixedTickets"[\s\S]*\}/);
|
|
155
|
-
if (!jsonMatch) {
|
|
156
|
-
throw new Error('No valid review result found');
|
|
157
|
-
}
|
|
158
|
-
const parsed = JSON.parse(jsonMatch[0]);
|
|
159
|
-
if (!parsed.fixedTickets || !Array.isArray(parsed.fixedTickets)) {
|
|
160
|
-
throw new Error('Invalid review result: fixedTickets must be an array');
|
|
161
|
-
}
|
|
162
|
-
// Validate fixed tickets
|
|
163
|
-
const validTypes = ['schema', 'backend', 'frontend', 'test'];
|
|
164
|
-
for (const ticket of parsed.fixedTickets) {
|
|
165
|
-
if (!ticket.id || !ticket.title || !ticket.description || !ticket.type) {
|
|
166
|
-
throw new Error(`Invalid ticket in review result: ${JSON.stringify(ticket)}`);
|
|
167
|
-
}
|
|
168
|
-
if (!validTypes.includes(ticket.type)) {
|
|
169
|
-
throw new Error(`Invalid type in ticket ${ticket.id}: ${ticket.type}`);
|
|
170
|
-
}
|
|
171
|
-
// Ensure status is set
|
|
172
|
-
if (!ticket.status) {
|
|
173
|
-
ticket.status = 'Todo';
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
// Display validation results
|
|
177
|
-
if (parsed.validationIssues.length > 0) {
|
|
178
|
-
console.log('๐ง Issues found and fixed:');
|
|
179
|
-
parsed.validationIssues.forEach((issue, idx) => {
|
|
180
|
-
console.log(` ${idx + 1}. ${issue}`);
|
|
181
|
-
});
|
|
182
|
-
console.log('');
|
|
183
|
-
}
|
|
184
|
-
else {
|
|
185
|
-
console.log('โ
No validation issues - tickets are correctly structured\n');
|
|
186
|
-
}
|
|
187
|
-
return parsed;
|
|
188
|
-
}
|
|
189
|
-
catch (error) {
|
|
190
|
-
// If validation fails, return original tickets with warning
|
|
191
|
-
console.warn('โ ๏ธ Ticket validation failed, using original tickets');
|
|
192
|
-
console.warn(` Error: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
193
|
-
return {
|
|
194
|
-
validationIssues: [],
|
|
195
|
-
fixedTickets: tickets,
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Write tickets to a JSON file
|
|
201
|
-
*/
|
|
202
|
-
export function writeTicketsFile(outputPath, tickets) {
|
|
203
|
-
const outputData = {
|
|
204
|
-
generatedAt: new Date().toISOString(),
|
|
205
|
-
totalTickets: tickets.length,
|
|
206
|
-
tickets,
|
|
207
|
-
};
|
|
208
|
-
writeFileSync(outputPath, JSON.stringify(outputData, null, 2), 'utf-8');
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Display tickets summary to console
|
|
212
|
-
*/
|
|
213
|
-
export function displayTicketsSummary(tickets) {
|
|
214
|
-
console.log(`\n${'='.repeat(60)}`);
|
|
215
|
-
console.log('๐ Tickets Created');
|
|
216
|
-
console.log(`${'='.repeat(60)}\n`);
|
|
217
|
-
for (const ticket of tickets) {
|
|
218
|
-
const emoji = ticket.type === 'schema'
|
|
219
|
-
? '๐๏ธ'
|
|
220
|
-
: ticket.type === 'backend'
|
|
221
|
-
? 'โ๏ธ'
|
|
222
|
-
: ticket.type === 'frontend'
|
|
223
|
-
? '๐จ'
|
|
224
|
-
: '๐งช';
|
|
225
|
-
console.log(`${emoji} ${ticket.id}: ${ticket.title}`);
|
|
226
|
-
console.log(` Type: ${ticket.type} | Effort: ${ticket.estimatedEffort}/10`);
|
|
227
|
-
if (ticket.category) {
|
|
228
|
-
console.log(` Category: ${ticket.category}`);
|
|
229
|
-
}
|
|
230
|
-
console.log('');
|
|
231
|
-
}
|
|
232
|
-
console.log(`${'='.repeat(60)}`);
|
|
233
|
-
console.log(`โ
Total: ${tickets.length} ticket(s)`);
|
|
234
|
-
console.log(`${'='.repeat(60)}\n`);
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Full pipeline: parse, validate, sort, and write tickets
|
|
238
|
-
* Used by both plan.ts and tickets.ts
|
|
239
|
-
*/
|
|
240
|
-
export async function processAndWriteTickets(rawTickets, outputPath, projectPath, options = {}) {
|
|
241
|
-
const { skipValidation = false, displaySummary = true } = options;
|
|
242
|
-
let finalTickets = sortTicketsByOrder(rawTickets);
|
|
243
|
-
let validationIssues = [];
|
|
244
|
-
// Run validation unless skipped
|
|
245
|
-
if (!skipValidation) {
|
|
246
|
-
const reviewResult = await validateAndFixTickets(finalTickets, projectPath);
|
|
247
|
-
finalTickets = reviewResult.fixedTickets;
|
|
248
|
-
validationIssues = reviewResult.validationIssues;
|
|
249
|
-
}
|
|
250
|
-
// Display summary
|
|
251
|
-
if (displaySummary) {
|
|
252
|
-
displayTicketsSummary(finalTickets);
|
|
253
|
-
}
|
|
254
|
-
// Write to file
|
|
255
|
-
writeTicketsFile(outputPath, finalTickets);
|
|
256
|
-
console.log(`๐พ Saved to: ${outputPath}\n`);
|
|
257
|
-
return { tickets: finalTickets, validationIssues };
|
|
258
|
-
}
|
|
259
|
-
//# sourceMappingURL=ticket-writer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ticket-writer.js","sourceRoot":"","sources":["../../../kosuke/utils/ticket-writer.ts"],"names":[],"mappings":"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"}
|