@litmers/cursorflow-orchestrator 0.1.3 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -7
- package/README.md +33 -2
- package/commands/cursorflow-doctor.md +24 -0
- package/commands/cursorflow-signal.md +19 -0
- package/dist/cli/clean.d.ts +5 -0
- package/dist/cli/clean.js +57 -0
- package/dist/cli/clean.js.map +1 -0
- package/dist/cli/doctor.d.ts +15 -0
- package/dist/cli/doctor.js +139 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.js +125 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +7 -0
- package/dist/cli/init.js +302 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/monitor.d.ts +8 -0
- package/dist/cli/monitor.js +210 -0
- package/dist/cli/monitor.js.map +1 -0
- package/dist/cli/resume.d.ts +5 -0
- package/dist/cli/resume.js +128 -0
- package/dist/cli/resume.js.map +1 -0
- package/dist/cli/run.d.ts +5 -0
- package/dist/cli/run.js +128 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/setup-commands.d.ts +23 -0
- package/dist/cli/setup-commands.js +234 -0
- package/dist/cli/setup-commands.js.map +1 -0
- package/dist/cli/signal.d.ts +7 -0
- package/dist/cli/signal.js +99 -0
- package/dist/cli/signal.js.map +1 -0
- package/dist/core/orchestrator.d.ts +47 -0
- package/dist/core/orchestrator.js +192 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/reviewer.d.ts +60 -0
- package/dist/core/reviewer.js +239 -0
- package/dist/core/reviewer.js.map +1 -0
- package/dist/core/runner.d.ts +51 -0
- package/dist/core/runner.js +499 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/utils/config.d.ts +31 -0
- package/dist/utils/config.js +198 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/cursor-agent.d.ts +61 -0
- package/dist/utils/cursor-agent.js +263 -0
- package/dist/utils/cursor-agent.js.map +1 -0
- package/dist/utils/doctor.d.ts +63 -0
- package/dist/utils/doctor.js +280 -0
- package/dist/utils/doctor.js.map +1 -0
- package/dist/utils/git.d.ts +131 -0
- package/dist/utils/git.js +272 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/logger.d.ts +68 -0
- package/dist/utils/logger.js +158 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/state.d.ts +65 -0
- package/dist/utils/state.js +216 -0
- package/dist/utils/state.js.map +1 -0
- package/dist/utils/types.d.ts +118 -0
- package/dist/utils/types.js +6 -0
- package/dist/utils/types.js.map +1 -0
- package/examples/README.md +155 -0
- package/examples/demo-project/README.md +262 -0
- package/examples/demo-project/_cursorflow/tasks/demo-test/01-create-utils.json +18 -0
- package/examples/demo-project/_cursorflow/tasks/demo-test/02-add-tests.json +18 -0
- package/examples/demo-project/_cursorflow/tasks/demo-test/README.md +109 -0
- package/package.json +71 -61
- package/scripts/ai-security-check.js +11 -4
- package/scripts/local-security-gate.sh +76 -0
- package/src/cli/{clean.js → clean.ts} +11 -5
- package/src/cli/doctor.ts +127 -0
- package/src/cli/{index.js → index.ts} +27 -16
- package/src/cli/{init.js → init.ts} +26 -18
- package/src/cli/{monitor.js → monitor.ts} +57 -44
- package/src/cli/resume.ts +119 -0
- package/src/cli/run.ts +109 -0
- package/src/cli/{setup-commands.js → setup-commands.ts} +38 -18
- package/src/cli/signal.ts +89 -0
- package/src/core/{orchestrator.js → orchestrator.ts} +44 -26
- package/src/core/{reviewer.js → reviewer.ts} +36 -29
- package/src/core/{runner.js → runner.ts} +125 -76
- package/src/utils/{config.js → config.ts} +17 -25
- package/src/utils/{cursor-agent.js → cursor-agent.ts} +38 -47
- package/src/utils/doctor.ts +312 -0
- package/src/utils/{git.js → git.ts} +70 -56
- package/src/utils/{logger.js → logger.ts} +170 -178
- package/src/utils/{state.js → state.ts} +30 -38
- package/src/utils/types.ts +134 -0
- package/src/cli/resume.js +0 -31
- package/src/cli/run.js +0 -51
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Orchestrator - Parallel lane execution with dependency management
|
|
4
|
+
*
|
|
5
|
+
* Adapted from admin-domains-orchestrator.js
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.spawnLane = spawnLane;
|
|
42
|
+
exports.waitChild = waitChild;
|
|
43
|
+
exports.listLaneFiles = listLaneFiles;
|
|
44
|
+
exports.printLaneStatus = printLaneStatus;
|
|
45
|
+
exports.orchestrate = orchestrate;
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const child_process_1 = require("child_process");
|
|
49
|
+
const logger = __importStar(require("../utils/logger"));
|
|
50
|
+
const state_1 = require("../utils/state");
|
|
51
|
+
/**
|
|
52
|
+
* Spawn a lane process
|
|
53
|
+
*/
|
|
54
|
+
function spawnLane({ tasksFile, laneRunDir, executor }) {
|
|
55
|
+
fs.mkdirSync(laneRunDir, { recursive: true });
|
|
56
|
+
const logPath = path.join(laneRunDir, 'terminal.log');
|
|
57
|
+
const logFd = fs.openSync(logPath, 'a');
|
|
58
|
+
// Use extension-less resolve to handle both .ts (dev) and .js (dist)
|
|
59
|
+
const runnerPath = require.resolve('./runner');
|
|
60
|
+
const args = [
|
|
61
|
+
runnerPath,
|
|
62
|
+
tasksFile,
|
|
63
|
+
'--run-dir', laneRunDir,
|
|
64
|
+
'--executor', executor,
|
|
65
|
+
];
|
|
66
|
+
const child = (0, child_process_1.spawn)('node', args, {
|
|
67
|
+
stdio: ['ignore', logFd, logFd],
|
|
68
|
+
env: process.env,
|
|
69
|
+
detached: false,
|
|
70
|
+
});
|
|
71
|
+
try {
|
|
72
|
+
fs.closeSync(logFd);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Ignore
|
|
76
|
+
}
|
|
77
|
+
return { child, logPath };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Wait for child process to exit
|
|
81
|
+
*/
|
|
82
|
+
function waitChild(proc) {
|
|
83
|
+
return new Promise((resolve) => {
|
|
84
|
+
if (proc.exitCode !== null) {
|
|
85
|
+
resolve(proc.exitCode);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
proc.once('exit', (code) => resolve(code ?? 1));
|
|
89
|
+
proc.once('error', () => resolve(1));
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* List lane task files in directory
|
|
94
|
+
*/
|
|
95
|
+
function listLaneFiles(tasksDir) {
|
|
96
|
+
if (!fs.existsSync(tasksDir)) {
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
const files = fs.readdirSync(tasksDir);
|
|
100
|
+
return files
|
|
101
|
+
.filter(f => f.endsWith('.json'))
|
|
102
|
+
.sort()
|
|
103
|
+
.map(f => ({
|
|
104
|
+
name: path.basename(f, '.json'),
|
|
105
|
+
path: path.join(tasksDir, f),
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Monitor lane states
|
|
110
|
+
*/
|
|
111
|
+
function printLaneStatus(lanes, laneRunDirs) {
|
|
112
|
+
const rows = lanes.map(lane => {
|
|
113
|
+
const dir = laneRunDirs[lane.name];
|
|
114
|
+
if (!dir)
|
|
115
|
+
return { lane: lane.name, status: '(unknown)', task: '-' };
|
|
116
|
+
const statePath = path.join(dir, 'state.json');
|
|
117
|
+
const state = (0, state_1.loadState)(statePath);
|
|
118
|
+
if (!state) {
|
|
119
|
+
return { lane: lane.name, status: '(no state)', task: '-' };
|
|
120
|
+
}
|
|
121
|
+
const idx = (state.currentTaskIndex || 0) + 1;
|
|
122
|
+
return {
|
|
123
|
+
lane: lane.name,
|
|
124
|
+
status: state.status || 'unknown',
|
|
125
|
+
task: `${idx}/${state.totalTasks || '?'}`,
|
|
126
|
+
};
|
|
127
|
+
});
|
|
128
|
+
logger.section('📡 Lane Status');
|
|
129
|
+
for (const r of rows) {
|
|
130
|
+
console.log(`- ${r.lane}: ${r.status} (${r.task})`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Run orchestration
|
|
135
|
+
*/
|
|
136
|
+
async function orchestrate(tasksDir, options = {}) {
|
|
137
|
+
const lanes = listLaneFiles(tasksDir);
|
|
138
|
+
if (lanes.length === 0) {
|
|
139
|
+
throw new Error(`No lane task files found in ${tasksDir}`);
|
|
140
|
+
}
|
|
141
|
+
const runRoot = options.runDir || `_cursorflow/logs/runs/run-${Date.now()}`;
|
|
142
|
+
fs.mkdirSync(runRoot, { recursive: true });
|
|
143
|
+
const laneRunDirs = {};
|
|
144
|
+
for (const lane of lanes) {
|
|
145
|
+
laneRunDirs[lane.name] = path.join(runRoot, 'lanes', lane.name);
|
|
146
|
+
}
|
|
147
|
+
logger.section('🧭 Starting Orchestration');
|
|
148
|
+
logger.info(`Tasks directory: ${tasksDir}`);
|
|
149
|
+
logger.info(`Run directory: ${runRoot}`);
|
|
150
|
+
logger.info(`Lanes: ${lanes.length}`);
|
|
151
|
+
// Spawn all lanes
|
|
152
|
+
const running = [];
|
|
153
|
+
for (const lane of lanes) {
|
|
154
|
+
const { child, logPath } = spawnLane({
|
|
155
|
+
laneName: lane.name,
|
|
156
|
+
tasksFile: lane.path,
|
|
157
|
+
laneRunDir: laneRunDirs[lane.name],
|
|
158
|
+
executor: options.executor || 'cursor-agent',
|
|
159
|
+
});
|
|
160
|
+
running.push({ lane: lane.name, child, logPath });
|
|
161
|
+
logger.info(`Lane started: ${lane.name}`);
|
|
162
|
+
}
|
|
163
|
+
// Monitor lanes
|
|
164
|
+
const monitorInterval = setInterval(() => {
|
|
165
|
+
printLaneStatus(lanes, laneRunDirs);
|
|
166
|
+
}, options.pollInterval || 60000);
|
|
167
|
+
// Wait for all lanes
|
|
168
|
+
const exitCodes = {};
|
|
169
|
+
for (const r of running) {
|
|
170
|
+
exitCodes[r.lane] = await waitChild(r.child);
|
|
171
|
+
}
|
|
172
|
+
clearInterval(monitorInterval);
|
|
173
|
+
printLaneStatus(lanes, laneRunDirs);
|
|
174
|
+
// Check for failures
|
|
175
|
+
const failed = Object.entries(exitCodes).filter(([, code]) => code !== 0 && code !== 2);
|
|
176
|
+
if (failed.length > 0) {
|
|
177
|
+
logger.error(`Lanes failed: ${failed.map(([l, c]) => `${l}(${c})`).join(', ')}`);
|
|
178
|
+
process.exit(1);
|
|
179
|
+
}
|
|
180
|
+
// Check for blocked lanes
|
|
181
|
+
const blocked = Object.entries(exitCodes)
|
|
182
|
+
.filter(([, code]) => code === 2)
|
|
183
|
+
.map(([lane]) => lane);
|
|
184
|
+
if (blocked.length > 0) {
|
|
185
|
+
logger.warn(`Lanes blocked on dependency: ${blocked.join(', ')}`);
|
|
186
|
+
logger.info('Handle dependency changes manually and resume lanes');
|
|
187
|
+
process.exit(2);
|
|
188
|
+
}
|
|
189
|
+
logger.success('All lanes completed successfully!');
|
|
190
|
+
return { lanes, exitCodes, runRoot };
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reviewer - Code review agent
|
|
3
|
+
*
|
|
4
|
+
* Adapted from reviewer-agent.js
|
|
5
|
+
*/
|
|
6
|
+
import { ReviewResult, TaskResult, RunnerConfig, AgentSendResult } from '../utils/types';
|
|
7
|
+
/**
|
|
8
|
+
* Build review prompt
|
|
9
|
+
*/
|
|
10
|
+
export declare function buildReviewPrompt({ taskName, taskBranch, acceptanceCriteria }: {
|
|
11
|
+
taskName: string;
|
|
12
|
+
taskBranch: string;
|
|
13
|
+
acceptanceCriteria?: string[];
|
|
14
|
+
}): string;
|
|
15
|
+
/**
|
|
16
|
+
* Parse review result
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseReviewResult(text: string): ReviewResult;
|
|
19
|
+
/**
|
|
20
|
+
* Build feedback prompt
|
|
21
|
+
*/
|
|
22
|
+
export declare function buildFeedbackPrompt(review: ReviewResult): string;
|
|
23
|
+
/**
|
|
24
|
+
* Review task
|
|
25
|
+
*/
|
|
26
|
+
export declare function reviewTask({ taskResult, worktreeDir, runDir, config, cursorAgentSend, cursorAgentCreateChat }: {
|
|
27
|
+
taskResult: TaskResult;
|
|
28
|
+
worktreeDir: string;
|
|
29
|
+
runDir: string;
|
|
30
|
+
config: RunnerConfig;
|
|
31
|
+
cursorAgentSend: (options: {
|
|
32
|
+
workspaceDir: string;
|
|
33
|
+
chatId: string;
|
|
34
|
+
prompt: string;
|
|
35
|
+
model?: string;
|
|
36
|
+
}) => AgentSendResult;
|
|
37
|
+
cursorAgentCreateChat: () => string;
|
|
38
|
+
}): Promise<ReviewResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Review loop with feedback
|
|
41
|
+
*/
|
|
42
|
+
export declare function runReviewLoop({ taskResult, worktreeDir, runDir, config, workChatId, cursorAgentSend, cursorAgentCreateChat }: {
|
|
43
|
+
taskResult: TaskResult;
|
|
44
|
+
worktreeDir: string;
|
|
45
|
+
runDir: string;
|
|
46
|
+
config: RunnerConfig;
|
|
47
|
+
workChatId: string;
|
|
48
|
+
cursorAgentSend: (options: {
|
|
49
|
+
workspaceDir: string;
|
|
50
|
+
chatId: string;
|
|
51
|
+
prompt: string;
|
|
52
|
+
model?: string;
|
|
53
|
+
}) => AgentSendResult;
|
|
54
|
+
cursorAgentCreateChat: () => string;
|
|
55
|
+
}): Promise<{
|
|
56
|
+
approved: boolean;
|
|
57
|
+
review: ReviewResult;
|
|
58
|
+
iterations: number;
|
|
59
|
+
error?: string;
|
|
60
|
+
}>;
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Reviewer - Code review agent
|
|
4
|
+
*
|
|
5
|
+
* Adapted from reviewer-agent.js
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.buildReviewPrompt = buildReviewPrompt;
|
|
42
|
+
exports.parseReviewResult = parseReviewResult;
|
|
43
|
+
exports.buildFeedbackPrompt = buildFeedbackPrompt;
|
|
44
|
+
exports.reviewTask = reviewTask;
|
|
45
|
+
exports.runReviewLoop = runReviewLoop;
|
|
46
|
+
const logger = __importStar(require("../utils/logger"));
|
|
47
|
+
const state_1 = require("../utils/state");
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
/**
|
|
50
|
+
* Build review prompt
|
|
51
|
+
*/
|
|
52
|
+
function buildReviewPrompt({ taskName, taskBranch, acceptanceCriteria = [] }) {
|
|
53
|
+
const criteriaList = acceptanceCriteria.length > 0
|
|
54
|
+
? acceptanceCriteria.map((c, i) => `${i + 1}. ${c}`).join('\n')
|
|
55
|
+
: 'Work should be completed properly.';
|
|
56
|
+
return `# Code Review: ${taskName}
|
|
57
|
+
|
|
58
|
+
## Role
|
|
59
|
+
You are a senior code reviewer. Please review the results of this task.
|
|
60
|
+
|
|
61
|
+
## Task Details
|
|
62
|
+
- Name: ${taskName}
|
|
63
|
+
- Branch: ${taskBranch}
|
|
64
|
+
|
|
65
|
+
## Acceptance Criteria
|
|
66
|
+
${criteriaList}
|
|
67
|
+
|
|
68
|
+
## Review Checklist
|
|
69
|
+
1. **Build Success**: Does \`pnpm build\` complete without errors?
|
|
70
|
+
2. **Code Quality**: Are there no linting or TypeScript type errors?
|
|
71
|
+
3. **Completeness**: Are all acceptance criteria met?
|
|
72
|
+
4. **Bugs**: Are there any obvious bugs or logic errors?
|
|
73
|
+
5. **Commit Status**: Are changes properly committed and pushed?
|
|
74
|
+
|
|
75
|
+
## Output Format (MUST follow exactly)
|
|
76
|
+
\`\`\`json
|
|
77
|
+
{
|
|
78
|
+
"status": "approved" | "needs_changes",
|
|
79
|
+
"buildSuccess": true | false,
|
|
80
|
+
"issues": [
|
|
81
|
+
{
|
|
82
|
+
"severity": "critical" | "major" | "minor",
|
|
83
|
+
"description": "...",
|
|
84
|
+
"file": "...",
|
|
85
|
+
"suggestion": "..."
|
|
86
|
+
}
|
|
87
|
+
],
|
|
88
|
+
"suggestions": ["..."],
|
|
89
|
+
"summary": "One-line summary"
|
|
90
|
+
}
|
|
91
|
+
\`\`\`
|
|
92
|
+
|
|
93
|
+
IMPORTANT: You MUST respond in the exact JSON format above. "status" must be either "approved" or "needs_changes".
|
|
94
|
+
`;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Parse review result
|
|
98
|
+
*/
|
|
99
|
+
function parseReviewResult(text) {
|
|
100
|
+
const t = String(text || '');
|
|
101
|
+
// Try JSON block
|
|
102
|
+
const jsonMatch = t.match(/```json\n([\s\S]*?)\n```/);
|
|
103
|
+
if (jsonMatch) {
|
|
104
|
+
try {
|
|
105
|
+
const parsed = JSON.parse(jsonMatch[1]);
|
|
106
|
+
return {
|
|
107
|
+
status: parsed.status || 'needs_changes',
|
|
108
|
+
buildSuccess: parsed.buildSuccess !== false,
|
|
109
|
+
issues: Array.isArray(parsed.issues) ? parsed.issues : [],
|
|
110
|
+
suggestions: Array.isArray(parsed.suggestions) ? parsed.suggestions : [],
|
|
111
|
+
summary: parsed.summary || '',
|
|
112
|
+
raw: t,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
logger.warn(`JSON parse failed: ${err.message}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Fallback parsing
|
|
120
|
+
const hasApproved = t.toLowerCase().includes('approved');
|
|
121
|
+
const hasIssues = t.toLowerCase().includes('needs_changes') ||
|
|
122
|
+
t.toLowerCase().includes('error') ||
|
|
123
|
+
t.toLowerCase().includes('failed');
|
|
124
|
+
return {
|
|
125
|
+
status: hasApproved && !hasIssues ? 'approved' : 'needs_changes',
|
|
126
|
+
buildSuccess: !t.toLowerCase().includes('build') || !t.toLowerCase().includes('fail'),
|
|
127
|
+
issues: hasIssues ? [{ severity: 'major', description: 'Parse failed, see logs' }] : [],
|
|
128
|
+
suggestions: [],
|
|
129
|
+
summary: 'Auto-parsed - check original response',
|
|
130
|
+
raw: t,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Build feedback prompt
|
|
135
|
+
*/
|
|
136
|
+
function buildFeedbackPrompt(review) {
|
|
137
|
+
const lines = [];
|
|
138
|
+
lines.push('# Code Review Feedback');
|
|
139
|
+
lines.push('');
|
|
140
|
+
lines.push('The reviewer found the following issues. Please fix them:');
|
|
141
|
+
lines.push('');
|
|
142
|
+
if (!review.buildSuccess) {
|
|
143
|
+
lines.push('## CRITICAL: Build Failed');
|
|
144
|
+
lines.push('- \`pnpm build\` failed. Fix build errors first.');
|
|
145
|
+
lines.push('');
|
|
146
|
+
}
|
|
147
|
+
for (const issue of review.issues || []) {
|
|
148
|
+
const severity = (issue.severity || 'major').toUpperCase();
|
|
149
|
+
lines.push(`## ${severity}: ${issue.description}`);
|
|
150
|
+
if (issue.file)
|
|
151
|
+
lines.push(`- File: ${issue.file}`);
|
|
152
|
+
if (issue.suggestion)
|
|
153
|
+
lines.push(`- Suggestion: ${issue.suggestion}`);
|
|
154
|
+
lines.push('');
|
|
155
|
+
}
|
|
156
|
+
if (review.suggestions && review.suggestions.length > 0) {
|
|
157
|
+
lines.push('## Additional Suggestions');
|
|
158
|
+
for (const s of review.suggestions) {
|
|
159
|
+
lines.push(`- ${s}`);
|
|
160
|
+
}
|
|
161
|
+
lines.push('');
|
|
162
|
+
}
|
|
163
|
+
lines.push('## Requirements');
|
|
164
|
+
lines.push('1. Fix all issues listed above');
|
|
165
|
+
lines.push('2. Ensure \`pnpm build\` succeeds');
|
|
166
|
+
lines.push('3. Commit and push your changes');
|
|
167
|
+
lines.push('');
|
|
168
|
+
lines.push('**Let me know when fixes are complete.**');
|
|
169
|
+
return lines.join('\n');
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Review task
|
|
173
|
+
*/
|
|
174
|
+
async function reviewTask({ taskResult, worktreeDir, runDir, config, cursorAgentSend, cursorAgentCreateChat }) {
|
|
175
|
+
const reviewPrompt = buildReviewPrompt({
|
|
176
|
+
taskName: taskResult.taskName,
|
|
177
|
+
taskBranch: taskResult.taskBranch,
|
|
178
|
+
acceptanceCriteria: config.acceptanceCriteria || [],
|
|
179
|
+
});
|
|
180
|
+
logger.info(`Reviewing: ${taskResult.taskName}`);
|
|
181
|
+
const reviewChatId = cursorAgentCreateChat();
|
|
182
|
+
const reviewResult = cursorAgentSend({
|
|
183
|
+
workspaceDir: worktreeDir,
|
|
184
|
+
chatId: reviewChatId,
|
|
185
|
+
prompt: reviewPrompt,
|
|
186
|
+
model: config.reviewModel || 'sonnet-4.5-thinking',
|
|
187
|
+
});
|
|
188
|
+
const review = parseReviewResult(reviewResult.resultText || '');
|
|
189
|
+
// Log review
|
|
190
|
+
const convoPath = path.join(runDir, 'conversation.jsonl');
|
|
191
|
+
(0, state_1.appendLog)(convoPath, (0, state_1.createConversationEntry)('reviewer', reviewResult.resultText || 'No result', {
|
|
192
|
+
task: taskResult.taskName,
|
|
193
|
+
model: config.reviewModel,
|
|
194
|
+
}));
|
|
195
|
+
logger.info(`Review result: ${review.status} (${review.issues?.length || 0} issues)`);
|
|
196
|
+
return review;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Review loop with feedback
|
|
200
|
+
*/
|
|
201
|
+
async function runReviewLoop({ taskResult, worktreeDir, runDir, config, workChatId, cursorAgentSend, cursorAgentCreateChat }) {
|
|
202
|
+
const maxIterations = config.maxReviewIterations || 3;
|
|
203
|
+
let iteration = 0;
|
|
204
|
+
let currentReview = null;
|
|
205
|
+
while (iteration < maxIterations) {
|
|
206
|
+
currentReview = await reviewTask({
|
|
207
|
+
taskResult,
|
|
208
|
+
worktreeDir,
|
|
209
|
+
runDir,
|
|
210
|
+
config,
|
|
211
|
+
cursorAgentSend,
|
|
212
|
+
cursorAgentCreateChat,
|
|
213
|
+
});
|
|
214
|
+
if (currentReview.status === 'approved') {
|
|
215
|
+
logger.success(`Review passed: ${taskResult.taskName} (iteration ${iteration + 1})`);
|
|
216
|
+
return { approved: true, review: currentReview, iterations: iteration + 1 };
|
|
217
|
+
}
|
|
218
|
+
iteration++;
|
|
219
|
+
if (iteration >= maxIterations) {
|
|
220
|
+
logger.warn(`Max review iterations (${maxIterations}) reached: ${taskResult.taskName}`);
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
// Send feedback
|
|
224
|
+
logger.info(`Sending feedback (iteration ${iteration}/${maxIterations})`);
|
|
225
|
+
const feedbackPrompt = buildFeedbackPrompt(currentReview);
|
|
226
|
+
const fixResult = cursorAgentSend({
|
|
227
|
+
workspaceDir: worktreeDir,
|
|
228
|
+
chatId: workChatId,
|
|
229
|
+
prompt: feedbackPrompt,
|
|
230
|
+
model: config.model,
|
|
231
|
+
});
|
|
232
|
+
if (!fixResult.ok) {
|
|
233
|
+
logger.error(`Feedback application failed: ${fixResult.error}`);
|
|
234
|
+
return { approved: false, review: currentReview, iterations: iteration, error: fixResult.error };
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return { approved: false, review: currentReview, iterations: iteration };
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=reviewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewer.js","sourceRoot":"","sources":["../../src/core/reviewer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Runner - Execute tasks sequentially in a lane
|
|
3
|
+
*
|
|
4
|
+
* Adapted from sequential-agent-runner.js
|
|
5
|
+
*/
|
|
6
|
+
import { RunnerConfig, Task, TaskExecutionResult, AgentSendResult, DependencyPolicy, DependencyRequestPlan } from '../utils/types';
|
|
7
|
+
/**
|
|
8
|
+
* Execute cursor-agent command with timeout and better error handling
|
|
9
|
+
*/
|
|
10
|
+
export declare function cursorAgentCreateChat(): string;
|
|
11
|
+
export declare function cursorAgentSend({ workspaceDir, chatId, prompt, model }: {
|
|
12
|
+
workspaceDir: string;
|
|
13
|
+
chatId: string;
|
|
14
|
+
prompt: string;
|
|
15
|
+
model?: string;
|
|
16
|
+
}): AgentSendResult;
|
|
17
|
+
/**
|
|
18
|
+
* Extract dependency change request from agent response
|
|
19
|
+
*/
|
|
20
|
+
export declare function extractDependencyRequest(text: string): {
|
|
21
|
+
required: boolean;
|
|
22
|
+
plan?: DependencyRequestPlan;
|
|
23
|
+
raw: string;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Wrap prompt with dependency policy
|
|
27
|
+
*/
|
|
28
|
+
export declare function wrapPromptForDependencyPolicy(prompt: string, policy: DependencyPolicy): string;
|
|
29
|
+
/**
|
|
30
|
+
* Apply file permissions based on dependency policy
|
|
31
|
+
*/
|
|
32
|
+
export declare function applyDependencyFilePermissions(worktreeDir: string, policy: DependencyPolicy): void;
|
|
33
|
+
/**
|
|
34
|
+
* Run a single task
|
|
35
|
+
*/
|
|
36
|
+
export declare function runTask({ task, config, index, worktreeDir, taskBranch, chatId, runDir, }: {
|
|
37
|
+
task: Task;
|
|
38
|
+
config: RunnerConfig;
|
|
39
|
+
index: number;
|
|
40
|
+
worktreeDir: string;
|
|
41
|
+
pipelineBranch: string;
|
|
42
|
+
taskBranch: string;
|
|
43
|
+
chatId: string;
|
|
44
|
+
runDir: string;
|
|
45
|
+
}): Promise<TaskExecutionResult>;
|
|
46
|
+
/**
|
|
47
|
+
* Run all tasks in sequence
|
|
48
|
+
*/
|
|
49
|
+
export declare function runTasks(tasksFile: string, config: RunnerConfig, runDir: string, options?: {
|
|
50
|
+
startIndex?: number;
|
|
51
|
+
}): Promise<TaskExecutionResult[]>;
|