@litmers/cursorflow-orchestrator 0.1.3 → 0.1.6
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/CHANGELOG.md +17 -7
- package/README.md +33 -2
- package/commands/cursorflow-doctor.md +24 -0
- package/commands/cursorflow-signal.md +19 -0
- package/dist/cli/clean.d.ts +5 -0
- package/dist/cli/clean.js +57 -0
- package/dist/cli/clean.js.map +1 -0
- package/dist/cli/doctor.d.ts +15 -0
- package/dist/cli/doctor.js +139 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.js +125 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +7 -0
- package/dist/cli/init.js +302 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/monitor.d.ts +8 -0
- package/dist/cli/monitor.js +210 -0
- package/dist/cli/monitor.js.map +1 -0
- package/dist/cli/resume.d.ts +5 -0
- package/dist/cli/resume.js +128 -0
- package/dist/cli/resume.js.map +1 -0
- package/dist/cli/run.d.ts +5 -0
- package/dist/cli/run.js +128 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/setup-commands.d.ts +23 -0
- package/dist/cli/setup-commands.js +234 -0
- package/dist/cli/setup-commands.js.map +1 -0
- package/dist/cli/signal.d.ts +7 -0
- package/dist/cli/signal.js +99 -0
- package/dist/cli/signal.js.map +1 -0
- package/dist/core/orchestrator.d.ts +47 -0
- package/dist/core/orchestrator.js +192 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/reviewer.d.ts +60 -0
- package/dist/core/reviewer.js +239 -0
- package/dist/core/reviewer.js.map +1 -0
- package/dist/core/runner.d.ts +51 -0
- package/dist/core/runner.js +499 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/utils/config.d.ts +31 -0
- package/dist/utils/config.js +198 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/cursor-agent.d.ts +61 -0
- package/dist/utils/cursor-agent.js +263 -0
- package/dist/utils/cursor-agent.js.map +1 -0
- package/dist/utils/doctor.d.ts +63 -0
- package/dist/utils/doctor.js +280 -0
- package/dist/utils/doctor.js.map +1 -0
- package/dist/utils/git.d.ts +131 -0
- package/dist/utils/git.js +272 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/logger.d.ts +68 -0
- package/dist/utils/logger.js +158 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/state.d.ts +65 -0
- package/dist/utils/state.js +216 -0
- package/dist/utils/state.js.map +1 -0
- package/dist/utils/types.d.ts +118 -0
- package/dist/utils/types.js +6 -0
- package/dist/utils/types.js.map +1 -0
- package/examples/README.md +155 -0
- package/examples/demo-project/README.md +262 -0
- package/examples/demo-project/_cursorflow/tasks/demo-test/01-create-utils.json +18 -0
- package/examples/demo-project/_cursorflow/tasks/demo-test/02-add-tests.json +18 -0
- package/examples/demo-project/_cursorflow/tasks/demo-test/README.md +109 -0
- package/package.json +71 -61
- package/scripts/ai-security-check.js +11 -4
- package/scripts/local-security-gate.sh +76 -0
- package/src/cli/{clean.js → clean.ts} +11 -5
- package/src/cli/doctor.ts +127 -0
- package/src/cli/{index.js → index.ts} +27 -16
- package/src/cli/{init.js → init.ts} +26 -18
- package/src/cli/{monitor.js → monitor.ts} +57 -44
- package/src/cli/resume.ts +119 -0
- package/src/cli/run.ts +109 -0
- package/src/cli/{setup-commands.js → setup-commands.ts} +38 -18
- package/src/cli/signal.ts +89 -0
- package/src/core/{orchestrator.js → orchestrator.ts} +44 -26
- package/src/core/{reviewer.js → reviewer.ts} +36 -29
- package/src/core/{runner.js → runner.ts} +125 -76
- package/src/utils/{config.js → config.ts} +17 -25
- package/src/utils/{cursor-agent.js → cursor-agent.ts} +38 -47
- package/src/utils/doctor.ts +312 -0
- package/src/utils/{git.js → git.ts} +70 -56
- package/src/utils/{logger.js → logger.ts} +170 -178
- package/src/utils/{state.js → state.ts} +30 -38
- package/src/utils/types.ts +134 -0
- package/src/cli/resume.js +0 -31
- package/src/cli/run.js +0 -51
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Core Runner - Execute tasks sequentially in a lane
|
|
4
|
+
*
|
|
5
|
+
* Adapted from sequential-agent-runner.js
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.cursorAgentCreateChat = cursorAgentCreateChat;
|
|
42
|
+
exports.cursorAgentSend = cursorAgentSend;
|
|
43
|
+
exports.extractDependencyRequest = extractDependencyRequest;
|
|
44
|
+
exports.wrapPromptForDependencyPolicy = wrapPromptForDependencyPolicy;
|
|
45
|
+
exports.applyDependencyFilePermissions = applyDependencyFilePermissions;
|
|
46
|
+
exports.runTask = runTask;
|
|
47
|
+
exports.runTasks = runTasks;
|
|
48
|
+
const fs = __importStar(require("fs"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
const child_process_1 = require("child_process");
|
|
51
|
+
const git = __importStar(require("../utils/git"));
|
|
52
|
+
const logger = __importStar(require("../utils/logger"));
|
|
53
|
+
const cursor_agent_1 = require("../utils/cursor-agent");
|
|
54
|
+
const state_1 = require("../utils/state");
|
|
55
|
+
/**
|
|
56
|
+
* Execute cursor-agent command with timeout and better error handling
|
|
57
|
+
*/
|
|
58
|
+
function cursorAgentCreateChat() {
|
|
59
|
+
try {
|
|
60
|
+
const res = (0, child_process_1.spawnSync)('cursor-agent', ['create-chat'], {
|
|
61
|
+
encoding: 'utf8',
|
|
62
|
+
stdio: 'pipe',
|
|
63
|
+
timeout: 30000, // 30 second timeout
|
|
64
|
+
});
|
|
65
|
+
if (res.error || res.status !== 0) {
|
|
66
|
+
throw res.error || new Error(res.stderr || 'Failed to create chat');
|
|
67
|
+
}
|
|
68
|
+
const out = res.stdout;
|
|
69
|
+
const lines = out.split('\n').filter(Boolean);
|
|
70
|
+
const chatId = lines[lines.length - 1] || null;
|
|
71
|
+
if (!chatId) {
|
|
72
|
+
throw new Error('Failed to get chat ID from cursor-agent');
|
|
73
|
+
}
|
|
74
|
+
logger.info(`Created chat session: ${chatId}`);
|
|
75
|
+
return chatId;
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
// Check for common errors
|
|
79
|
+
if (error.message.includes('ENOENT')) {
|
|
80
|
+
throw new Error('cursor-agent CLI not found. Install with: npm install -g @cursor/agent');
|
|
81
|
+
}
|
|
82
|
+
if (error.message.includes('ETIMEDOUT') || error.killed) {
|
|
83
|
+
throw new Error('cursor-agent timed out. Check your internet connection and Cursor authentication.');
|
|
84
|
+
}
|
|
85
|
+
if (error.stderr) {
|
|
86
|
+
const stderr = error.stderr.toString();
|
|
87
|
+
// Check for authentication errors
|
|
88
|
+
if (stderr.includes('not authenticated') ||
|
|
89
|
+
stderr.includes('login') ||
|
|
90
|
+
stderr.includes('auth')) {
|
|
91
|
+
throw new Error('Cursor authentication failed. Please:\n' +
|
|
92
|
+
' 1. Open Cursor IDE\n' +
|
|
93
|
+
' 2. Sign in to your account\n' +
|
|
94
|
+
' 3. Verify you can use AI features\n' +
|
|
95
|
+
' 4. Try running cursorflow again\n\n' +
|
|
96
|
+
`Original error: ${stderr.trim()}`);
|
|
97
|
+
}
|
|
98
|
+
// Check for API key errors
|
|
99
|
+
if (stderr.includes('api key') || stderr.includes('API_KEY')) {
|
|
100
|
+
throw new Error('Cursor API key error. Please check your Cursor account and subscription.\n' +
|
|
101
|
+
`Error: ${stderr.trim()}`);
|
|
102
|
+
}
|
|
103
|
+
throw new Error(`cursor-agent error: ${stderr.trim()}`);
|
|
104
|
+
}
|
|
105
|
+
throw new Error(`Failed to create chat: ${error.message}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function parseJsonFromStdout(stdout) {
|
|
109
|
+
const text = String(stdout || '').trim();
|
|
110
|
+
if (!text)
|
|
111
|
+
return null;
|
|
112
|
+
const lines = text.split('\n').filter(Boolean);
|
|
113
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
114
|
+
const line = lines[i]?.trim();
|
|
115
|
+
if (line?.startsWith('{') && line?.endsWith('}')) {
|
|
116
|
+
try {
|
|
117
|
+
return JSON.parse(line);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
function cursorAgentSend({ workspaceDir, chatId, prompt, model }) {
|
|
127
|
+
const args = [
|
|
128
|
+
'--print',
|
|
129
|
+
'--output-format', 'json',
|
|
130
|
+
'--workspace', workspaceDir,
|
|
131
|
+
...(model ? ['--model', model] : []),
|
|
132
|
+
'--resume', chatId,
|
|
133
|
+
prompt,
|
|
134
|
+
];
|
|
135
|
+
logger.info('Executing cursor-agent...');
|
|
136
|
+
const res = (0, child_process_1.spawnSync)('cursor-agent', args, {
|
|
137
|
+
encoding: 'utf8',
|
|
138
|
+
stdio: 'pipe',
|
|
139
|
+
timeout: 300000, // 5 minute timeout for LLM response
|
|
140
|
+
});
|
|
141
|
+
// Check for timeout
|
|
142
|
+
if (res.error) {
|
|
143
|
+
if (res.error.code === 'ETIMEDOUT') {
|
|
144
|
+
return {
|
|
145
|
+
ok: false,
|
|
146
|
+
exitCode: -1,
|
|
147
|
+
error: 'cursor-agent timed out after 5 minutes. The LLM request may be taking too long or there may be network issues.',
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
ok: false,
|
|
152
|
+
exitCode: -1,
|
|
153
|
+
error: `cursor-agent error: ${res.error.message}`,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
const json = parseJsonFromStdout(res.stdout);
|
|
157
|
+
if (res.status !== 0 || !json || json.type !== 'result') {
|
|
158
|
+
let errorMsg = res.stderr?.trim() || res.stdout?.trim() || `exit=${res.status}`;
|
|
159
|
+
// Check for authentication errors
|
|
160
|
+
if (errorMsg.includes('not authenticated') ||
|
|
161
|
+
errorMsg.includes('login') ||
|
|
162
|
+
errorMsg.includes('auth')) {
|
|
163
|
+
errorMsg = 'Authentication error. Please:\n' +
|
|
164
|
+
' 1. Open Cursor IDE\n' +
|
|
165
|
+
' 2. Sign in to your account\n' +
|
|
166
|
+
' 3. Verify AI features are working\n' +
|
|
167
|
+
' 4. Try again\n\n' +
|
|
168
|
+
`Details: ${errorMsg}`;
|
|
169
|
+
}
|
|
170
|
+
// Check for rate limit errors
|
|
171
|
+
if (errorMsg.includes('rate limit') || errorMsg.includes('quota')) {
|
|
172
|
+
errorMsg = 'API rate limit or quota exceeded. Please:\n' +
|
|
173
|
+
' 1. Check your Cursor subscription\n' +
|
|
174
|
+
' 2. Wait a few minutes and try again\n\n' +
|
|
175
|
+
`Details: ${errorMsg}`;
|
|
176
|
+
}
|
|
177
|
+
// Check for model errors
|
|
178
|
+
if (errorMsg.includes('model')) {
|
|
179
|
+
errorMsg = `Model error (requested: ${model || 'default'}). ` +
|
|
180
|
+
'Please check if the model is available in your Cursor subscription.\n\n' +
|
|
181
|
+
`Details: ${errorMsg}`;
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
ok: false,
|
|
185
|
+
exitCode: res.status ?? -1,
|
|
186
|
+
error: errorMsg,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
ok: !json.is_error,
|
|
191
|
+
exitCode: res.status ?? 0,
|
|
192
|
+
sessionId: json.session_id || chatId,
|
|
193
|
+
resultText: json.result || '',
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Extract dependency change request from agent response
|
|
198
|
+
*/
|
|
199
|
+
function extractDependencyRequest(text) {
|
|
200
|
+
const t = String(text || '');
|
|
201
|
+
const marker = 'DEPENDENCY_CHANGE_REQUIRED';
|
|
202
|
+
if (!t.includes(marker)) {
|
|
203
|
+
return { required: false, raw: t };
|
|
204
|
+
}
|
|
205
|
+
const after = t.split(marker).slice(1).join(marker);
|
|
206
|
+
const match = after.match(/\{[\s\S]*?\}/);
|
|
207
|
+
if (match) {
|
|
208
|
+
try {
|
|
209
|
+
return {
|
|
210
|
+
required: true,
|
|
211
|
+
plan: JSON.parse(match[0]),
|
|
212
|
+
raw: t,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return { required: true, raw: t };
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return { required: true, raw: t };
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Wrap prompt with dependency policy
|
|
223
|
+
*/
|
|
224
|
+
function wrapPromptForDependencyPolicy(prompt, policy) {
|
|
225
|
+
if (policy.allowDependencyChange && !policy.lockfileReadOnly) {
|
|
226
|
+
return prompt;
|
|
227
|
+
}
|
|
228
|
+
return `# Dependency Policy (MUST FOLLOW)
|
|
229
|
+
|
|
230
|
+
You are running in a restricted lane.
|
|
231
|
+
|
|
232
|
+
- allowDependencyChange: ${policy.allowDependencyChange}
|
|
233
|
+
- lockfileReadOnly: ${policy.lockfileReadOnly}
|
|
234
|
+
|
|
235
|
+
Rules:
|
|
236
|
+
- BEFORE making any code changes, decide whether dependency changes are required.
|
|
237
|
+
- If dependency changes are required, DO NOT change any files. Instead reply with:
|
|
238
|
+
|
|
239
|
+
DEPENDENCY_CHANGE_REQUIRED
|
|
240
|
+
\`\`\`json
|
|
241
|
+
{ "reason": "...", "changes": [...], "commands": ["pnpm add ..."], "notes": "..." }
|
|
242
|
+
\`\`\`
|
|
243
|
+
|
|
244
|
+
Then STOP.
|
|
245
|
+
- If dependency changes are NOT required, proceed normally.
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
${prompt}`;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Apply file permissions based on dependency policy
|
|
253
|
+
*/
|
|
254
|
+
function applyDependencyFilePermissions(worktreeDir, policy) {
|
|
255
|
+
const targets = [];
|
|
256
|
+
if (!policy.allowDependencyChange) {
|
|
257
|
+
targets.push('package.json');
|
|
258
|
+
}
|
|
259
|
+
if (policy.lockfileReadOnly) {
|
|
260
|
+
targets.push('pnpm-lock.yaml', 'package-lock.json', 'yarn.lock');
|
|
261
|
+
}
|
|
262
|
+
for (const file of targets) {
|
|
263
|
+
const filePath = path.join(worktreeDir, file);
|
|
264
|
+
if (!fs.existsSync(filePath))
|
|
265
|
+
continue;
|
|
266
|
+
try {
|
|
267
|
+
const stats = fs.statSync(filePath);
|
|
268
|
+
const mode = stats.mode & 0o777;
|
|
269
|
+
fs.chmodSync(filePath, mode & ~0o222); // Remove write bits
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
// Best effort
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Run a single task
|
|
278
|
+
*/
|
|
279
|
+
async function runTask({ task, config, index, worktreeDir, taskBranch, chatId, runDir, }) {
|
|
280
|
+
const model = task.model || config.model || 'sonnet-4.5';
|
|
281
|
+
const convoPath = path.join(runDir, 'conversation.jsonl');
|
|
282
|
+
logger.section(`[${index + 1}/${config.tasks.length}] ${task.name}`);
|
|
283
|
+
logger.info(`Model: ${model}`);
|
|
284
|
+
logger.info(`Branch: ${taskBranch}`);
|
|
285
|
+
// Checkout task branch
|
|
286
|
+
git.runGit(['checkout', '-B', taskBranch], { cwd: worktreeDir });
|
|
287
|
+
// Apply dependency permissions
|
|
288
|
+
applyDependencyFilePermissions(worktreeDir, config.dependencyPolicy);
|
|
289
|
+
// Run prompt
|
|
290
|
+
const prompt1 = wrapPromptForDependencyPolicy(task.prompt, config.dependencyPolicy);
|
|
291
|
+
(0, state_1.appendLog)(convoPath, (0, state_1.createConversationEntry)('user', prompt1, {
|
|
292
|
+
task: task.name,
|
|
293
|
+
model,
|
|
294
|
+
}));
|
|
295
|
+
logger.info('Sending prompt to agent...');
|
|
296
|
+
const r1 = cursorAgentSend({
|
|
297
|
+
workspaceDir: worktreeDir,
|
|
298
|
+
chatId,
|
|
299
|
+
prompt: prompt1,
|
|
300
|
+
model,
|
|
301
|
+
});
|
|
302
|
+
(0, state_1.appendLog)(convoPath, (0, state_1.createConversationEntry)('assistant', r1.resultText || r1.error || 'No response', {
|
|
303
|
+
task: task.name,
|
|
304
|
+
model,
|
|
305
|
+
}));
|
|
306
|
+
if (!r1.ok) {
|
|
307
|
+
return {
|
|
308
|
+
taskName: task.name,
|
|
309
|
+
taskBranch,
|
|
310
|
+
status: 'ERROR',
|
|
311
|
+
error: r1.error,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
// Check for dependency request
|
|
315
|
+
const depReq = extractDependencyRequest(r1.resultText || '');
|
|
316
|
+
if (depReq.required && !config.dependencyPolicy.allowDependencyChange) {
|
|
317
|
+
return {
|
|
318
|
+
taskName: task.name,
|
|
319
|
+
taskBranch,
|
|
320
|
+
status: 'BLOCKED_DEPENDENCY',
|
|
321
|
+
dependencyRequest: depReq.plan || null,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
// Push task branch
|
|
325
|
+
git.push(taskBranch, { cwd: worktreeDir, setUpstream: true });
|
|
326
|
+
return {
|
|
327
|
+
taskName: task.name,
|
|
328
|
+
taskBranch,
|
|
329
|
+
status: 'FINISHED',
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Run all tasks in sequence
|
|
334
|
+
*/
|
|
335
|
+
async function runTasks(tasksFile, config, runDir, options = {}) {
|
|
336
|
+
const startIndex = options.startIndex || 0;
|
|
337
|
+
// Ensure cursor-agent is installed
|
|
338
|
+
(0, cursor_agent_1.ensureCursorAgent)();
|
|
339
|
+
// Check authentication before starting
|
|
340
|
+
logger.info('Checking Cursor authentication...');
|
|
341
|
+
const authStatus = (0, cursor_agent_1.checkCursorAuth)();
|
|
342
|
+
if (!authStatus.authenticated) {
|
|
343
|
+
logger.error('❌ Cursor authentication failed');
|
|
344
|
+
logger.error(` ${authStatus.message}`);
|
|
345
|
+
if (authStatus.details) {
|
|
346
|
+
logger.error(` Details: ${authStatus.details}`);
|
|
347
|
+
}
|
|
348
|
+
if (authStatus.help) {
|
|
349
|
+
logger.error(` ${authStatus.help}`);
|
|
350
|
+
}
|
|
351
|
+
console.log('');
|
|
352
|
+
(0, cursor_agent_1.printAuthHelp)();
|
|
353
|
+
throw new Error('Cursor authentication required. Please authenticate and try again.');
|
|
354
|
+
}
|
|
355
|
+
logger.success('✓ Cursor authentication OK');
|
|
356
|
+
const repoRoot = git.getRepoRoot();
|
|
357
|
+
// Load existing state if resuming
|
|
358
|
+
const statePath = path.join(runDir, 'state.json');
|
|
359
|
+
let state = null;
|
|
360
|
+
if (startIndex > 0 && fs.existsSync(statePath)) {
|
|
361
|
+
state = JSON.parse(fs.readFileSync(statePath, 'utf8'));
|
|
362
|
+
}
|
|
363
|
+
const pipelineBranch = state?.pipelineBranch || config.pipelineBranch || `${config.branchPrefix || 'cursorflow/'}${Date.now().toString(36)}`;
|
|
364
|
+
const worktreeDir = state?.worktreeDir || path.join(repoRoot, config.worktreeRoot || '_cursorflow/worktrees', pipelineBranch);
|
|
365
|
+
if (startIndex === 0) {
|
|
366
|
+
logger.section('🚀 Starting Pipeline');
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
logger.section(`🔁 Resuming Pipeline from task ${startIndex + 1}`);
|
|
370
|
+
}
|
|
371
|
+
logger.info(`Pipeline Branch: ${pipelineBranch}`);
|
|
372
|
+
logger.info(`Worktree: ${worktreeDir}`);
|
|
373
|
+
logger.info(`Tasks: ${config.tasks.length}`);
|
|
374
|
+
// Create worktree only if starting fresh
|
|
375
|
+
if (startIndex === 0 || !fs.existsSync(worktreeDir)) {
|
|
376
|
+
git.createWorktree(worktreeDir, pipelineBranch, {
|
|
377
|
+
baseBranch: config.baseBranch || 'main',
|
|
378
|
+
cwd: repoRoot,
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
// Create chat
|
|
382
|
+
logger.info('Creating chat session...');
|
|
383
|
+
const chatId = cursorAgentCreateChat();
|
|
384
|
+
// Initialize state if not loaded
|
|
385
|
+
if (!state) {
|
|
386
|
+
state = {
|
|
387
|
+
status: 'running',
|
|
388
|
+
pipelineBranch,
|
|
389
|
+
worktreeDir,
|
|
390
|
+
totalTasks: config.tasks.length,
|
|
391
|
+
currentTaskIndex: 0,
|
|
392
|
+
label: pipelineBranch,
|
|
393
|
+
startTime: Date.now(),
|
|
394
|
+
endTime: null,
|
|
395
|
+
error: null,
|
|
396
|
+
dependencyRequest: null,
|
|
397
|
+
tasksFile, // Store tasks file for resume
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
state.status = 'running';
|
|
402
|
+
state.error = null;
|
|
403
|
+
state.dependencyRequest = null;
|
|
404
|
+
}
|
|
405
|
+
(0, state_1.saveState)(statePath, state);
|
|
406
|
+
// Run tasks
|
|
407
|
+
const results = [];
|
|
408
|
+
for (let i = startIndex; i < config.tasks.length; i++) {
|
|
409
|
+
const task = config.tasks[i];
|
|
410
|
+
const taskBranch = `${pipelineBranch}--${String(i + 1).padStart(2, '0')}-${task.name}`;
|
|
411
|
+
const result = await runTask({
|
|
412
|
+
task,
|
|
413
|
+
config,
|
|
414
|
+
index: i,
|
|
415
|
+
worktreeDir,
|
|
416
|
+
pipelineBranch,
|
|
417
|
+
taskBranch,
|
|
418
|
+
chatId,
|
|
419
|
+
runDir,
|
|
420
|
+
});
|
|
421
|
+
results.push(result);
|
|
422
|
+
// Update state
|
|
423
|
+
state.currentTaskIndex = i + 1;
|
|
424
|
+
(0, state_1.saveState)(statePath, state);
|
|
425
|
+
// Handle blocked or error
|
|
426
|
+
if (result.status === 'BLOCKED_DEPENDENCY') {
|
|
427
|
+
state.status = 'failed';
|
|
428
|
+
state.dependencyRequest = result.dependencyRequest || null;
|
|
429
|
+
(0, state_1.saveState)(statePath, state);
|
|
430
|
+
logger.warn('Task blocked on dependency change');
|
|
431
|
+
process.exit(2);
|
|
432
|
+
}
|
|
433
|
+
if (result.status !== 'FINISHED') {
|
|
434
|
+
state.status = 'failed';
|
|
435
|
+
state.error = result.error || 'Unknown error';
|
|
436
|
+
(0, state_1.saveState)(statePath, state);
|
|
437
|
+
logger.error(`Task failed: ${result.error}`);
|
|
438
|
+
process.exit(1);
|
|
439
|
+
}
|
|
440
|
+
// Merge into pipeline
|
|
441
|
+
logger.info(`Merging ${taskBranch} → ${pipelineBranch}`);
|
|
442
|
+
git.merge(taskBranch, { cwd: worktreeDir, noFf: true });
|
|
443
|
+
git.push(pipelineBranch, { cwd: worktreeDir });
|
|
444
|
+
}
|
|
445
|
+
// Complete
|
|
446
|
+
state.status = 'completed';
|
|
447
|
+
state.endTime = Date.now();
|
|
448
|
+
(0, state_1.saveState)(statePath, state);
|
|
449
|
+
logger.success('All tasks completed!');
|
|
450
|
+
return results;
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* CLI entry point
|
|
454
|
+
*/
|
|
455
|
+
if (require.main === module) {
|
|
456
|
+
const args = process.argv.slice(2);
|
|
457
|
+
if (args.length < 1) {
|
|
458
|
+
console.error('Usage: node runner.js <tasks-file> --run-dir <dir> --executor <executor>');
|
|
459
|
+
process.exit(1);
|
|
460
|
+
}
|
|
461
|
+
const tasksFile = args[0];
|
|
462
|
+
const runDirIdx = args.indexOf('--run-dir');
|
|
463
|
+
const startIdxIdx = args.indexOf('--start-index');
|
|
464
|
+
// const executorIdx = args.indexOf('--executor');
|
|
465
|
+
const runDir = runDirIdx >= 0 ? args[runDirIdx + 1] : '.';
|
|
466
|
+
const startIndex = startIdxIdx >= 0 ? parseInt(args[startIdxIdx + 1] || '0') : 0;
|
|
467
|
+
// const executor = executorIdx >= 0 ? args[executorIdx + 1] : 'cursor-agent';
|
|
468
|
+
if (!fs.existsSync(tasksFile)) {
|
|
469
|
+
console.error(`Tasks file not found: ${tasksFile}`);
|
|
470
|
+
process.exit(1);
|
|
471
|
+
}
|
|
472
|
+
// Load tasks configuration
|
|
473
|
+
let config;
|
|
474
|
+
try {
|
|
475
|
+
config = JSON.parse(fs.readFileSync(tasksFile, 'utf8'));
|
|
476
|
+
}
|
|
477
|
+
catch (error) {
|
|
478
|
+
console.error(`Failed to load tasks file: ${error.message}`);
|
|
479
|
+
process.exit(1);
|
|
480
|
+
}
|
|
481
|
+
// Add dependency policy defaults
|
|
482
|
+
config.dependencyPolicy = config.dependencyPolicy || {
|
|
483
|
+
allowDependencyChange: false,
|
|
484
|
+
lockfileReadOnly: true,
|
|
485
|
+
};
|
|
486
|
+
// Run tasks
|
|
487
|
+
runTasks(tasksFile, config, runDir, { startIndex })
|
|
488
|
+
.then(() => {
|
|
489
|
+
process.exit(0);
|
|
490
|
+
})
|
|
491
|
+
.catch(error => {
|
|
492
|
+
console.error(`Runner failed: ${error.message}`);
|
|
493
|
+
if (process.env['DEBUG']) {
|
|
494
|
+
console.error(error.stack);
|
|
495
|
+
}
|
|
496
|
+
process.exit(1);
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loader for CursorFlow
|
|
3
|
+
*
|
|
4
|
+
* Finds project root and loads user configuration with defaults
|
|
5
|
+
*/
|
|
6
|
+
import { CursorFlowConfig } from './types';
|
|
7
|
+
export { CursorFlowConfig };
|
|
8
|
+
/**
|
|
9
|
+
* Find project root by looking for package.json
|
|
10
|
+
*/
|
|
11
|
+
export declare function findProjectRoot(cwd?: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Load configuration with defaults
|
|
14
|
+
*/
|
|
15
|
+
export declare function loadConfig(projectRoot?: string | null): CursorFlowConfig;
|
|
16
|
+
/**
|
|
17
|
+
* Get absolute path for tasks directory
|
|
18
|
+
*/
|
|
19
|
+
export declare function getTasksDir(config: CursorFlowConfig): string;
|
|
20
|
+
/**
|
|
21
|
+
* Get absolute path for logs directory
|
|
22
|
+
*/
|
|
23
|
+
export declare function getLogsDir(config: CursorFlowConfig): string;
|
|
24
|
+
/**
|
|
25
|
+
* Validate configuration
|
|
26
|
+
*/
|
|
27
|
+
export declare function validateConfig(config: CursorFlowConfig): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Create default config file
|
|
30
|
+
*/
|
|
31
|
+
export declare function createDefaultConfig(projectRoot: string, force?: boolean): string;
|