@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.
Files changed (90) hide show
  1. package/CHANGELOG.md +17 -7
  2. package/README.md +33 -2
  3. package/commands/cursorflow-doctor.md +24 -0
  4. package/commands/cursorflow-signal.md +19 -0
  5. package/dist/cli/clean.d.ts +5 -0
  6. package/dist/cli/clean.js +57 -0
  7. package/dist/cli/clean.js.map +1 -0
  8. package/dist/cli/doctor.d.ts +15 -0
  9. package/dist/cli/doctor.js +139 -0
  10. package/dist/cli/doctor.js.map +1 -0
  11. package/dist/cli/index.d.ts +6 -0
  12. package/dist/cli/index.js +125 -0
  13. package/dist/cli/index.js.map +1 -0
  14. package/dist/cli/init.d.ts +7 -0
  15. package/dist/cli/init.js +302 -0
  16. package/dist/cli/init.js.map +1 -0
  17. package/dist/cli/monitor.d.ts +8 -0
  18. package/dist/cli/monitor.js +210 -0
  19. package/dist/cli/monitor.js.map +1 -0
  20. package/dist/cli/resume.d.ts +5 -0
  21. package/dist/cli/resume.js +128 -0
  22. package/dist/cli/resume.js.map +1 -0
  23. package/dist/cli/run.d.ts +5 -0
  24. package/dist/cli/run.js +128 -0
  25. package/dist/cli/run.js.map +1 -0
  26. package/dist/cli/setup-commands.d.ts +23 -0
  27. package/dist/cli/setup-commands.js +234 -0
  28. package/dist/cli/setup-commands.js.map +1 -0
  29. package/dist/cli/signal.d.ts +7 -0
  30. package/dist/cli/signal.js +99 -0
  31. package/dist/cli/signal.js.map +1 -0
  32. package/dist/core/orchestrator.d.ts +47 -0
  33. package/dist/core/orchestrator.js +192 -0
  34. package/dist/core/orchestrator.js.map +1 -0
  35. package/dist/core/reviewer.d.ts +60 -0
  36. package/dist/core/reviewer.js +239 -0
  37. package/dist/core/reviewer.js.map +1 -0
  38. package/dist/core/runner.d.ts +51 -0
  39. package/dist/core/runner.js +499 -0
  40. package/dist/core/runner.js.map +1 -0
  41. package/dist/utils/config.d.ts +31 -0
  42. package/dist/utils/config.js +198 -0
  43. package/dist/utils/config.js.map +1 -0
  44. package/dist/utils/cursor-agent.d.ts +61 -0
  45. package/dist/utils/cursor-agent.js +263 -0
  46. package/dist/utils/cursor-agent.js.map +1 -0
  47. package/dist/utils/doctor.d.ts +63 -0
  48. package/dist/utils/doctor.js +280 -0
  49. package/dist/utils/doctor.js.map +1 -0
  50. package/dist/utils/git.d.ts +131 -0
  51. package/dist/utils/git.js +272 -0
  52. package/dist/utils/git.js.map +1 -0
  53. package/dist/utils/logger.d.ts +68 -0
  54. package/dist/utils/logger.js +158 -0
  55. package/dist/utils/logger.js.map +1 -0
  56. package/dist/utils/state.d.ts +65 -0
  57. package/dist/utils/state.js +216 -0
  58. package/dist/utils/state.js.map +1 -0
  59. package/dist/utils/types.d.ts +118 -0
  60. package/dist/utils/types.js +6 -0
  61. package/dist/utils/types.js.map +1 -0
  62. package/examples/README.md +155 -0
  63. package/examples/demo-project/README.md +262 -0
  64. package/examples/demo-project/_cursorflow/tasks/demo-test/01-create-utils.json +18 -0
  65. package/examples/demo-project/_cursorflow/tasks/demo-test/02-add-tests.json +18 -0
  66. package/examples/demo-project/_cursorflow/tasks/demo-test/README.md +109 -0
  67. package/package.json +71 -61
  68. package/scripts/ai-security-check.js +11 -4
  69. package/scripts/local-security-gate.sh +76 -0
  70. package/src/cli/{clean.js → clean.ts} +11 -5
  71. package/src/cli/doctor.ts +127 -0
  72. package/src/cli/{index.js → index.ts} +27 -16
  73. package/src/cli/{init.js → init.ts} +26 -18
  74. package/src/cli/{monitor.js → monitor.ts} +57 -44
  75. package/src/cli/resume.ts +119 -0
  76. package/src/cli/run.ts +109 -0
  77. package/src/cli/{setup-commands.js → setup-commands.ts} +38 -18
  78. package/src/cli/signal.ts +89 -0
  79. package/src/core/{orchestrator.js → orchestrator.ts} +44 -26
  80. package/src/core/{reviewer.js → reviewer.ts} +36 -29
  81. package/src/core/{runner.js → runner.ts} +125 -76
  82. package/src/utils/{config.js → config.ts} +17 -25
  83. package/src/utils/{cursor-agent.js → cursor-agent.ts} +38 -47
  84. package/src/utils/doctor.ts +312 -0
  85. package/src/utils/{git.js → git.ts} +70 -56
  86. package/src/utils/{logger.js → logger.ts} +170 -178
  87. package/src/utils/{state.js → state.ts} +30 -38
  88. package/src/utils/types.ts +134 -0
  89. package/src/cli/resume.js +0 -31
  90. 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;