@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.
Files changed (90) hide show
  1. package/CHANGELOG.md +17 -7
  2. package/README.md +33 -2
  3. package/commands/cursorflow-doctor.md +24 -0
  4. package/commands/cursorflow-signal.md +19 -0
  5. package/dist/cli/clean.d.ts +5 -0
  6. package/dist/cli/clean.js +57 -0
  7. package/dist/cli/clean.js.map +1 -0
  8. package/dist/cli/doctor.d.ts +15 -0
  9. package/dist/cli/doctor.js +139 -0
  10. package/dist/cli/doctor.js.map +1 -0
  11. package/dist/cli/index.d.ts +6 -0
  12. package/dist/cli/index.js +125 -0
  13. package/dist/cli/index.js.map +1 -0
  14. package/dist/cli/init.d.ts +7 -0
  15. package/dist/cli/init.js +302 -0
  16. package/dist/cli/init.js.map +1 -0
  17. package/dist/cli/monitor.d.ts +8 -0
  18. package/dist/cli/monitor.js +210 -0
  19. package/dist/cli/monitor.js.map +1 -0
  20. package/dist/cli/resume.d.ts +5 -0
  21. package/dist/cli/resume.js +128 -0
  22. package/dist/cli/resume.js.map +1 -0
  23. package/dist/cli/run.d.ts +5 -0
  24. package/dist/cli/run.js +128 -0
  25. package/dist/cli/run.js.map +1 -0
  26. package/dist/cli/setup-commands.d.ts +23 -0
  27. package/dist/cli/setup-commands.js +234 -0
  28. package/dist/cli/setup-commands.js.map +1 -0
  29. package/dist/cli/signal.d.ts +7 -0
  30. package/dist/cli/signal.js +99 -0
  31. package/dist/cli/signal.js.map +1 -0
  32. package/dist/core/orchestrator.d.ts +47 -0
  33. package/dist/core/orchestrator.js +192 -0
  34. package/dist/core/orchestrator.js.map +1 -0
  35. package/dist/core/reviewer.d.ts +60 -0
  36. package/dist/core/reviewer.js +239 -0
  37. package/dist/core/reviewer.js.map +1 -0
  38. package/dist/core/runner.d.ts +51 -0
  39. package/dist/core/runner.js +499 -0
  40. package/dist/core/runner.js.map +1 -0
  41. package/dist/utils/config.d.ts +31 -0
  42. package/dist/utils/config.js +198 -0
  43. package/dist/utils/config.js.map +1 -0
  44. package/dist/utils/cursor-agent.d.ts +61 -0
  45. package/dist/utils/cursor-agent.js +263 -0
  46. package/dist/utils/cursor-agent.js.map +1 -0
  47. package/dist/utils/doctor.d.ts +63 -0
  48. package/dist/utils/doctor.js +280 -0
  49. package/dist/utils/doctor.js.map +1 -0
  50. package/dist/utils/git.d.ts +131 -0
  51. package/dist/utils/git.js +272 -0
  52. package/dist/utils/git.js.map +1 -0
  53. package/dist/utils/logger.d.ts +68 -0
  54. package/dist/utils/logger.js +158 -0
  55. package/dist/utils/logger.js.map +1 -0
  56. package/dist/utils/state.d.ts +65 -0
  57. package/dist/utils/state.js +216 -0
  58. package/dist/utils/state.js.map +1 -0
  59. package/dist/utils/types.d.ts +118 -0
  60. package/dist/utils/types.js +6 -0
  61. package/dist/utils/types.js.map +1 -0
  62. package/examples/README.md +155 -0
  63. package/examples/demo-project/README.md +262 -0
  64. package/examples/demo-project/_cursorflow/tasks/demo-test/01-create-utils.json +18 -0
  65. package/examples/demo-project/_cursorflow/tasks/demo-test/02-add-tests.json +18 -0
  66. package/examples/demo-project/_cursorflow/tasks/demo-test/README.md +109 -0
  67. package/package.json +71 -61
  68. package/scripts/ai-security-check.js +11 -4
  69. package/scripts/local-security-gate.sh +76 -0
  70. package/src/cli/{clean.js → clean.ts} +11 -5
  71. package/src/cli/doctor.ts +127 -0
  72. package/src/cli/{index.js → index.ts} +27 -16
  73. package/src/cli/{init.js → init.ts} +26 -18
  74. package/src/cli/{monitor.js → monitor.ts} +57 -44
  75. package/src/cli/resume.ts +119 -0
  76. package/src/cli/run.ts +109 -0
  77. package/src/cli/{setup-commands.js → setup-commands.ts} +38 -18
  78. package/src/cli/signal.ts +89 -0
  79. package/src/core/{orchestrator.js → orchestrator.ts} +44 -26
  80. package/src/core/{reviewer.js → reviewer.ts} +36 -29
  81. package/src/core/{runner.js → runner.ts} +125 -76
  82. package/src/utils/{config.js → config.ts} +17 -25
  83. package/src/utils/{cursor-agent.js → cursor-agent.ts} +38 -47
  84. package/src/utils/doctor.ts +312 -0
  85. package/src/utils/{git.js → git.ts} +70 -56
  86. package/src/utils/{logger.js → logger.ts} +170 -178
  87. package/src/utils/{state.js → state.ts} +30 -38
  88. package/src/utils/types.ts +134 -0
  89. package/src/cli/resume.js +0 -31
  90. 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[]>;