@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.
Files changed (35) hide show
  1. package/dist/index.js +37 -15
  2. package/dist/index.js.map +1 -1
  3. package/dist/kosuke/commands/build.d.ts.map +1 -1
  4. package/dist/kosuke/commands/build.js +3 -1
  5. package/dist/kosuke/commands/build.js.map +1 -1
  6. package/dist/kosuke/commands/plan.d.ts.map +1 -1
  7. package/dist/kosuke/commands/plan.js +57 -36
  8. package/dist/kosuke/commands/plan.js.map +1 -1
  9. package/dist/kosuke/commands/test.d.ts +5 -5
  10. package/dist/kosuke/commands/test.d.ts.map +1 -1
  11. package/dist/kosuke/commands/test.js +321 -86
  12. package/dist/kosuke/commands/test.js.map +1 -1
  13. package/dist/kosuke/commands/tickets.d.ts.map +1 -1
  14. package/dist/kosuke/commands/tickets.js +28 -14
  15. package/dist/kosuke/commands/tickets.js.map +1 -1
  16. package/dist/kosuke/types.d.ts +14 -3
  17. package/dist/kosuke/types.d.ts.map +1 -1
  18. package/dist/kosuke/utils/playwright-mcp-client.d.ts +45 -0
  19. package/dist/kosuke/utils/playwright-mcp-client.d.ts.map +1 -0
  20. package/dist/kosuke/utils/playwright-mcp-client.js +131 -0
  21. package/dist/kosuke/utils/playwright-mcp-client.js.map +1 -0
  22. package/dist/kosuke/utils/tickets-manager.d.ts +41 -1
  23. package/dist/kosuke/utils/tickets-manager.d.ts.map +1 -1
  24. package/dist/kosuke/utils/tickets-manager.js +278 -1
  25. package/dist/kosuke/utils/tickets-manager.js.map +1 -1
  26. package/dist/lib.d.ts +3 -3
  27. package/dist/lib.d.ts.map +1 -1
  28. package/dist/lib.js +1 -1
  29. package/dist/lib.js.map +1 -1
  30. package/dist/package.json +2 -2
  31. package/package.json +2 -2
  32. package/dist/kosuke/utils/ticket-writer.d.ts +0 -48
  33. package/dist/kosuke/utils/ticket-writer.d.ts.map +0 -1
  34. package/dist/kosuke/utils/ticket-writer.js +0 -259
  35. 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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"}