@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.
- package/CHANGELOG.md +7 -6
- 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/index.d.ts +6 -0
- package/dist/cli/index.js +120 -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 +58 -0
- package/dist/cli/resume.js.map +1 -0
- package/dist/cli/run.d.ts +5 -0
- package/dist/cli/run.js +74 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/setup-commands.d.ts +19 -0
- package/dist/cli/setup-commands.js +218 -0
- package/dist/cli/setup-commands.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 +49 -0
- package/dist/core/runner.js +475 -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/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 +117 -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/{index.js → index.ts} +22 -16
- package/src/cli/{init.js → init.ts} +26 -18
- package/src/cli/{monitor.js → monitor.ts} +57 -44
- package/src/cli/{resume.js → resume.ts} +11 -5
- package/src/cli/run.ts +54 -0
- package/src/cli/{setup-commands.js → setup-commands.ts} +19 -18
- 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} +78 -56
- package/src/utils/{config.js → config.ts} +17 -25
- package/src/utils/{cursor-agent.js → cursor-agent.ts} +38 -47
- 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 +133 -0
- package/src/cli/run.js +0 -51
|
@@ -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,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CursorFlow resume command (stub)
|
|
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 logger = __importStar(require("../utils/logger"));
|
|
39
|
+
function parseArgs(args) {
|
|
40
|
+
return {
|
|
41
|
+
lane: args[0],
|
|
42
|
+
runDir: null,
|
|
43
|
+
clean: args.includes('--clean'),
|
|
44
|
+
restart: args.includes('--restart'),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async function resume(args) {
|
|
48
|
+
logger.section('🔁 Resuming Lane');
|
|
49
|
+
const options = parseArgs(args);
|
|
50
|
+
logger.info('This command will be fully implemented in the next phase');
|
|
51
|
+
logger.info(`Lane: ${options.lane}`);
|
|
52
|
+
logger.info(`Clean: ${options.clean}`);
|
|
53
|
+
logger.info(`Restart: ${options.restart}`);
|
|
54
|
+
logger.warn('\n⚠️ Implementation pending');
|
|
55
|
+
logger.info('This will resume interrupted lanes');
|
|
56
|
+
}
|
|
57
|
+
module.exports = resume;
|
|
58
|
+
//# sourceMappingURL=resume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../src/cli/resume.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,wDAA0C;AAS1C,SAAS,SAAS,CAAC,IAAc;IAC/B,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACb,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC/B,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAc;IAClC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEnC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAEhC,MAAM,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IACxE,MAAM,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAE3C,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC5C,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;AACpD,CAAC;AAED,iBAAS,MAAM,CAAC"}
|
package/dist/cli/run.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CursorFlow run 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 orchestrator_1 = require("../core/orchestrator");
|
|
41
|
+
const config_1 = require("../utils/config");
|
|
42
|
+
function parseArgs(args) {
|
|
43
|
+
const tasksDir = args.find(a => !a.startsWith('--'));
|
|
44
|
+
const executorIdx = args.indexOf('--executor');
|
|
45
|
+
return {
|
|
46
|
+
tasksDir,
|
|
47
|
+
dryRun: args.includes('--dry-run'),
|
|
48
|
+
executor: executorIdx >= 0 ? args[executorIdx + 1] || null : null,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
async function run(args) {
|
|
52
|
+
const options = parseArgs(args);
|
|
53
|
+
if (!options.tasksDir) {
|
|
54
|
+
console.log('\nUsage: cursorflow run <tasks-dir> [options]');
|
|
55
|
+
throw new Error('Tasks directory required');
|
|
56
|
+
}
|
|
57
|
+
if (!fs.existsSync(options.tasksDir)) {
|
|
58
|
+
throw new Error(`Tasks directory not found: ${options.tasksDir}`);
|
|
59
|
+
}
|
|
60
|
+
const config = (0, config_1.loadConfig)();
|
|
61
|
+
try {
|
|
62
|
+
await (0, orchestrator_1.orchestrate)(options.tasksDir, {
|
|
63
|
+
executor: options.executor || config.executor,
|
|
64
|
+
pollInterval: config.pollInterval * 1000,
|
|
65
|
+
runDir: path.join(config.logsDir, 'runs', `run-${Date.now()}`),
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
// Re-throw to be handled by the main entry point
|
|
70
|
+
throw new Error(`Orchestration failed: ${error.message}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
module.exports = run;
|
|
74
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,2CAA6B;AAC7B,uCAAyB;AAEzB,uDAAmD;AACnD,4CAA6C;AAQ7C,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAE/C,OAAO;QACL,QAAQ;QACR,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QAClC,QAAQ,EAAE,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI;KAClE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,GAAG,CAAC,IAAc;IAC/B,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAEhC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAE5B,IAAI,CAAC;QACH,MAAM,IAAA,0BAAW,EAAC,OAAO,CAAC,QAAQ,EAAE;YAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ;YAC7C,YAAY,EAAE,MAAM,CAAC,YAAY,GAAG,IAAI;YACxC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;SAC/D,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,iDAAiD;QACjD,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,iBAAS,GAAG,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Setup Cursor commands
|
|
3
|
+
*
|
|
4
|
+
* Installs CursorFlow commands to .cursor/commands/cursorflow/
|
|
5
|
+
*/
|
|
6
|
+
interface SetupOptions {
|
|
7
|
+
force?: boolean;
|
|
8
|
+
uninstall?: boolean;
|
|
9
|
+
silent?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function setupCommands(options?: SetupOptions): {
|
|
12
|
+
installed: number;
|
|
13
|
+
backed: number;
|
|
14
|
+
skipped: number;
|
|
15
|
+
};
|
|
16
|
+
export declare function uninstallCommands(options?: SetupOptions): {
|
|
17
|
+
removed: number;
|
|
18
|
+
};
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Setup Cursor commands
|
|
4
|
+
*
|
|
5
|
+
* Installs CursorFlow commands to .cursor/commands/cursorflow/
|
|
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.setupCommands = setupCommands;
|
|
42
|
+
exports.uninstallCommands = uninstallCommands;
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const logger = __importStar(require("../utils/logger"));
|
|
46
|
+
const config_1 = require("../utils/config");
|
|
47
|
+
function parseArgs(args) {
|
|
48
|
+
const options = {
|
|
49
|
+
force: false,
|
|
50
|
+
uninstall: false,
|
|
51
|
+
silent: false,
|
|
52
|
+
};
|
|
53
|
+
for (const arg of args) {
|
|
54
|
+
switch (arg) {
|
|
55
|
+
case '--force':
|
|
56
|
+
options.force = true;
|
|
57
|
+
break;
|
|
58
|
+
case '--uninstall':
|
|
59
|
+
options.uninstall = true;
|
|
60
|
+
break;
|
|
61
|
+
case '--silent':
|
|
62
|
+
options.silent = true;
|
|
63
|
+
break;
|
|
64
|
+
case '--help':
|
|
65
|
+
case '-h':
|
|
66
|
+
printHelp();
|
|
67
|
+
process.exit(0);
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return options;
|
|
72
|
+
}
|
|
73
|
+
function printHelp() {
|
|
74
|
+
console.log(`
|
|
75
|
+
Usage: cursorflow-setup [options]
|
|
76
|
+
|
|
77
|
+
Install CursorFlow commands to Cursor IDE
|
|
78
|
+
|
|
79
|
+
Options:
|
|
80
|
+
--force Overwrite existing commands
|
|
81
|
+
--uninstall Remove installed commands
|
|
82
|
+
--silent Suppress output
|
|
83
|
+
--help, -h Show help
|
|
84
|
+
|
|
85
|
+
Examples:
|
|
86
|
+
cursorflow-setup
|
|
87
|
+
cursorflow-setup --force
|
|
88
|
+
cursorflow-setup --uninstall
|
|
89
|
+
`);
|
|
90
|
+
}
|
|
91
|
+
function getCommandsSourceDir() {
|
|
92
|
+
// Commands are in the package directory
|
|
93
|
+
return path.join(__dirname, '..', '..', 'commands');
|
|
94
|
+
}
|
|
95
|
+
function setupCommands(options = {}) {
|
|
96
|
+
const projectRoot = (0, config_1.findProjectRoot)();
|
|
97
|
+
const targetDir = path.join(projectRoot, '.cursor', 'commands', 'cursorflow');
|
|
98
|
+
const sourceDir = getCommandsSourceDir();
|
|
99
|
+
if (!options.silent) {
|
|
100
|
+
logger.info(`Installing commands to: ${path.relative(projectRoot, targetDir)}`);
|
|
101
|
+
}
|
|
102
|
+
// Create target directory
|
|
103
|
+
if (!fs.existsSync(targetDir)) {
|
|
104
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
105
|
+
}
|
|
106
|
+
// Get list of command files
|
|
107
|
+
if (!fs.existsSync(sourceDir)) {
|
|
108
|
+
throw new Error(`Commands directory not found: ${sourceDir}`);
|
|
109
|
+
}
|
|
110
|
+
const commandFiles = fs.readdirSync(sourceDir).filter(f => f.endsWith('.md'));
|
|
111
|
+
if (commandFiles.length === 0) {
|
|
112
|
+
throw new Error(`No command files found in ${sourceDir}`);
|
|
113
|
+
}
|
|
114
|
+
let installed = 0;
|
|
115
|
+
let backed = 0;
|
|
116
|
+
let skipped = 0;
|
|
117
|
+
for (const file of commandFiles) {
|
|
118
|
+
const sourcePath = path.join(sourceDir, file);
|
|
119
|
+
const targetPath = path.join(targetDir, file);
|
|
120
|
+
// Check if file exists
|
|
121
|
+
if (fs.existsSync(targetPath)) {
|
|
122
|
+
if (options.force) {
|
|
123
|
+
// Backup existing file
|
|
124
|
+
const backupPath = `${targetPath}.backup`;
|
|
125
|
+
fs.copyFileSync(targetPath, backupPath);
|
|
126
|
+
backed++;
|
|
127
|
+
if (!options.silent) {
|
|
128
|
+
logger.info(`📦 Backed up: ${file}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
skipped++;
|
|
133
|
+
if (!options.silent) {
|
|
134
|
+
logger.info(`⏭️ Skipped (exists): ${file}`);
|
|
135
|
+
}
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Copy file
|
|
140
|
+
fs.copyFileSync(sourcePath, targetPath);
|
|
141
|
+
installed++;
|
|
142
|
+
if (!options.silent) {
|
|
143
|
+
logger.success(`Installed: ${file}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (!options.silent) {
|
|
147
|
+
logger.section('🎉 Setup complete!');
|
|
148
|
+
console.log(` Installed: ${installed} commands`);
|
|
149
|
+
if (backed > 0) {
|
|
150
|
+
console.log(` Backed up: ${backed} existing commands`);
|
|
151
|
+
}
|
|
152
|
+
if (skipped > 0) {
|
|
153
|
+
console.log(` Skipped: ${skipped} commands (use --force to overwrite)`);
|
|
154
|
+
}
|
|
155
|
+
console.log(`\n📍 Location: ${targetDir}`);
|
|
156
|
+
console.log('\n💡 Usage: Type "/" in Cursor chat to see commands');
|
|
157
|
+
}
|
|
158
|
+
return { installed, backed, skipped };
|
|
159
|
+
}
|
|
160
|
+
function uninstallCommands(options = {}) {
|
|
161
|
+
const projectRoot = (0, config_1.findProjectRoot)();
|
|
162
|
+
const targetDir = path.join(projectRoot, '.cursor', 'commands', 'cursorflow');
|
|
163
|
+
if (!fs.existsSync(targetDir)) {
|
|
164
|
+
if (!options.silent) {
|
|
165
|
+
logger.info('Commands directory not found, nothing to uninstall');
|
|
166
|
+
}
|
|
167
|
+
return { removed: 0 };
|
|
168
|
+
}
|
|
169
|
+
const commandFiles = fs.readdirSync(targetDir).filter(f => f.endsWith('.md'));
|
|
170
|
+
let removed = 0;
|
|
171
|
+
for (const file of commandFiles) {
|
|
172
|
+
const filePath = path.join(targetDir, file);
|
|
173
|
+
fs.unlinkSync(filePath);
|
|
174
|
+
removed++;
|
|
175
|
+
if (!options.silent) {
|
|
176
|
+
logger.info(`Removed: ${file}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Remove directory if empty
|
|
180
|
+
const remainingFiles = fs.readdirSync(targetDir);
|
|
181
|
+
if (remainingFiles.length === 0) {
|
|
182
|
+
fs.rmdirSync(targetDir);
|
|
183
|
+
if (!options.silent) {
|
|
184
|
+
logger.info(`Removed directory: ${targetDir}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (!options.silent) {
|
|
188
|
+
logger.success(`Uninstalled ${removed} commands`);
|
|
189
|
+
}
|
|
190
|
+
return { removed };
|
|
191
|
+
}
|
|
192
|
+
async function main(args) {
|
|
193
|
+
const options = parseArgs(args);
|
|
194
|
+
try {
|
|
195
|
+
if (options.uninstall) {
|
|
196
|
+
return uninstallCommands(options);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
return setupCommands(options);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
if (!options.silent) {
|
|
204
|
+
logger.error(error.message);
|
|
205
|
+
}
|
|
206
|
+
throw error;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (require.main === module) {
|
|
210
|
+
main(process.argv.slice(2)).catch(error => {
|
|
211
|
+
console.error('❌ Error:', error.message);
|
|
212
|
+
if (process.env['DEBUG']) {
|
|
213
|
+
console.error(error.stack);
|
|
214
|
+
}
|
|
215
|
+
process.exit(1);
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=setup-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-commands.js","sourceRoot":"","sources":["../../src/cli/setup-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orchestrator - Parallel lane execution with dependency management
|
|
3
|
+
*
|
|
4
|
+
* Adapted from admin-domains-orchestrator.js
|
|
5
|
+
*/
|
|
6
|
+
import { ChildProcess } from 'child_process';
|
|
7
|
+
export interface LaneInfo {
|
|
8
|
+
name: string;
|
|
9
|
+
path: string;
|
|
10
|
+
}
|
|
11
|
+
export interface SpawnLaneResult {
|
|
12
|
+
child: ChildProcess;
|
|
13
|
+
logPath: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Spawn a lane process
|
|
17
|
+
*/
|
|
18
|
+
export declare function spawnLane({ tasksFile, laneRunDir, executor }: {
|
|
19
|
+
laneName: string;
|
|
20
|
+
tasksFile: string;
|
|
21
|
+
laneRunDir: string;
|
|
22
|
+
executor: string;
|
|
23
|
+
}): SpawnLaneResult;
|
|
24
|
+
/**
|
|
25
|
+
* Wait for child process to exit
|
|
26
|
+
*/
|
|
27
|
+
export declare function waitChild(proc: ChildProcess): Promise<number>;
|
|
28
|
+
/**
|
|
29
|
+
* List lane task files in directory
|
|
30
|
+
*/
|
|
31
|
+
export declare function listLaneFiles(tasksDir: string): LaneInfo[];
|
|
32
|
+
/**
|
|
33
|
+
* Monitor lane states
|
|
34
|
+
*/
|
|
35
|
+
export declare function printLaneStatus(lanes: LaneInfo[], laneRunDirs: Record<string, string>): void;
|
|
36
|
+
/**
|
|
37
|
+
* Run orchestration
|
|
38
|
+
*/
|
|
39
|
+
export declare function orchestrate(tasksDir: string, options?: {
|
|
40
|
+
runDir?: string;
|
|
41
|
+
executor?: string;
|
|
42
|
+
pollInterval?: number;
|
|
43
|
+
}): Promise<{
|
|
44
|
+
lanes: LaneInfo[];
|
|
45
|
+
exitCodes: Record<string, number>;
|
|
46
|
+
runRoot: string;
|
|
47
|
+
}>;
|