@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,302 @@
1
+ "use strict";
2
+ /**
3
+ * CursorFlow init command
4
+ *
5
+ * Initialize CursorFlow in a project
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
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const logger = __importStar(require("../utils/logger"));
43
+ const config_1 = require("../utils/config");
44
+ const setup_commands_1 = require("./setup-commands");
45
+ function parseArgs(args) {
46
+ const options = {
47
+ example: false,
48
+ withCommands: true,
49
+ configOnly: false,
50
+ force: false,
51
+ gitignore: true,
52
+ };
53
+ for (let i = 0; i < args.length; i++) {
54
+ const arg = args[i];
55
+ switch (arg) {
56
+ case '--example':
57
+ options.example = true;
58
+ break;
59
+ case '--with-commands':
60
+ options.withCommands = true;
61
+ break;
62
+ case '--no-commands':
63
+ options.withCommands = false;
64
+ break;
65
+ case '--config-only':
66
+ options.configOnly = true;
67
+ break;
68
+ case '--force':
69
+ options.force = true;
70
+ break;
71
+ case '--no-gitignore':
72
+ options.gitignore = false;
73
+ break;
74
+ case '--help':
75
+ case '-h':
76
+ printHelp();
77
+ process.exit(0);
78
+ break;
79
+ }
80
+ }
81
+ return options;
82
+ }
83
+ function printHelp() {
84
+ console.log(`
85
+ Usage: cursorflow init [options]
86
+
87
+ Initialize CursorFlow in your project
88
+
89
+ Options:
90
+ --example Create example tasks
91
+ --with-commands Install Cursor commands (default: true)
92
+ --no-commands Skip Cursor commands installation
93
+ --no-gitignore Skip adding _cursorflow to .gitignore
94
+ --config-only Only create config file
95
+ --force Overwrite existing files
96
+ --help, -h Show help
97
+
98
+ Examples:
99
+ cursorflow init
100
+ cursorflow init --example
101
+ cursorflow init --config-only
102
+ cursorflow init --no-gitignore
103
+ `);
104
+ }
105
+ function createDirectories(projectRoot, config) {
106
+ const tasksDir = path.join(projectRoot, config.tasksDir);
107
+ const logsDir = path.join(projectRoot, config.logsDir);
108
+ if (!fs.existsSync(tasksDir)) {
109
+ fs.mkdirSync(tasksDir, { recursive: true });
110
+ logger.success(`Created directory: ${config.tasksDir}`);
111
+ }
112
+ else {
113
+ logger.info(`Directory already exists: ${config.tasksDir}`);
114
+ }
115
+ if (!fs.existsSync(logsDir)) {
116
+ fs.mkdirSync(logsDir, { recursive: true });
117
+ logger.success(`Created directory: ${config.logsDir}`);
118
+ }
119
+ else {
120
+ logger.info(`Directory already exists: ${config.logsDir}`);
121
+ }
122
+ }
123
+ function createExampleTasks(projectRoot, config) {
124
+ const exampleDir = path.join(projectRoot, config.tasksDir, 'example');
125
+ if (!fs.existsSync(exampleDir)) {
126
+ fs.mkdirSync(exampleDir, { recursive: true });
127
+ }
128
+ const exampleTask = {
129
+ repository: "https://github.com/your-org/your-repo",
130
+ baseBranch: "main",
131
+ branchPrefix: "cursorflow/example-",
132
+ executor: "cursor-agent",
133
+ autoCreatePr: false,
134
+ pollInterval: 60,
135
+ tasks: [
136
+ {
137
+ name: "hello",
138
+ model: "sonnet-4.5",
139
+ prompt: `# Example Task
140
+
141
+ ## Goal
142
+ Create a simple hello.txt file with a greeting message.
143
+
144
+ ## Steps
145
+ 1. Create a file called hello.txt
146
+ 2. Write "Hello from CursorFlow!" in the file
147
+ 3. Commit the change with message: "feat: add hello file"
148
+ `
149
+ }
150
+ ]
151
+ };
152
+ const taskPath = path.join(exampleDir, '01-hello.json');
153
+ fs.writeFileSync(taskPath, JSON.stringify(exampleTask, null, 2) + '\n', 'utf8');
154
+ logger.success(`Created example task: ${path.relative(projectRoot, taskPath)}`);
155
+ // Create README
156
+ const readmePath = path.join(exampleDir, 'README.md');
157
+ const readme = `# Example Task
158
+
159
+ This is an example CursorFlow task to help you get started.
160
+
161
+ ## Running the example
162
+
163
+ \`\`\`bash
164
+ cursorflow run ${config.tasksDir}/example/
165
+ \`\`\`
166
+
167
+ ## What it does
168
+
169
+ - Creates a simple hello.txt file
170
+ - Demonstrates basic task structure
171
+ - Shows how to write task prompts
172
+
173
+ ## Next steps
174
+
175
+ 1. Review the task configuration in \`01-hello.json\`
176
+ 2. Run the task to see CursorFlow in action
177
+ 3. Create your own tasks based on this example
178
+ `;
179
+ fs.writeFileSync(readmePath, readme, 'utf8');
180
+ logger.success(`Created example README: ${path.relative(projectRoot, readmePath)}`);
181
+ }
182
+ /**
183
+ * Add _cursorflow to .gitignore
184
+ */
185
+ function updateGitignore(projectRoot) {
186
+ const gitignorePath = path.join(projectRoot, '.gitignore');
187
+ const entry = '_cursorflow/';
188
+ // Check if .gitignore exists
189
+ if (!fs.existsSync(gitignorePath)) {
190
+ // Create new .gitignore
191
+ fs.writeFileSync(gitignorePath, `# CursorFlow\n${entry}\n`, 'utf8');
192
+ logger.success('Created .gitignore with _cursorflow/');
193
+ return;
194
+ }
195
+ // Read existing .gitignore
196
+ const content = fs.readFileSync(gitignorePath, 'utf8');
197
+ // Check if already included
198
+ const lines = content.split('\n');
199
+ const hasEntry = lines.some(line => {
200
+ const trimmed = line.trim();
201
+ return trimmed === '_cursorflow' ||
202
+ trimmed === '_cursorflow/' ||
203
+ trimmed === '/_cursorflow' ||
204
+ trimmed === '/_cursorflow/';
205
+ });
206
+ if (hasEntry) {
207
+ logger.info('_cursorflow/ already in .gitignore');
208
+ return;
209
+ }
210
+ // Add entry
211
+ let newContent = content;
212
+ // Add newline if file doesn't end with one
213
+ if (!content.endsWith('\n')) {
214
+ newContent += '\n';
215
+ }
216
+ // Add section header and entry
217
+ newContent += `\n# CursorFlow\n${entry}\n`;
218
+ fs.writeFileSync(gitignorePath, newContent, 'utf8');
219
+ logger.success('Added _cursorflow/ to .gitignore');
220
+ }
221
+ async function init(args) {
222
+ logger.section('🚀 Initializing CursorFlow');
223
+ const options = parseArgs(args);
224
+ const projectRoot = (0, config_1.findProjectRoot)();
225
+ logger.info(`Project root: ${projectRoot}`);
226
+ // 1. Create config file
227
+ const configPath = path.join(projectRoot, 'cursorflow.config.js');
228
+ const configExists = fs.existsSync(configPath);
229
+ if (configExists && !options.force) {
230
+ logger.warn(`Config file already exists: ${configPath}`);
231
+ logger.info('Use --force to overwrite');
232
+ }
233
+ else {
234
+ try {
235
+ (0, config_1.createDefaultConfig)(projectRoot, options.force);
236
+ logger.success(`Created config file: cursorflow.config.js`);
237
+ }
238
+ catch (error) {
239
+ if (error.message.includes('already exists') && !options.force) {
240
+ logger.warn(error.message);
241
+ }
242
+ else {
243
+ throw error;
244
+ }
245
+ }
246
+ }
247
+ // We need to require the config file after it might have been created
248
+ const config = require(configPath);
249
+ if (options.configOnly) {
250
+ logger.section('✅ Configuration initialized');
251
+ logger.info('\nNext steps:');
252
+ logger.info(' 1. Review cursorflow.config.js');
253
+ logger.info(' 2. Run: cursorflow init (without --config-only) to set up directories');
254
+ return;
255
+ }
256
+ // 2. Create directories
257
+ logger.info('\n📁 Creating directories...');
258
+ createDirectories(projectRoot, config);
259
+ // 3. Update .gitignore
260
+ if (options.gitignore) {
261
+ logger.info('\n📝 Updating .gitignore...');
262
+ try {
263
+ updateGitignore(projectRoot);
264
+ }
265
+ catch (error) {
266
+ logger.warn(`Failed to update .gitignore: ${error.message}`);
267
+ logger.info('You can manually add "_cursorflow/" to your .gitignore');
268
+ }
269
+ }
270
+ // 4. Install Cursor commands
271
+ if (options.withCommands) {
272
+ logger.info('\n📋 Installing Cursor commands...');
273
+ try {
274
+ await (0, setup_commands_1.setupCommands)({ force: options.force, silent: false });
275
+ }
276
+ catch (error) {
277
+ logger.warn(`Failed to install Cursor commands: ${error.message}`);
278
+ logger.info('You can install them later with: npx cursorflow-setup');
279
+ }
280
+ }
281
+ // 5. Create example tasks
282
+ if (options.example) {
283
+ logger.info('\n📝 Creating example tasks...');
284
+ createExampleTasks(projectRoot, config);
285
+ }
286
+ // 6. Summary
287
+ logger.section('✅ CursorFlow initialized successfully!');
288
+ console.log('\n📚 Next steps:\n');
289
+ console.log(' 1. Review cursorflow.config.js');
290
+ console.log(' 2. Type "/" in Cursor IDE to see available commands');
291
+ if (options.example) {
292
+ console.log(` 3. Run: cursorflow run ${config.tasksDir}/example/`);
293
+ }
294
+ else {
295
+ console.log(' 3. Create tasks with: cursorflow prepare MyFeature');
296
+ }
297
+ console.log('\n📖 Documentation:');
298
+ console.log(' https://github.com/eungjin-cigro/cursorflow#readme');
299
+ console.log('');
300
+ }
301
+ module.exports = init;
302
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * CursorFlow monitor command
3
+ */
4
+ /**
5
+ * Monitor lanes
6
+ */
7
+ declare function monitor(args: string[]): Promise<void>;
8
+ export = monitor;
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ /**
3
+ * CursorFlow monitor command
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const logger = __importStar(require("../utils/logger"));
41
+ const state_1 = require("../utils/state");
42
+ const config_1 = require("../utils/config");
43
+ function parseArgs(args) {
44
+ const watch = args.includes('--watch');
45
+ const intervalIdx = args.indexOf('--interval');
46
+ const interval = intervalIdx >= 0 ? parseInt(args[intervalIdx + 1] || '2') || 2 : 2;
47
+ // Find run directory (first non-option argument)
48
+ const runDir = args.find(arg => !arg.startsWith('--') && args.indexOf(arg) !== intervalIdx + 1);
49
+ return {
50
+ runDir,
51
+ watch,
52
+ interval,
53
+ };
54
+ }
55
+ /**
56
+ * Find the latest run directory
57
+ */
58
+ function findLatestRunDir(logsDir) {
59
+ const runsDir = path.join(logsDir, 'runs');
60
+ if (!fs.existsSync(runsDir)) {
61
+ return null;
62
+ }
63
+ const runs = fs.readdirSync(runsDir)
64
+ .filter(d => d.startsWith('run-'))
65
+ .map(d => ({
66
+ name: d,
67
+ path: path.join(runsDir, d),
68
+ mtime: fs.statSync(path.join(runsDir, d)).mtime.getTime(),
69
+ }))
70
+ .sort((a, b) => b.mtime - a.mtime);
71
+ return runs.length > 0 ? runs[0].path : null;
72
+ }
73
+ /**
74
+ * List all lanes in a run directory
75
+ */
76
+ function listLanes(runDir) {
77
+ const lanesDir = path.join(runDir, 'lanes');
78
+ if (!fs.existsSync(lanesDir)) {
79
+ return [];
80
+ }
81
+ return fs.readdirSync(lanesDir)
82
+ .filter(d => {
83
+ const stat = fs.statSync(path.join(lanesDir, d));
84
+ return stat.isDirectory();
85
+ })
86
+ .map(name => ({
87
+ name,
88
+ path: path.join(lanesDir, name),
89
+ }));
90
+ }
91
+ /**
92
+ * Get lane status
93
+ */
94
+ function getLaneStatus(lanePath) {
95
+ const statePath = path.join(lanePath, 'state.json');
96
+ const state = (0, state_1.loadState)(statePath);
97
+ if (!state) {
98
+ return {
99
+ status: 'no state',
100
+ currentTask: '-',
101
+ totalTasks: '?',
102
+ progress: '0%',
103
+ };
104
+ }
105
+ const progress = state.totalTasks > 0
106
+ ? Math.round((state.currentTaskIndex / state.totalTasks) * 100)
107
+ : 0;
108
+ return {
109
+ status: state.status || 'unknown',
110
+ currentTask: (state.currentTaskIndex || 0) + 1,
111
+ totalTasks: state.totalTasks || '?',
112
+ progress: `${progress}%`,
113
+ pipelineBranch: state.pipelineBranch || '-',
114
+ chatId: state.chatId || '-',
115
+ };
116
+ }
117
+ /**
118
+ * Get status icon
119
+ */
120
+ function getStatusIcon(status) {
121
+ const icons = {
122
+ 'running': '🔄',
123
+ 'completed': '✅',
124
+ 'failed': '❌',
125
+ 'blocked_dependency': '🚫',
126
+ 'no state': '⚪',
127
+ };
128
+ return icons[status] || '❓';
129
+ }
130
+ /**
131
+ * Display lane status table
132
+ */
133
+ function displayStatus(runDir, lanes) {
134
+ console.log('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
135
+ console.log(`📊 Run: ${path.basename(runDir)}`);
136
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
137
+ if (lanes.length === 0) {
138
+ console.log(' No lanes found\n');
139
+ return;
140
+ }
141
+ // Calculate column widths
142
+ const maxNameLen = Math.max(...lanes.map(l => l.name.length), 10);
143
+ // Header
144
+ console.log(` ${'Lane'.padEnd(maxNameLen)} Status Progress Tasks`);
145
+ console.log(` ${'─'.repeat(maxNameLen)} ${'─'.repeat(18)} ${'─'.repeat(8)} ${'─'.repeat(10)}`);
146
+ // Lanes
147
+ for (const lane of lanes) {
148
+ const status = getLaneStatus(lane.path);
149
+ const statusIcon = getStatusIcon(status.status);
150
+ const statusText = `${statusIcon} ${status.status}`.padEnd(18);
151
+ const progressText = status.progress.padEnd(8);
152
+ const tasksText = `${status.currentTask}/${status.totalTasks}`;
153
+ console.log(` ${lane.name.padEnd(maxNameLen)} ${statusText} ${progressText} ${tasksText}`);
154
+ }
155
+ console.log();
156
+ }
157
+ /**
158
+ * Monitor lanes
159
+ */
160
+ async function monitor(args) {
161
+ logger.section('📡 Monitoring Lane Execution');
162
+ const options = parseArgs(args);
163
+ const config = (0, config_1.loadConfig)();
164
+ // Determine run directory
165
+ let runDir = options.runDir;
166
+ if (!runDir || runDir === 'latest') {
167
+ runDir = findLatestRunDir(config.logsDir) || undefined;
168
+ if (!runDir) {
169
+ logger.error(`Runs directory: ${path.join(config.logsDir, 'runs')}`);
170
+ throw new Error('No run directories found');
171
+ }
172
+ logger.info(`Using latest run: ${path.basename(runDir)}`);
173
+ }
174
+ if (!fs.existsSync(runDir)) {
175
+ throw new Error(`Run directory not found: ${runDir}`);
176
+ }
177
+ // Watch mode
178
+ if (options.watch) {
179
+ logger.info(`Watch mode: every ${options.interval}s (Ctrl+C to stop)\n`);
180
+ let iteration = 0;
181
+ const refresh = () => {
182
+ if (iteration > 0) {
183
+ // Clear screen
184
+ process.stdout.write('\x1Bc');
185
+ }
186
+ const lanes = listLanes(runDir);
187
+ displayStatus(runDir, lanes);
188
+ iteration++;
189
+ };
190
+ // Initial display
191
+ refresh();
192
+ // Set up interval
193
+ const intervalId = setInterval(refresh, options.interval * 1000);
194
+ // Handle Ctrl+C
195
+ return new Promise((_, reject) => {
196
+ process.on('SIGINT', () => {
197
+ clearInterval(intervalId);
198
+ console.log('\n👋 Monitoring stopped\n');
199
+ process.exit(0);
200
+ });
201
+ });
202
+ }
203
+ else {
204
+ // Single shot
205
+ const lanes = listLanes(runDir);
206
+ displayStatus(runDir, lanes);
207
+ }
208
+ }
209
+ module.exports = monitor;
210
+ //# sourceMappingURL=monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/cli/monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * CursorFlow resume command
3
+ */
4
+ declare function resume(args: string[]): Promise<void>;
5
+ export = resume;
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ /**
3
+ * CursorFlow resume command
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ const path = __importStar(require("path"));
39
+ const fs = __importStar(require("fs"));
40
+ const child_process_1 = require("child_process");
41
+ const logger = __importStar(require("../utils/logger"));
42
+ const config_1 = require("../utils/config");
43
+ const state_1 = require("../utils/state");
44
+ function parseArgs(args) {
45
+ const runDirIdx = args.indexOf('--run-dir');
46
+ return {
47
+ lane: args.find(a => !a.startsWith('--')) || null,
48
+ runDir: runDirIdx >= 0 ? args[runDirIdx + 1] || null : null,
49
+ clean: args.includes('--clean'),
50
+ restart: args.includes('--restart'),
51
+ };
52
+ }
53
+ /**
54
+ * Find the latest run directory
55
+ */
56
+ function findLatestRunDir(logsDir) {
57
+ const runsDir = path.join(logsDir, 'runs');
58
+ if (!fs.existsSync(runsDir))
59
+ return null;
60
+ const runs = fs.readdirSync(runsDir)
61
+ .filter(d => d.startsWith('run-'))
62
+ .sort()
63
+ .reverse();
64
+ return runs.length > 0 ? path.join(runsDir, runs[0]) : null;
65
+ }
66
+ async function resume(args) {
67
+ const options = parseArgs(args);
68
+ const config = (0, config_1.loadConfig)();
69
+ const logsDir = (0, config_1.getLogsDir)(config);
70
+ if (!options.lane) {
71
+ throw new Error('Lane name required (e.g., cursorflow resume lane-1)');
72
+ }
73
+ let runDir = options.runDir;
74
+ if (!runDir) {
75
+ runDir = findLatestRunDir(logsDir);
76
+ }
77
+ if (!runDir || !fs.existsSync(runDir)) {
78
+ throw new Error(`Run directory not found: ${runDir || 'latest'}`);
79
+ }
80
+ const laneDir = path.join(runDir, 'lanes', options.lane);
81
+ const statePath = path.join(laneDir, 'state.json');
82
+ if (!fs.existsSync(statePath)) {
83
+ throw new Error(`Lane state not found at ${statePath}. Is the lane name correct?`);
84
+ }
85
+ const state = (0, state_1.loadState)(statePath);
86
+ if (!state) {
87
+ throw new Error(`Failed to load state from ${statePath}`);
88
+ }
89
+ if (!state.tasksFile || !fs.existsSync(state.tasksFile)) {
90
+ throw new Error(`Original tasks file not found: ${state.tasksFile}. Resume impossible without task definition.`);
91
+ }
92
+ logger.section(`🔁 Resuming Lane: ${options.lane}`);
93
+ logger.info(`Run: ${path.basename(runDir)}`);
94
+ logger.info(`Tasks: ${state.tasksFile}`);
95
+ logger.info(`Starting from task index: ${options.restart ? 0 : state.currentTaskIndex}`);
96
+ const runnerPath = require.resolve('../core/runner');
97
+ const runnerArgs = [
98
+ runnerPath,
99
+ state.tasksFile,
100
+ '--run-dir', laneDir,
101
+ '--start-index', options.restart ? '0' : String(state.currentTaskIndex),
102
+ ];
103
+ logger.info(`Spawning runner process...`);
104
+ const child = (0, child_process_1.spawn)('node', runnerArgs, {
105
+ stdio: 'inherit',
106
+ env: process.env,
107
+ });
108
+ return new Promise((resolve, reject) => {
109
+ child.on('exit', (code) => {
110
+ if (code === 0) {
111
+ logger.success(`Lane ${options.lane} completed successfully`);
112
+ resolve();
113
+ }
114
+ else if (code === 2) {
115
+ logger.warn(`Lane ${options.lane} blocked on dependency change`);
116
+ resolve();
117
+ }
118
+ else {
119
+ reject(new Error(`Lane ${options.lane} failed with exit code ${code}`));
120
+ }
121
+ });
122
+ child.on('error', (error) => {
123
+ reject(new Error(`Failed to start runner: ${error.message}`));
124
+ });
125
+ });
126
+ }
127
+ module.exports = resume;
128
+ //# sourceMappingURL=resume.js.map