@litmers/cursorflow-orchestrator 0.1.31 → 0.1.36

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 (150) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +182 -59
  3. package/commands/cursorflow-add.md +159 -0
  4. package/commands/cursorflow-doctor.md +45 -23
  5. package/commands/cursorflow-monitor.md +23 -2
  6. package/commands/cursorflow-new.md +87 -0
  7. package/commands/cursorflow-run.md +60 -111
  8. package/dist/cli/add.d.ts +7 -0
  9. package/dist/cli/add.js +377 -0
  10. package/dist/cli/add.js.map +1 -0
  11. package/dist/cli/clean.js +1 -0
  12. package/dist/cli/clean.js.map +1 -1
  13. package/dist/cli/config.d.ts +7 -0
  14. package/dist/cli/config.js +181 -0
  15. package/dist/cli/config.js.map +1 -0
  16. package/dist/cli/doctor.js +47 -4
  17. package/dist/cli/doctor.js.map +1 -1
  18. package/dist/cli/index.js +34 -30
  19. package/dist/cli/index.js.map +1 -1
  20. package/dist/cli/logs.js +17 -34
  21. package/dist/cli/logs.js.map +1 -1
  22. package/dist/cli/monitor.js +62 -65
  23. package/dist/cli/monitor.js.map +1 -1
  24. package/dist/cli/new.d.ts +7 -0
  25. package/dist/cli/new.js +232 -0
  26. package/dist/cli/new.js.map +1 -0
  27. package/dist/cli/prepare.js +95 -193
  28. package/dist/cli/prepare.js.map +1 -1
  29. package/dist/cli/resume.js +57 -68
  30. package/dist/cli/resume.js.map +1 -1
  31. package/dist/cli/run.js +60 -30
  32. package/dist/cli/run.js.map +1 -1
  33. package/dist/cli/stop.js +6 -0
  34. package/dist/cli/stop.js.map +1 -1
  35. package/dist/cli/tasks.d.ts +5 -3
  36. package/dist/cli/tasks.js +181 -29
  37. package/dist/cli/tasks.js.map +1 -1
  38. package/dist/core/failure-policy.d.ts +9 -0
  39. package/dist/core/failure-policy.js +9 -0
  40. package/dist/core/failure-policy.js.map +1 -1
  41. package/dist/core/orchestrator.d.ts +20 -6
  42. package/dist/core/orchestrator.js +215 -334
  43. package/dist/core/orchestrator.js.map +1 -1
  44. package/dist/core/runner/agent.d.ts +27 -0
  45. package/dist/core/runner/agent.js +294 -0
  46. package/dist/core/runner/agent.js.map +1 -0
  47. package/dist/core/runner/index.d.ts +5 -0
  48. package/dist/core/runner/index.js +22 -0
  49. package/dist/core/runner/index.js.map +1 -0
  50. package/dist/core/runner/pipeline.d.ts +9 -0
  51. package/dist/core/runner/pipeline.js +539 -0
  52. package/dist/core/runner/pipeline.js.map +1 -0
  53. package/dist/core/runner/prompt.d.ts +25 -0
  54. package/dist/core/runner/prompt.js +175 -0
  55. package/dist/core/runner/prompt.js.map +1 -0
  56. package/dist/core/runner/task.d.ts +26 -0
  57. package/dist/core/runner/task.js +283 -0
  58. package/dist/core/runner/task.js.map +1 -0
  59. package/dist/core/runner/utils.d.ts +37 -0
  60. package/dist/core/runner/utils.js +161 -0
  61. package/dist/core/runner/utils.js.map +1 -0
  62. package/dist/core/runner.d.ts +2 -96
  63. package/dist/core/runner.js +11 -1136
  64. package/dist/core/runner.js.map +1 -1
  65. package/dist/core/stall-detection.d.ts +326 -0
  66. package/dist/core/stall-detection.js +781 -0
  67. package/dist/core/stall-detection.js.map +1 -0
  68. package/dist/services/logging/console.js +2 -1
  69. package/dist/services/logging/console.js.map +1 -1
  70. package/dist/types/config.d.ts +6 -6
  71. package/dist/types/flow.d.ts +84 -0
  72. package/dist/types/flow.js +10 -0
  73. package/dist/types/flow.js.map +1 -0
  74. package/dist/types/index.d.ts +1 -0
  75. package/dist/types/index.js +3 -3
  76. package/dist/types/index.js.map +1 -1
  77. package/dist/types/lane.d.ts +0 -2
  78. package/dist/types/logging.d.ts +5 -1
  79. package/dist/types/task.d.ts +7 -11
  80. package/dist/utils/config.d.ts +5 -1
  81. package/dist/utils/config.js +15 -16
  82. package/dist/utils/config.js.map +1 -1
  83. package/dist/utils/dependency.d.ts +36 -1
  84. package/dist/utils/dependency.js +256 -1
  85. package/dist/utils/dependency.js.map +1 -1
  86. package/dist/utils/doctor.js +40 -8
  87. package/dist/utils/doctor.js.map +1 -1
  88. package/dist/utils/enhanced-logger.d.ts +45 -82
  89. package/dist/utils/enhanced-logger.js +239 -844
  90. package/dist/utils/enhanced-logger.js.map +1 -1
  91. package/dist/utils/flow.d.ts +9 -0
  92. package/dist/utils/flow.js +73 -0
  93. package/dist/utils/flow.js.map +1 -0
  94. package/dist/utils/git.d.ts +29 -0
  95. package/dist/utils/git.js +115 -5
  96. package/dist/utils/git.js.map +1 -1
  97. package/dist/utils/state.js +0 -2
  98. package/dist/utils/state.js.map +1 -1
  99. package/dist/utils/task-service.d.ts +2 -2
  100. package/dist/utils/task-service.js +40 -31
  101. package/dist/utils/task-service.js.map +1 -1
  102. package/package.json +4 -3
  103. package/src/cli/add.ts +397 -0
  104. package/src/cli/clean.ts +1 -0
  105. package/src/cli/config.ts +177 -0
  106. package/src/cli/doctor.ts +48 -4
  107. package/src/cli/index.ts +36 -32
  108. package/src/cli/logs.ts +20 -33
  109. package/src/cli/monitor.ts +70 -75
  110. package/src/cli/new.ts +235 -0
  111. package/src/cli/prepare.ts +98 -205
  112. package/src/cli/resume.ts +61 -76
  113. package/src/cli/run.ts +333 -306
  114. package/src/cli/stop.ts +8 -0
  115. package/src/cli/tasks.ts +200 -21
  116. package/src/core/failure-policy.ts +9 -0
  117. package/src/core/orchestrator.ts +279 -379
  118. package/src/core/runner/agent.ts +314 -0
  119. package/src/core/runner/index.ts +6 -0
  120. package/src/core/runner/pipeline.ts +567 -0
  121. package/src/core/runner/prompt.ts +174 -0
  122. package/src/core/runner/task.ts +320 -0
  123. package/src/core/runner/utils.ts +142 -0
  124. package/src/core/runner.ts +8 -1347
  125. package/src/core/stall-detection.ts +936 -0
  126. package/src/services/logging/console.ts +2 -1
  127. package/src/types/config.ts +6 -6
  128. package/src/types/flow.ts +91 -0
  129. package/src/types/index.ts +15 -3
  130. package/src/types/lane.ts +0 -2
  131. package/src/types/logging.ts +5 -1
  132. package/src/types/task.ts +7 -11
  133. package/src/utils/config.ts +16 -17
  134. package/src/utils/dependency.ts +311 -2
  135. package/src/utils/doctor.ts +36 -8
  136. package/src/utils/enhanced-logger.ts +264 -927
  137. package/src/utils/flow.ts +42 -0
  138. package/src/utils/git.ts +145 -5
  139. package/src/utils/state.ts +0 -2
  140. package/src/utils/task-service.ts +48 -40
  141. package/commands/cursorflow-review.md +0 -56
  142. package/commands/cursorflow-runs.md +0 -59
  143. package/dist/cli/runs.d.ts +0 -5
  144. package/dist/cli/runs.js +0 -214
  145. package/dist/cli/runs.js.map +0 -1
  146. package/dist/core/reviewer.d.ts +0 -66
  147. package/dist/core/reviewer.js +0 -265
  148. package/dist/core/reviewer.js.map +0 -1
  149. package/src/cli/runs.ts +0 -212
  150. package/src/core/reviewer.ts +0 -285
package/dist/cli/runs.js DELETED
@@ -1,214 +0,0 @@
1
- "use strict";
2
- /**
3
- * CursorFlow runs command - List and view run details
4
- */
5
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- var desc = Object.getOwnPropertyDescriptor(m, k);
8
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
- desc = { enumerable: true, get: function() { return m[k]; } };
10
- }
11
- Object.defineProperty(o, k2, desc);
12
- }) : (function(o, m, k, k2) {
13
- if (k2 === undefined) k2 = k;
14
- o[k2] = m[k];
15
- }));
16
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
- Object.defineProperty(o, "default", { enumerable: true, value: v });
18
- }) : function(o, v) {
19
- o["default"] = v;
20
- });
21
- var __importStar = (this && this.__importStar) || (function () {
22
- var ownKeys = function(o) {
23
- ownKeys = Object.getOwnPropertyNames || function (o) {
24
- var ar = [];
25
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
- return ar;
27
- };
28
- return ownKeys(o);
29
- };
30
- return function (mod) {
31
- if (mod && mod.__esModule) return mod;
32
- var result = {};
33
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
- __setModuleDefault(result, mod);
35
- return result;
36
- };
37
- })();
38
- const fs = __importStar(require("fs"));
39
- const logger = __importStar(require("../utils/logger"));
40
- const config_1 = require("../utils/config");
41
- const run_service_1 = require("../utils/run-service");
42
- const path_1 = require("../utils/path");
43
- function printHelp() {
44
- console.log(`
45
- Usage: cursorflow runs [run-id] [options]
46
-
47
- List all runs or view details of a specific run.
48
-
49
- Options:
50
- [run-id] View details of a specific run
51
- --running Filter to show only running runs
52
- --status <status> Filter by status: running, completed, failed, partial, pending
53
- --json Output in JSON format
54
- --help, -h Show help
55
-
56
- Examples:
57
- cursorflow runs # List all runs
58
- cursorflow runs --running # List only running runs
59
- cursorflow runs run-123 # View details of run-123
60
- `);
61
- }
62
- function parseArgs(args) {
63
- const statusIdx = args.indexOf('--status');
64
- const running = args.includes('--running');
65
- // Find run ID (first non-option argument)
66
- const runId = args.find((arg, i) => {
67
- if (arg.startsWith('--') || arg.startsWith('-'))
68
- return false;
69
- // Skip values for options
70
- const prevArg = args[i - 1];
71
- if (prevArg && ['--status'].includes(prevArg)) {
72
- return false;
73
- }
74
- return true;
75
- });
76
- return {
77
- runId,
78
- status: running ? 'running' : (statusIdx >= 0 ? args[statusIdx + 1] : undefined),
79
- json: args.includes('--json'),
80
- help: args.includes('--help') || args.includes('-h'),
81
- };
82
- }
83
- /**
84
- * Format duration in a human-readable way
85
- */
86
- function formatDuration(ms) {
87
- if (ms < 1000)
88
- return `${ms}ms`;
89
- const seconds = Math.floor(ms / 1000);
90
- if (seconds < 60)
91
- return `${seconds}s`;
92
- const minutes = Math.floor(seconds / 60);
93
- const remainingSeconds = seconds % 60;
94
- if (minutes < 60)
95
- return `${minutes}m ${remainingSeconds}s`;
96
- const hours = Math.floor(minutes / 60);
97
- const remainingMinutes = minutes % 60;
98
- return `${hours}h ${remainingMinutes}m`;
99
- }
100
- /**
101
- * Get status color and emoji
102
- */
103
- function getStatusDisplay(status) {
104
- switch (status) {
105
- case 'running':
106
- return `${logger.COLORS.blue}🔄 running${logger.COLORS.reset}`;
107
- case 'completed':
108
- return `${logger.COLORS.green}✅ done ${logger.COLORS.reset}`;
109
- case 'failed':
110
- return `${logger.COLORS.red}❌ failed ${logger.COLORS.reset}`;
111
- case 'partial':
112
- return `${logger.COLORS.yellow}⚠️ partial${logger.COLORS.reset}`;
113
- case 'pending':
114
- return `${logger.COLORS.gray}⏳ pending${logger.COLORS.reset}`;
115
- default:
116
- return status;
117
- }
118
- }
119
- /**
120
- * Display list of runs
121
- */
122
- function displayRunList(runs) {
123
- if (runs.length === 0) {
124
- console.log('No runs found.');
125
- return;
126
- }
127
- console.log(` Run ID Task Status Lanes Duration`);
128
- console.log(`${logger.COLORS.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${logger.COLORS.reset}`);
129
- for (const run of runs) {
130
- const isRunning = run.status === 'running';
131
- const prefix = isRunning ? `${logger.COLORS.blue} ▶${logger.COLORS.reset}` : ' ';
132
- const id = run.id.padEnd(20);
133
- const task = (run.taskName || 'unnamed').substring(0, 15).padEnd(15);
134
- const status = getStatusDisplay(run.status);
135
- const completedLanes = run.lanes.filter(l => l.status === 'completed').length;
136
- const totalLanes = run.lanes.length;
137
- const lanes = `${completedLanes}/${totalLanes}`.padEnd(10);
138
- const duration = formatDuration(run.duration);
139
- console.log(`${prefix} ${id} ${task} ${status} ${lanes} ${duration}`);
140
- }
141
- }
142
- /**
143
- * Display detailed information for a single run
144
- */
145
- function displayRunDetail(run) {
146
- logger.section(`Run Details: ${run.id}`);
147
- console.log(`${logger.COLORS.bold}Task:${logger.COLORS.reset} ${run.taskName}`);
148
- console.log(`${logger.COLORS.bold}Status:${logger.COLORS.reset} ${getStatusDisplay(run.status)}`);
149
- console.log(`${logger.COLORS.bold}Start Time:${logger.COLORS.reset} ${new Date(run.startTime).toLocaleString()}`);
150
- console.log(`${logger.COLORS.bold}Duration:${logger.COLORS.reset} ${formatDuration(run.duration)}`);
151
- console.log(`${logger.COLORS.bold}Path:${logger.COLORS.reset} ${run.path}`);
152
- console.log(`\n${logger.COLORS.bold}Lanes:${logger.COLORS.reset}`);
153
- for (const lane of run.lanes) {
154
- const statusColor = lane.status === 'completed' ? logger.COLORS.green :
155
- lane.status === 'failed' ? logger.COLORS.red :
156
- lane.status === 'running' ? logger.COLORS.blue : logger.COLORS.reset;
157
- console.log(` - ${lane.name.padEnd(20)} [${statusColor}${lane.status.toUpperCase()}${logger.COLORS.reset}] Task ${lane.currentTask}/${lane.totalTasks} (PID: ${lane.pid || 'N/A'})`);
158
- }
159
- if (run.branches.length > 0) {
160
- console.log(`\n${logger.COLORS.bold}Branches:${logger.COLORS.reset}`);
161
- for (const branch of run.branches) {
162
- console.log(` - ${branch}`);
163
- }
164
- }
165
- if (run.worktrees.length > 0) {
166
- console.log(`\n${logger.COLORS.bold}Worktrees:${logger.COLORS.reset}`);
167
- for (const wt of run.worktrees) {
168
- console.log(` - ${wt}`);
169
- }
170
- }
171
- console.log(`\nView logs: ${logger.COLORS.cyan}cursorflow logs ${run.id} --all${logger.COLORS.reset}`);
172
- }
173
- async function runs(args) {
174
- const options = parseArgs(args);
175
- if (options.help) {
176
- printHelp();
177
- return;
178
- }
179
- const config = (0, config_1.loadConfig)();
180
- const logsDir = (0, config_1.getLogsDir)(config);
181
- const runsDir = (0, path_1.safeJoin)(logsDir, 'runs');
182
- if (!fs.existsSync(runsDir)) {
183
- if (options.json) {
184
- console.log('[]');
185
- }
186
- else {
187
- console.log('No runs found. (Runs directory does not exist)');
188
- }
189
- return;
190
- }
191
- const runService = new run_service_1.RunService(runsDir);
192
- if (options.runId) {
193
- const run = runService.getRunInfo(options.runId);
194
- if (!run) {
195
- throw new Error(`Run not found: ${options.runId}`);
196
- }
197
- if (options.json) {
198
- console.log(JSON.stringify(run, null, 2));
199
- }
200
- else {
201
- displayRunDetail(run);
202
- }
203
- return;
204
- }
205
- const runsList = runService.listRuns({ status: options.status });
206
- if (options.json) {
207
- console.log(JSON.stringify(runsList, null, 2));
208
- }
209
- else {
210
- displayRunList(runsList);
211
- }
212
- }
213
- module.exports = runs;
214
- //# sourceMappingURL=runs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runs.js","sourceRoot":"","sources":["../../src/cli/runs.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AAEzB,wDAA0C;AAC1C,4CAAyD;AACzD,sDAAkD;AAElD,wCAAyC;AASzC,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;GAgBX,CAAC,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAE3C,0CAA0C;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACjC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAC9D,0BAA0B;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,KAAK;QACL,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAc,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7F,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC7B,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;KACrD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,EAAU;IAChC,IAAI,EAAE,GAAG,IAAI;QAAE,OAAO,GAAG,EAAE,IAAI,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACtC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,GAAG,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,gBAAgB,GAAG,OAAO,GAAG,EAAE,CAAC;IACtC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,KAAK,gBAAgB,GAAG,CAAC;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,MAAM,gBAAgB,GAAG,OAAO,GAAG,EAAE,CAAC;IACtC,OAAO,GAAG,KAAK,KAAK,gBAAgB,GAAG,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,MAAiB;IACzC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,aAAa,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACjE,KAAK,WAAW;YACd,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,YAAY,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACjE,KAAK,QAAQ;YACX,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,YAAY,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC/D,KAAK,SAAS;YACZ,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,aAAa,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACnE,KAAK,SAAS;YACZ,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,YAAY,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAChE;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,IAAe;IACrC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,mFAAmF,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAE3I,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC;QAC3C,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAEpF,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAE5C,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;QAC9E,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;QACpC,MAAM,KAAK,GAAG,GAAG,cAAc,IAAI,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE3D,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE9C,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,EAAE,IAAI,IAAI,IAAI,MAAM,IAAI,KAAK,IAAI,QAAQ,EAAE,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,GAAY;IACpC,MAAM,CAAC,OAAO,CAAC,gBAAgB,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAEzC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,MAAM,CAAC,KAAK,SAAS,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,UAAU,MAAM,CAAC,MAAM,CAAC,KAAK,OAAO,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACrG,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,cAAc,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAClH,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,YAAY,MAAM,CAAC,MAAM,CAAC,KAAK,MAAM,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACtG,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAElF,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACnE,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC9C,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QAExF,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,UAAU,IAAI,CAAC,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC;IACxL,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,YAAY,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACtE,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,EAAE,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,aAAa,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACvE,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,MAAM,CAAC,IAAI,mBAAmB,GAAG,CAAC,EAAE,SAAS,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AACzG,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,IAAc;IAChC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAEhC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,IAAA,mBAAU,EAAC,MAAM,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAA,eAAQ,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAE1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAChE,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,wBAAU,CAAC,OAAO,CAAC,CAAC;IAE3C,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,GAAG,GAAG,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,kBAAkB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEjE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,iBAAS,IAAI,CAAC"}
@@ -1,66 +0,0 @@
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, model, cursorAgentSend, cursorAgentCreateChat }: {
27
- taskResult: TaskResult;
28
- worktreeDir: string;
29
- runDir: string;
30
- config: RunnerConfig;
31
- model?: string;
32
- cursorAgentSend: (options: {
33
- workspaceDir: string;
34
- chatId: string;
35
- prompt: string;
36
- model?: string;
37
- outputFormat?: 'stream-json' | 'json' | 'plain';
38
- taskName?: string;
39
- }) => Promise<AgentSendResult>;
40
- cursorAgentCreateChat: () => string;
41
- }): Promise<ReviewResult>;
42
- /**
43
- * Review loop with feedback
44
- */
45
- export declare function runReviewLoop({ taskResult, worktreeDir, runDir, config, workChatId, model, cursorAgentSend, cursorAgentCreateChat }: {
46
- taskResult: TaskResult;
47
- worktreeDir: string;
48
- runDir: string;
49
- config: RunnerConfig;
50
- workChatId: string;
51
- model?: string;
52
- cursorAgentSend: (options: {
53
- workspaceDir: string;
54
- chatId: string;
55
- prompt: string;
56
- model?: string;
57
- outputFormat?: 'stream-json' | 'json' | 'plain';
58
- taskName?: string;
59
- }) => Promise<AgentSendResult>;
60
- cursorAgentCreateChat: () => string;
61
- }): Promise<{
62
- approved: boolean;
63
- review: ReviewResult;
64
- iterations: number;
65
- error?: string;
66
- }>;
@@ -1,265 +0,0 @@
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
- const events_1 = require("../utils/events");
50
- /**
51
- * Build review prompt
52
- */
53
- function buildReviewPrompt({ taskName, taskBranch, acceptanceCriteria = [] }) {
54
- const criteriaList = acceptanceCriteria.length > 0
55
- ? acceptanceCriteria.map((c, i) => `${i + 1}. ${c}`).join('\n')
56
- : 'Work should be completed properly.';
57
- return `# Code Review: ${taskName}
58
-
59
- ## Role
60
- You are a senior code reviewer. Please review the results of this task.
61
-
62
- ## Task Details
63
- - Name: ${taskName}
64
- - Branch: ${taskBranch}
65
-
66
- ## Acceptance Criteria
67
- ${criteriaList}
68
-
69
- ## Review Checklist
70
- 1. **Build Success**: Does \`pnpm build\` complete without errors?
71
- 2. **Code Quality**: Are there no linting or TypeScript type errors?
72
- 3. **Completeness**: Are all acceptance criteria met?
73
- 4. **Bugs**: Are there any obvious bugs or logic errors?
74
- 5. **Commit Status**: Are changes properly committed and pushed?
75
-
76
- ## Output Format (MUST follow exactly)
77
- \`\`\`json
78
- {
79
- "status": "approved" | "needs_changes",
80
- "buildSuccess": true | false,
81
- "issues": [
82
- {
83
- "severity": "critical" | "major" | "minor",
84
- "description": "...",
85
- "file": "...",
86
- "suggestion": "..."
87
- }
88
- ],
89
- "suggestions": ["..."],
90
- "summary": "One-line summary"
91
- }
92
- \`\`\`
93
-
94
- IMPORTANT: You MUST respond in the exact JSON format above. "status" must be either "approved" or "needs_changes".
95
- `;
96
- }
97
- /**
98
- * Parse review result
99
- */
100
- function parseReviewResult(text) {
101
- const t = String(text || '');
102
- // Try JSON block
103
- const jsonMatch = t.match(/```json\n([\s\S]*?)\n```/);
104
- if (jsonMatch) {
105
- try {
106
- const parsed = JSON.parse(jsonMatch[1]);
107
- return {
108
- status: parsed.status || 'needs_changes',
109
- buildSuccess: parsed.buildSuccess !== false,
110
- issues: Array.isArray(parsed.issues) ? parsed.issues : [],
111
- suggestions: Array.isArray(parsed.suggestions) ? parsed.suggestions : [],
112
- summary: parsed.summary || '',
113
- raw: t,
114
- };
115
- }
116
- catch (err) {
117
- logger.warn(`JSON parse failed: ${err.message}`);
118
- }
119
- }
120
- // Fallback parsing
121
- const hasApproved = t.toLowerCase().includes('approved');
122
- const hasIssues = t.toLowerCase().includes('needs_changes') ||
123
- t.toLowerCase().includes('error') ||
124
- t.toLowerCase().includes('failed');
125
- return {
126
- status: hasApproved && !hasIssues ? 'approved' : 'needs_changes',
127
- buildSuccess: !t.toLowerCase().includes('build') || !t.toLowerCase().includes('fail'),
128
- issues: hasIssues ? [{ severity: 'major', description: 'Parse failed, see logs' }] : [],
129
- suggestions: [],
130
- summary: 'Auto-parsed - check original response',
131
- raw: t,
132
- };
133
- }
134
- /**
135
- * Build feedback prompt
136
- */
137
- function buildFeedbackPrompt(review) {
138
- const lines = [];
139
- lines.push('# Code Review Feedback');
140
- lines.push('');
141
- lines.push('The reviewer found the following issues. Please fix them:');
142
- lines.push('');
143
- if (!review.buildSuccess) {
144
- lines.push('## CRITICAL: Build Failed');
145
- lines.push('- \`pnpm build\` failed. Fix build errors first.');
146
- lines.push('');
147
- }
148
- for (const issue of review.issues || []) {
149
- const severity = (issue.severity || 'major').toUpperCase();
150
- lines.push(`## ${severity}: ${issue.description}`);
151
- if (issue.file)
152
- lines.push(`- File: ${issue.file}`);
153
- if (issue.suggestion)
154
- lines.push(`- Suggestion: ${issue.suggestion}`);
155
- lines.push('');
156
- }
157
- if (review.suggestions && review.suggestions.length > 0) {
158
- lines.push('## Additional Suggestions');
159
- for (const s of review.suggestions) {
160
- lines.push(`- ${s}`);
161
- }
162
- lines.push('');
163
- }
164
- lines.push('## Requirements');
165
- lines.push('1. Fix all issues listed above');
166
- lines.push('2. Ensure \`pnpm build\` succeeds');
167
- lines.push('3. Commit and push your changes');
168
- lines.push('');
169
- lines.push('**Let me know when fixes are complete.**');
170
- return lines.join('\n');
171
- }
172
- /**
173
- * Review task
174
- */
175
- async function reviewTask({ taskResult, worktreeDir, runDir, config, model, cursorAgentSend, cursorAgentCreateChat }) {
176
- const reviewPrompt = buildReviewPrompt({
177
- taskName: taskResult.taskName,
178
- taskBranch: taskResult.taskBranch,
179
- acceptanceCriteria: taskResult.acceptanceCriteria || config.acceptanceCriteria || [],
180
- });
181
- logger.info(`Reviewing: ${taskResult.taskName}`);
182
- events_1.events.emit('review.started', {
183
- taskName: taskResult.taskName,
184
- taskBranch: taskResult.taskBranch,
185
- });
186
- const reviewChatId = cursorAgentCreateChat();
187
- const reviewModel = model || config.reviewModel || config.model || 'sonnet-4.5';
188
- const reviewResult = await cursorAgentSend({
189
- workspaceDir: worktreeDir,
190
- chatId: reviewChatId,
191
- prompt: reviewPrompt,
192
- model: reviewModel,
193
- outputFormat: config.agentOutputFormat,
194
- taskName: `review:${taskResult.taskName}`,
195
- });
196
- const review = parseReviewResult(reviewResult.resultText || '');
197
- // Log review
198
- const convoPath = path.join(runDir, 'conversation.jsonl');
199
- (0, state_1.appendLog)(convoPath, (0, state_1.createConversationEntry)('reviewer', reviewResult.resultText || 'No result', {
200
- task: taskResult.taskName,
201
- model: reviewModel,
202
- }));
203
- logger.info(`Review result: ${review.status} (${review.issues?.length || 0} issues)`);
204
- events_1.events.emit('review.completed', {
205
- taskName: taskResult.taskName,
206
- status: review.status,
207
- issueCount: review.issues?.length || 0,
208
- summary: review.summary,
209
- });
210
- return review;
211
- }
212
- /**
213
- * Review loop with feedback
214
- */
215
- async function runReviewLoop({ taskResult, worktreeDir, runDir, config, workChatId, model, cursorAgentSend, cursorAgentCreateChat }) {
216
- const maxIterations = config.maxReviewIterations || 3;
217
- let iteration = 0;
218
- let currentReview = null;
219
- while (iteration < maxIterations) {
220
- currentReview = await reviewTask({
221
- taskResult,
222
- worktreeDir,
223
- runDir,
224
- config,
225
- model,
226
- cursorAgentSend,
227
- cursorAgentCreateChat,
228
- });
229
- if (currentReview.status === 'approved') {
230
- logger.success(`Review passed: ${taskResult.taskName} (iteration ${iteration + 1})`);
231
- events_1.events.emit('review.approved', {
232
- taskName: taskResult.taskName,
233
- iterations: iteration + 1,
234
- });
235
- return { approved: true, review: currentReview, iterations: iteration + 1 };
236
- }
237
- iteration++;
238
- if (iteration >= maxIterations) {
239
- logger.warn(`Max review iterations (${maxIterations}) reached: ${taskResult.taskName}`);
240
- events_1.events.emit('review.rejected', {
241
- taskName: taskResult.taskName,
242
- reason: 'Max iterations reached',
243
- iterations: iteration,
244
- });
245
- break;
246
- }
247
- // Send feedback
248
- logger.info(`Sending feedback (iteration ${iteration}/${maxIterations})`);
249
- const feedbackPrompt = buildFeedbackPrompt(currentReview);
250
- const fixResult = await cursorAgentSend({
251
- workspaceDir: worktreeDir,
252
- chatId: workChatId,
253
- prompt: feedbackPrompt,
254
- model: config.model,
255
- outputFormat: config.agentOutputFormat,
256
- taskName: taskResult.taskName,
257
- });
258
- if (!fixResult.ok) {
259
- logger.error(`Feedback application failed: ${fixResult.error}`);
260
- return { approved: false, review: currentReview, iterations: iteration, error: fixResult.error };
261
- }
262
- }
263
- return { approved: false, review: currentReview, iterations: iteration };
264
- }
265
- //# sourceMappingURL=reviewer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reviewer.js","sourceRoot":"","sources":["../../src/core/reviewer.ts"],"names":[],"mappings":"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"}