@kosuke-ai/cli 0.0.44 → 0.0.46

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
package/README.md CHANGED
@@ -32,6 +32,7 @@ import {
32
32
  lintCommand,
33
33
  syncRulesCommand,
34
34
  requirementsCommand,
35
+ planCoreStream,
35
36
  discoverFiles,
36
37
  createBatches,
37
38
  runLint,
@@ -61,6 +62,20 @@ const lintResult = await runLint();
61
62
  if (!lintResult.success) {
62
63
  console.error('Linting failed:', lintResult.error);
63
64
  }
65
+
66
+ // Stream plan command (for real-time updates)
67
+ const stream = planCoreStream({
68
+ prompt: 'Add dark mode',
69
+ directory: './my-project',
70
+ });
71
+
72
+ for await (const event of stream) {
73
+ if (event.type === 'message') {
74
+ console.log('Claude:', event.data.text);
75
+ } else if (event.type === 'done') {
76
+ console.log('Result:', event.data);
77
+ }
78
+ }
64
79
  ```
65
80
 
66
81
  #### Local Development with npm link
@@ -79,12 +94,15 @@ Now your project will use the local kosuke-cli, and changes will be reflected au
79
94
 
80
95
  ## Prerequisites
81
96
 
82
- Set up the required environment variable:
97
+ Set up the required environment variables:
83
98
 
84
99
  ```bash
85
100
  # Required for Claude API access
86
101
  export ANTHROPIC_API_KEY="your-api-key-here"
87
102
 
103
+ # Optional: Specify Claude model (default: claude-haiku-4-5-20251001)
104
+ export ANTHROPIC_MODEL="claude-haiku-4-5-20251001"
105
+
88
106
  # Optional: Only required when using --pr flag
89
107
  export GITHUB_TOKEN="your-github-token-here"
90
108
  ```
@@ -93,9 +111,18 @@ You can also create a `.env` file in your project root:
93
111
 
94
112
  ```env
95
113
  ANTHROPIC_API_KEY=your-api-key-here
114
+ ANTHROPIC_MODEL=claude-haiku-4-5-20251001
96
115
  GITHUB_TOKEN=your-github-token-here
97
116
  ```
98
117
 
118
+ **Available Models:**
119
+
120
+ - `claude-haiku-4-5-20251001` - Fast and cost-effective (default)
121
+ - `claude-sonnet-4-5-20250929` - Balanced performance and quality
122
+ - `claude-opus-4-5-20251101` - Highest quality, slower
123
+
124
+ Model pricing is configured in `claude.costs.json` (per million tokens).
125
+
99
126
  ### CLI Logging (Optional)
100
127
 
101
128
  Kosuke CLI can automatically log command executions to kosuke-core for analytics, cost monitoring, and debugging. This feature is optional and requires additional configuration.
@@ -148,6 +175,72 @@ Use the `--pr` flag to automatically create a pull request with the changes.
148
175
 
149
176
  ## Commands
150
177
 
178
+ ### `kosuke serve`
179
+
180
+ Start an HTTP server that exposes Kosuke CLI commands via REST API with Server-Sent Events (SSE) for real-time streaming.
181
+
182
+ **Options:**
183
+
184
+ - `--port=<number>` - Port to listen on (default: 3000)
185
+
186
+ **Examples:**
187
+
188
+ ```bash
189
+ # Start server on default port 3000
190
+ kosuke serve
191
+
192
+ # Start server on custom port
193
+ kosuke serve --port=8080
194
+ ```
195
+
196
+ **API Endpoints:**
197
+
198
+ - `GET /health` - Health check endpoint
199
+ - `POST /api/plan` - Plan command with SSE streaming
200
+ - `POST /api/build` - Build command with SSE streaming
201
+
202
+ **Example API Usage:**
203
+
204
+ ```bash
205
+ # Health check
206
+ curl http://localhost:3000/health
207
+
208
+ # Plan command with SSE
209
+ curl -N -X POST http://localhost:3000/api/plan \
210
+ -H "Content-Type: application/json" \
211
+ -d '{
212
+ "query": "Add dark mode toggle",
213
+ "cwd": "/path/to/project",
214
+ "noTest": false
215
+ }'
216
+
217
+ # Build command with SSE
218
+ curl -N -X POST http://localhost:3000/api/build \
219
+ -H "Content-Type: application/json" \
220
+ -d '{
221
+ "cwd": "/path/to/project",
222
+ "review": true,
223
+ "url": "http://localhost:3000"
224
+ }'
225
+ ```
226
+
227
+ **SSE Event Types:**
228
+
229
+ The API returns Server-Sent Events (SSE) with the following event types:
230
+
231
+ - `tool_call` - Tool execution events (file reads, bash commands, etc.)
232
+ - `message` - Assistant text messages (Claude's reasoning and updates)
233
+ - `done` - Final result with statistics, tokens used, and cost
234
+
235
+ **Request Validation:**
236
+
237
+ All API requests are validated using Zod schemas:
238
+
239
+ - `/api/plan` requires: `{ query: string, cwd: string, noTest?: boolean, resume?: string }`
240
+ - `/api/build` requires: `{ cwd: string, ticketsFile?: string, reset?: boolean, review?: boolean }`
241
+
242
+ Invalid requests return 400 with detailed error messages.
243
+
151
244
  ### `kosuke sync-rules`
152
245
 
153
246
  Sync rules and documentation from kosuke-template repository.
@@ -0,0 +1,34 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "description": "Claude model pricing configuration (per million tokens)",
4
+ "models": {
5
+ "claude-haiku-4-5-20251001": {
6
+ "name": "Claude Haiku 4.5",
7
+ "input": 1.0,
8
+ "output": 5.0,
9
+ "cacheCreation": 1.25,
10
+ "cacheRead": 0.1
11
+ },
12
+ "claude-sonnet-4-5-20250929": {
13
+ "name": "Claude Sonnet 4.5",
14
+ "input": 3.0,
15
+ "output": 15.0,
16
+ "cacheCreation": 3.75,
17
+ "cacheRead": 0.3
18
+ },
19
+ "claude-opus-4-5-20251101": {
20
+ "name": "Claude Opus 4.5",
21
+ "input": 5.0,
22
+ "output": 25.0,
23
+ "cacheCreation": 6.25,
24
+ "cacheRead": 0.5
25
+ }
26
+ },
27
+ "default": {
28
+ "name": "Claude Haiku 4.5",
29
+ "input": 1.0,
30
+ "output": 5.0,
31
+ "cacheCreation": 1.25,
32
+ "cacheRead": 0.1
33
+ }
34
+ }
package/dist/index.js CHANGED
@@ -40,6 +40,7 @@ import { migrateCommand } from './kosuke/commands/migrate.js';
40
40
  import { planCommand } from './kosuke/commands/plan.js';
41
41
  import { requirementsCommand } from './kosuke/commands/requirements.js';
42
42
  import { reviewCommand } from './kosuke/commands/review.js';
43
+ import { serveCommand } from './kosuke/commands/serve.js';
43
44
  import { syncRulesCommand } from './kosuke/commands/sync-rules.js';
44
45
  import { testCommand } from './kosuke/commands/test.js';
45
46
  import { ticketsCommand } from './kosuke/commands/tickets.js';
@@ -97,6 +98,7 @@ async function main() {
97
98
  args.find((arg) => arg.startsWith('--dir='))?.split('=')[1],
98
99
  noTest: args.includes('--no-test'),
99
100
  noLogs: args.includes('--no-logs'),
101
+ resume: args.find((arg) => arg.startsWith('--resume='))?.split('=')[1],
100
102
  };
101
103
  if (!options.prompt) {
102
104
  console.error('❌ The --prompt flag is required\n');
@@ -104,6 +106,7 @@ async function main() {
104
106
  console.log('\nOptions:');
105
107
  console.log(' --prompt="..." Feature or bug description (required)');
106
108
  console.log(' --directory=PATH Directory with existing code (default: cwd)');
109
+ console.log(' --resume=SESSION_ID Resume a previous planning session');
107
110
  console.log(' --no-test Skip WEB-TEST ticket creation');
108
111
  console.log('\nOutput:');
109
112
  console.log(' Tickets are saved to tickets/{timestamp}.ticket.json');
@@ -111,6 +114,7 @@ async function main() {
111
114
  console.log(' kosuke plan --prompt="Add dark mode toggle"');
112
115
  console.log(' kosuke plan --prompt="Fix login timeout bug" --directory=./my-app');
113
116
  console.log(' kosuke plan --prompt="Add user notifications" --no-test');
117
+ console.log(' kosuke plan --prompt="continue" --resume=<session-id>');
114
118
  process.exit(1);
115
119
  }
116
120
  await planCommand(options);
@@ -208,6 +212,13 @@ async function main() {
208
212
  await testCommand(options);
209
213
  break;
210
214
  }
215
+ case 'serve': {
216
+ const options = {
217
+ port: parseInt(args.find((arg) => arg.startsWith('--port='))?.split('=')[1] || '3000'),
218
+ };
219
+ await serveCommand(options);
220
+ break;
221
+ }
211
222
  default:
212
223
  console.error(`❌ Unknown command: ${command}\n`);
213
224
  showHelp();
@@ -227,6 +238,21 @@ function showHelp() {
227
238
 
228
239
  COMMANDS:
229
240
 
241
+ serve [options]
242
+ Start HTTP server for Kosuke CLI commands
243
+ Provides SSE endpoints for real-time command execution
244
+
245
+ Options:
246
+ --port=<number> Port to listen on (default: 3000)
247
+
248
+ Examples:
249
+ kosuke serve # Start on port 3000
250
+ kosuke serve --port=8080 # Start on custom port
251
+
252
+ Endpoints:
253
+ GET /health # Health check
254
+ POST /api/plan # Plan command with SSE
255
+
230
256
  sync-rules [options]
231
257
  Sync rules and documentation from kosuke-template
232
258
 
@@ -298,6 +324,7 @@ COMMANDS:
298
324
  kosuke plan --prompt="Add dark mode toggle"
299
325
  kosuke plan --prompt="Fix login timeout bug" --directory=./my-app
300
326
  kosuke plan --prompt="Add user notifications" --no-test
327
+ kosuke plan --prompt="continue" --resume=<session-id>
301
328
 
302
329
  Features:
303
330
  - Analyzes codebase to understand existing patterns
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
@@ -23,7 +23,11 @@
23
23
  * kosuke build
24
24
  * gh pr create
25
25
  */
26
- import type { BuildOptions } from '../types.js';
26
+ import type { BuildOptions, BuildStreamEvent } from '../types.js';
27
+ /**
28
+ * Streaming version of build - orchestrates all sub-commands with SSE events
29
+ */
30
+ export declare function buildCoreStream(options: BuildOptions): AsyncGenerator<BuildStreamEvent, void, void>;
27
31
  /**
28
32
  * Main build command - processes all tickets and commits each one
29
33
  */
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../kosuke/commands/build.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAU,MAAM,aAAa,CAAC;AA6ExD;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAySvE"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../kosuke/commands/build.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAU,MAAM,aAAa,CAAC;AAiF1E;;GAEG;AACH,wBAAuB,eAAe,CACpC,OAAO,EAAE,YAAY,GACpB,cAAc,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,CAkV9C;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA2SvE"}
@@ -29,8 +29,11 @@ import * as readline from 'readline';
29
29
  import simpleGit from 'simple-git';
30
30
  import { generateWebTestPrompt } from '../utils/prompt-generator.js';
31
31
  import { loadTicketsFile, saveTicketsFile, updateTicketStatus, } from '../utils/tickets-manager.js';
32
+ import { migrateCoreStream } from './migrate.js';
32
33
  import { migrateCore } from './migrate.js';
34
+ import { shipCoreStream } from './ship.js';
33
35
  import { shipCore } from './ship.js';
36
+ import { testCoreStream } from './test.js';
34
37
  import { testCore } from './test.js';
35
38
  /**
36
39
  * Prompt user for confirmation to continue
@@ -81,6 +84,7 @@ function getTicketsToProcess(ticketsData) {
81
84
  }
82
85
  /**
83
86
  * Commit a single ticket to current branch
87
+ * Returns the commit message
84
88
  */
85
89
  async function commitTicket(ticket, cwd) {
86
90
  const git = simpleGit(cwd);
@@ -90,7 +94,295 @@ async function commitTicket(ticket, cwd) {
90
94
  const ticketType = ticket.type || 'feat';
91
95
  const commitMessage = `${ticketType}: ${ticket.id} - ${ticket.title}`;
92
96
  await git.commit(commitMessage, ['--no-verify']);
93
- console.log(`\n ✅ Committed: ${commitMessage}\n`);
97
+ return commitMessage;
98
+ }
99
+ /**
100
+ * Streaming version of build - orchestrates all sub-commands with SSE events
101
+ */
102
+ export async function* buildCoreStream(options) {
103
+ const { directory, ticketsFile = 'tickets.json', dbUrl = 'postgres://postgres:postgres@localhost:5432/postgres', reset = false, review = true, url, headless, verbose, trace, } = options;
104
+ // 1. Validate and resolve directory
105
+ const cwd = directory ? resolve(directory) : process.cwd();
106
+ if (!existsSync(cwd)) {
107
+ yield {
108
+ type: 'done',
109
+ data: {
110
+ success: false,
111
+ ticketsProcessed: 0,
112
+ ticketsSucceeded: 0,
113
+ ticketsFailed: 0,
114
+ totalCost: 0,
115
+ tokensUsed: { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 },
116
+ },
117
+ };
118
+ return;
119
+ }
120
+ const stats = statSync(cwd);
121
+ if (!stats.isDirectory()) {
122
+ yield {
123
+ type: 'done',
124
+ data: {
125
+ success: false,
126
+ ticketsProcessed: 0,
127
+ ticketsSucceeded: 0,
128
+ ticketsFailed: 0,
129
+ totalCost: 0,
130
+ tokensUsed: { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 },
131
+ },
132
+ };
133
+ return;
134
+ }
135
+ const ticketsPath = join(cwd, ticketsFile);
136
+ // 2. Load tickets
137
+ const ticketsData = loadTicketsFile(ticketsPath);
138
+ // 3. Reset all tickets to "Todo" if --reset flag is provided
139
+ if (reset) {
140
+ ticketsData.tickets.forEach((ticket) => {
141
+ if (ticket.status !== 'Todo') {
142
+ ticket.status = 'Todo';
143
+ delete ticket.error;
144
+ }
145
+ });
146
+ saveTicketsFile(ticketsPath, ticketsData);
147
+ }
148
+ const ticketsToProcess = getTicketsToProcess(ticketsData);
149
+ if (ticketsToProcess.length === 0) {
150
+ yield {
151
+ type: 'done',
152
+ data: {
153
+ success: true,
154
+ ticketsProcessed: 0,
155
+ ticketsSucceeded: 0,
156
+ ticketsFailed: 0,
157
+ totalCost: 0,
158
+ tokensUsed: { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 },
159
+ },
160
+ };
161
+ return;
162
+ }
163
+ // Yield build started event
164
+ yield {
165
+ type: 'build_started',
166
+ data: { totalTickets: ticketsToProcess.length, ticketsFile: ticketsPath },
167
+ };
168
+ // Track cumulative metrics
169
+ let totalInputTokens = 0;
170
+ let totalOutputTokens = 0;
171
+ let totalCacheCreationTokens = 0;
172
+ let totalCacheReadTokens = 0;
173
+ let totalCost = 0;
174
+ let ticketsSucceeded = 0;
175
+ let ticketsFailed = 0;
176
+ // 4. Process each ticket sequentially
177
+ for (let i = 0; i < ticketsToProcess.length; i++) {
178
+ const ticket = ticketsToProcess[i];
179
+ // Yield ticket started
180
+ yield {
181
+ type: 'ticket_started',
182
+ data: { ticket, index: i + 1, total: ticketsToProcess.length },
183
+ };
184
+ try {
185
+ // Update status to InProgress
186
+ updateTicketStatus(ticketsPath, ticket.id, 'InProgress');
187
+ // Process ticket based on type
188
+ const isTestTicket = ticket.type === 'test';
189
+ if (isTestTicket) {
190
+ // Test ticket with retry logic (Task 6)
191
+ yield { type: 'ticket_phase', data: { phase: 'test', status: 'started' } };
192
+ const testPrompt = generateWebTestPrompt(ticket);
193
+ let testSuccess = false;
194
+ let retryCount = 0;
195
+ const maxRetries = 3;
196
+ while (!testSuccess && retryCount <= maxRetries) {
197
+ // Run test
198
+ for await (const event of testCoreStream({
199
+ prompt: testPrompt,
200
+ context: {
201
+ ticketId: ticket.id,
202
+ ticketTitle: ticket.title,
203
+ ticketDescription: ticket.description,
204
+ },
205
+ url,
206
+ headless,
207
+ verbose,
208
+ trace,
209
+ })) {
210
+ yield { type: 'test_event', data: event };
211
+ if (event.type === 'done') {
212
+ const testResult = event.data;
213
+ testSuccess = testResult.success;
214
+ // Track metrics
215
+ totalInputTokens += testResult.tokensUsed.input;
216
+ totalOutputTokens += testResult.tokensUsed.output;
217
+ totalCacheCreationTokens += testResult.tokensUsed.cacheCreation;
218
+ totalCacheReadTokens += testResult.tokensUsed.cacheRead;
219
+ totalCost += testResult.cost;
220
+ // If test failed and we have retries left, create fix ticket
221
+ if (!testSuccess && retryCount < maxRetries) {
222
+ retryCount++;
223
+ yield {
224
+ type: 'test_retry',
225
+ data: {
226
+ attempt: retryCount,
227
+ maxRetries,
228
+ error: testResult.error || 'Test failed',
229
+ },
230
+ };
231
+ // Create fix ticket
232
+ const fixTicket = {
233
+ id: `${ticket.id}-FIX-${retryCount}`,
234
+ title: `Fix ${ticket.id} test failures`,
235
+ description: `Fix the following test failures:\n\n${testResult.error}\n\nOriginal ticket:\n${ticket.description}`,
236
+ type: 'backend',
237
+ estimatedEffort: 5,
238
+ status: 'InProgress',
239
+ category: ticket.category,
240
+ };
241
+ // Run ship to fix test
242
+ for await (const shipEvent of shipCoreStream({
243
+ ticketData: fixTicket,
244
+ review: false,
245
+ directory: cwd,
246
+ dbUrl,
247
+ })) {
248
+ yield { type: 'ship_event', data: shipEvent };
249
+ if (shipEvent.type === 'done') {
250
+ const shipResult = shipEvent.data;
251
+ totalInputTokens += shipResult.tokensUsed.input;
252
+ totalOutputTokens += shipResult.tokensUsed.output;
253
+ totalCacheCreationTokens += shipResult.tokensUsed.cacheCreation;
254
+ totalCacheReadTokens += shipResult.tokensUsed.cacheRead;
255
+ totalCost += shipResult.cost;
256
+ if (!shipResult.success) {
257
+ // Fix failed, will retry test anyway
258
+ break;
259
+ }
260
+ }
261
+ }
262
+ }
263
+ }
264
+ }
265
+ }
266
+ if (!testSuccess) {
267
+ throw new Error(`Test failed after ${maxRetries} fix attempts`);
268
+ }
269
+ yield { type: 'ticket_phase', data: { phase: 'test', status: 'completed' } };
270
+ }
271
+ else {
272
+ // Implementation ticket - run ship
273
+ yield { type: 'ticket_phase', data: { phase: 'ship', status: 'started' } };
274
+ let shipSuccess = false;
275
+ for await (const event of shipCoreStream({
276
+ ticketData: ticket,
277
+ review,
278
+ directory: cwd,
279
+ dbUrl,
280
+ })) {
281
+ yield { type: 'ship_event', data: event };
282
+ if (event.type === 'done') {
283
+ const shipResult = event.data;
284
+ shipSuccess = shipResult.success;
285
+ totalInputTokens += shipResult.tokensUsed.input;
286
+ totalOutputTokens += shipResult.tokensUsed.output;
287
+ totalCacheCreationTokens += shipResult.tokensUsed.cacheCreation;
288
+ totalCacheReadTokens += shipResult.tokensUsed.cacheRead;
289
+ totalCost += shipResult.cost;
290
+ if (!shipSuccess) {
291
+ throw new Error(shipResult.error || 'Ship failed');
292
+ }
293
+ }
294
+ }
295
+ yield { type: 'ticket_phase', data: { phase: 'ship', status: 'completed' } };
296
+ // If schema ticket, run migrations
297
+ if (ticket.type === 'schema') {
298
+ yield { type: 'ticket_phase', data: { phase: 'migrate', status: 'started' } };
299
+ let migrateSuccess = false;
300
+ for await (const event of migrateCoreStream({
301
+ directory: cwd,
302
+ dbUrl,
303
+ context: {
304
+ ticketId: ticket.id,
305
+ ticketTitle: ticket.title,
306
+ ticketDescription: ticket.description,
307
+ },
308
+ })) {
309
+ yield { type: 'migrate_event', data: event };
310
+ if (event.type === 'done') {
311
+ const migrateResult = event.data;
312
+ migrateSuccess = migrateResult.success;
313
+ totalInputTokens += migrateResult.tokensUsed.input;
314
+ totalOutputTokens += migrateResult.tokensUsed.output;
315
+ totalCacheCreationTokens += migrateResult.tokensUsed.cacheCreation;
316
+ totalCacheReadTokens += migrateResult.tokensUsed.cacheRead;
317
+ totalCost += migrateResult.cost;
318
+ if (!migrateSuccess) {
319
+ throw new Error(migrateResult.error || 'Migration failed');
320
+ }
321
+ }
322
+ }
323
+ yield { type: 'ticket_phase', data: { phase: 'migrate', status: 'completed' } };
324
+ }
325
+ }
326
+ // Ticket succeeded
327
+ updateTicketStatus(ticketsPath, ticket.id, 'Done');
328
+ ticketsSucceeded++;
329
+ yield {
330
+ type: 'ticket_completed',
331
+ data: { ticket, result: 'success' },
332
+ };
333
+ // Auto-commit (no interactive prompts in streaming mode)
334
+ const commitMessage = await commitTicket(ticket, cwd);
335
+ yield {
336
+ type: 'ticket_committed',
337
+ data: { ticket, commitMessage },
338
+ };
339
+ // Yield progress
340
+ yield {
341
+ type: 'progress',
342
+ data: {
343
+ completed: i + 1,
344
+ total: ticketsToProcess.length,
345
+ percentage: Math.round(((i + 1) / ticketsToProcess.length) * 100),
346
+ },
347
+ };
348
+ }
349
+ catch (error) {
350
+ const errorMessage = error instanceof Error ? error.message : String(error);
351
+ // Update ticket status to Error
352
+ updateTicketStatus(ticketsPath, ticket.id, 'Error', errorMessage);
353
+ ticketsFailed++;
354
+ yield {
355
+ type: 'ticket_completed',
356
+ data: { ticket, result: 'failed' },
357
+ };
358
+ // Continue to next ticket on failure (don't stop entire build)
359
+ yield {
360
+ type: 'progress',
361
+ data: {
362
+ completed: i + 1,
363
+ total: ticketsToProcess.length,
364
+ percentage: Math.round(((i + 1) / ticketsToProcess.length) * 100),
365
+ },
366
+ };
367
+ }
368
+ }
369
+ // Yield final result
370
+ yield {
371
+ type: 'done',
372
+ data: {
373
+ success: ticketsFailed === 0,
374
+ ticketsProcessed: ticketsToProcess.length,
375
+ ticketsSucceeded,
376
+ ticketsFailed,
377
+ totalCost,
378
+ tokensUsed: {
379
+ input: totalInputTokens,
380
+ output: totalOutputTokens,
381
+ cacheCreation: totalCacheCreationTokens,
382
+ cacheRead: totalCacheReadTokens,
383
+ },
384
+ },
385
+ };
94
386
  }
95
387
  /**
96
388
  * Main build command - processes all tickets and commits each one
@@ -288,7 +580,8 @@ export async function buildCommand(options) {
288
580
  // Interactive: ask before committing
289
581
  const commitConfirmed = await promptConfirmation(`\n❓ Commit ${ticket.id}?`);
290
582
  if (commitConfirmed) {
291
- await commitTicket(ticket, cwd);
583
+ const commitMessage = await commitTicket(ticket, cwd);
584
+ console.log(`\n ✅ Committed: ${commitMessage}\n`);
292
585
  }
293
586
  else {
294
587
  console.log(' ⏭️ Skipped commit for this ticket\n');
@@ -296,7 +589,8 @@ export async function buildCommand(options) {
296
589
  }
297
590
  else {
298
591
  // Default: auto-commit each ticket
299
- await commitTicket(ticket, cwd);
592
+ const commitMessage = await commitTicket(ticket, cwd);
593
+ console.log(`\n ✅ Committed: ${commitMessage}\n`);
300
594
  }
301
595
  // Ask for confirmation before proceeding to next ticket (if not last ticket)
302
596
  if (askConfirm && i < ticketsToProcess.length - 1) {