@litmers/cursorflow-orchestrator 0.1.30 → 0.1.34
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/README.md +144 -52
- package/commands/cursorflow-add.md +159 -0
- package/commands/cursorflow-monitor.md +23 -2
- package/commands/cursorflow-new.md +87 -0
- package/dist/cli/add.d.ts +7 -0
- package/dist/cli/add.js +377 -0
- package/dist/cli/add.js.map +1 -0
- package/dist/cli/clean.js +1 -0
- package/dist/cli/clean.js.map +1 -1
- package/dist/cli/config.d.ts +7 -0
- package/dist/cli/config.js +181 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.js +34 -30
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/logs.js +7 -33
- package/dist/cli/logs.js.map +1 -1
- package/dist/cli/monitor.js +51 -62
- package/dist/cli/monitor.js.map +1 -1
- package/dist/cli/new.d.ts +7 -0
- package/dist/cli/new.js +232 -0
- package/dist/cli/new.js.map +1 -0
- package/dist/cli/prepare.js +95 -193
- package/dist/cli/prepare.js.map +1 -1
- package/dist/cli/resume.js +11 -47
- package/dist/cli/resume.js.map +1 -1
- package/dist/cli/run.js +27 -22
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/tasks.js +1 -2
- package/dist/cli/tasks.js.map +1 -1
- package/dist/core/failure-policy.d.ts +9 -0
- package/dist/core/failure-policy.js +9 -0
- package/dist/core/failure-policy.js.map +1 -1
- package/dist/core/orchestrator.d.ts +20 -6
- package/dist/core/orchestrator.js +217 -331
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/core/runner/agent.d.ts +27 -0
- package/dist/core/runner/agent.js +294 -0
- package/dist/core/runner/agent.js.map +1 -0
- package/dist/core/runner/index.d.ts +5 -0
- package/dist/core/runner/index.js +22 -0
- package/dist/core/runner/index.js.map +1 -0
- package/dist/core/runner/pipeline.d.ts +9 -0
- package/dist/core/runner/pipeline.js +539 -0
- package/dist/core/runner/pipeline.js.map +1 -0
- package/dist/core/runner/prompt.d.ts +25 -0
- package/dist/core/runner/prompt.js +175 -0
- package/dist/core/runner/prompt.js.map +1 -0
- package/dist/core/runner/task.d.ts +26 -0
- package/dist/core/runner/task.js +283 -0
- package/dist/core/runner/task.js.map +1 -0
- package/dist/core/runner/utils.d.ts +37 -0
- package/dist/core/runner/utils.js +161 -0
- package/dist/core/runner/utils.js.map +1 -0
- package/dist/core/runner.d.ts +2 -96
- package/dist/core/runner.js +11 -1136
- package/dist/core/runner.js.map +1 -1
- package/dist/core/stall-detection.d.ts +326 -0
- package/dist/core/stall-detection.js +781 -0
- package/dist/core/stall-detection.js.map +1 -0
- package/dist/types/config.d.ts +6 -6
- package/dist/types/flow.d.ts +84 -0
- package/dist/types/flow.js +10 -0
- package/dist/types/flow.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.js +3 -3
- package/dist/types/index.js.map +1 -1
- package/dist/types/lane.d.ts +0 -2
- package/dist/types/logging.d.ts +5 -1
- package/dist/types/task.d.ts +7 -11
- package/dist/utils/config.js +7 -15
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/dependency.d.ts +36 -1
- package/dist/utils/dependency.js +256 -1
- package/dist/utils/dependency.js.map +1 -1
- package/dist/utils/enhanced-logger.d.ts +45 -82
- package/dist/utils/enhanced-logger.js +238 -844
- package/dist/utils/enhanced-logger.js.map +1 -1
- package/dist/utils/git.d.ts +29 -0
- package/dist/utils/git.js +115 -5
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/state.js +0 -2
- package/dist/utils/state.js.map +1 -1
- package/dist/utils/task-service.d.ts +2 -2
- package/dist/utils/task-service.js +40 -31
- package/dist/utils/task-service.js.map +1 -1
- package/package.json +4 -3
- package/src/cli/add.ts +397 -0
- package/src/cli/clean.ts +1 -0
- package/src/cli/config.ts +177 -0
- package/src/cli/index.ts +36 -32
- package/src/cli/logs.ts +7 -31
- package/src/cli/monitor.ts +55 -71
- package/src/cli/new.ts +235 -0
- package/src/cli/prepare.ts +98 -205
- package/src/cli/resume.ts +13 -56
- package/src/cli/run.ts +311 -306
- package/src/cli/tasks.ts +1 -2
- package/src/core/failure-policy.ts +9 -0
- package/src/core/orchestrator.ts +281 -375
- package/src/core/runner/agent.ts +314 -0
- package/src/core/runner/index.ts +6 -0
- package/src/core/runner/pipeline.ts +567 -0
- package/src/core/runner/prompt.ts +174 -0
- package/src/core/runner/task.ts +320 -0
- package/src/core/runner/utils.ts +142 -0
- package/src/core/runner.ts +8 -1347
- package/src/core/stall-detection.ts +936 -0
- package/src/types/config.ts +6 -6
- package/src/types/flow.ts +91 -0
- package/src/types/index.ts +15 -3
- package/src/types/lane.ts +0 -2
- package/src/types/logging.ts +5 -1
- package/src/types/task.ts +7 -11
- package/src/utils/config.ts +8 -16
- package/src/utils/dependency.ts +311 -2
- package/src/utils/enhanced-logger.ts +263 -927
- package/src/utils/git.ts +145 -5
- package/src/utils/state.ts +0 -2
- package/src/utils/task-service.ts +48 -40
- package/commands/cursorflow-review.md +0 -56
- package/commands/cursorflow-runs.md +0 -59
- package/dist/cli/runs.d.ts +0 -5
- package/dist/cli/runs.js +0 -214
- package/dist/cli/runs.js.map +0 -1
- package/dist/core/reviewer.d.ts +0 -66
- package/dist/core/reviewer.js +0 -265
- package/dist/core/reviewer.js.map +0 -1
- package/src/cli/runs.ts +0 -212
- package/src/core/reviewer.ts +0 -285
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.runTasks = runTasks;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const git = __importStar(require("../../utils/git"));
|
|
40
|
+
const logger = __importStar(require("../../utils/logger"));
|
|
41
|
+
const cursor_agent_1 = require("../../utils/cursor-agent");
|
|
42
|
+
const state_1 = require("../../utils/state");
|
|
43
|
+
const events_1 = require("../../utils/events");
|
|
44
|
+
const health_1 = require("../../utils/health");
|
|
45
|
+
const checkpoint_1 = require("../../utils/checkpoint");
|
|
46
|
+
const path_1 = require("../../utils/path");
|
|
47
|
+
const agent_1 = require("./agent");
|
|
48
|
+
const task_1 = require("./task");
|
|
49
|
+
/**
|
|
50
|
+
* Validate task configuration
|
|
51
|
+
*/
|
|
52
|
+
function validateTaskConfig(config) {
|
|
53
|
+
if (!config.tasks || config.tasks.length === 0) {
|
|
54
|
+
throw new Error('No tasks defined in configuration');
|
|
55
|
+
}
|
|
56
|
+
for (let i = 0; i < config.tasks.length; i++) {
|
|
57
|
+
const task = config.tasks[i];
|
|
58
|
+
if (!task.name)
|
|
59
|
+
throw new Error(`Task at index ${i} has no name`);
|
|
60
|
+
if (!task.prompt)
|
|
61
|
+
throw new Error(`Task "${task.name}" has no prompt`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Run all tasks in sequence
|
|
66
|
+
*/
|
|
67
|
+
async function runTasks(tasksFile, config, runDir, options = {}) {
|
|
68
|
+
const startIndex = options.startIndex || 0;
|
|
69
|
+
const noGit = options.noGit || config.noGit || false;
|
|
70
|
+
// Ensure paths are absolute before potentially changing directory
|
|
71
|
+
runDir = path.resolve(runDir);
|
|
72
|
+
tasksFile = path.resolve(tasksFile);
|
|
73
|
+
if (noGit) {
|
|
74
|
+
logger.info('🚫 Running in noGit mode - Git operations will be skipped');
|
|
75
|
+
}
|
|
76
|
+
// Validate configuration before starting
|
|
77
|
+
logger.info('Validating task configuration...');
|
|
78
|
+
try {
|
|
79
|
+
validateTaskConfig(config);
|
|
80
|
+
logger.success('✓ Configuration valid');
|
|
81
|
+
}
|
|
82
|
+
catch (validationError) {
|
|
83
|
+
logger.error('❌ Configuration validation failed');
|
|
84
|
+
logger.error(` ${validationError.message}`);
|
|
85
|
+
throw validationError;
|
|
86
|
+
}
|
|
87
|
+
// Run preflight checks (can be skipped for resume)
|
|
88
|
+
if (!options.skipPreflight && startIndex === 0) {
|
|
89
|
+
logger.info('Running preflight checks...');
|
|
90
|
+
const preflight = await (0, health_1.preflightCheck)({
|
|
91
|
+
requireRemote: !noGit,
|
|
92
|
+
requireAuth: true,
|
|
93
|
+
});
|
|
94
|
+
if (!preflight.canProceed) {
|
|
95
|
+
(0, health_1.printPreflightReport)(preflight);
|
|
96
|
+
throw new Error('Preflight check failed. Please fix the blockers above.');
|
|
97
|
+
}
|
|
98
|
+
if (preflight.warnings.length > 0) {
|
|
99
|
+
for (const warning of preflight.warnings) {
|
|
100
|
+
logger.warn(`⚠️ ${warning}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
logger.success('✓ Preflight checks passed');
|
|
104
|
+
}
|
|
105
|
+
// Warn if baseBranch is set in config (it will be ignored)
|
|
106
|
+
if (config.baseBranch) {
|
|
107
|
+
logger.warn(`⚠️ config.baseBranch="${config.baseBranch}" will be ignored. Using current branch instead.`);
|
|
108
|
+
}
|
|
109
|
+
// Set verbose git logging
|
|
110
|
+
git.setVerboseGit(config.verboseGit || false);
|
|
111
|
+
// Ensure cursor-agent is installed
|
|
112
|
+
(0, cursor_agent_1.ensureCursorAgent)();
|
|
113
|
+
// Check authentication before starting
|
|
114
|
+
logger.info('Checking Cursor authentication...');
|
|
115
|
+
const authStatus = (0, cursor_agent_1.checkCursorAuth)();
|
|
116
|
+
if (!authStatus.authenticated) {
|
|
117
|
+
logger.error('❌ Cursor authentication failed');
|
|
118
|
+
logger.error(` ${authStatus.message}`);
|
|
119
|
+
if (authStatus.details) {
|
|
120
|
+
logger.error(` Details: ${authStatus.details}`);
|
|
121
|
+
}
|
|
122
|
+
if (authStatus.help) {
|
|
123
|
+
logger.error(` ${authStatus.help}`);
|
|
124
|
+
}
|
|
125
|
+
console.log('');
|
|
126
|
+
(0, cursor_agent_1.printAuthHelp)();
|
|
127
|
+
throw new Error('Cursor authentication required. Please authenticate and try again.');
|
|
128
|
+
}
|
|
129
|
+
logger.success('✓ Cursor authentication OK');
|
|
130
|
+
// In noGit mode, we don't need repoRoot - use current directory
|
|
131
|
+
const repoRoot = noGit ? process.cwd() : git.getMainRepoRoot();
|
|
132
|
+
// ALWAYS use current branch as base - ignore config.baseBranch
|
|
133
|
+
// This ensures dependency structure is maintained in the worktree
|
|
134
|
+
const currentBranch = noGit ? 'main' : git.getCurrentBranch(repoRoot);
|
|
135
|
+
logger.info(`📍 Base branch: ${currentBranch} (current branch)`);
|
|
136
|
+
// Load existing state if resuming
|
|
137
|
+
const statePath = (0, path_1.safeJoin)(runDir, 'state.json');
|
|
138
|
+
let state = null;
|
|
139
|
+
if (fs.existsSync(statePath)) {
|
|
140
|
+
// Check if state needs recovery
|
|
141
|
+
if ((0, state_1.stateNeedsRecovery)(statePath)) {
|
|
142
|
+
logger.warn('State file indicates incomplete previous run. Attempting recovery...');
|
|
143
|
+
const repairedState = (0, state_1.repairLaneState)(statePath);
|
|
144
|
+
if (repairedState) {
|
|
145
|
+
state = repairedState;
|
|
146
|
+
logger.success('✓ State recovered');
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
logger.warn('Could not recover state. Starting fresh.');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
state = (0, state_1.loadState)(statePath);
|
|
154
|
+
// Validate loaded state
|
|
155
|
+
if (state) {
|
|
156
|
+
const validation = (0, state_1.validateLaneState)(statePath, {
|
|
157
|
+
checkWorktree: !noGit,
|
|
158
|
+
checkBranch: !noGit,
|
|
159
|
+
autoRepair: true,
|
|
160
|
+
});
|
|
161
|
+
if (!validation.valid) {
|
|
162
|
+
logger.warn(`State validation issues: ${validation.issues.join(', ')}`);
|
|
163
|
+
if (validation.repaired) {
|
|
164
|
+
logger.info('State was auto-repaired');
|
|
165
|
+
state = validation.repairedState || state;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const randomSuffix = Math.random().toString(36).substring(2, 7);
|
|
172
|
+
const pipelineBranch = state?.pipelineBranch || config.pipelineBranch || `${config.branchPrefix || 'cursorflow/'}${Date.now().toString(36)}-${randomSuffix}`;
|
|
173
|
+
// In noGit mode, use a simple local directory instead of worktree
|
|
174
|
+
// Flatten the path by replacing slashes with hyphens to avoid race conditions in parent directory creation
|
|
175
|
+
const worktreeDir = state?.worktreeDir || config.worktreeDir || (noGit
|
|
176
|
+
? (0, path_1.safeJoin)(repoRoot, config.worktreeRoot || '_cursorflow/workdir', pipelineBranch.replace(/\//g, '-'))
|
|
177
|
+
: (0, path_1.safeJoin)(repoRoot, config.worktreeRoot || '_cursorflow/worktrees', pipelineBranch.replace(/\//g, '-')));
|
|
178
|
+
if (startIndex === 0) {
|
|
179
|
+
logger.section('🚀 Starting Pipeline');
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
logger.section(`🔁 Resuming Pipeline from task ${startIndex + 1}`);
|
|
183
|
+
}
|
|
184
|
+
logger.info(`Pipeline Branch: ${pipelineBranch}`);
|
|
185
|
+
logger.info(`Worktree: ${worktreeDir}`);
|
|
186
|
+
logger.info(`Tasks: ${config.tasks.length}`);
|
|
187
|
+
// Create worktree only if starting fresh and worktree doesn't exist
|
|
188
|
+
if (!fs.existsSync(worktreeDir)) {
|
|
189
|
+
if (noGit) {
|
|
190
|
+
// In noGit mode, just create the directory
|
|
191
|
+
logger.info(`Creating work directory: ${worktreeDir}`);
|
|
192
|
+
fs.mkdirSync(worktreeDir, { recursive: true });
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
// Use a simple retry mechanism for Git worktree creation to handle potential race conditions
|
|
196
|
+
let retries = 3;
|
|
197
|
+
let lastError = null;
|
|
198
|
+
while (retries > 0) {
|
|
199
|
+
try {
|
|
200
|
+
// Ensure parent directory exists before calling git worktree
|
|
201
|
+
const worktreeParent = path.dirname(worktreeDir);
|
|
202
|
+
if (!fs.existsSync(worktreeParent)) {
|
|
203
|
+
fs.mkdirSync(worktreeParent, { recursive: true });
|
|
204
|
+
}
|
|
205
|
+
// Always use the current branch (already captured at start) as the base branch
|
|
206
|
+
git.createWorktree(worktreeDir, pipelineBranch, {
|
|
207
|
+
baseBranch: currentBranch,
|
|
208
|
+
cwd: repoRoot,
|
|
209
|
+
});
|
|
210
|
+
break; // Success
|
|
211
|
+
}
|
|
212
|
+
catch (e) {
|
|
213
|
+
lastError = e;
|
|
214
|
+
retries--;
|
|
215
|
+
if (retries > 0) {
|
|
216
|
+
const delay = Math.floor(Math.random() * 1000) + 500;
|
|
217
|
+
logger.warn(`Worktree creation failed, retrying in ${delay}ms... (${retries} retries left)`);
|
|
218
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (retries === 0 && lastError) {
|
|
223
|
+
throw new Error(`Failed to create Git worktree after retries: ${lastError.message}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
else if (!noGit) {
|
|
228
|
+
// If it exists but we are in Git mode, ensure it's actually a worktree and on the right branch
|
|
229
|
+
logger.info(`Reusing existing worktree: ${worktreeDir}`);
|
|
230
|
+
try {
|
|
231
|
+
git.runGit(['checkout', pipelineBranch], { cwd: worktreeDir });
|
|
232
|
+
}
|
|
233
|
+
catch (e) {
|
|
234
|
+
// If checkout fails, maybe the worktree is in a weird state.
|
|
235
|
+
// For now, just log it. In a more robust impl, we might want to repair it.
|
|
236
|
+
logger.warn(`Failed to checkout branch ${pipelineBranch} in existing worktree: ${e}`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Change current directory to worktree for all subsequent operations
|
|
240
|
+
// This ensures that all spawned processes (like git or npm) inherit the correct CWD
|
|
241
|
+
logger.info(`Changing directory to worktree: ${worktreeDir}`);
|
|
242
|
+
process.chdir(worktreeDir);
|
|
243
|
+
// Create chat
|
|
244
|
+
logger.info('Creating chat session...');
|
|
245
|
+
const chatId = (0, agent_1.cursorAgentCreateChat)(worktreeDir);
|
|
246
|
+
// Initialize state if not loaded
|
|
247
|
+
if (!state) {
|
|
248
|
+
state = {
|
|
249
|
+
status: 'running',
|
|
250
|
+
pipelineBranch,
|
|
251
|
+
worktreeDir,
|
|
252
|
+
totalTasks: config.tasks.length,
|
|
253
|
+
currentTaskIndex: 0,
|
|
254
|
+
label: pipelineBranch,
|
|
255
|
+
startTime: Date.now(),
|
|
256
|
+
endTime: null,
|
|
257
|
+
error: null,
|
|
258
|
+
dependencyRequest: null,
|
|
259
|
+
tasksFile, // Store tasks file for resume
|
|
260
|
+
completedTasks: [],
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
state.status = 'running';
|
|
265
|
+
state.error = null;
|
|
266
|
+
state.dependencyRequest = null;
|
|
267
|
+
state.pipelineBranch = pipelineBranch;
|
|
268
|
+
state.worktreeDir = worktreeDir;
|
|
269
|
+
state.label = state.label || pipelineBranch;
|
|
270
|
+
state.completedTasks = state.completedTasks || [];
|
|
271
|
+
}
|
|
272
|
+
(0, state_1.saveState)(statePath, state);
|
|
273
|
+
// Run tasks
|
|
274
|
+
const results = [];
|
|
275
|
+
const laneName = state.label || path.basename(runDir);
|
|
276
|
+
let previousTaskBranch = null;
|
|
277
|
+
for (let i = startIndex; i < config.tasks.length; i++) {
|
|
278
|
+
// Re-read tasks file to allow dynamic updates to future tasks
|
|
279
|
+
try {
|
|
280
|
+
const currentConfig = JSON.parse(fs.readFileSync(tasksFile, 'utf8'));
|
|
281
|
+
if (currentConfig.tasks && currentConfig.tasks.length > i) {
|
|
282
|
+
// Update the current and future tasks from the file
|
|
283
|
+
config.tasks[i] = currentConfig.tasks[i];
|
|
284
|
+
// Also update future tasks in case the user added/removed tasks
|
|
285
|
+
for (let j = i + 1; j < currentConfig.tasks.length; j++) {
|
|
286
|
+
config.tasks[j] = currentConfig.tasks[j];
|
|
287
|
+
}
|
|
288
|
+
// Sync the length if tasks were added
|
|
289
|
+
if (currentConfig.tasks.length > config.tasks.length) {
|
|
290
|
+
for (let j = config.tasks.length; j < currentConfig.tasks.length; j++) {
|
|
291
|
+
config.tasks.push(currentConfig.tasks[j]);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
// Update total tasks count in state if it changed
|
|
295
|
+
if (state && state.totalTasks !== currentConfig.tasks.length) {
|
|
296
|
+
state.totalTasks = currentConfig.tasks.length;
|
|
297
|
+
(0, state_1.saveState)(statePath, state);
|
|
298
|
+
logger.info(`📋 Task list updated. New total tasks: ${state.totalTasks}`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
catch (e) {
|
|
303
|
+
logger.warn(`⚠️ Could not reload tasks from ${tasksFile}. Using existing configuration. (${e instanceof Error ? e.message : String(e)})`);
|
|
304
|
+
}
|
|
305
|
+
const task = config.tasks[i];
|
|
306
|
+
const taskBranch = `${pipelineBranch}--${String(i + 1).padStart(2, '0')}-${task.name}`;
|
|
307
|
+
// Delete previous task branch if it exists (Task 1 deleted when Task 2 starts, etc.)
|
|
308
|
+
if (!noGit && previousTaskBranch) {
|
|
309
|
+
logger.info(`🧹 Deleting previous task branch: ${previousTaskBranch}`);
|
|
310
|
+
try {
|
|
311
|
+
// Only delete if it's not the current branch
|
|
312
|
+
const current = git.getCurrentBranch(worktreeDir);
|
|
313
|
+
if (current !== previousTaskBranch) {
|
|
314
|
+
git.deleteBranch(previousTaskBranch, { cwd: worktreeDir, force: true });
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
catch (e) {
|
|
318
|
+
logger.warn(`Failed to delete previous branch ${previousTaskBranch}: ${e}`);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// Create checkpoint before each task
|
|
322
|
+
try {
|
|
323
|
+
await (0, checkpoint_1.createCheckpoint)(laneName, runDir, noGit ? null : worktreeDir, {
|
|
324
|
+
description: `Before task ${i + 1}: ${task.name}`,
|
|
325
|
+
maxCheckpoints: 5,
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
catch (e) {
|
|
329
|
+
logger.warn(`Failed to create checkpoint: ${e.message}`);
|
|
330
|
+
}
|
|
331
|
+
// Handle task-level dependencies
|
|
332
|
+
if (task.dependsOn && task.dependsOn.length > 0) {
|
|
333
|
+
state.status = 'waiting';
|
|
334
|
+
state.waitingFor = task.dependsOn;
|
|
335
|
+
(0, state_1.saveState)(statePath, state);
|
|
336
|
+
try {
|
|
337
|
+
// Use enhanced dependency wait with timeout
|
|
338
|
+
await (0, task_1.waitForTaskDependencies)(task.dependsOn, runDir, {
|
|
339
|
+
timeoutMs: config.timeout || 30 * 60 * 1000,
|
|
340
|
+
onTimeout: 'fail',
|
|
341
|
+
});
|
|
342
|
+
if (!noGit) {
|
|
343
|
+
await (0, task_1.mergeDependencyBranches)(task.dependsOn, runDir, worktreeDir, pipelineBranch);
|
|
344
|
+
}
|
|
345
|
+
state.status = 'running';
|
|
346
|
+
state.waitingFor = [];
|
|
347
|
+
(0, state_1.saveState)(statePath, state);
|
|
348
|
+
}
|
|
349
|
+
catch (e) {
|
|
350
|
+
state.status = 'failed';
|
|
351
|
+
state.waitingFor = [];
|
|
352
|
+
state.error = e.message;
|
|
353
|
+
(0, state_1.saveState)(statePath, state);
|
|
354
|
+
logger.error(`Task dependency wait/merge failed: ${e.message}`);
|
|
355
|
+
// Try to restore from checkpoint
|
|
356
|
+
const latestCheckpoint = (0, checkpoint_1.getLatestCheckpoint)(runDir);
|
|
357
|
+
if (latestCheckpoint) {
|
|
358
|
+
logger.info(`💾 Checkpoint available: ${latestCheckpoint.id}`);
|
|
359
|
+
logger.info(` Resume with: cursorflow resume --checkpoint ${latestCheckpoint.id}`);
|
|
360
|
+
}
|
|
361
|
+
process.exit(1);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
const result = await (0, task_1.runTask)({
|
|
365
|
+
task,
|
|
366
|
+
config,
|
|
367
|
+
index: i,
|
|
368
|
+
worktreeDir,
|
|
369
|
+
pipelineBranch,
|
|
370
|
+
taskBranch,
|
|
371
|
+
chatId,
|
|
372
|
+
runDir,
|
|
373
|
+
noGit,
|
|
374
|
+
});
|
|
375
|
+
results.push(result);
|
|
376
|
+
// Update state
|
|
377
|
+
state.currentTaskIndex = i + 1;
|
|
378
|
+
state.completedTasks = state.completedTasks || [];
|
|
379
|
+
if (!state.completedTasks.includes(task.name)) {
|
|
380
|
+
state.completedTasks.push(task.name);
|
|
381
|
+
}
|
|
382
|
+
(0, state_1.saveState)(statePath, state);
|
|
383
|
+
// Handle blocked or error
|
|
384
|
+
if (result.status === 'BLOCKED_DEPENDENCY') {
|
|
385
|
+
state.status = 'failed';
|
|
386
|
+
state.dependencyRequest = result.dependencyRequest || null;
|
|
387
|
+
(0, state_1.saveState)(statePath, state);
|
|
388
|
+
if (result.dependencyRequest) {
|
|
389
|
+
events_1.events.emit('lane.dependency_requested', {
|
|
390
|
+
laneName: state.label,
|
|
391
|
+
dependencyRequest: result.dependencyRequest,
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
logger.warn('Task blocked on dependency change');
|
|
395
|
+
process.exit(2);
|
|
396
|
+
}
|
|
397
|
+
if (result.status !== 'FINISHED') {
|
|
398
|
+
state.status = 'failed';
|
|
399
|
+
state.error = result.error || 'Unknown error';
|
|
400
|
+
(0, state_1.saveState)(statePath, state);
|
|
401
|
+
logger.error(`Task failed: ${result.error}`);
|
|
402
|
+
process.exit(1);
|
|
403
|
+
}
|
|
404
|
+
// Merge into pipeline (skip in noGit mode)
|
|
405
|
+
if (!noGit) {
|
|
406
|
+
logger.info(`Merging ${taskBranch} → ${pipelineBranch}`);
|
|
407
|
+
// Ensure we are on the pipeline branch before merging the task branch
|
|
408
|
+
logger.info(`🔄 Switching to pipeline branch ${pipelineBranch} to integrate changes`);
|
|
409
|
+
git.runGit(['checkout', pipelineBranch], { cwd: worktreeDir });
|
|
410
|
+
// Pre-check for conflicts (should be rare since task branch was created from pipeline)
|
|
411
|
+
const conflictCheck = git.checkMergeConflict(taskBranch, { cwd: worktreeDir });
|
|
412
|
+
if (conflictCheck.willConflict) {
|
|
413
|
+
logger.warn(`⚠️ Unexpected conflict detected when merging ${taskBranch}`);
|
|
414
|
+
logger.warn(` Conflicting files: ${conflictCheck.conflictingFiles.join(', ')}`);
|
|
415
|
+
logger.warn(` This may indicate concurrent modifications to ${pipelineBranch}`);
|
|
416
|
+
events_1.events.emit('merge.conflict_detected', {
|
|
417
|
+
taskName: task.name,
|
|
418
|
+
taskBranch,
|
|
419
|
+
pipelineBranch,
|
|
420
|
+
conflictingFiles: conflictCheck.conflictingFiles,
|
|
421
|
+
preCheck: true,
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
// Use safeMerge instead of plain merge for better error handling
|
|
425
|
+
logger.info(`🔀 Merging task ${task.name} (${taskBranch}) into ${pipelineBranch}`);
|
|
426
|
+
const mergeResult = git.safeMerge(taskBranch, {
|
|
427
|
+
cwd: worktreeDir,
|
|
428
|
+
noFf: true,
|
|
429
|
+
message: `chore: merge task ${task.name} into pipeline`,
|
|
430
|
+
abortOnConflict: true,
|
|
431
|
+
});
|
|
432
|
+
if (!mergeResult.success) {
|
|
433
|
+
if (mergeResult.conflict) {
|
|
434
|
+
logger.error(`❌ Merge conflict: ${mergeResult.conflictingFiles.join(', ')}`);
|
|
435
|
+
state.status = 'failed';
|
|
436
|
+
state.error = `Merge conflict when integrating task ${task.name}: ${mergeResult.conflictingFiles.join(', ')}`;
|
|
437
|
+
(0, state_1.saveState)(statePath, state);
|
|
438
|
+
process.exit(1);
|
|
439
|
+
}
|
|
440
|
+
throw new Error(mergeResult.error || 'Merge failed');
|
|
441
|
+
}
|
|
442
|
+
// Log changed files
|
|
443
|
+
const stats = git.getLastOperationStats(worktreeDir);
|
|
444
|
+
if (stats) {
|
|
445
|
+
logger.info('Changed files:\n' + stats);
|
|
446
|
+
}
|
|
447
|
+
git.push(pipelineBranch, { cwd: worktreeDir });
|
|
448
|
+
}
|
|
449
|
+
else {
|
|
450
|
+
logger.info(`✓ Task ${task.name} completed (noGit mode - no branch operations)`);
|
|
451
|
+
}
|
|
452
|
+
// Set previousTaskBranch for cleanup in the next iteration
|
|
453
|
+
previousTaskBranch = noGit ? null : taskBranch;
|
|
454
|
+
}
|
|
455
|
+
// Final Consolidation: Create flow branch and cleanup
|
|
456
|
+
if (!noGit) {
|
|
457
|
+
const flowBranch = laneName;
|
|
458
|
+
logger.section(`🏁 Final Consolidation: ${flowBranch}`);
|
|
459
|
+
// 1. Delete the very last task branch
|
|
460
|
+
if (previousTaskBranch) {
|
|
461
|
+
logger.info(`🧹 Deleting last task branch: ${previousTaskBranch}`);
|
|
462
|
+
try {
|
|
463
|
+
git.deleteBranch(previousTaskBranch, { cwd: worktreeDir, force: true });
|
|
464
|
+
}
|
|
465
|
+
catch (e) {
|
|
466
|
+
logger.warn(` Failed to delete last task branch: ${e}`);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
// 2. Create flow branch from pipelineBranch and cleanup
|
|
470
|
+
if (flowBranch !== pipelineBranch) {
|
|
471
|
+
logger.info(`🌿 Creating final flow branch: ${flowBranch}`);
|
|
472
|
+
try {
|
|
473
|
+
// Create/Overwrite flow branch from pipeline branch
|
|
474
|
+
git.runGit(['checkout', '-B', flowBranch, pipelineBranch], { cwd: worktreeDir });
|
|
475
|
+
git.push(flowBranch, { cwd: worktreeDir, setUpstream: true });
|
|
476
|
+
// 3. Delete temporary pipeline branch
|
|
477
|
+
logger.info(`🗑️ Deleting temporary pipeline branch: ${pipelineBranch}`);
|
|
478
|
+
// Must be on another branch to delete pipelineBranch
|
|
479
|
+
git.runGit(['checkout', flowBranch], { cwd: worktreeDir });
|
|
480
|
+
git.deleteBranch(pipelineBranch, { cwd: worktreeDir, force: true });
|
|
481
|
+
try {
|
|
482
|
+
git.deleteBranch(pipelineBranch, { cwd: worktreeDir, force: true, remote: true });
|
|
483
|
+
logger.info(` Deleted remote branch: origin/${pipelineBranch}`);
|
|
484
|
+
}
|
|
485
|
+
catch {
|
|
486
|
+
// May not exist on remote or delete failed
|
|
487
|
+
}
|
|
488
|
+
logger.success(`✓ Flow branch '${flowBranch}' is now the only remaining branch.`);
|
|
489
|
+
}
|
|
490
|
+
catch (e) {
|
|
491
|
+
logger.error(`❌ Failed during final consolidation: ${e}`);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
// Complete
|
|
496
|
+
state.status = 'completed';
|
|
497
|
+
state.endTime = Date.now();
|
|
498
|
+
(0, state_1.saveState)(statePath, state);
|
|
499
|
+
// Log final file summary
|
|
500
|
+
if (noGit) {
|
|
501
|
+
const getFileSummary = (dir) => {
|
|
502
|
+
let stats = { files: 0, dirs: 0 };
|
|
503
|
+
if (!fs.existsSync(dir))
|
|
504
|
+
return stats;
|
|
505
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
506
|
+
for (const entry of entries) {
|
|
507
|
+
if (entry.name === '.git' || entry.name === '_cursorflow' || entry.name === 'node_modules')
|
|
508
|
+
continue;
|
|
509
|
+
if (entry.isDirectory()) {
|
|
510
|
+
stats.dirs++;
|
|
511
|
+
const sub = getFileSummary((0, path_1.safeJoin)(dir, entry.name));
|
|
512
|
+
stats.files += sub.files;
|
|
513
|
+
stats.dirs += sub.dirs;
|
|
514
|
+
}
|
|
515
|
+
else {
|
|
516
|
+
stats.files++;
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
return stats;
|
|
520
|
+
};
|
|
521
|
+
const summary = getFileSummary(worktreeDir);
|
|
522
|
+
logger.info(`Final Workspace Summary (noGit): ${summary.files} files, ${summary.dirs} directories created/modified`);
|
|
523
|
+
}
|
|
524
|
+
else {
|
|
525
|
+
try {
|
|
526
|
+
// Always use current branch for comparison (already captured at start)
|
|
527
|
+
const stats = git.runGit(['diff', '--stat', currentBranch, pipelineBranch], { cwd: repoRoot, silent: true });
|
|
528
|
+
if (stats) {
|
|
529
|
+
logger.info('Final Workspace Summary (Git):\n' + stats);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
catch (e) {
|
|
533
|
+
// Ignore
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
logger.success('All tasks completed!');
|
|
537
|
+
return results;
|
|
538
|
+
}
|
|
539
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/core/runner/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { DependencyPolicy, RunnerConfig } from '../../types';
|
|
2
|
+
import { DependencyResult } from './utils';
|
|
3
|
+
/**
|
|
4
|
+
* Dependency request file name - agent writes here when dependency changes are needed
|
|
5
|
+
*/
|
|
6
|
+
export declare const DEPENDENCY_REQUEST_FILE = "_cursorflow/dependency-request.json";
|
|
7
|
+
/**
|
|
8
|
+
* Wrap prompt with dependency policy instructions (legacy, used by tests)
|
|
9
|
+
*/
|
|
10
|
+
export declare function wrapPromptForDependencyPolicy(prompt: string, policy: DependencyPolicy): string;
|
|
11
|
+
/**
|
|
12
|
+
* Wrap prompt with global context, dependency policy, and worktree instructions
|
|
13
|
+
*/
|
|
14
|
+
export declare function wrapPrompt(prompt: string, config: RunnerConfig, options?: {
|
|
15
|
+
noGit?: boolean;
|
|
16
|
+
isWorktree?: boolean;
|
|
17
|
+
dependencyResults?: DependencyResult[];
|
|
18
|
+
worktreePath?: string;
|
|
19
|
+
taskBranch?: string;
|
|
20
|
+
pipelineBranch?: string;
|
|
21
|
+
}): string;
|
|
22
|
+
/**
|
|
23
|
+
* Apply file permissions based on dependency policy
|
|
24
|
+
*/
|
|
25
|
+
export declare function applyDependencyFilePermissions(worktreeDir: string, policy: DependencyPolicy): void;
|