@litmers/cursorflow-orchestrator 0.1.2 → 0.1.5

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 (74) hide show
  1. package/CHANGELOG.md +7 -6
  2. package/dist/cli/clean.d.ts +5 -0
  3. package/dist/cli/clean.js +57 -0
  4. package/dist/cli/clean.js.map +1 -0
  5. package/dist/cli/index.d.ts +6 -0
  6. package/dist/cli/index.js +120 -0
  7. package/dist/cli/index.js.map +1 -0
  8. package/dist/cli/init.d.ts +7 -0
  9. package/dist/cli/init.js +302 -0
  10. package/dist/cli/init.js.map +1 -0
  11. package/dist/cli/monitor.d.ts +8 -0
  12. package/dist/cli/monitor.js +210 -0
  13. package/dist/cli/monitor.js.map +1 -0
  14. package/dist/cli/resume.d.ts +5 -0
  15. package/dist/cli/resume.js +58 -0
  16. package/dist/cli/resume.js.map +1 -0
  17. package/dist/cli/run.d.ts +5 -0
  18. package/dist/cli/run.js +74 -0
  19. package/dist/cli/run.js.map +1 -0
  20. package/dist/cli/setup-commands.d.ts +19 -0
  21. package/dist/cli/setup-commands.js +218 -0
  22. package/dist/cli/setup-commands.js.map +1 -0
  23. package/dist/core/orchestrator.d.ts +47 -0
  24. package/dist/core/orchestrator.js +192 -0
  25. package/dist/core/orchestrator.js.map +1 -0
  26. package/dist/core/reviewer.d.ts +60 -0
  27. package/dist/core/reviewer.js +239 -0
  28. package/dist/core/reviewer.js.map +1 -0
  29. package/dist/core/runner.d.ts +49 -0
  30. package/dist/core/runner.js +475 -0
  31. package/dist/core/runner.js.map +1 -0
  32. package/dist/utils/config.d.ts +31 -0
  33. package/dist/utils/config.js +198 -0
  34. package/dist/utils/config.js.map +1 -0
  35. package/dist/utils/cursor-agent.d.ts +61 -0
  36. package/dist/utils/cursor-agent.js +263 -0
  37. package/dist/utils/cursor-agent.js.map +1 -0
  38. package/dist/utils/git.d.ts +131 -0
  39. package/dist/utils/git.js +272 -0
  40. package/dist/utils/git.js.map +1 -0
  41. package/dist/utils/logger.d.ts +68 -0
  42. package/dist/utils/logger.js +158 -0
  43. package/dist/utils/logger.js.map +1 -0
  44. package/dist/utils/state.d.ts +65 -0
  45. package/dist/utils/state.js +216 -0
  46. package/dist/utils/state.js.map +1 -0
  47. package/dist/utils/types.d.ts +117 -0
  48. package/dist/utils/types.js +6 -0
  49. package/dist/utils/types.js.map +1 -0
  50. package/examples/README.md +155 -0
  51. package/examples/demo-project/README.md +262 -0
  52. package/examples/demo-project/_cursorflow/tasks/demo-test/01-create-utils.json +18 -0
  53. package/examples/demo-project/_cursorflow/tasks/demo-test/02-add-tests.json +18 -0
  54. package/examples/demo-project/_cursorflow/tasks/demo-test/README.md +109 -0
  55. package/package.json +71 -61
  56. package/scripts/ai-security-check.js +11 -4
  57. package/scripts/local-security-gate.sh +76 -0
  58. package/src/cli/{clean.js → clean.ts} +11 -5
  59. package/src/cli/{index.js → index.ts} +22 -16
  60. package/src/cli/{init.js → init.ts} +26 -18
  61. package/src/cli/{monitor.js → monitor.ts} +57 -44
  62. package/src/cli/{resume.js → resume.ts} +11 -5
  63. package/src/cli/run.ts +54 -0
  64. package/src/cli/{setup-commands.js → setup-commands.ts} +19 -18
  65. package/src/core/{orchestrator.js → orchestrator.ts} +44 -26
  66. package/src/core/{reviewer.js → reviewer.ts} +36 -29
  67. package/src/core/{runner.js → runner.ts} +78 -56
  68. package/src/utils/{config.js → config.ts} +17 -25
  69. package/src/utils/{cursor-agent.js → cursor-agent.ts} +38 -47
  70. package/src/utils/{git.js → git.ts} +70 -56
  71. package/src/utils/{logger.js → logger.ts} +170 -178
  72. package/src/utils/{state.js → state.ts} +30 -38
  73. package/src/utils/types.ts +133 -0
  74. package/src/cli/run.js +0 -51
@@ -0,0 +1,475 @@
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(config, runDir) {
336
+ // Ensure cursor-agent is installed
337
+ (0, cursor_agent_1.ensureCursorAgent)();
338
+ // Check authentication before starting
339
+ logger.info('Checking Cursor authentication...');
340
+ const authStatus = (0, cursor_agent_1.checkCursorAuth)();
341
+ if (!authStatus.authenticated) {
342
+ logger.error('❌ Cursor authentication failed');
343
+ logger.error(` ${authStatus.message}`);
344
+ if (authStatus.details) {
345
+ logger.error(` Details: ${authStatus.details}`);
346
+ }
347
+ if (authStatus.help) {
348
+ logger.error(` ${authStatus.help}`);
349
+ }
350
+ console.log('');
351
+ (0, cursor_agent_1.printAuthHelp)();
352
+ throw new Error('Cursor authentication required. Please authenticate and try again.');
353
+ }
354
+ logger.success('✓ Cursor authentication OK');
355
+ const repoRoot = git.getRepoRoot();
356
+ const pipelineBranch = config.pipelineBranch || `${config.branchPrefix || 'cursorflow/'}${Date.now().toString(36)}`;
357
+ const worktreeDir = path.join(repoRoot, config.worktreeRoot || '_cursorflow/worktrees', pipelineBranch);
358
+ logger.section('🚀 Starting Pipeline');
359
+ logger.info(`Pipeline Branch: ${pipelineBranch}`);
360
+ logger.info(`Worktree: ${worktreeDir}`);
361
+ logger.info(`Tasks: ${config.tasks.length}`);
362
+ // Create worktree
363
+ git.createWorktree(worktreeDir, pipelineBranch, {
364
+ baseBranch: config.baseBranch || 'main',
365
+ cwd: repoRoot,
366
+ });
367
+ // Create chat
368
+ logger.info('Creating chat session...');
369
+ const chatId = cursorAgentCreateChat();
370
+ // Save initial state
371
+ const state = {
372
+ status: 'running',
373
+ pipelineBranch,
374
+ worktreeDir,
375
+ totalTasks: config.tasks.length,
376
+ currentTaskIndex: 0,
377
+ label: pipelineBranch,
378
+ startTime: Date.now(),
379
+ endTime: null,
380
+ error: null,
381
+ dependencyRequest: null,
382
+ };
383
+ (0, state_1.saveState)(path.join(runDir, 'state.json'), state);
384
+ // Run tasks
385
+ const results = [];
386
+ for (let i = 0; i < config.tasks.length; i++) {
387
+ const task = config.tasks[i];
388
+ const taskBranch = `${pipelineBranch}--${String(i + 1).padStart(2, '0')}-${task.name}`;
389
+ const result = await runTask({
390
+ task,
391
+ config,
392
+ index: i,
393
+ worktreeDir,
394
+ pipelineBranch,
395
+ taskBranch,
396
+ chatId,
397
+ runDir,
398
+ });
399
+ results.push(result);
400
+ // Update state
401
+ state.currentTaskIndex = i + 1;
402
+ (0, state_1.saveState)(path.join(runDir, 'state.json'), state);
403
+ // Handle blocked or error
404
+ if (result.status === 'BLOCKED_DEPENDENCY') {
405
+ state.status = 'failed'; // Or blocked if we had a blocked status in LaneState
406
+ state.dependencyRequest = result.dependencyRequest || null;
407
+ (0, state_1.saveState)(path.join(runDir, 'state.json'), state);
408
+ logger.warn('Task blocked on dependency change');
409
+ process.exit(2);
410
+ }
411
+ if (result.status !== 'FINISHED') {
412
+ state.status = 'failed';
413
+ state.error = result.error || 'Unknown error';
414
+ (0, state_1.saveState)(path.join(runDir, 'state.json'), state);
415
+ logger.error(`Task failed: ${result.error}`);
416
+ process.exit(1);
417
+ }
418
+ // Merge into pipeline
419
+ logger.info(`Merging ${taskBranch} → ${pipelineBranch}`);
420
+ git.merge(taskBranch, { cwd: worktreeDir, noFf: true });
421
+ git.push(pipelineBranch, { cwd: worktreeDir });
422
+ }
423
+ // Complete
424
+ state.status = 'completed';
425
+ state.endTime = Date.now();
426
+ (0, state_1.saveState)(path.join(runDir, 'state.json'), state);
427
+ logger.success('All tasks completed!');
428
+ return results;
429
+ }
430
+ /**
431
+ * CLI entry point
432
+ */
433
+ if (require.main === module) {
434
+ const args = process.argv.slice(2);
435
+ if (args.length < 1) {
436
+ console.error('Usage: node runner.js <tasks-file> --run-dir <dir> --executor <executor>');
437
+ process.exit(1);
438
+ }
439
+ const tasksFile = args[0];
440
+ const runDirIdx = args.indexOf('--run-dir');
441
+ // const executorIdx = args.indexOf('--executor');
442
+ const runDir = runDirIdx >= 0 ? args[runDirIdx + 1] : '.';
443
+ // const executor = executorIdx >= 0 ? args[executorIdx + 1] : 'cursor-agent';
444
+ if (!fs.existsSync(tasksFile)) {
445
+ console.error(`Tasks file not found: ${tasksFile}`);
446
+ process.exit(1);
447
+ }
448
+ // Load tasks configuration
449
+ let config;
450
+ try {
451
+ config = JSON.parse(fs.readFileSync(tasksFile, 'utf8'));
452
+ }
453
+ catch (error) {
454
+ console.error(`Failed to load tasks file: ${error.message}`);
455
+ process.exit(1);
456
+ }
457
+ // Add dependency policy defaults
458
+ config.dependencyPolicy = config.dependencyPolicy || {
459
+ allowDependencyChange: false,
460
+ lockfileReadOnly: true,
461
+ };
462
+ // Run tasks
463
+ runTasks(config, runDir)
464
+ .then(() => {
465
+ process.exit(0);
466
+ })
467
+ .catch(error => {
468
+ console.error(`Runner failed: ${error.message}`);
469
+ if (process.env['DEBUG']) {
470
+ console.error(error.stack);
471
+ }
472
+ process.exit(1);
473
+ });
474
+ }
475
+ //# 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;