@litmers/cursorflow-orchestrator 0.1.20 → 0.1.28
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 +20 -0
- package/commands/cursorflow-clean.md +19 -0
- package/commands/cursorflow-runs.md +59 -0
- package/commands/cursorflow-stop.md +55 -0
- package/dist/cli/clean.js +171 -0
- package/dist/cli/clean.js.map +1 -1
- package/dist/cli/index.js +7 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.js +1 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/logs.js +83 -42
- package/dist/cli/logs.js.map +1 -1
- package/dist/cli/monitor.d.ts +7 -0
- package/dist/cli/monitor.js +1007 -189
- package/dist/cli/monitor.js.map +1 -1
- package/dist/cli/prepare.js +87 -3
- package/dist/cli/prepare.js.map +1 -1
- package/dist/cli/resume.js +188 -236
- package/dist/cli/resume.js.map +1 -1
- package/dist/cli/run.js +125 -3
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/runs.d.ts +5 -0
- package/dist/cli/runs.js +214 -0
- package/dist/cli/runs.js.map +1 -0
- package/dist/cli/setup-commands.js +0 -0
- package/dist/cli/signal.js +1 -1
- package/dist/cli/signal.js.map +1 -1
- package/dist/cli/stop.d.ts +5 -0
- package/dist/cli/stop.js +215 -0
- package/dist/cli/stop.js.map +1 -0
- package/dist/cli/tasks.d.ts +10 -0
- package/dist/cli/tasks.js +165 -0
- package/dist/cli/tasks.js.map +1 -0
- package/dist/core/auto-recovery.d.ts +212 -0
- package/dist/core/auto-recovery.js +737 -0
- package/dist/core/auto-recovery.js.map +1 -0
- package/dist/core/failure-policy.d.ts +156 -0
- package/dist/core/failure-policy.js +488 -0
- package/dist/core/failure-policy.js.map +1 -0
- package/dist/core/orchestrator.d.ts +15 -2
- package/dist/core/orchestrator.js +397 -15
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/core/reviewer.d.ts +2 -0
- package/dist/core/reviewer.js +2 -0
- package/dist/core/reviewer.js.map +1 -1
- package/dist/core/runner.d.ts +33 -10
- package/dist/core/runner.js +321 -146
- package/dist/core/runner.js.map +1 -1
- package/dist/services/logging/buffer.d.ts +67 -0
- package/dist/services/logging/buffer.js +309 -0
- package/dist/services/logging/buffer.js.map +1 -0
- package/dist/services/logging/console.d.ts +89 -0
- package/dist/services/logging/console.js +169 -0
- package/dist/services/logging/console.js.map +1 -0
- package/dist/services/logging/file-writer.d.ts +71 -0
- package/dist/services/logging/file-writer.js +516 -0
- package/dist/services/logging/file-writer.js.map +1 -0
- package/dist/services/logging/formatter.d.ts +39 -0
- package/dist/services/logging/formatter.js +227 -0
- package/dist/services/logging/formatter.js.map +1 -0
- package/dist/services/logging/index.d.ts +11 -0
- package/dist/services/logging/index.js +30 -0
- package/dist/services/logging/index.js.map +1 -0
- package/dist/services/logging/parser.d.ts +31 -0
- package/dist/services/logging/parser.js +222 -0
- package/dist/services/logging/parser.js.map +1 -0
- package/dist/services/process/index.d.ts +59 -0
- package/dist/services/process/index.js +257 -0
- package/dist/services/process/index.js.map +1 -0
- package/dist/types/agent.d.ts +20 -0
- package/dist/types/agent.js +6 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/config.d.ts +65 -0
- package/dist/types/config.js +6 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/events.d.ts +125 -0
- package/dist/types/events.js +6 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.js +37 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/lane.d.ts +43 -0
- package/dist/types/lane.js +6 -0
- package/dist/types/lane.js.map +1 -0
- package/dist/types/logging.d.ts +71 -0
- package/dist/types/logging.js +16 -0
- package/dist/types/logging.js.map +1 -0
- package/dist/types/review.d.ts +17 -0
- package/dist/types/review.js +6 -0
- package/dist/types/review.js.map +1 -0
- package/dist/types/run.d.ts +32 -0
- package/dist/types/run.js +6 -0
- package/dist/types/run.js.map +1 -0
- package/dist/types/task.d.ts +71 -0
- package/dist/types/task.js +6 -0
- package/dist/types/task.js.map +1 -0
- package/dist/ui/components.d.ts +134 -0
- package/dist/ui/components.js +389 -0
- package/dist/ui/components.js.map +1 -0
- package/dist/ui/log-viewer.d.ts +49 -0
- package/dist/ui/log-viewer.js +449 -0
- package/dist/ui/log-viewer.js.map +1 -0
- package/dist/utils/checkpoint.d.ts +87 -0
- package/dist/utils/checkpoint.js +317 -0
- package/dist/utils/checkpoint.js.map +1 -0
- package/dist/utils/config.d.ts +4 -0
- package/dist/utils/config.js +11 -2
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/cursor-agent.js.map +1 -1
- package/dist/utils/dependency.d.ts +74 -0
- package/dist/utils/dependency.js +420 -0
- package/dist/utils/dependency.js.map +1 -0
- package/dist/utils/doctor.js +10 -5
- package/dist/utils/doctor.js.map +1 -1
- package/dist/utils/enhanced-logger.d.ts +10 -33
- package/dist/utils/enhanced-logger.js +94 -9
- package/dist/utils/enhanced-logger.js.map +1 -1
- package/dist/utils/git.d.ts +121 -0
- package/dist/utils/git.js +322 -2
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/health.d.ts +91 -0
- package/dist/utils/health.js +556 -0
- package/dist/utils/health.js.map +1 -0
- package/dist/utils/lock.d.ts +95 -0
- package/dist/utils/lock.js +332 -0
- package/dist/utils/lock.js.map +1 -0
- package/dist/utils/log-buffer.d.ts +17 -0
- package/dist/utils/log-buffer.js +14 -0
- package/dist/utils/log-buffer.js.map +1 -0
- package/dist/utils/log-constants.d.ts +23 -0
- package/dist/utils/log-constants.js +28 -0
- package/dist/utils/log-constants.js.map +1 -0
- package/dist/utils/log-formatter.d.ts +9 -0
- package/dist/utils/log-formatter.js +113 -70
- package/dist/utils/log-formatter.js.map +1 -1
- package/dist/utils/log-service.d.ts +19 -0
- package/dist/utils/log-service.js +47 -0
- package/dist/utils/log-service.js.map +1 -0
- package/dist/utils/logger.d.ts +46 -27
- package/dist/utils/logger.js +82 -60
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/process-manager.d.ts +21 -0
- package/dist/utils/process-manager.js +138 -0
- package/dist/utils/process-manager.js.map +1 -0
- package/dist/utils/retry.d.ts +121 -0
- package/dist/utils/retry.js +374 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/run-service.d.ts +88 -0
- package/dist/utils/run-service.js +412 -0
- package/dist/utils/run-service.js.map +1 -0
- package/dist/utils/state.d.ts +58 -2
- package/dist/utils/state.js +306 -3
- package/dist/utils/state.js.map +1 -1
- package/dist/utils/task-service.d.ts +82 -0
- package/dist/utils/task-service.js +348 -0
- package/dist/utils/task-service.js.map +1 -0
- package/dist/utils/types.d.ts +2 -272
- package/dist/utils/types.js +16 -0
- package/dist/utils/types.js.map +1 -1
- package/package.json +38 -23
- package/scripts/ai-security-check.js +0 -1
- package/scripts/local-security-gate.sh +0 -0
- package/scripts/monitor-lanes.sh +94 -0
- package/scripts/patches/test-cursor-agent.js +0 -1
- package/scripts/release.sh +0 -0
- package/scripts/setup-security.sh +0 -0
- package/scripts/stream-logs.sh +72 -0
- package/scripts/verify-and-fix.sh +0 -0
- package/src/cli/clean.ts +180 -0
- package/src/cli/index.ts +7 -0
- package/src/cli/init.ts +1 -1
- package/src/cli/logs.ts +79 -42
- package/src/cli/monitor.ts +1815 -899
- package/src/cli/prepare.ts +97 -3
- package/src/cli/resume.ts +220 -277
- package/src/cli/run.ts +154 -3
- package/src/cli/runs.ts +212 -0
- package/src/cli/setup-commands.ts +0 -0
- package/src/cli/signal.ts +1 -1
- package/src/cli/stop.ts +209 -0
- package/src/cli/tasks.ts +154 -0
- package/src/core/auto-recovery.ts +909 -0
- package/src/core/failure-policy.ts +592 -0
- package/src/core/orchestrator.ts +1136 -675
- package/src/core/reviewer.ts +4 -0
- package/src/core/runner.ts +1443 -1217
- package/src/services/logging/buffer.ts +326 -0
- package/src/services/logging/console.ts +193 -0
- package/src/services/logging/file-writer.ts +526 -0
- package/src/services/logging/formatter.ts +268 -0
- package/src/services/logging/index.ts +16 -0
- package/src/services/logging/parser.ts +232 -0
- package/src/services/process/index.ts +261 -0
- package/src/types/agent.ts +24 -0
- package/src/types/config.ts +79 -0
- package/src/types/events.ts +156 -0
- package/src/types/index.ts +29 -0
- package/src/types/lane.ts +56 -0
- package/src/types/logging.ts +96 -0
- package/src/types/review.ts +20 -0
- package/src/types/run.ts +37 -0
- package/src/types/task.ts +79 -0
- package/src/ui/components.ts +430 -0
- package/src/ui/log-viewer.ts +485 -0
- package/src/utils/checkpoint.ts +374 -0
- package/src/utils/config.ts +11 -2
- package/src/utils/cursor-agent.ts +1 -1
- package/src/utils/dependency.ts +482 -0
- package/src/utils/doctor.ts +11 -5
- package/src/utils/enhanced-logger.ts +108 -49
- package/src/utils/git.ts +871 -499
- package/src/utils/health.ts +596 -0
- package/src/utils/lock.ts +346 -0
- package/src/utils/log-buffer.ts +28 -0
- package/src/utils/log-constants.ts +26 -0
- package/src/utils/log-formatter.ts +120 -37
- package/src/utils/log-service.ts +49 -0
- package/src/utils/logger.ts +100 -51
- package/src/utils/process-manager.ts +100 -0
- package/src/utils/retry.ts +413 -0
- package/src/utils/run-service.ts +433 -0
- package/src/utils/state.ts +369 -3
- package/src/utils/task-service.ts +370 -0
- package/src/utils/types.ts +2 -315
package/dist/cli/stop.js
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CursorFlow stop command - Stop running workflows or specific lanes
|
|
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 readline = __importStar(require("readline"));
|
|
39
|
+
const logger = __importStar(require("../utils/logger"));
|
|
40
|
+
const config_1 = require("../utils/config");
|
|
41
|
+
const run_service_1 = require("../utils/run-service");
|
|
42
|
+
const process_manager_1 = require("../utils/process-manager");
|
|
43
|
+
const path_1 = require("../utils/path");
|
|
44
|
+
function printHelp() {
|
|
45
|
+
console.log(`
|
|
46
|
+
Usage: cursorflow stop [run-id] [options]
|
|
47
|
+
|
|
48
|
+
Stop running workflows or specific lanes.
|
|
49
|
+
|
|
50
|
+
Options:
|
|
51
|
+
[run-id] Stop a specific run
|
|
52
|
+
--lane <name> Stop only a specific lane
|
|
53
|
+
--force Use SIGKILL instead of SIGTERM
|
|
54
|
+
--yes, -y Skip confirmation prompt
|
|
55
|
+
--help, -h Show help
|
|
56
|
+
|
|
57
|
+
Examples:
|
|
58
|
+
cursorflow stop # Stop all running workflows
|
|
59
|
+
cursorflow stop run-123 # Stop run-123
|
|
60
|
+
cursorflow stop --lane api # Stop only the 'api' lane in the latest run
|
|
61
|
+
cursorflow stop --force # Force stop all workflows
|
|
62
|
+
`);
|
|
63
|
+
}
|
|
64
|
+
function parseArgs(args) {
|
|
65
|
+
const laneIdx = args.indexOf('--lane');
|
|
66
|
+
// Find run ID (first non-option argument)
|
|
67
|
+
const runId = args.find((arg, i) => {
|
|
68
|
+
if (arg.startsWith('--') || arg.startsWith('-'))
|
|
69
|
+
return false;
|
|
70
|
+
// Skip values for options
|
|
71
|
+
const prevArg = args[i - 1];
|
|
72
|
+
if (prevArg && ['--lane'].includes(prevArg)) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
return true;
|
|
76
|
+
});
|
|
77
|
+
return {
|
|
78
|
+
runId,
|
|
79
|
+
lane: laneIdx >= 0 ? args[laneIdx + 1] : undefined,
|
|
80
|
+
force: args.includes('--force'),
|
|
81
|
+
yes: args.includes('--yes') || args.includes('-y'),
|
|
82
|
+
help: args.includes('--help') || args.includes('-h'),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Prompt user for confirmation
|
|
87
|
+
*/
|
|
88
|
+
async function confirm(message) {
|
|
89
|
+
const rl = readline.createInterface({
|
|
90
|
+
input: process.stdin,
|
|
91
|
+
output: process.stdout,
|
|
92
|
+
});
|
|
93
|
+
return new Promise((resolve) => {
|
|
94
|
+
rl.question(`${message} [y/N]: `, (answer) => {
|
|
95
|
+
rl.close();
|
|
96
|
+
resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
async function stop(args) {
|
|
101
|
+
const options = parseArgs(args);
|
|
102
|
+
if (options.help) {
|
|
103
|
+
printHelp();
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const config = (0, config_1.loadConfig)();
|
|
107
|
+
const logsDir = (0, config_1.getLogsDir)(config);
|
|
108
|
+
const runsDir = (0, path_1.safeJoin)(logsDir, 'runs');
|
|
109
|
+
const runService = new run_service_1.RunService(runsDir);
|
|
110
|
+
const signal = options.force ? 'SIGKILL' : 'SIGTERM';
|
|
111
|
+
// Case 1: Stop specific lane in specific run (or latest if runId not provided)
|
|
112
|
+
if (options.lane) {
|
|
113
|
+
let runId = options.runId;
|
|
114
|
+
if (!runId) {
|
|
115
|
+
const activeRuns = runService.getActiveRuns();
|
|
116
|
+
if (activeRuns.length === 0) {
|
|
117
|
+
logger.info('No active runs found.');
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
runId = activeRuns[0].id;
|
|
121
|
+
}
|
|
122
|
+
const run = runService.getRunInfo(runId);
|
|
123
|
+
if (!run) {
|
|
124
|
+
throw new Error(`Run not found: ${runId}`);
|
|
125
|
+
}
|
|
126
|
+
const lane = run.lanes.find(l => l.name === options.lane);
|
|
127
|
+
if (!lane) {
|
|
128
|
+
throw new Error(`Lane '${options.lane}' not found in run '${runId}'`);
|
|
129
|
+
}
|
|
130
|
+
if (!lane.pid) {
|
|
131
|
+
logger.info(`Lane '${options.lane}' is not currently running (no PID).`);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (!options.yes) {
|
|
135
|
+
const ok = await confirm(`⚠️ Stop lane '${options.lane}' in run '${runId}'?`);
|
|
136
|
+
if (!ok)
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
logger.info(`🛑 Stopping lane '${options.lane}' (PID ${lane.pid})...`);
|
|
140
|
+
if (process_manager_1.ProcessManager.killProcess(lane.pid, signal)) {
|
|
141
|
+
logger.success(`✓ lane '${options.lane}' stopped.`);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
logger.error(`Failed to stop lane '${options.lane}'.`);
|
|
145
|
+
}
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// Case 2: Stop specific run
|
|
149
|
+
if (options.runId) {
|
|
150
|
+
const run = runService.getRunInfo(options.runId);
|
|
151
|
+
if (!run) {
|
|
152
|
+
throw new Error(`Run not found: ${options.runId}`);
|
|
153
|
+
}
|
|
154
|
+
if (run.status !== 'running') {
|
|
155
|
+
logger.info(`Run '${options.runId}' is not currently running (Status: ${run.status}).`);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
if (!options.yes) {
|
|
159
|
+
const ok = await confirm(`⚠️ Stop run '${options.runId}' (${run.taskName})?`);
|
|
160
|
+
if (!ok)
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
logger.info(`🛑 Stopping run '${options.runId}'...`);
|
|
164
|
+
let stoppedCount = 0;
|
|
165
|
+
for (const lane of run.lanes) {
|
|
166
|
+
if (lane.pid && process_manager_1.ProcessManager.killProcess(lane.pid, signal)) {
|
|
167
|
+
logger.info(` ✓ lane '${lane.name}' (PID ${lane.pid}) stopped`);
|
|
168
|
+
stoppedCount++;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (stoppedCount > 0) {
|
|
172
|
+
logger.success(`✅ Run '${options.runId}' stopped.`);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
logger.info('No active lanes were stopped.');
|
|
176
|
+
}
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
// Case 3: Stop all running workflows
|
|
180
|
+
const activeRuns = runService.getActiveRuns();
|
|
181
|
+
if (activeRuns.length === 0) {
|
|
182
|
+
logger.info('No active runs found.');
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
if (!options.yes) {
|
|
186
|
+
console.log('\n⚠️ Stop all running workflows?\n');
|
|
187
|
+
console.log('Currently running:');
|
|
188
|
+
for (const run of activeRuns) {
|
|
189
|
+
const activeLanes = run.lanes.filter(l => l.pid).length;
|
|
190
|
+
console.log(` - ${run.id} (${run.taskName}): ${activeLanes} lanes active`);
|
|
191
|
+
}
|
|
192
|
+
console.log('');
|
|
193
|
+
const ok = await confirm('Continue?');
|
|
194
|
+
if (!ok)
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
logger.info('🛑 Stopping all workflows...');
|
|
198
|
+
let totalStopped = 0;
|
|
199
|
+
for (const run of activeRuns) {
|
|
200
|
+
for (const lane of run.lanes) {
|
|
201
|
+
if (lane.pid && process_manager_1.ProcessManager.killProcess(lane.pid, signal)) {
|
|
202
|
+
logger.info(` ✓ lane '${lane.name}' (PID ${lane.pid}) stopped`);
|
|
203
|
+
totalStopped++;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (totalStopped > 0) {
|
|
208
|
+
logger.success(`\n✅ All workflows stopped (${totalStopped} lanes).`);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
logger.info('\nNo active lanes were stopped.');
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
module.exports = stop;
|
|
215
|
+
//# sourceMappingURL=stop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/cli/stop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CursorFlow tasks command
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* cursorflow tasks # List all tasks
|
|
6
|
+
* cursorflow tasks --validate # List all tasks with validation
|
|
7
|
+
* cursorflow tasks <name> # Show detailed task info
|
|
8
|
+
*/
|
|
9
|
+
declare function tasks(args: string[]): Promise<void>;
|
|
10
|
+
export = tasks;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CursorFlow tasks command
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* cursorflow tasks # List all tasks
|
|
7
|
+
* cursorflow tasks --validate # List all tasks with validation
|
|
8
|
+
* cursorflow tasks <name> # Show detailed task info
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
const logger = __importStar(require("../utils/logger"));
|
|
44
|
+
const task_service_1 = require("../utils/task-service");
|
|
45
|
+
const config_1 = require("../utils/config");
|
|
46
|
+
const COLORS = logger.COLORS;
|
|
47
|
+
function printHelp() {
|
|
48
|
+
console.log(`
|
|
49
|
+
Usage: cursorflow tasks [options] [task-name]
|
|
50
|
+
|
|
51
|
+
Manage and view prepared tasks in _cursorflow/tasks/.
|
|
52
|
+
|
|
53
|
+
Options:
|
|
54
|
+
--validate Run validation on all tasks before listing
|
|
55
|
+
--help, -h Show help
|
|
56
|
+
|
|
57
|
+
Examples:
|
|
58
|
+
cursorflow tasks
|
|
59
|
+
cursorflow tasks --validate
|
|
60
|
+
cursorflow tasks 2412221530_AuthSystem
|
|
61
|
+
`);
|
|
62
|
+
}
|
|
63
|
+
function parseArgs(args) {
|
|
64
|
+
const options = {
|
|
65
|
+
validate: args.includes('--validate'),
|
|
66
|
+
taskName: null,
|
|
67
|
+
};
|
|
68
|
+
const nameArg = args.find(arg => !arg.startsWith('-'));
|
|
69
|
+
if (nameArg) {
|
|
70
|
+
options.taskName = nameArg;
|
|
71
|
+
}
|
|
72
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
73
|
+
printHelp();
|
|
74
|
+
process.exit(0);
|
|
75
|
+
}
|
|
76
|
+
return options;
|
|
77
|
+
}
|
|
78
|
+
function formatDate(date) {
|
|
79
|
+
const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
|
80
|
+
return `${months[date.getMonth()]} ${date.getDate()}`;
|
|
81
|
+
}
|
|
82
|
+
function getStatusLabel(info) {
|
|
83
|
+
const status = info.validationStatus;
|
|
84
|
+
const icon = status === 'valid' ? '✅' : status === 'warnings' ? '⚠️' : status === 'errors' ? '❌' : '❓';
|
|
85
|
+
if (status === 'valid')
|
|
86
|
+
return `${icon} Valid`;
|
|
87
|
+
if (status === 'warnings')
|
|
88
|
+
return `${icon} Warnings`;
|
|
89
|
+
if (status === 'errors')
|
|
90
|
+
return `${icon} Errors`;
|
|
91
|
+
return `${icon} Unknown`;
|
|
92
|
+
}
|
|
93
|
+
function printTasksList(tasks) {
|
|
94
|
+
if (tasks.length === 0) {
|
|
95
|
+
logger.info('No tasks found in _cursorflow/tasks/');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
console.log(`${COLORS.bold}Prepared Tasks:${COLORS.reset}`);
|
|
99
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
100
|
+
const task = tasks[i];
|
|
101
|
+
const prefix = i === 0 ? ' ▶' : ' ';
|
|
102
|
+
const name = task.name.padEnd(30);
|
|
103
|
+
const lanes = `${task.lanes.length} lane${task.lanes.length > 1 ? 's' : ''}`.padEnd(10);
|
|
104
|
+
const status = getStatusLabel(task).padEnd(14);
|
|
105
|
+
const date = formatDate(task.timestamp);
|
|
106
|
+
let color = COLORS.reset;
|
|
107
|
+
if (task.validationStatus === 'errors')
|
|
108
|
+
color = COLORS.red;
|
|
109
|
+
else if (task.validationStatus === 'warnings')
|
|
110
|
+
color = COLORS.yellow;
|
|
111
|
+
else if (task.validationStatus === 'valid')
|
|
112
|
+
color = COLORS.green;
|
|
113
|
+
console.log(`${color}${prefix} ${name} ${lanes} ${status} ${date}${COLORS.reset}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function printTaskDetail(info) {
|
|
117
|
+
console.log(`${COLORS.bold}Task: ${info.name}${COLORS.reset}`);
|
|
118
|
+
console.log(`${COLORS.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${COLORS.reset}`);
|
|
119
|
+
if (info.lanes.length === 0) {
|
|
120
|
+
console.log('No lanes defined.');
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
console.log(`${COLORS.bold}Lanes:${COLORS.reset}`);
|
|
124
|
+
for (const lane of info.lanes) {
|
|
125
|
+
const fileName = lane.fileName.padEnd(18);
|
|
126
|
+
const preset = `[${lane.preset}]`.padEnd(10);
|
|
127
|
+
const flow = lane.taskFlow;
|
|
128
|
+
const depends = lane.dependsOn.length > 0 ? ` ${COLORS.gray}(depends: ${lane.dependsOn.join(', ')})${COLORS.reset}` : '';
|
|
129
|
+
console.log(` ${fileName} ${COLORS.blue}${preset}${COLORS.reset} ${flow}${depends}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async function tasks(args) {
|
|
134
|
+
const options = parseArgs(args);
|
|
135
|
+
const projectRoot = (0, config_1.findProjectRoot)();
|
|
136
|
+
const config = (0, config_1.loadConfig)(projectRoot);
|
|
137
|
+
const tasksDir = (0, config_1.getTasksDir)(config);
|
|
138
|
+
const taskService = new task_service_1.TaskService(tasksDir);
|
|
139
|
+
if (options.taskName) {
|
|
140
|
+
const info = taskService.getTaskDirInfo(options.taskName);
|
|
141
|
+
if (!info) {
|
|
142
|
+
logger.error(`Task not found: ${options.taskName}`);
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
// Always validate for detail view to have report
|
|
146
|
+
taskService.validateTaskDir(options.taskName);
|
|
147
|
+
const updatedInfo = taskService.getTaskDirInfo(options.taskName);
|
|
148
|
+
printTaskDetail(updatedInfo);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
let taskList = taskService.listTaskDirs();
|
|
152
|
+
if (options.validate) {
|
|
153
|
+
const spinner = logger.createSpinner('Validating tasks...');
|
|
154
|
+
spinner.start();
|
|
155
|
+
for (const task of taskList) {
|
|
156
|
+
taskService.validateTaskDir(task.name);
|
|
157
|
+
}
|
|
158
|
+
spinner.succeed('Validation complete');
|
|
159
|
+
taskList = taskService.listTaskDirs();
|
|
160
|
+
}
|
|
161
|
+
printTasksList(taskList);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
module.exports = tasks;
|
|
165
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/cli/tasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Recovery Module
|
|
3
|
+
*
|
|
4
|
+
* Automatic recovery strategies for common orchestration failures:
|
|
5
|
+
* - Agent idle/no response detection with escalating interventions
|
|
6
|
+
* - Guidance messages for git conflicts and push failures
|
|
7
|
+
* - Process health monitoring with restart capabilities
|
|
8
|
+
* - Doctor integration for persistent failures
|
|
9
|
+
* - POF (Post-mortem of Failure) saving for failed recoveries
|
|
10
|
+
*/
|
|
11
|
+
import { ChildProcess } from 'child_process';
|
|
12
|
+
import { LaneState } from '../utils/types';
|
|
13
|
+
/** Recovery stages for escalating interventions */
|
|
14
|
+
export declare enum RecoveryStage {
|
|
15
|
+
/** Normal operation - monitoring */
|
|
16
|
+
NORMAL = 0,
|
|
17
|
+
/** First intervention - send continue signal */
|
|
18
|
+
CONTINUE_SIGNAL = 1,
|
|
19
|
+
/** Second intervention - send stronger prompt */
|
|
20
|
+
STRONGER_PROMPT = 2,
|
|
21
|
+
/** Third intervention - kill and restart process */
|
|
22
|
+
RESTART_PROCESS = 3,
|
|
23
|
+
/** Final stage - run doctor and report */
|
|
24
|
+
DIAGNOSE = 4,
|
|
25
|
+
/** No more recovery possible */
|
|
26
|
+
ABORT = 5
|
|
27
|
+
}
|
|
28
|
+
/** Configuration for auto-recovery behavior */
|
|
29
|
+
export interface AutoRecoveryConfig {
|
|
30
|
+
/** Time without activity before sending continue signal (default: 2 minutes) */
|
|
31
|
+
idleTimeoutMs: number;
|
|
32
|
+
/** Time to wait after continue signal before escalating (default: 2 minutes) */
|
|
33
|
+
continueGraceMs: number;
|
|
34
|
+
/** Time to wait after stronger prompt before escalating (default: 2 minutes) */
|
|
35
|
+
strongerPromptGraceMs: number;
|
|
36
|
+
/** Maximum number of restarts before aborting (default: 2) */
|
|
37
|
+
maxRestarts: number;
|
|
38
|
+
/** Whether to run doctor on persistent failures (default: true) */
|
|
39
|
+
runDoctorOnFailure: boolean;
|
|
40
|
+
/** Patterns indicating long-running operations (won't trigger idle) */
|
|
41
|
+
longOperationPatterns: RegExp[];
|
|
42
|
+
/** Grace period for long operations (default: 10 minutes) */
|
|
43
|
+
longOperationGraceMs: number;
|
|
44
|
+
/** Enable verbose logging */
|
|
45
|
+
verbose: boolean;
|
|
46
|
+
}
|
|
47
|
+
/** Default auto-recovery configuration */
|
|
48
|
+
export declare const DEFAULT_AUTO_RECOVERY_CONFIG: AutoRecoveryConfig;
|
|
49
|
+
/** State tracking for a single lane's recovery */
|
|
50
|
+
export interface LaneRecoveryState {
|
|
51
|
+
laneName: string;
|
|
52
|
+
stage: RecoveryStage;
|
|
53
|
+
lastActivityTime: number;
|
|
54
|
+
lastBytesReceived: number;
|
|
55
|
+
totalBytesReceived: number;
|
|
56
|
+
lastOutput: string;
|
|
57
|
+
restartCount: number;
|
|
58
|
+
continueSignalsSent: number;
|
|
59
|
+
lastStageChangeTime: number;
|
|
60
|
+
diagnosticInfo?: DiagnosticInfo;
|
|
61
|
+
isLongOperation: boolean;
|
|
62
|
+
failureHistory: FailureRecord[];
|
|
63
|
+
}
|
|
64
|
+
/** Diagnostic information from doctor */
|
|
65
|
+
export interface DiagnosticInfo {
|
|
66
|
+
timestamp: number;
|
|
67
|
+
agentHealthy: boolean;
|
|
68
|
+
authHealthy: boolean;
|
|
69
|
+
systemHealthy: boolean;
|
|
70
|
+
suggestedAction: string;
|
|
71
|
+
details: string;
|
|
72
|
+
}
|
|
73
|
+
/** Recovery action result */
|
|
74
|
+
export interface RecoveryActionResult {
|
|
75
|
+
success: boolean;
|
|
76
|
+
action: string;
|
|
77
|
+
message: string;
|
|
78
|
+
shouldContinue: boolean;
|
|
79
|
+
nextStage?: RecoveryStage;
|
|
80
|
+
diagnostic?: DiagnosticInfo;
|
|
81
|
+
}
|
|
82
|
+
/** Record of a failure for POF */
|
|
83
|
+
export interface FailureRecord {
|
|
84
|
+
timestamp: number;
|
|
85
|
+
stage: RecoveryStage;
|
|
86
|
+
action: string;
|
|
87
|
+
message: string;
|
|
88
|
+
idleTimeMs: number;
|
|
89
|
+
bytesReceived: number;
|
|
90
|
+
lastOutput: string;
|
|
91
|
+
}
|
|
92
|
+
/** POF (Post-mortem of Failure) entry */
|
|
93
|
+
export interface POFEntry {
|
|
94
|
+
title: string;
|
|
95
|
+
runId: string;
|
|
96
|
+
failureTime: string;
|
|
97
|
+
detectedAt: string;
|
|
98
|
+
summary: string;
|
|
99
|
+
rootCause: {
|
|
100
|
+
type: string;
|
|
101
|
+
description: string;
|
|
102
|
+
symptoms: string[];
|
|
103
|
+
};
|
|
104
|
+
affectedLanes: Array<{
|
|
105
|
+
name: string;
|
|
106
|
+
status: string;
|
|
107
|
+
task: string;
|
|
108
|
+
taskIndex: number;
|
|
109
|
+
pid?: number;
|
|
110
|
+
reason: string;
|
|
111
|
+
recoveryAttempts: FailureRecord[];
|
|
112
|
+
}>;
|
|
113
|
+
possibleCauses: string[];
|
|
114
|
+
recovery: {
|
|
115
|
+
command: string;
|
|
116
|
+
description: string;
|
|
117
|
+
alternativeCommand?: string;
|
|
118
|
+
alternativeDescription?: string;
|
|
119
|
+
};
|
|
120
|
+
previousFailures?: POFEntry[];
|
|
121
|
+
}
|
|
122
|
+
/** Generate guidance message for git push failure */
|
|
123
|
+
export declare function getGitPushFailureGuidance(): string;
|
|
124
|
+
/** Generate guidance message for merge conflict */
|
|
125
|
+
export declare function getMergeConflictGuidance(): string;
|
|
126
|
+
/** Generate guidance message for general git error */
|
|
127
|
+
export declare function getGitErrorGuidance(errorMessage: string): string;
|
|
128
|
+
/**
|
|
129
|
+
* Manages recovery state for all lanes
|
|
130
|
+
*/
|
|
131
|
+
export declare class AutoRecoveryManager {
|
|
132
|
+
private config;
|
|
133
|
+
private laneStates;
|
|
134
|
+
private eventHandlers;
|
|
135
|
+
constructor(config?: Partial<AutoRecoveryConfig>);
|
|
136
|
+
/**
|
|
137
|
+
* Register a lane for recovery monitoring
|
|
138
|
+
*/
|
|
139
|
+
registerLane(laneName: string): void;
|
|
140
|
+
/**
|
|
141
|
+
* Unregister a lane from recovery monitoring
|
|
142
|
+
*/
|
|
143
|
+
unregisterLane(laneName: string): void;
|
|
144
|
+
/**
|
|
145
|
+
* Record activity for a lane
|
|
146
|
+
*/
|
|
147
|
+
recordActivity(laneName: string, bytesReceived?: number, output?: string): void;
|
|
148
|
+
/**
|
|
149
|
+
* Get current recovery state for a lane
|
|
150
|
+
*/
|
|
151
|
+
getState(laneName: string): LaneRecoveryState | undefined;
|
|
152
|
+
/**
|
|
153
|
+
* Check if a lane needs recovery intervention
|
|
154
|
+
*/
|
|
155
|
+
needsIntervention(laneName: string): boolean;
|
|
156
|
+
/**
|
|
157
|
+
* Get the next recovery action for a lane
|
|
158
|
+
*/
|
|
159
|
+
getRecoveryAction(laneName: string, laneRunDir: string, child?: ChildProcess): Promise<RecoveryActionResult>;
|
|
160
|
+
/**
|
|
161
|
+
* Send a continue signal to the lane
|
|
162
|
+
*/
|
|
163
|
+
private sendContinueSignal;
|
|
164
|
+
/**
|
|
165
|
+
* Send a stronger prompt to nudge the agent
|
|
166
|
+
*/
|
|
167
|
+
private sendStrongerPrompt;
|
|
168
|
+
/**
|
|
169
|
+
* Request process restart
|
|
170
|
+
*/
|
|
171
|
+
private requestRestart;
|
|
172
|
+
/**
|
|
173
|
+
* Run diagnostic checks
|
|
174
|
+
*/
|
|
175
|
+
private runDiagnosis;
|
|
176
|
+
/**
|
|
177
|
+
* Get failure history for a lane
|
|
178
|
+
*/
|
|
179
|
+
getFailureHistory(laneName: string): FailureRecord[];
|
|
180
|
+
/**
|
|
181
|
+
* Get configuration
|
|
182
|
+
*/
|
|
183
|
+
getConfig(): AutoRecoveryConfig;
|
|
184
|
+
/**
|
|
185
|
+
* Update configuration
|
|
186
|
+
*/
|
|
187
|
+
updateConfig(config: Partial<AutoRecoveryConfig>): void;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Save a POF entry to the pof directory
|
|
191
|
+
*/
|
|
192
|
+
export declare function savePOF(runId: string, pofDir: string, entry: POFEntry): string;
|
|
193
|
+
/**
|
|
194
|
+
* Create a POF entry from recovery state
|
|
195
|
+
*/
|
|
196
|
+
export declare function createPOFFromRecoveryState(runId: string, runDir: string, laneName: string, state: LaneRecoveryState, laneState: LaneState | null, diagnostic?: DiagnosticInfo): POFEntry;
|
|
197
|
+
/**
|
|
198
|
+
* Load existing POF entries for a run
|
|
199
|
+
*/
|
|
200
|
+
export declare function loadPOF(pofDir: string, runId: string): POFEntry | null;
|
|
201
|
+
/**
|
|
202
|
+
* List all POF files in a directory
|
|
203
|
+
*/
|
|
204
|
+
export declare function listPOFs(pofDir: string): string[];
|
|
205
|
+
/**
|
|
206
|
+
* Get or create the default auto-recovery manager
|
|
207
|
+
*/
|
|
208
|
+
export declare function getAutoRecoveryManager(config?: Partial<AutoRecoveryConfig>): AutoRecoveryManager;
|
|
209
|
+
/**
|
|
210
|
+
* Reset the default manager (for testing)
|
|
211
|
+
*/
|
|
212
|
+
export declare function resetAutoRecoveryManager(): void;
|