@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../src/cli/resume.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/run.js
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
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 logger = __importStar(require("../utils/logger"));
|
|
41
|
+
const orchestrator_1 = require("../core/orchestrator");
|
|
42
|
+
const config_1 = require("../utils/config");
|
|
43
|
+
const doctor_1 = require("../utils/doctor");
|
|
44
|
+
const setup_commands_1 = require("./setup-commands");
|
|
45
|
+
function parseArgs(args) {
|
|
46
|
+
const tasksDir = args.find(a => !a.startsWith('--'));
|
|
47
|
+
const executorIdx = args.indexOf('--executor');
|
|
48
|
+
return {
|
|
49
|
+
tasksDir,
|
|
50
|
+
dryRun: args.includes('--dry-run'),
|
|
51
|
+
executor: executorIdx >= 0 ? args[executorIdx + 1] || null : null,
|
|
52
|
+
skipDoctor: args.includes('--skip-doctor') || args.includes('--no-doctor'),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
async function run(args) {
|
|
56
|
+
const options = parseArgs(args);
|
|
57
|
+
// Auto-setup Cursor commands if missing or outdated
|
|
58
|
+
if (!(0, setup_commands_1.areCommandsInstalled)()) {
|
|
59
|
+
logger.info('Installing missing or outdated Cursor IDE commands...');
|
|
60
|
+
try {
|
|
61
|
+
(0, setup_commands_1.setupCommands)({ silent: true });
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
// Non-blocking
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (!options.tasksDir) {
|
|
68
|
+
console.log('\nUsage: cursorflow run <tasks-dir> [options]');
|
|
69
|
+
throw new Error('Tasks directory required');
|
|
70
|
+
}
|
|
71
|
+
const config = (0, config_1.loadConfig)();
|
|
72
|
+
const logsDir = (0, config_1.getLogsDir)(config);
|
|
73
|
+
// Resolve tasks dir:
|
|
74
|
+
// - Prefer the exact path if it exists relative to cwd
|
|
75
|
+
// - Otherwise, fall back to projectRoot-relative path for better ergonomics
|
|
76
|
+
const tasksDir = path.isAbsolute(options.tasksDir)
|
|
77
|
+
? options.tasksDir
|
|
78
|
+
: (fs.existsSync(options.tasksDir)
|
|
79
|
+
? path.resolve(process.cwd(), options.tasksDir)
|
|
80
|
+
: path.join(config.projectRoot, options.tasksDir));
|
|
81
|
+
if (!fs.existsSync(tasksDir)) {
|
|
82
|
+
throw new Error(`Tasks directory not found: ${tasksDir}`);
|
|
83
|
+
}
|
|
84
|
+
// Preflight checks (doctor)
|
|
85
|
+
if (!options.skipDoctor) {
|
|
86
|
+
const report = (0, doctor_1.runDoctor)({
|
|
87
|
+
cwd: process.cwd(),
|
|
88
|
+
tasksDir,
|
|
89
|
+
executor: options.executor || config.executor,
|
|
90
|
+
includeCursorAgentChecks: true,
|
|
91
|
+
});
|
|
92
|
+
if (!report.ok) {
|
|
93
|
+
logger.section('🛑 Pre-flight check failed');
|
|
94
|
+
for (const issue of report.issues) {
|
|
95
|
+
const header = `${issue.title} (${issue.id})`;
|
|
96
|
+
if (issue.severity === 'error') {
|
|
97
|
+
logger.error(header, '❌');
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
logger.warn(header, '⚠️');
|
|
101
|
+
}
|
|
102
|
+
console.log(` ${issue.message}`);
|
|
103
|
+
if (issue.details)
|
|
104
|
+
console.log(` Details: ${issue.details}`);
|
|
105
|
+
if (issue.fixes?.length) {
|
|
106
|
+
console.log(' Fix:');
|
|
107
|
+
for (const fix of issue.fixes)
|
|
108
|
+
console.log(` - ${fix}`);
|
|
109
|
+
}
|
|
110
|
+
console.log('');
|
|
111
|
+
}
|
|
112
|
+
throw new Error('Pre-flight checks failed. Run `cursorflow doctor` for details.');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
await (0, orchestrator_1.orchestrate)(tasksDir, {
|
|
117
|
+
executor: options.executor || config.executor,
|
|
118
|
+
pollInterval: config.pollInterval * 1000,
|
|
119
|
+
runDir: path.join(logsDir, 'runs', `run-${Date.now()}`),
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
// Re-throw to be handled by the main entry point
|
|
124
|
+
throw new Error(`Orchestration failed: ${error.message}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
module.exports = run;
|
|
128
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
+
/**
|
|
20
|
+
* Check if commands are already installed
|
|
21
|
+
*/
|
|
22
|
+
export declare function areCommandsInstalled(): boolean;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,234 @@
|
|
|
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
|
+
exports.areCommandsInstalled = areCommandsInstalled;
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const logger = __importStar(require("../utils/logger"));
|
|
47
|
+
const config_1 = require("../utils/config");
|
|
48
|
+
function parseArgs(args) {
|
|
49
|
+
const options = {
|
|
50
|
+
force: false,
|
|
51
|
+
uninstall: false,
|
|
52
|
+
silent: false,
|
|
53
|
+
};
|
|
54
|
+
for (const arg of args) {
|
|
55
|
+
switch (arg) {
|
|
56
|
+
case '--force':
|
|
57
|
+
options.force = true;
|
|
58
|
+
break;
|
|
59
|
+
case '--uninstall':
|
|
60
|
+
options.uninstall = true;
|
|
61
|
+
break;
|
|
62
|
+
case '--silent':
|
|
63
|
+
options.silent = true;
|
|
64
|
+
break;
|
|
65
|
+
case '--help':
|
|
66
|
+
case '-h':
|
|
67
|
+
printHelp();
|
|
68
|
+
process.exit(0);
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return options;
|
|
73
|
+
}
|
|
74
|
+
function printHelp() {
|
|
75
|
+
console.log(`
|
|
76
|
+
Usage: cursorflow-setup [options]
|
|
77
|
+
|
|
78
|
+
Install CursorFlow commands to Cursor IDE
|
|
79
|
+
|
|
80
|
+
Options:
|
|
81
|
+
--force Overwrite existing commands
|
|
82
|
+
--uninstall Remove installed commands
|
|
83
|
+
--silent Suppress output
|
|
84
|
+
--help, -h Show help
|
|
85
|
+
|
|
86
|
+
Examples:
|
|
87
|
+
cursorflow-setup
|
|
88
|
+
cursorflow-setup --force
|
|
89
|
+
cursorflow-setup --uninstall
|
|
90
|
+
`);
|
|
91
|
+
}
|
|
92
|
+
function getCommandsSourceDir() {
|
|
93
|
+
// Commands are in the package directory
|
|
94
|
+
return path.join(__dirname, '..', '..', 'commands');
|
|
95
|
+
}
|
|
96
|
+
function setupCommands(options = {}) {
|
|
97
|
+
const projectRoot = (0, config_1.findProjectRoot)();
|
|
98
|
+
const targetDir = path.join(projectRoot, '.cursor', 'commands', 'cursorflow');
|
|
99
|
+
const sourceDir = getCommandsSourceDir();
|
|
100
|
+
if (!options.silent) {
|
|
101
|
+
logger.info(`Installing commands to: ${path.relative(projectRoot, targetDir)}`);
|
|
102
|
+
}
|
|
103
|
+
// Create target directory
|
|
104
|
+
if (!fs.existsSync(targetDir)) {
|
|
105
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
106
|
+
}
|
|
107
|
+
// Get list of command files
|
|
108
|
+
if (!fs.existsSync(sourceDir)) {
|
|
109
|
+
throw new Error(`Commands directory not found: ${sourceDir}`);
|
|
110
|
+
}
|
|
111
|
+
const commandFiles = fs.readdirSync(sourceDir).filter(f => f.endsWith('.md'));
|
|
112
|
+
if (commandFiles.length === 0) {
|
|
113
|
+
throw new Error(`No command files found in ${sourceDir}`);
|
|
114
|
+
}
|
|
115
|
+
let installed = 0;
|
|
116
|
+
let backed = 0;
|
|
117
|
+
let skipped = 0;
|
|
118
|
+
for (const file of commandFiles) {
|
|
119
|
+
const sourcePath = path.join(sourceDir, file);
|
|
120
|
+
const targetPath = path.join(targetDir, file);
|
|
121
|
+
// Check if file exists
|
|
122
|
+
if (fs.existsSync(targetPath)) {
|
|
123
|
+
if (options.force) {
|
|
124
|
+
// Backup existing file
|
|
125
|
+
const backupPath = `${targetPath}.backup`;
|
|
126
|
+
fs.copyFileSync(targetPath, backupPath);
|
|
127
|
+
backed++;
|
|
128
|
+
if (!options.silent) {
|
|
129
|
+
logger.info(`📦 Backed up: ${file}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
skipped++;
|
|
134
|
+
if (!options.silent) {
|
|
135
|
+
logger.info(`⏭️ Skipped (exists): ${file}`);
|
|
136
|
+
}
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Copy file
|
|
141
|
+
fs.copyFileSync(sourcePath, targetPath);
|
|
142
|
+
installed++;
|
|
143
|
+
if (!options.silent) {
|
|
144
|
+
logger.success(`Installed: ${file}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (!options.silent) {
|
|
148
|
+
logger.section('🎉 Setup complete!');
|
|
149
|
+
console.log(` Installed: ${installed} commands`);
|
|
150
|
+
if (backed > 0) {
|
|
151
|
+
console.log(` Backed up: ${backed} existing commands`);
|
|
152
|
+
}
|
|
153
|
+
if (skipped > 0) {
|
|
154
|
+
console.log(` Skipped: ${skipped} commands (use --force to overwrite)`);
|
|
155
|
+
}
|
|
156
|
+
console.log(`\n📍 Location: ${targetDir}`);
|
|
157
|
+
console.log('\n💡 Usage: Type "/" in Cursor chat to see commands');
|
|
158
|
+
}
|
|
159
|
+
return { installed, backed, skipped };
|
|
160
|
+
}
|
|
161
|
+
function uninstallCommands(options = {}) {
|
|
162
|
+
const projectRoot = (0, config_1.findProjectRoot)();
|
|
163
|
+
const targetDir = path.join(projectRoot, '.cursor', 'commands', 'cursorflow');
|
|
164
|
+
if (!fs.existsSync(targetDir)) {
|
|
165
|
+
if (!options.silent) {
|
|
166
|
+
logger.info('Commands directory not found, nothing to uninstall');
|
|
167
|
+
}
|
|
168
|
+
return { removed: 0 };
|
|
169
|
+
}
|
|
170
|
+
const commandFiles = fs.readdirSync(targetDir).filter(f => f.endsWith('.md'));
|
|
171
|
+
let removed = 0;
|
|
172
|
+
for (const file of commandFiles) {
|
|
173
|
+
const filePath = path.join(targetDir, file);
|
|
174
|
+
fs.unlinkSync(filePath);
|
|
175
|
+
removed++;
|
|
176
|
+
if (!options.silent) {
|
|
177
|
+
logger.info(`Removed: ${file}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Remove directory if empty
|
|
181
|
+
const remainingFiles = fs.readdirSync(targetDir);
|
|
182
|
+
if (remainingFiles.length === 0) {
|
|
183
|
+
fs.rmdirSync(targetDir);
|
|
184
|
+
if (!options.silent) {
|
|
185
|
+
logger.info(`Removed directory: ${targetDir}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (!options.silent) {
|
|
189
|
+
logger.success(`Uninstalled ${removed} commands`);
|
|
190
|
+
}
|
|
191
|
+
return { removed };
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Check if commands are already installed
|
|
195
|
+
*/
|
|
196
|
+
function areCommandsInstalled() {
|
|
197
|
+
const projectRoot = (0, config_1.findProjectRoot)();
|
|
198
|
+
const targetDir = path.join(projectRoot, '.cursor', 'commands', 'cursorflow');
|
|
199
|
+
const sourceDir = getCommandsSourceDir();
|
|
200
|
+
if (!fs.existsSync(targetDir) || !fs.existsSync(sourceDir)) {
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
const sourceFiles = fs.readdirSync(sourceDir).filter(f => f.endsWith('.md'));
|
|
204
|
+
const targetFiles = fs.readdirSync(targetDir).filter(f => f.endsWith('.md'));
|
|
205
|
+
// Basic check: do we have all the files from source in target?
|
|
206
|
+
return sourceFiles.every(f => targetFiles.includes(f));
|
|
207
|
+
}
|
|
208
|
+
async function main(args) {
|
|
209
|
+
const options = parseArgs(args);
|
|
210
|
+
try {
|
|
211
|
+
if (options.uninstall) {
|
|
212
|
+
return uninstallCommands(options);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
return setupCommands(options);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
if (!options.silent) {
|
|
220
|
+
logger.error(error.message);
|
|
221
|
+
}
|
|
222
|
+
throw error;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (require.main === module) {
|
|
226
|
+
main(process.argv.slice(2)).catch(error => {
|
|
227
|
+
console.error('❌ Error:', error.message);
|
|
228
|
+
if (process.env['DEBUG']) {
|
|
229
|
+
console.error(error.stack);
|
|
230
|
+
}
|
|
231
|
+
process.exit(1);
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
//# 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,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CursorFlow signal command
|
|
4
|
+
*
|
|
5
|
+
* Send a direct message to a running lane
|
|
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 path = __importStar(require("path"));
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const logger = __importStar(require("../utils/logger"));
|
|
43
|
+
const config_1 = require("../utils/config");
|
|
44
|
+
const state_1 = require("../utils/state");
|
|
45
|
+
function parseArgs(args) {
|
|
46
|
+
const runDirIdx = args.indexOf('--run-dir');
|
|
47
|
+
// First non-option is lane, second (or rest joined) is message
|
|
48
|
+
const nonOptions = args.filter(a => !a.startsWith('--'));
|
|
49
|
+
return {
|
|
50
|
+
lane: nonOptions[0] || null,
|
|
51
|
+
message: nonOptions.slice(1).join(' ') || null,
|
|
52
|
+
runDir: runDirIdx >= 0 ? args[runDirIdx + 1] || null : null,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function findLatestRunDir(logsDir) {
|
|
56
|
+
const runsDir = path.join(logsDir, 'runs');
|
|
57
|
+
if (!fs.existsSync(runsDir))
|
|
58
|
+
return null;
|
|
59
|
+
const runs = fs.readdirSync(runsDir)
|
|
60
|
+
.filter(d => d.startsWith('run-'))
|
|
61
|
+
.sort()
|
|
62
|
+
.reverse();
|
|
63
|
+
return runs.length > 0 ? path.join(runsDir, runs[0]) : null;
|
|
64
|
+
}
|
|
65
|
+
async function signal(args) {
|
|
66
|
+
const options = parseArgs(args);
|
|
67
|
+
const config = (0, config_1.loadConfig)();
|
|
68
|
+
const logsDir = (0, config_1.getLogsDir)(config);
|
|
69
|
+
if (!options.lane) {
|
|
70
|
+
throw new Error('Lane name required: cursorflow signal <lane> "<message>"');
|
|
71
|
+
}
|
|
72
|
+
if (!options.message) {
|
|
73
|
+
throw new Error('Message required: cursorflow signal <lane> "<message>"');
|
|
74
|
+
}
|
|
75
|
+
let runDir = options.runDir;
|
|
76
|
+
if (!runDir) {
|
|
77
|
+
runDir = findLatestRunDir(logsDir);
|
|
78
|
+
}
|
|
79
|
+
if (!runDir || !fs.existsSync(runDir)) {
|
|
80
|
+
throw new Error(`Run directory not found: ${runDir || 'latest'}`);
|
|
81
|
+
}
|
|
82
|
+
const convoPath = path.join(runDir, 'lanes', options.lane, 'conversation.jsonl');
|
|
83
|
+
if (!fs.existsSync(convoPath)) {
|
|
84
|
+
throw new Error(`Conversation log not found at ${convoPath}. Is the lane running?`);
|
|
85
|
+
}
|
|
86
|
+
logger.info(`Sending signal to lane: ${options.lane}`);
|
|
87
|
+
logger.info(`Message: "${options.message}"`);
|
|
88
|
+
// Append as a "commander" role message
|
|
89
|
+
// Note: We cast to 'system' or similar if 'commander' isn't in the enum,
|
|
90
|
+
// but let's use 'reviewer' or 'system' which agents usually respect,
|
|
91
|
+
// or update the type definition.
|
|
92
|
+
const entry = (0, state_1.createConversationEntry)('system', `[COMMANDER INTERVENTION]\n${options.message}`, {
|
|
93
|
+
task: 'DIRECT_SIGNAL'
|
|
94
|
+
});
|
|
95
|
+
(0, state_1.appendLog)(convoPath, entry);
|
|
96
|
+
logger.success('Signal sent successfully. The agent will see this message in its next turn or via file monitoring.');
|
|
97
|
+
}
|
|
98
|
+
module.exports = signal;
|
|
99
|
+
//# sourceMappingURL=signal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal.js","sourceRoot":"","sources":["../../src/cli/signal.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
|
+
}>;
|