@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
package/dist/cli/init.js
ADDED
|
@@ -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,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,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
|