@kosuke-ai/cli 0.0.44 → 0.0.45

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 (82) hide show
  1. package/README.md +94 -1
  2. package/claude.costs.json +34 -0
  3. package/dist/index.js +27 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/kosuke/commands/build.d.ts +5 -1
  6. package/dist/kosuke/commands/build.d.ts.map +1 -1
  7. package/dist/kosuke/commands/build.js +297 -3
  8. package/dist/kosuke/commands/build.js.map +1 -1
  9. package/dist/kosuke/commands/migrate.d.ts +6 -1
  10. package/dist/kosuke/commands/migrate.d.ts.map +1 -1
  11. package/dist/kosuke/commands/migrate.js +124 -37
  12. package/dist/kosuke/commands/migrate.js.map +1 -1
  13. package/dist/kosuke/commands/plan.d.ts +4 -20
  14. package/dist/kosuke/commands/plan.d.ts.map +1 -1
  15. package/dist/kosuke/commands/plan.js +471 -679
  16. package/dist/kosuke/commands/plan.js.map +1 -1
  17. package/dist/kosuke/commands/requirements.js +2 -2
  18. package/dist/kosuke/commands/requirements.js.map +1 -1
  19. package/dist/kosuke/commands/review.d.ts +6 -1
  20. package/dist/kosuke/commands/review.d.ts.map +1 -1
  21. package/dist/kosuke/commands/review.js +168 -68
  22. package/dist/kosuke/commands/review.js.map +1 -1
  23. package/dist/kosuke/commands/serve.d.ts +9 -0
  24. package/dist/kosuke/commands/serve.d.ts.map +1 -0
  25. package/dist/kosuke/commands/serve.js +17 -0
  26. package/dist/kosuke/commands/serve.js.map +1 -0
  27. package/dist/kosuke/commands/ship.d.ts +6 -1
  28. package/dist/kosuke/commands/ship.d.ts.map +1 -1
  29. package/dist/kosuke/commands/ship.js +226 -67
  30. package/dist/kosuke/commands/ship.js.map +1 -1
  31. package/dist/kosuke/commands/test.d.ts +6 -1
  32. package/dist/kosuke/commands/test.d.ts.map +1 -1
  33. package/dist/kosuke/commands/test.js +171 -73
  34. package/dist/kosuke/commands/test.js.map +1 -1
  35. package/dist/kosuke/commands/tickets.d.ts +7 -15
  36. package/dist/kosuke/commands/tickets.d.ts.map +1 -1
  37. package/dist/kosuke/commands/tickets.js +14 -58
  38. package/dist/kosuke/commands/tickets.js.map +1 -1
  39. package/dist/kosuke/serve/middleware/error-handler.d.ts +13 -0
  40. package/dist/kosuke/serve/middleware/error-handler.d.ts.map +1 -0
  41. package/dist/kosuke/serve/middleware/error-handler.js +34 -0
  42. package/dist/kosuke/serve/middleware/error-handler.js.map +1 -0
  43. package/dist/kosuke/serve/middleware/validation.d.ts +13 -0
  44. package/dist/kosuke/serve/middleware/validation.d.ts.map +1 -0
  45. package/dist/kosuke/serve/middleware/validation.js +39 -0
  46. package/dist/kosuke/serve/middleware/validation.js.map +1 -0
  47. package/dist/kosuke/serve/routes/build.d.ts +6 -0
  48. package/dist/kosuke/serve/routes/build.d.ts.map +1 -0
  49. package/dist/kosuke/serve/routes/build.js +224 -0
  50. package/dist/kosuke/serve/routes/build.js.map +1 -0
  51. package/dist/kosuke/serve/routes/health.d.ts +6 -0
  52. package/dist/kosuke/serve/routes/health.d.ts.map +1 -0
  53. package/dist/kosuke/serve/routes/health.js +11 -0
  54. package/dist/kosuke/serve/routes/health.js.map +1 -0
  55. package/dist/kosuke/serve/routes/plan.d.ts +6 -0
  56. package/dist/kosuke/serve/routes/plan.d.ts.map +1 -0
  57. package/dist/kosuke/serve/routes/plan.js +104 -0
  58. package/dist/kosuke/serve/routes/plan.js.map +1 -0
  59. package/dist/kosuke/serve/server.d.ts +16 -0
  60. package/dist/kosuke/serve/server.d.ts.map +1 -0
  61. package/dist/kosuke/serve/server.js +63 -0
  62. package/dist/kosuke/serve/server.js.map +1 -0
  63. package/dist/kosuke/serve/validation/build.d.ts +41 -0
  64. package/dist/kosuke/serve/validation/build.d.ts.map +1 -0
  65. package/dist/kosuke/serve/validation/build.js +20 -0
  66. package/dist/kosuke/serve/validation/build.js.map +1 -0
  67. package/dist/kosuke/serve/validation/plan.d.ts +26 -0
  68. package/dist/kosuke/serve/validation/plan.d.ts.map +1 -0
  69. package/dist/kosuke/serve/validation/plan.js +15 -0
  70. package/dist/kosuke/serve/validation/plan.js.map +1 -0
  71. package/dist/kosuke/types.d.ts +205 -0
  72. package/dist/kosuke/types.d.ts.map +1 -1
  73. package/dist/kosuke/utils/claude-agent.d.ts +82 -6
  74. package/dist/kosuke/utils/claude-agent.d.ts.map +1 -1
  75. package/dist/kosuke/utils/claude-agent.js +381 -180
  76. package/dist/kosuke/utils/claude-agent.js.map +1 -1
  77. package/dist/lib.d.ts +4 -4
  78. package/dist/lib.d.ts.map +1 -1
  79. package/dist/lib.js +2 -1
  80. package/dist/lib.js.map +1 -1
  81. package/dist/package.json +6 -2
  82. package/package.json +6 -2
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Error handling middleware
3
+ */
4
+ /**
5
+ * 404 handler for unknown routes
6
+ */
7
+ export function notFoundHandler(req, res) {
8
+ res.status(404).json({
9
+ error: 'Not Found',
10
+ message: `Route ${req.method} ${req.path} not found`,
11
+ availableRoutes: ['GET /health', 'POST /api/plan'],
12
+ });
13
+ }
14
+ /**
15
+ * Global error handler (must be registered last)
16
+ */
17
+ export function errorHandler(err, req, res, _next) {
18
+ // JSON parsing errors
19
+ if (err instanceof SyntaxError && 'body' in err) {
20
+ res.status(400).json({
21
+ error: 'Invalid JSON',
22
+ message: 'Request body contains invalid JSON syntax',
23
+ details: err.message,
24
+ });
25
+ return;
26
+ }
27
+ // Generic error handler
28
+ console.error('Server error:', err);
29
+ res.status(500).json({
30
+ error: 'Internal Server Error',
31
+ message: err.message || 'An unexpected error occurred',
32
+ });
33
+ }
34
+ //# sourceMappingURL=error-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../../../kosuke/serve/middleware/error-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY,EAAE,GAAa;IACzD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,SAAS,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,YAAY;QACpD,eAAe,EAAE,CAAC,aAAa,EAAE,gBAAgB,CAAC;KACnD,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,GAAU,EAAE,GAAY,EAAE,GAAa,EAAE,KAAmB;IACvF,sBAAsB;IACtB,IAAI,GAAG,YAAY,WAAW,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;QAChD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE,cAAc;YACrB,OAAO,EAAE,2CAA2C;YACpD,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,wBAAwB;IACxB,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;IACpC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,KAAK,EAAE,uBAAuB;QAC9B,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,8BAA8B;KACvD,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Generic validation middleware
3
+ */
4
+ import type { Request, Response, NextFunction } from 'express';
5
+ import { z } from 'zod';
6
+ /**
7
+ * Generic validation middleware factory
8
+ *
9
+ * Validates request body against a Zod schema and returns 400 if invalid.
10
+ * Replaces req.body with validated data on success.
11
+ */
12
+ export declare function validateRequest(schema: z.ZodSchema): (req: Request, res: Response, next: NextFunction) => void;
13
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../kosuke/serve/middleware/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,IACzC,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,KAAG,IAAI,CA6B/D"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Generic validation middleware
3
+ */
4
+ /**
5
+ * Generic validation middleware factory
6
+ *
7
+ * Validates request body against a Zod schema and returns 400 if invalid.
8
+ * Replaces req.body with validated data on success.
9
+ */
10
+ export function validateRequest(schema) {
11
+ return (req, res, next) => {
12
+ try {
13
+ const result = schema.safeParse(req.body);
14
+ if (!result.success) {
15
+ // Format Zod errors into readable format
16
+ const errors = result.error.issues.map((err) => ({
17
+ field: err.path.join('.'),
18
+ message: err.message,
19
+ }));
20
+ res.status(400).json({
21
+ error: 'Validation Error',
22
+ message: 'Request validation failed',
23
+ details: errors,
24
+ });
25
+ return;
26
+ }
27
+ // Replace req.body with validated data
28
+ req.body = result.data;
29
+ next();
30
+ }
31
+ catch (error) {
32
+ res.status(500).json({
33
+ error: 'Internal Server Error',
34
+ message: error instanceof Error ? error.message : 'Unknown error',
35
+ });
36
+ }
37
+ };
38
+ }
39
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../kosuke/serve/middleware/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAAmB;IACjD,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAQ,EAAE;QAC/D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAE1C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,yCAAyC;gBACzC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC/C,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;oBACzB,OAAO,EAAE,GAAG,CAAC,OAAO;iBACrB,CAAC,CAAC,CAAC;gBAEJ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,kBAAkB;oBACzB,OAAO,EAAE,2BAA2B;oBACpC,OAAO,EAAE,MAAM;iBAChB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,uCAAuC;YACvC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACvB,IAAI,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,uBAAuB;gBAC9B,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAClE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Build command SSE route
3
+ */
4
+ import type { Request, Response } from 'express';
5
+ export declare function buildRoute(req: Request, res: Response): Promise<void>;
6
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../../kosuke/serve/routes/build.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAOjD,wBAAsB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA2P3E"}
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Build command SSE route
3
+ */
4
+ import { existsSync } from 'fs';
5
+ import { buildCoreStream } from '../../commands/build.js';
6
+ import { parseToolAction } from '../../utils/claude-agent.js';
7
+ export async function buildRoute(req, res) {
8
+ // Request body is already validated by middleware
9
+ const { cwd, ticketsFile, dbUrl, reset, review, url, headless, verbose, trace } = req.body;
10
+ // Verify directory exists
11
+ if (!existsSync(cwd)) {
12
+ res.status(400).json({
13
+ error: 'Invalid directory',
14
+ message: `Directory does not exist: ${cwd}`,
15
+ });
16
+ return;
17
+ }
18
+ // Set SSE headers
19
+ res.setHeader('Content-Type', 'text/event-stream');
20
+ res.setHeader('Cache-Control', 'no-cache');
21
+ res.setHeader('Connection', 'keep-alive');
22
+ const sendEvent = (event, data) => {
23
+ res.write(`event: ${event}\n`);
24
+ res.write(`data: ${JSON.stringify(data)}\n\n`);
25
+ };
26
+ try {
27
+ const options = {
28
+ directory: cwd,
29
+ ticketsFile,
30
+ dbUrl,
31
+ reset,
32
+ review,
33
+ url,
34
+ headless,
35
+ verbose,
36
+ trace,
37
+ // No askCommit/askConfirm in API mode (auto-commit everything)
38
+ };
39
+ const stream = buildCoreStream(options);
40
+ // Stream events to client
41
+ for await (const event of stream) {
42
+ switch (event.type) {
43
+ case 'build_started':
44
+ sendEvent('build_started', {
45
+ totalTickets: event.data.totalTickets,
46
+ ticketsFile: event.data.ticketsFile,
47
+ });
48
+ break;
49
+ case 'ticket_started':
50
+ sendEvent('ticket_started', {
51
+ ticket: event.data.ticket,
52
+ index: event.data.index,
53
+ total: event.data.total,
54
+ });
55
+ break;
56
+ case 'ticket_phase':
57
+ sendEvent('ticket_phase', {
58
+ phase: event.data.phase,
59
+ status: event.data.status,
60
+ });
61
+ break;
62
+ case 'ship_event':
63
+ // Handle nested ship events
64
+ if (event.data.type === 'message') {
65
+ const msg = event.data.data;
66
+ // Skip verbose tool results
67
+ if (msg.type === 'user' && 'tool_use_result' in msg) {
68
+ break;
69
+ }
70
+ // Skip system init
71
+ if (msg.type === 'system' && msg.subtype === 'init') {
72
+ break;
73
+ }
74
+ // Extract tool calls and text from assistant messages
75
+ if (msg.type === 'assistant' && msg.message) {
76
+ const msgData = msg.message;
77
+ if (msgData.content && Array.isArray(msgData.content)) {
78
+ let hasText = false;
79
+ for (const block of msgData.content) {
80
+ if (block.type === 'tool_use' && block.name) {
81
+ // Send tool call event
82
+ const toolInput = block.input;
83
+ const parsed = parseToolAction(block.name, toolInput);
84
+ sendEvent('ship_tool_call', {
85
+ action: parsed.action,
86
+ params: parsed.params,
87
+ });
88
+ }
89
+ else if (block.type === 'text' && block.text) {
90
+ hasText = true;
91
+ }
92
+ }
93
+ // Only forward message if it has text (skip usage-only)
94
+ if (hasText) {
95
+ sendEvent('ship_message', msg);
96
+ }
97
+ }
98
+ }
99
+ }
100
+ else {
101
+ // Forward other ship events as-is
102
+ sendEvent(`ship_${event.data.type}`, event.data.data);
103
+ }
104
+ break;
105
+ case 'test_event':
106
+ // Handle nested test events (uses Playwright MCP, different event structure)
107
+ if (event.data.type === 'tool_executed') {
108
+ // Send tool execution as tool_call
109
+ const toolData = event.data.data;
110
+ sendEvent('test_tool_call', {
111
+ action: toolData.toolName,
112
+ params: { success: toolData.success },
113
+ });
114
+ }
115
+ else if (event.data.type === 'assistant_message') {
116
+ // Send assistant message with text (skip if empty)
117
+ const msgData = event.data.data;
118
+ if (msgData.text && msgData.text.trim()) {
119
+ sendEvent('test_message', { text: msgData.text });
120
+ }
121
+ }
122
+ else {
123
+ // Forward other test events as-is
124
+ sendEvent(`test_${event.data.type}`, event.data.data);
125
+ }
126
+ break;
127
+ case 'migrate_event':
128
+ // Handle nested migrate events
129
+ if (event.data.type === 'message') {
130
+ const msg = event.data.data;
131
+ // Skip verbose tool results
132
+ if (msg.type === 'user' && 'tool_use_result' in msg) {
133
+ break;
134
+ }
135
+ // Skip system init
136
+ if (msg.type === 'system' && msg.subtype === 'init') {
137
+ break;
138
+ }
139
+ // Extract tool calls and text from assistant messages
140
+ if (msg.type === 'assistant' && msg.message) {
141
+ const msgData = msg.message;
142
+ if (msgData.content && Array.isArray(msgData.content)) {
143
+ let hasText = false;
144
+ for (const block of msgData.content) {
145
+ if (block.type === 'tool_use' && block.name) {
146
+ // Send tool call event
147
+ const toolInput = block.input;
148
+ const parsed = parseToolAction(block.name, toolInput);
149
+ sendEvent('migrate_tool_call', {
150
+ action: parsed.action,
151
+ params: parsed.params,
152
+ });
153
+ }
154
+ else if (block.type === 'text' && block.text) {
155
+ hasText = true;
156
+ }
157
+ }
158
+ // Only forward message if it has text (skip usage-only)
159
+ if (hasText) {
160
+ sendEvent('migrate_message', msg);
161
+ }
162
+ }
163
+ }
164
+ }
165
+ else {
166
+ // Forward other migrate events as-is
167
+ sendEvent(`migrate_${event.data.type}`, event.data.data);
168
+ }
169
+ break;
170
+ case 'test_retry':
171
+ sendEvent('test_retry', {
172
+ attempt: event.data.attempt,
173
+ maxRetries: event.data.maxRetries,
174
+ error: event.data.error,
175
+ });
176
+ break;
177
+ case 'ticket_completed':
178
+ sendEvent('ticket_completed', {
179
+ ticket: event.data.ticket,
180
+ result: event.data.result,
181
+ });
182
+ break;
183
+ case 'ticket_committed':
184
+ sendEvent('ticket_committed', {
185
+ ticket: event.data.ticket,
186
+ commitMessage: event.data.commitMessage,
187
+ });
188
+ break;
189
+ case 'progress':
190
+ sendEvent('progress', {
191
+ completed: event.data.completed,
192
+ total: event.data.total,
193
+ percentage: event.data.percentage,
194
+ });
195
+ break;
196
+ case 'done':
197
+ sendEvent('done', {
198
+ success: event.data.success,
199
+ ticketsProcessed: event.data.ticketsProcessed,
200
+ ticketsSucceeded: event.data.ticketsSucceeded,
201
+ ticketsFailed: event.data.ticketsFailed,
202
+ totalCost: event.data.totalCost,
203
+ tokensUsed: event.data.tokensUsed,
204
+ });
205
+ break;
206
+ }
207
+ }
208
+ }
209
+ catch (error) {
210
+ sendEvent('done', {
211
+ success: false,
212
+ ticketsProcessed: 0,
213
+ ticketsSucceeded: 0,
214
+ ticketsFailed: 0,
215
+ totalCost: 0,
216
+ tokensUsed: { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 },
217
+ error: error instanceof Error ? error.message : String(error),
218
+ });
219
+ }
220
+ finally {
221
+ res.end();
222
+ }
223
+ }
224
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../../kosuke/serve/routes/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Health check route
3
+ */
4
+ import type { Request, Response } from 'express';
5
+ export declare function healthRoute(_req: Request, res: Response): void;
6
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../../kosuke/serve/routes/health.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEjD,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,CAM9D"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Health check route
3
+ */
4
+ export function healthRoute(_req, res) {
5
+ res.json({
6
+ status: 'ok',
7
+ uptime: process.uptime(),
8
+ timestamp: new Date().toISOString(),
9
+ });
10
+ }
11
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../../../kosuke/serve/routes/health.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,UAAU,WAAW,CAAC,IAAa,EAAE,GAAa;IACtD,GAAG,CAAC,IAAI,CAAC;QACP,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;QACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Plan command SSE route
3
+ */
4
+ import type { Request, Response } from 'express';
5
+ export declare function planRoute(req: Request, res: Response): Promise<void>;
6
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../../kosuke/serve/routes/plan.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAOjD,wBAAsB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAiH1E"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Plan command SSE route
3
+ */
4
+ import { planCoreStream } from '../../commands/plan.js';
5
+ import { parseToolAction } from '../../utils/claude-agent.js';
6
+ import { existsSync } from 'fs';
7
+ export async function planRoute(req, res) {
8
+ // Request body is already validated by middleware
9
+ const { query, cwd, noTest, resume } = req.body;
10
+ // Verify directory exists
11
+ if (!existsSync(cwd)) {
12
+ res.status(400).json({
13
+ error: 'Invalid directory',
14
+ message: `Directory does not exist: ${cwd}`,
15
+ });
16
+ return;
17
+ }
18
+ // Set SSE headers
19
+ res.setHeader('Content-Type', 'text/event-stream');
20
+ res.setHeader('Cache-Control', 'no-cache');
21
+ res.setHeader('Connection', 'keep-alive');
22
+ const sendEvent = (event, data) => {
23
+ res.write(`event: ${event}\n`);
24
+ res.write(`data: ${JSON.stringify(data)}\n\n`);
25
+ };
26
+ try {
27
+ const options = {
28
+ prompt: query,
29
+ directory: cwd,
30
+ noTest,
31
+ resume,
32
+ };
33
+ const stream = planCoreStream(options);
34
+ // Stream polished events (filter verbose content)
35
+ for await (const event of stream) {
36
+ if (event.type === 'tool_call') {
37
+ // Parse and send tool call event
38
+ const toolInput = event.data.input;
39
+ const parsed = parseToolAction(event.data.name, toolInput);
40
+ sendEvent('tool_call', {
41
+ action: parsed.action,
42
+ params: parsed.params,
43
+ });
44
+ }
45
+ else if (event.type === 'message') {
46
+ const msg = event.data;
47
+ // Skip verbose tool results (file contents, grep results)
48
+ if (msg.type === 'user' && 'tool_use_result' in msg) {
49
+ continue; // Don't send file contents to client
50
+ }
51
+ // Skip system init (too verbose)
52
+ if (msg.type === 'system' && msg.subtype === 'init') {
53
+ continue;
54
+ }
55
+ // Send assistant messages (text only, tool calls handled separately)
56
+ if (msg.type === 'assistant') {
57
+ const polishedMsg = {
58
+ type: msg.type,
59
+ session_id: msg.session_id,
60
+ };
61
+ // Extract text content
62
+ const msgData = msg.message;
63
+ if (msgData.content && Array.isArray(msgData.content)) {
64
+ for (const block of msgData.content) {
65
+ if (block.type === 'text' && block.text) {
66
+ polishedMsg.text = block.text;
67
+ }
68
+ }
69
+ }
70
+ // Include token usage
71
+ if (msgData.usage) {
72
+ polishedMsg.usage = msgData.usage;
73
+ }
74
+ // Only send if there's actual text content (skip usage-only messages)
75
+ if (polishedMsg.text) {
76
+ sendEvent('message', polishedMsg);
77
+ }
78
+ }
79
+ // Skip result messages (usage-only, not useful for client)
80
+ }
81
+ else if (event.type === 'done') {
82
+ // Send final result
83
+ sendEvent('done', {
84
+ status: event.data.status,
85
+ ticketsFile: event.data.ticketsFile,
86
+ tokensUsed: event.data.tokensUsed,
87
+ cost: event.data.cost,
88
+ sessionId: event.data.sessionId,
89
+ error: event.data.error,
90
+ });
91
+ }
92
+ }
93
+ }
94
+ catch (error) {
95
+ sendEvent('done', {
96
+ status: 'error',
97
+ error: error instanceof Error ? error.message : String(error),
98
+ });
99
+ }
100
+ finally {
101
+ res.end();
102
+ }
103
+ }
104
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../../kosuke/serve/routes/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Express server for Kosuke CLI commands over HTTP with SSE
3
+ */
4
+ import express from 'express';
5
+ export interface ServeOptions {
6
+ port?: number;
7
+ }
8
+ /**
9
+ * Create and configure Express server
10
+ */
11
+ export declare function createServer(): express.Express;
12
+ /**
13
+ * Start the Kosuke server
14
+ */
15
+ export declare function startServer(options?: ServeOptions): Promise<never>;
16
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../kosuke/serve/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAS9B,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAAC,OAAO,CAgB9C;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,CAoC5E"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Express server for Kosuke CLI commands over HTTP with SSE
3
+ */
4
+ import express from 'express';
5
+ import { healthRoute } from './routes/health.js';
6
+ import { planRoute } from './routes/plan.js';
7
+ import { buildRoute } from './routes/build.js';
8
+ import { validateRequest } from './middleware/validation.js';
9
+ import { errorHandler, notFoundHandler } from './middleware/error-handler.js';
10
+ import { planRequestSchema } from './validation/plan.js';
11
+ import { buildRequestSchema } from './validation/build.js';
12
+ /**
13
+ * Create and configure Express server
14
+ */
15
+ export function createServer() {
16
+ const app = express();
17
+ // Middleware
18
+ app.use(express.json());
19
+ // Routes
20
+ app.get('/health', healthRoute);
21
+ app.post('/api/plan', validateRequest(planRequestSchema), planRoute);
22
+ app.post('/api/build', validateRequest(buildRequestSchema), buildRoute);
23
+ // Error handlers (must be last)
24
+ app.use(notFoundHandler);
25
+ app.use(errorHandler);
26
+ return app;
27
+ }
28
+ /**
29
+ * Start the Kosuke server
30
+ */
31
+ export async function startServer(options = {}) {
32
+ const port = options.port || 3000;
33
+ // Validate environment
34
+ if (!process.env.ANTHROPIC_API_KEY) {
35
+ throw new Error('ANTHROPIC_API_KEY environment variable is required');
36
+ }
37
+ if (!process.env.GITHUB_TOKEN) {
38
+ throw new Error('GITHUB_TOKEN environment variable is required for build command');
39
+ }
40
+ const app = createServer();
41
+ return new Promise((_, reject) => {
42
+ const server = app.listen(port, () => {
43
+ console.log(`
44
+ ╔══════════════════════════════════════════════════════════════════════════════╗
45
+ ║ Kosuke Server Running ║
46
+ ╚══════════════════════════════════════════════════════════════════════════════╝
47
+
48
+ 🚀 Server listening on http://localhost:${port}
49
+
50
+ 📡 Available endpoints:
51
+ GET /health - Health check
52
+ POST /api/plan - Plan command with SSE
53
+ POST /api/build - Build command with SSE
54
+
55
+ Press Ctrl+C to stop the server.
56
+ `);
57
+ });
58
+ server.on('error', (error) => {
59
+ reject(error);
60
+ });
61
+ });
62
+ }
63
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../kosuke/serve/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAM3D;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IAEtB,aAAa;IACb,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAExB,SAAS;IACT,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAChC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,iBAAiB,CAAC,EAAE,SAAS,CAAC,CAAC;IACrE,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,CAAC;IAExE,gCAAgC;IAChC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACzB,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAEtB,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAwB,EAAE;IAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;IAElC,uBAAuB;IACvB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAE3B,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;YACnC,OAAO,CAAC,GAAG,CAAC;;;;;0CAKwB,IAAI;;;;;;;;CAQ7C,CAAC,CAAC;QACC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3B,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Build command validation schemas
3
+ */
4
+ import { z } from 'zod';
5
+ /**
6
+ * Build request validation schema
7
+ * Note: No askCommit/askConfirm in API mode (auto-commit everything)
8
+ */
9
+ export declare const buildRequestSchema: z.ZodObject<{
10
+ cwd: z.ZodString;
11
+ ticketsFile: z.ZodOptional<z.ZodString>;
12
+ dbUrl: z.ZodOptional<z.ZodString>;
13
+ reset: z.ZodOptional<z.ZodBoolean>;
14
+ review: z.ZodOptional<z.ZodBoolean>;
15
+ url: z.ZodOptional<z.ZodString>;
16
+ headless: z.ZodOptional<z.ZodBoolean>;
17
+ verbose: z.ZodOptional<z.ZodBoolean>;
18
+ trace: z.ZodOptional<z.ZodBoolean>;
19
+ }, "strip", z.ZodTypeAny, {
20
+ cwd: string;
21
+ verbose?: boolean | undefined;
22
+ url?: string | undefined;
23
+ review?: boolean | undefined;
24
+ dbUrl?: string | undefined;
25
+ trace?: boolean | undefined;
26
+ headless?: boolean | undefined;
27
+ ticketsFile?: string | undefined;
28
+ reset?: boolean | undefined;
29
+ }, {
30
+ cwd: string;
31
+ verbose?: boolean | undefined;
32
+ url?: string | undefined;
33
+ review?: boolean | undefined;
34
+ dbUrl?: string | undefined;
35
+ trace?: boolean | undefined;
36
+ headless?: boolean | undefined;
37
+ ticketsFile?: string | undefined;
38
+ reset?: boolean | undefined;
39
+ }>;
40
+ export type BuildRequest = z.infer<typeof buildRequestSchema>;
41
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../../kosuke/serve/validation/build.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC"}