@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.
- package/README.md +94 -1
- package/claude.costs.json +34 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -1
- package/dist/kosuke/commands/build.d.ts +5 -1
- package/dist/kosuke/commands/build.d.ts.map +1 -1
- package/dist/kosuke/commands/build.js +297 -3
- package/dist/kosuke/commands/build.js.map +1 -1
- package/dist/kosuke/commands/migrate.d.ts +6 -1
- package/dist/kosuke/commands/migrate.d.ts.map +1 -1
- package/dist/kosuke/commands/migrate.js +124 -37
- package/dist/kosuke/commands/migrate.js.map +1 -1
- package/dist/kosuke/commands/plan.d.ts +4 -20
- package/dist/kosuke/commands/plan.d.ts.map +1 -1
- package/dist/kosuke/commands/plan.js +471 -679
- package/dist/kosuke/commands/plan.js.map +1 -1
- package/dist/kosuke/commands/requirements.js +2 -2
- package/dist/kosuke/commands/requirements.js.map +1 -1
- package/dist/kosuke/commands/review.d.ts +6 -1
- package/dist/kosuke/commands/review.d.ts.map +1 -1
- package/dist/kosuke/commands/review.js +168 -68
- package/dist/kosuke/commands/review.js.map +1 -1
- package/dist/kosuke/commands/serve.d.ts +9 -0
- package/dist/kosuke/commands/serve.d.ts.map +1 -0
- package/dist/kosuke/commands/serve.js +17 -0
- package/dist/kosuke/commands/serve.js.map +1 -0
- package/dist/kosuke/commands/ship.d.ts +6 -1
- package/dist/kosuke/commands/ship.d.ts.map +1 -1
- package/dist/kosuke/commands/ship.js +226 -67
- package/dist/kosuke/commands/ship.js.map +1 -1
- package/dist/kosuke/commands/test.d.ts +6 -1
- package/dist/kosuke/commands/test.d.ts.map +1 -1
- package/dist/kosuke/commands/test.js +171 -73
- package/dist/kosuke/commands/test.js.map +1 -1
- package/dist/kosuke/commands/tickets.d.ts +7 -15
- package/dist/kosuke/commands/tickets.d.ts.map +1 -1
- package/dist/kosuke/commands/tickets.js +14 -58
- package/dist/kosuke/commands/tickets.js.map +1 -1
- package/dist/kosuke/serve/middleware/error-handler.d.ts +13 -0
- package/dist/kosuke/serve/middleware/error-handler.d.ts.map +1 -0
- package/dist/kosuke/serve/middleware/error-handler.js +34 -0
- package/dist/kosuke/serve/middleware/error-handler.js.map +1 -0
- package/dist/kosuke/serve/middleware/validation.d.ts +13 -0
- package/dist/kosuke/serve/middleware/validation.d.ts.map +1 -0
- package/dist/kosuke/serve/middleware/validation.js +39 -0
- package/dist/kosuke/serve/middleware/validation.js.map +1 -0
- package/dist/kosuke/serve/routes/build.d.ts +6 -0
- package/dist/kosuke/serve/routes/build.d.ts.map +1 -0
- package/dist/kosuke/serve/routes/build.js +224 -0
- package/dist/kosuke/serve/routes/build.js.map +1 -0
- package/dist/kosuke/serve/routes/health.d.ts +6 -0
- package/dist/kosuke/serve/routes/health.d.ts.map +1 -0
- package/dist/kosuke/serve/routes/health.js +11 -0
- package/dist/kosuke/serve/routes/health.js.map +1 -0
- package/dist/kosuke/serve/routes/plan.d.ts +6 -0
- package/dist/kosuke/serve/routes/plan.d.ts.map +1 -0
- package/dist/kosuke/serve/routes/plan.js +104 -0
- package/dist/kosuke/serve/routes/plan.js.map +1 -0
- package/dist/kosuke/serve/server.d.ts +16 -0
- package/dist/kosuke/serve/server.d.ts.map +1 -0
- package/dist/kosuke/serve/server.js +63 -0
- package/dist/kosuke/serve/server.js.map +1 -0
- package/dist/kosuke/serve/validation/build.d.ts +41 -0
- package/dist/kosuke/serve/validation/build.d.ts.map +1 -0
- package/dist/kosuke/serve/validation/build.js +20 -0
- package/dist/kosuke/serve/validation/build.js.map +1 -0
- package/dist/kosuke/serve/validation/plan.d.ts +26 -0
- package/dist/kosuke/serve/validation/plan.d.ts.map +1 -0
- package/dist/kosuke/serve/validation/plan.js +15 -0
- package/dist/kosuke/serve/validation/plan.js.map +1 -0
- package/dist/kosuke/types.d.ts +205 -0
- package/dist/kosuke/types.d.ts.map +1 -1
- package/dist/kosuke/utils/claude-agent.d.ts +82 -6
- package/dist/kosuke/utils/claude-agent.d.ts.map +1 -1
- package/dist/kosuke/utils/claude-agent.js +381 -180
- package/dist/kosuke/utils/claude-agent.js.map +1 -1
- package/dist/lib.d.ts +4 -4
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +2 -1
- package/dist/lib.js.map +1 -1
- package/dist/package.json +6 -2
- 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
|
|
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;
|
|
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
|
-
|
|
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) {
|