@litmers/cursorflow-orchestrator 0.1.18 → 0.1.26
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 +25 -0
- package/README.md +25 -7
- 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 +178 -6
- package/dist/cli/clean.js.map +1 -1
- package/dist/cli/index.js +12 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.js +8 -7
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/logs.js +126 -77
- package/dist/cli/logs.js.map +1 -1
- package/dist/cli/monitor.d.ts +7 -0
- package/dist/cli/monitor.js +1021 -202
- package/dist/cli/monitor.js.map +1 -1
- package/dist/cli/prepare.js +39 -21
- package/dist/cli/prepare.js.map +1 -1
- package/dist/cli/resume.js +268 -163
- package/dist/cli/resume.js.map +1 -1
- package/dist/cli/run.js +11 -5
- 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 +8 -8
- 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 +16 -2
- package/dist/core/orchestrator.js +439 -105
- 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 +374 -164
- 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 +18 -8
- 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 +17 -11
- package/dist/utils/doctor.js.map +1 -1
- package/dist/utils/enhanced-logger.d.ts +10 -33
- package/dist/utils/enhanced-logger.js +108 -20
- package/dist/utils/enhanced-logger.js.map +1 -1
- package/dist/utils/git.d.ts +121 -0
- package/dist/utils/git.js +484 -11
- 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 +25 -0
- package/dist/utils/log-formatter.js +237 -0
- package/dist/utils/log-formatter.js.map +1 -0
- 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/path.d.ts +19 -0
- package/dist/utils/path.js +77 -0
- package/dist/utils/path.js.map +1 -0
- 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 +62 -3
- package/dist/utils/state.js +317 -11
- 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/template.d.ts +14 -0
- package/dist/utils/template.js +122 -0
- package/dist/utils/template.js.map +1 -0
- package/dist/utils/types.d.ts +2 -271
- 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 +187 -6
- package/src/cli/index.ts +12 -1
- package/src/cli/init.ts +8 -7
- package/src/cli/logs.ts +124 -77
- package/src/cli/monitor.ts +1815 -898
- package/src/cli/prepare.ts +41 -21
- package/src/cli/resume.ts +753 -626
- package/src/cli/run.ts +12 -5
- package/src/cli/runs.ts +212 -0
- package/src/cli/setup-commands.ts +0 -0
- package/src/cli/signal.ts +8 -7
- 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 +1131 -704
- package/src/core/reviewer.ts +4 -0
- package/src/core/runner.ts +444 -180
- 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 +18 -8
- package/src/utils/cursor-agent.ts +1 -1
- package/src/utils/dependency.ts +482 -0
- package/src/utils/doctor.ts +18 -11
- package/src/utils/enhanced-logger.ts +122 -60
- package/src/utils/git.ts +517 -11
- 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 +245 -0
- package/src/utils/log-service.ts +49 -0
- package/src/utils/logger.ts +100 -51
- package/src/utils/path.ts +45 -0
- 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 +385 -11
- package/src/utils/task-service.ts +370 -0
- package/src/utils/template.ts +92 -0
- package/src/utils/types.ts +2 -314
- package/templates/basic.json +21 -0
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TaskService - Manages CursorFlow task directories and validation
|
|
4
|
+
*
|
|
5
|
+
* Provides:
|
|
6
|
+
* - List prepared task directories
|
|
7
|
+
* - Get task details (lanes, dependencies)
|
|
8
|
+
* - Validate tasks (doctor integration)
|
|
9
|
+
* - Check run eligibility
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.TaskService = void 0;
|
|
46
|
+
exports.createTaskService = createTaskService;
|
|
47
|
+
const fs = __importStar(require("fs"));
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
const logger = __importStar(require("./logger"));
|
|
50
|
+
// Cache for validation results
|
|
51
|
+
const validationCache = new Map();
|
|
52
|
+
class TaskService {
|
|
53
|
+
tasksDir;
|
|
54
|
+
constructor(tasksDir) {
|
|
55
|
+
this.tasksDir = tasksDir;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* List all prepared task directories
|
|
59
|
+
*/
|
|
60
|
+
listTaskDirs() {
|
|
61
|
+
if (!fs.existsSync(this.tasksDir)) {
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
const dirs = fs.readdirSync(this.tasksDir)
|
|
65
|
+
.filter(name => {
|
|
66
|
+
const dirPath = path.join(this.tasksDir, name);
|
|
67
|
+
return fs.statSync(dirPath).isDirectory() && !name.startsWith('.');
|
|
68
|
+
})
|
|
69
|
+
.sort((a, b) => b.localeCompare(a)); // Most recent first (assuming timestamp prefix)
|
|
70
|
+
return dirs.map(name => this.getTaskDirInfo(name)).filter((t) => t !== null);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get detailed information about a task directory
|
|
74
|
+
*/
|
|
75
|
+
getTaskDirInfo(taskName) {
|
|
76
|
+
const taskPath = path.join(this.tasksDir, taskName);
|
|
77
|
+
if (!fs.existsSync(taskPath)) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
const stat = fs.statSync(taskPath);
|
|
82
|
+
const timestamp = this.parseTimestampFromName(taskName) || stat.mtime;
|
|
83
|
+
const featureName = this.extractFeatureName(taskName);
|
|
84
|
+
const lanes = this.scanLaneFiles(taskPath);
|
|
85
|
+
// Get cached validation status
|
|
86
|
+
const cached = validationCache.get(taskName);
|
|
87
|
+
const validationStatus = cached?.status || 'unknown';
|
|
88
|
+
const lastValidated = cached?.lastValidated;
|
|
89
|
+
return {
|
|
90
|
+
name: taskName,
|
|
91
|
+
path: taskPath,
|
|
92
|
+
timestamp,
|
|
93
|
+
featureName,
|
|
94
|
+
lanes,
|
|
95
|
+
validationStatus,
|
|
96
|
+
lastValidated,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
logger.debug(`Failed to read task dir ${taskName}: ${error}`);
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Scan lane files in a task directory
|
|
106
|
+
*/
|
|
107
|
+
scanLaneFiles(taskPath) {
|
|
108
|
+
const files = fs.readdirSync(taskPath)
|
|
109
|
+
.filter(name => name.endsWith('.json'))
|
|
110
|
+
.sort();
|
|
111
|
+
const lanes = [];
|
|
112
|
+
for (const fileName of files) {
|
|
113
|
+
try {
|
|
114
|
+
const filePath = path.join(taskPath, fileName);
|
|
115
|
+
const content = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
116
|
+
const laneName = this.extractLaneName(fileName);
|
|
117
|
+
const tasks = content.tasks || [];
|
|
118
|
+
const dependsOn = content.dependsOn || [];
|
|
119
|
+
const preset = this.detectPreset(tasks);
|
|
120
|
+
const taskFlow = this.generateTaskFlow(tasks);
|
|
121
|
+
lanes.push({
|
|
122
|
+
fileName,
|
|
123
|
+
laneName,
|
|
124
|
+
preset,
|
|
125
|
+
taskCount: tasks.length,
|
|
126
|
+
taskFlow,
|
|
127
|
+
dependsOn,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
logger.debug(`Failed to parse lane file ${fileName}: ${error}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return lanes;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Extract lane name from filename (e.g., "01-lane-1.json" -> "lane-1")
|
|
138
|
+
*/
|
|
139
|
+
extractLaneName(fileName) {
|
|
140
|
+
const baseName = fileName.replace('.json', '');
|
|
141
|
+
// Remove numeric prefix if present (e.g., "01-lane-1" -> "lane-1")
|
|
142
|
+
const match = baseName.match(/^\d+-(.+)$/);
|
|
143
|
+
return match ? match[1] : baseName;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Parse timestamp from task name (format: YYMMDDHHMM_FeatureName)
|
|
147
|
+
*/
|
|
148
|
+
parseTimestampFromName(taskName) {
|
|
149
|
+
const match = taskName.match(/^(\d{10})_/);
|
|
150
|
+
if (!match)
|
|
151
|
+
return null;
|
|
152
|
+
const ts = match[1];
|
|
153
|
+
const year = 2000 + parseInt(ts.substring(0, 2), 10);
|
|
154
|
+
const month = parseInt(ts.substring(2, 4), 10) - 1;
|
|
155
|
+
const day = parseInt(ts.substring(4, 6), 10);
|
|
156
|
+
const hour = parseInt(ts.substring(6, 8), 10);
|
|
157
|
+
const minute = parseInt(ts.substring(8, 10), 10);
|
|
158
|
+
return new Date(year, month, day, hour, minute);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Extract feature name from task directory name
|
|
162
|
+
*/
|
|
163
|
+
extractFeatureName(taskName) {
|
|
164
|
+
const parts = taskName.split('_');
|
|
165
|
+
if (parts.length >= 2) {
|
|
166
|
+
return parts.slice(1).join('_');
|
|
167
|
+
}
|
|
168
|
+
return taskName;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Detect task preset based on task structure
|
|
172
|
+
*/
|
|
173
|
+
detectPreset(tasks) {
|
|
174
|
+
if (tasks.length === 0)
|
|
175
|
+
return 'empty';
|
|
176
|
+
const taskNames = tasks.map(t => t.name.toLowerCase());
|
|
177
|
+
if (taskNames.includes('plan') && taskNames.includes('implement') && taskNames.includes('test')) {
|
|
178
|
+
return 'complex';
|
|
179
|
+
}
|
|
180
|
+
if (taskNames.includes('implement') && taskNames.includes('test') && !taskNames.includes('plan')) {
|
|
181
|
+
return 'simple';
|
|
182
|
+
}
|
|
183
|
+
if (taskNames.includes('merge')) {
|
|
184
|
+
return 'merge';
|
|
185
|
+
}
|
|
186
|
+
return 'custom';
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Generate task flow string (e.g., "plan → implement → test")
|
|
190
|
+
*/
|
|
191
|
+
generateTaskFlow(tasks) {
|
|
192
|
+
if (tasks.length === 0)
|
|
193
|
+
return '';
|
|
194
|
+
return tasks.map(t => t.name).join(' → ');
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Validate a task directory
|
|
198
|
+
*/
|
|
199
|
+
validateTaskDir(taskName) {
|
|
200
|
+
const taskInfo = this.getTaskDirInfo(taskName);
|
|
201
|
+
if (!taskInfo) {
|
|
202
|
+
return {
|
|
203
|
+
status: 'errors',
|
|
204
|
+
errors: [`Task directory not found: ${taskName}`],
|
|
205
|
+
warnings: [],
|
|
206
|
+
issues: [`Task directory not found: ${taskName}`],
|
|
207
|
+
lastValidated: Date.now(),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
const errors = [];
|
|
211
|
+
const warnings = [];
|
|
212
|
+
// Check if there are any lane files
|
|
213
|
+
if (taskInfo.lanes.length === 0) {
|
|
214
|
+
errors.push('No lane files found in task directory');
|
|
215
|
+
}
|
|
216
|
+
// Validate each lane file
|
|
217
|
+
for (const lane of taskInfo.lanes) {
|
|
218
|
+
// Check task count
|
|
219
|
+
if (lane.taskCount === 0) {
|
|
220
|
+
errors.push(`Lane ${lane.fileName} has no tasks defined`);
|
|
221
|
+
}
|
|
222
|
+
// Check dependencies exist
|
|
223
|
+
for (const dep of lane.dependsOn) {
|
|
224
|
+
const depExists = taskInfo.lanes.some(l => l.laneName === dep || l.fileName === dep || l.fileName === `${dep}.json`);
|
|
225
|
+
if (!depExists) {
|
|
226
|
+
warnings.push(`Lane ${lane.fileName} depends on unknown lane: ${dep}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// Validate lane file structure
|
|
230
|
+
try {
|
|
231
|
+
const filePath = path.join(taskInfo.path, lane.fileName);
|
|
232
|
+
const content = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
233
|
+
// Check tasks array
|
|
234
|
+
if (!Array.isArray(content.tasks)) {
|
|
235
|
+
errors.push(`Lane ${lane.fileName}: 'tasks' must be an array`);
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
// Validate each task
|
|
239
|
+
for (let i = 0; i < content.tasks.length; i++) {
|
|
240
|
+
const task = content.tasks[i];
|
|
241
|
+
if (!task.name) {
|
|
242
|
+
errors.push(`Lane ${lane.fileName}: Task ${i + 1} missing 'name'`);
|
|
243
|
+
}
|
|
244
|
+
if (!task.prompt) {
|
|
245
|
+
errors.push(`Lane ${lane.fileName}: Task ${i + 1} missing 'prompt'`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
errors.push(`Lane ${lane.fileName}: Invalid JSON - ${error}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// Check for circular dependencies
|
|
255
|
+
const circularDeps = this.detectCircularDependencies(taskInfo.lanes);
|
|
256
|
+
if (circularDeps.length > 0) {
|
|
257
|
+
errors.push(`Circular dependencies detected: ${circularDeps.join(' -> ')}`);
|
|
258
|
+
}
|
|
259
|
+
// Determine overall status
|
|
260
|
+
let status = 'valid';
|
|
261
|
+
if (errors.length > 0) {
|
|
262
|
+
status = 'errors';
|
|
263
|
+
}
|
|
264
|
+
else if (warnings.length > 0) {
|
|
265
|
+
status = 'warnings';
|
|
266
|
+
}
|
|
267
|
+
const issues = [...errors, ...warnings];
|
|
268
|
+
const result = {
|
|
269
|
+
issues,
|
|
270
|
+
status,
|
|
271
|
+
errors,
|
|
272
|
+
warnings,
|
|
273
|
+
lastValidated: Date.now(),
|
|
274
|
+
};
|
|
275
|
+
// Cache the result
|
|
276
|
+
validationCache.set(taskName, result);
|
|
277
|
+
return result;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Detect circular dependencies in lane dependency graph
|
|
281
|
+
*/
|
|
282
|
+
detectCircularDependencies(lanes) {
|
|
283
|
+
const visited = new Set();
|
|
284
|
+
const stack = new Set();
|
|
285
|
+
const cycle = [];
|
|
286
|
+
const dfs = (laneName) => {
|
|
287
|
+
if (stack.has(laneName)) {
|
|
288
|
+
cycle.push(laneName);
|
|
289
|
+
return true; // Cycle found
|
|
290
|
+
}
|
|
291
|
+
if (visited.has(laneName)) {
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
visited.add(laneName);
|
|
295
|
+
stack.add(laneName);
|
|
296
|
+
const lane = lanes.find(l => l.laneName === laneName);
|
|
297
|
+
if (lane) {
|
|
298
|
+
for (const dep of lane.dependsOn) {
|
|
299
|
+
if (dfs(dep)) {
|
|
300
|
+
cycle.unshift(laneName);
|
|
301
|
+
return true;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
stack.delete(laneName);
|
|
306
|
+
return false;
|
|
307
|
+
};
|
|
308
|
+
for (const lane of lanes) {
|
|
309
|
+
if (dfs(lane.laneName)) {
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return cycle;
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Get cached validation status
|
|
317
|
+
*/
|
|
318
|
+
getValidationStatus(taskName) {
|
|
319
|
+
const cached = validationCache.get(taskName);
|
|
320
|
+
return cached?.status || 'unknown';
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Check if a task can be run
|
|
324
|
+
*/
|
|
325
|
+
canRun(taskName) {
|
|
326
|
+
const validation = this.validateTaskDir(taskName);
|
|
327
|
+
if (validation.status === 'errors') {
|
|
328
|
+
return { ok: false, issues: validation.errors };
|
|
329
|
+
}
|
|
330
|
+
return { ok: true, issues: validation.warnings };
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Clear validation cache
|
|
334
|
+
*/
|
|
335
|
+
clearCache() {
|
|
336
|
+
validationCache.clear();
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
exports.TaskService = TaskService;
|
|
340
|
+
/**
|
|
341
|
+
* Create a TaskService instance with default paths
|
|
342
|
+
*/
|
|
343
|
+
function createTaskService(projectRoot) {
|
|
344
|
+
const root = projectRoot || process.cwd();
|
|
345
|
+
const tasksDir = path.join(root, '_cursorflow', 'tasks');
|
|
346
|
+
return new TaskService(tasksDir);
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=task-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-service.js","sourceRoot":"","sources":["../../src/utils/task-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template loading utilities for CursorFlow
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Fetch remote template from URL
|
|
6
|
+
*/
|
|
7
|
+
export declare function fetchRemoteTemplate(url: string): Promise<any>;
|
|
8
|
+
/**
|
|
9
|
+
* Resolve template from various sources:
|
|
10
|
+
* 1. URL (starts with http:// or https://)
|
|
11
|
+
* 2. Built-in template (name without .json)
|
|
12
|
+
* 3. Local file path
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolveTemplate(templatePath: string): Promise<any>;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Template loading utilities for CursorFlow
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.fetchRemoteTemplate = fetchRemoteTemplate;
|
|
40
|
+
exports.resolveTemplate = resolveTemplate;
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const https = __importStar(require("https"));
|
|
44
|
+
const http = __importStar(require("http"));
|
|
45
|
+
const logger = __importStar(require("./logger"));
|
|
46
|
+
const path_1 = require("./path");
|
|
47
|
+
const config_1 = require("./config");
|
|
48
|
+
/**
|
|
49
|
+
* Fetch remote template from URL
|
|
50
|
+
*/
|
|
51
|
+
async function fetchRemoteTemplate(url) {
|
|
52
|
+
return new Promise((resolve, reject) => {
|
|
53
|
+
const protocol = url.startsWith('https') ? https : http;
|
|
54
|
+
protocol.get(url, (res) => {
|
|
55
|
+
if (res.statusCode !== 200) {
|
|
56
|
+
reject(new Error(`Failed to fetch template from ${url}: Status ${res.statusCode}`));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
let data = '';
|
|
60
|
+
res.on('data', (chunk) => {
|
|
61
|
+
data += chunk;
|
|
62
|
+
});
|
|
63
|
+
res.on('end', () => {
|
|
64
|
+
try {
|
|
65
|
+
resolve(JSON.parse(data));
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
reject(new Error(`Failed to parse template JSON from ${url}: ${e}`));
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}).on('error', (err) => {
|
|
72
|
+
reject(new Error(`Network error while fetching template from ${url}: ${err.message}`));
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Resolve template from various sources:
|
|
78
|
+
* 1. URL (starts with http:// or https://)
|
|
79
|
+
* 2. Built-in template (name without .json)
|
|
80
|
+
* 3. Local file path
|
|
81
|
+
*/
|
|
82
|
+
async function resolveTemplate(templatePath) {
|
|
83
|
+
// 1. Remote URL
|
|
84
|
+
if (templatePath.startsWith('http://') || templatePath.startsWith('https://')) {
|
|
85
|
+
logger.info(`Fetching remote template: ${templatePath}`);
|
|
86
|
+
return fetchRemoteTemplate(templatePath);
|
|
87
|
+
}
|
|
88
|
+
// 2. Built-in template
|
|
89
|
+
// Search in templates/ directory of the project root
|
|
90
|
+
try {
|
|
91
|
+
const projectRoot = (0, config_1.findProjectRoot)();
|
|
92
|
+
const builtInPath = (0, path_1.safeJoin)(projectRoot, 'templates', templatePath.endsWith('.json') ? templatePath : `${templatePath}.json`);
|
|
93
|
+
if (fs.existsSync(builtInPath)) {
|
|
94
|
+
logger.info(`Using built-in template: ${templatePath}`);
|
|
95
|
+
return JSON.parse(fs.readFileSync(builtInPath, 'utf8'));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch (e) {
|
|
99
|
+
// Ignore error if project root not found, try other methods
|
|
100
|
+
}
|
|
101
|
+
// Fallback for built-in templates relative to the module (for installed package)
|
|
102
|
+
const templatesDir = path.resolve(__dirname, '../../templates');
|
|
103
|
+
const templateFileName = templatePath.endsWith('.json') ? templatePath : `${templatePath}.json`;
|
|
104
|
+
const modulePath = (0, path_1.safeJoin)(templatesDir, templateFileName);
|
|
105
|
+
if (fs.existsSync(modulePath)) {
|
|
106
|
+
logger.info(`Using module template: ${templatePath}`);
|
|
107
|
+
return JSON.parse(fs.readFileSync(modulePath, 'utf8'));
|
|
108
|
+
}
|
|
109
|
+
// 3. Local file path
|
|
110
|
+
const localPath = (0, path_1.safeJoin)(process.cwd(), templatePath);
|
|
111
|
+
if (fs.existsSync(localPath)) {
|
|
112
|
+
logger.info(`Using local template: ${templatePath}`);
|
|
113
|
+
try {
|
|
114
|
+
return JSON.parse(fs.readFileSync(localPath, 'utf8'));
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
throw new Error(`Failed to parse local template ${templatePath}: ${e}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
throw new Error(`Template not found: ${templatePath}. It must be a URL, a built-in template name, or a local file path.`);
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/utils/template.ts"],"names":[],"mappings":"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"}
|