@litmers/cursorflow-orchestrator 0.1.18 → 0.1.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +25 -7
  3. package/commands/cursorflow-clean.md +19 -0
  4. package/commands/cursorflow-runs.md +59 -0
  5. package/commands/cursorflow-stop.md +55 -0
  6. package/dist/cli/clean.js +178 -6
  7. package/dist/cli/clean.js.map +1 -1
  8. package/dist/cli/index.js +12 -1
  9. package/dist/cli/index.js.map +1 -1
  10. package/dist/cli/init.js +8 -7
  11. package/dist/cli/init.js.map +1 -1
  12. package/dist/cli/logs.js +126 -77
  13. package/dist/cli/logs.js.map +1 -1
  14. package/dist/cli/monitor.d.ts +7 -0
  15. package/dist/cli/monitor.js +1021 -202
  16. package/dist/cli/monitor.js.map +1 -1
  17. package/dist/cli/prepare.js +39 -21
  18. package/dist/cli/prepare.js.map +1 -1
  19. package/dist/cli/resume.js +268 -163
  20. package/dist/cli/resume.js.map +1 -1
  21. package/dist/cli/run.js +11 -5
  22. package/dist/cli/run.js.map +1 -1
  23. package/dist/cli/runs.d.ts +5 -0
  24. package/dist/cli/runs.js +214 -0
  25. package/dist/cli/runs.js.map +1 -0
  26. package/dist/cli/setup-commands.js +0 -0
  27. package/dist/cli/signal.js +8 -8
  28. package/dist/cli/signal.js.map +1 -1
  29. package/dist/cli/stop.d.ts +5 -0
  30. package/dist/cli/stop.js +215 -0
  31. package/dist/cli/stop.js.map +1 -0
  32. package/dist/cli/tasks.d.ts +10 -0
  33. package/dist/cli/tasks.js +165 -0
  34. package/dist/cli/tasks.js.map +1 -0
  35. package/dist/core/auto-recovery.d.ts +212 -0
  36. package/dist/core/auto-recovery.js +737 -0
  37. package/dist/core/auto-recovery.js.map +1 -0
  38. package/dist/core/failure-policy.d.ts +156 -0
  39. package/dist/core/failure-policy.js +488 -0
  40. package/dist/core/failure-policy.js.map +1 -0
  41. package/dist/core/orchestrator.d.ts +16 -2
  42. package/dist/core/orchestrator.js +439 -105
  43. package/dist/core/orchestrator.js.map +1 -1
  44. package/dist/core/reviewer.d.ts +2 -0
  45. package/dist/core/reviewer.js +2 -0
  46. package/dist/core/reviewer.js.map +1 -1
  47. package/dist/core/runner.d.ts +33 -10
  48. package/dist/core/runner.js +374 -164
  49. package/dist/core/runner.js.map +1 -1
  50. package/dist/services/logging/buffer.d.ts +67 -0
  51. package/dist/services/logging/buffer.js +309 -0
  52. package/dist/services/logging/buffer.js.map +1 -0
  53. package/dist/services/logging/console.d.ts +89 -0
  54. package/dist/services/logging/console.js +169 -0
  55. package/dist/services/logging/console.js.map +1 -0
  56. package/dist/services/logging/file-writer.d.ts +71 -0
  57. package/dist/services/logging/file-writer.js +516 -0
  58. package/dist/services/logging/file-writer.js.map +1 -0
  59. package/dist/services/logging/formatter.d.ts +39 -0
  60. package/dist/services/logging/formatter.js +227 -0
  61. package/dist/services/logging/formatter.js.map +1 -0
  62. package/dist/services/logging/index.d.ts +11 -0
  63. package/dist/services/logging/index.js +30 -0
  64. package/dist/services/logging/index.js.map +1 -0
  65. package/dist/services/logging/parser.d.ts +31 -0
  66. package/dist/services/logging/parser.js +222 -0
  67. package/dist/services/logging/parser.js.map +1 -0
  68. package/dist/services/process/index.d.ts +59 -0
  69. package/dist/services/process/index.js +257 -0
  70. package/dist/services/process/index.js.map +1 -0
  71. package/dist/types/agent.d.ts +20 -0
  72. package/dist/types/agent.js +6 -0
  73. package/dist/types/agent.js.map +1 -0
  74. package/dist/types/config.d.ts +65 -0
  75. package/dist/types/config.js +6 -0
  76. package/dist/types/config.js.map +1 -0
  77. package/dist/types/events.d.ts +125 -0
  78. package/dist/types/events.js +6 -0
  79. package/dist/types/events.js.map +1 -0
  80. package/dist/types/index.d.ts +12 -0
  81. package/dist/types/index.js +37 -0
  82. package/dist/types/index.js.map +1 -0
  83. package/dist/types/lane.d.ts +43 -0
  84. package/dist/types/lane.js +6 -0
  85. package/dist/types/lane.js.map +1 -0
  86. package/dist/types/logging.d.ts +71 -0
  87. package/dist/types/logging.js +16 -0
  88. package/dist/types/logging.js.map +1 -0
  89. package/dist/types/review.d.ts +17 -0
  90. package/dist/types/review.js +6 -0
  91. package/dist/types/review.js.map +1 -0
  92. package/dist/types/run.d.ts +32 -0
  93. package/dist/types/run.js +6 -0
  94. package/dist/types/run.js.map +1 -0
  95. package/dist/types/task.d.ts +71 -0
  96. package/dist/types/task.js +6 -0
  97. package/dist/types/task.js.map +1 -0
  98. package/dist/ui/components.d.ts +134 -0
  99. package/dist/ui/components.js +389 -0
  100. package/dist/ui/components.js.map +1 -0
  101. package/dist/ui/log-viewer.d.ts +49 -0
  102. package/dist/ui/log-viewer.js +449 -0
  103. package/dist/ui/log-viewer.js.map +1 -0
  104. package/dist/utils/checkpoint.d.ts +87 -0
  105. package/dist/utils/checkpoint.js +317 -0
  106. package/dist/utils/checkpoint.js.map +1 -0
  107. package/dist/utils/config.d.ts +4 -0
  108. package/dist/utils/config.js +18 -8
  109. package/dist/utils/config.js.map +1 -1
  110. package/dist/utils/cursor-agent.js.map +1 -1
  111. package/dist/utils/dependency.d.ts +74 -0
  112. package/dist/utils/dependency.js +420 -0
  113. package/dist/utils/dependency.js.map +1 -0
  114. package/dist/utils/doctor.js +17 -11
  115. package/dist/utils/doctor.js.map +1 -1
  116. package/dist/utils/enhanced-logger.d.ts +10 -33
  117. package/dist/utils/enhanced-logger.js +108 -20
  118. package/dist/utils/enhanced-logger.js.map +1 -1
  119. package/dist/utils/git.d.ts +121 -0
  120. package/dist/utils/git.js +484 -11
  121. package/dist/utils/git.js.map +1 -1
  122. package/dist/utils/health.d.ts +91 -0
  123. package/dist/utils/health.js +556 -0
  124. package/dist/utils/health.js.map +1 -0
  125. package/dist/utils/lock.d.ts +95 -0
  126. package/dist/utils/lock.js +332 -0
  127. package/dist/utils/lock.js.map +1 -0
  128. package/dist/utils/log-buffer.d.ts +17 -0
  129. package/dist/utils/log-buffer.js +14 -0
  130. package/dist/utils/log-buffer.js.map +1 -0
  131. package/dist/utils/log-constants.d.ts +23 -0
  132. package/dist/utils/log-constants.js +28 -0
  133. package/dist/utils/log-constants.js.map +1 -0
  134. package/dist/utils/log-formatter.d.ts +25 -0
  135. package/dist/utils/log-formatter.js +237 -0
  136. package/dist/utils/log-formatter.js.map +1 -0
  137. package/dist/utils/log-service.d.ts +19 -0
  138. package/dist/utils/log-service.js +47 -0
  139. package/dist/utils/log-service.js.map +1 -0
  140. package/dist/utils/logger.d.ts +46 -27
  141. package/dist/utils/logger.js +82 -60
  142. package/dist/utils/logger.js.map +1 -1
  143. package/dist/utils/path.d.ts +19 -0
  144. package/dist/utils/path.js +77 -0
  145. package/dist/utils/path.js.map +1 -0
  146. package/dist/utils/process-manager.d.ts +21 -0
  147. package/dist/utils/process-manager.js +138 -0
  148. package/dist/utils/process-manager.js.map +1 -0
  149. package/dist/utils/retry.d.ts +121 -0
  150. package/dist/utils/retry.js +374 -0
  151. package/dist/utils/retry.js.map +1 -0
  152. package/dist/utils/run-service.d.ts +88 -0
  153. package/dist/utils/run-service.js +412 -0
  154. package/dist/utils/run-service.js.map +1 -0
  155. package/dist/utils/state.d.ts +62 -3
  156. package/dist/utils/state.js +317 -11
  157. package/dist/utils/state.js.map +1 -1
  158. package/dist/utils/task-service.d.ts +82 -0
  159. package/dist/utils/task-service.js +348 -0
  160. package/dist/utils/task-service.js.map +1 -0
  161. package/dist/utils/template.d.ts +14 -0
  162. package/dist/utils/template.js +122 -0
  163. package/dist/utils/template.js.map +1 -0
  164. package/dist/utils/types.d.ts +2 -271
  165. package/dist/utils/types.js +16 -0
  166. package/dist/utils/types.js.map +1 -1
  167. package/package.json +38 -23
  168. package/scripts/ai-security-check.js +0 -1
  169. package/scripts/local-security-gate.sh +0 -0
  170. package/scripts/monitor-lanes.sh +94 -0
  171. package/scripts/patches/test-cursor-agent.js +0 -1
  172. package/scripts/release.sh +0 -0
  173. package/scripts/setup-security.sh +0 -0
  174. package/scripts/stream-logs.sh +72 -0
  175. package/scripts/verify-and-fix.sh +0 -0
  176. package/src/cli/clean.ts +187 -6
  177. package/src/cli/index.ts +12 -1
  178. package/src/cli/init.ts +8 -7
  179. package/src/cli/logs.ts +124 -77
  180. package/src/cli/monitor.ts +1815 -898
  181. package/src/cli/prepare.ts +41 -21
  182. package/src/cli/resume.ts +753 -626
  183. package/src/cli/run.ts +12 -5
  184. package/src/cli/runs.ts +212 -0
  185. package/src/cli/setup-commands.ts +0 -0
  186. package/src/cli/signal.ts +8 -7
  187. package/src/cli/stop.ts +209 -0
  188. package/src/cli/tasks.ts +154 -0
  189. package/src/core/auto-recovery.ts +909 -0
  190. package/src/core/failure-policy.ts +592 -0
  191. package/src/core/orchestrator.ts +1131 -704
  192. package/src/core/reviewer.ts +4 -0
  193. package/src/core/runner.ts +444 -180
  194. package/src/services/logging/buffer.ts +326 -0
  195. package/src/services/logging/console.ts +193 -0
  196. package/src/services/logging/file-writer.ts +526 -0
  197. package/src/services/logging/formatter.ts +268 -0
  198. package/src/services/logging/index.ts +16 -0
  199. package/src/services/logging/parser.ts +232 -0
  200. package/src/services/process/index.ts +261 -0
  201. package/src/types/agent.ts +24 -0
  202. package/src/types/config.ts +79 -0
  203. package/src/types/events.ts +156 -0
  204. package/src/types/index.ts +29 -0
  205. package/src/types/lane.ts +56 -0
  206. package/src/types/logging.ts +96 -0
  207. package/src/types/review.ts +20 -0
  208. package/src/types/run.ts +37 -0
  209. package/src/types/task.ts +79 -0
  210. package/src/ui/components.ts +430 -0
  211. package/src/ui/log-viewer.ts +485 -0
  212. package/src/utils/checkpoint.ts +374 -0
  213. package/src/utils/config.ts +18 -8
  214. package/src/utils/cursor-agent.ts +1 -1
  215. package/src/utils/dependency.ts +482 -0
  216. package/src/utils/doctor.ts +18 -11
  217. package/src/utils/enhanced-logger.ts +122 -60
  218. package/src/utils/git.ts +517 -11
  219. package/src/utils/health.ts +596 -0
  220. package/src/utils/lock.ts +346 -0
  221. package/src/utils/log-buffer.ts +28 -0
  222. package/src/utils/log-constants.ts +26 -0
  223. package/src/utils/log-formatter.ts +245 -0
  224. package/src/utils/log-service.ts +49 -0
  225. package/src/utils/logger.ts +100 -51
  226. package/src/utils/path.ts +45 -0
  227. package/src/utils/process-manager.ts +100 -0
  228. package/src/utils/retry.ts +413 -0
  229. package/src/utils/run-service.ts +433 -0
  230. package/src/utils/state.ts +385 -11
  231. package/src/utils/task-service.ts +370 -0
  232. package/src/utils/template.ts +92 -0
  233. package/src/utils/types.ts +2 -314
  234. package/templates/basic.json +21 -0
@@ -1,6 +1,11 @@
1
1
  "use strict";
2
2
  /**
3
3
  * State management utilities for CursorFlow
4
+ *
5
+ * Features:
6
+ * - Atomic writes to prevent corruption
7
+ * - State validation and repair
8
+ * - Versioned state with conflict detection
4
9
  */
5
10
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
11
  if (k2 === undefined) k2 = k;
@@ -37,7 +42,14 @@ var __importStar = (this && this.__importStar) || (function () {
37
42
  })();
38
43
  Object.defineProperty(exports, "__esModule", { value: true });
39
44
  exports.saveState = saveState;
45
+ exports.saveStateWithLock = saveStateWithLock;
40
46
  exports.loadState = loadState;
47
+ exports.loadStateWithBackup = loadStateWithBackup;
48
+ exports.updateStateAtomic = updateStateAtomic;
49
+ exports.validateLaneState = validateLaneState;
50
+ exports.repairLaneState = repairLaneState;
51
+ exports.stateNeedsRecovery = stateNeedsRecovery;
52
+ exports.cleanupTempFiles = cleanupTempFiles;
41
53
  exports.appendLog = appendLog;
42
54
  exports.readLog = readLog;
43
55
  exports.createLaneState = createLaneState;
@@ -50,18 +62,70 @@ exports.listLanesInRun = listLanesInRun;
50
62
  exports.getLaneStateSummary = getLaneStateSummary;
51
63
  const fs = __importStar(require("fs"));
52
64
  const path = __importStar(require("path"));
65
+ const path_1 = require("./path");
66
+ const lock_1 = require("./lock");
67
+ const git = __importStar(require("./git"));
53
68
  /**
54
- * Save state to JSON file
69
+ * Save state to JSON file with atomic write
55
70
  */
56
71
  function saveState(statePath, state) {
57
72
  const stateDir = path.dirname(statePath);
58
73
  if (!fs.existsSync(stateDir)) {
59
74
  fs.mkdirSync(stateDir, { recursive: true });
60
75
  }
61
- fs.writeFileSync(statePath, JSON.stringify(state, null, 2), 'utf8');
76
+ // Atomic write: write to temp file, then rename
77
+ const tempPath = `${statePath}.tmp.${process.pid}`;
78
+ try {
79
+ fs.writeFileSync(tempPath, JSON.stringify(state, null, 2), 'utf8');
80
+ fs.renameSync(tempPath, statePath);
81
+ }
82
+ catch (error) {
83
+ // Clean up temp file if rename fails
84
+ try {
85
+ if (fs.existsSync(tempPath)) {
86
+ fs.unlinkSync(tempPath);
87
+ }
88
+ }
89
+ catch {
90
+ // Ignore cleanup errors
91
+ }
92
+ throw error;
93
+ }
62
94
  }
63
95
  /**
64
- * Load state from JSON file
96
+ * Save state with file lock to prevent race conditions
97
+ */
98
+ function saveStateWithLock(statePath, state, lockOptions) {
99
+ const lockPath = `${statePath}.lock`;
100
+ // Try to acquire lock
101
+ const maxRetries = 50;
102
+ let acquired = false;
103
+ let retries = 0;
104
+ while (retries < maxRetries && !acquired) {
105
+ acquired = (0, lock_1.tryAcquireLockSync)(lockPath, {
106
+ operation: 'saveState',
107
+ staleTimeoutMs: 10000,
108
+ ...lockOptions
109
+ });
110
+ if (!acquired) {
111
+ retries++;
112
+ // Sync sleep
113
+ const end = Date.now() + 100;
114
+ while (Date.now() < end) { /* wait */ }
115
+ }
116
+ }
117
+ if (!acquired) {
118
+ throw new Error(`Failed to acquire lock for state file: ${statePath}`);
119
+ }
120
+ try {
121
+ saveState(statePath, state);
122
+ }
123
+ finally {
124
+ (0, lock_1.releaseLockSync)(lockPath);
125
+ }
126
+ }
127
+ /**
128
+ * Load state from JSON file with corruption recovery
65
129
  */
66
130
  function loadState(statePath) {
67
131
  if (!fs.existsSync(statePath)) {
@@ -72,10 +136,250 @@ function loadState(statePath) {
72
136
  return JSON.parse(content);
73
137
  }
74
138
  catch (error) {
139
+ // Try to recover from backup if exists
140
+ const backupPath = `${statePath}.backup`;
141
+ if (fs.existsSync(backupPath)) {
142
+ try {
143
+ console.warn(`Warning: Main state file corrupted, trying backup: ${statePath}`);
144
+ const backupContent = fs.readFileSync(backupPath, 'utf8');
145
+ const backupState = JSON.parse(backupContent);
146
+ // Restore from backup
147
+ saveState(statePath, backupState);
148
+ return backupState;
149
+ }
150
+ catch {
151
+ // Backup also corrupted
152
+ }
153
+ }
75
154
  console.warn(`Warning: Failed to parse state file ${statePath}: ${error.message}`);
76
155
  return null;
77
156
  }
78
157
  }
158
+ /**
159
+ * Load state with automatic backup creation
160
+ */
161
+ function loadStateWithBackup(statePath) {
162
+ const state = loadState(statePath);
163
+ if (state) {
164
+ // Create backup
165
+ const backupPath = `${statePath}.backup`;
166
+ try {
167
+ fs.copyFileSync(statePath, backupPath);
168
+ }
169
+ catch {
170
+ // Ignore backup failures
171
+ }
172
+ }
173
+ return state;
174
+ }
175
+ /**
176
+ * Update state with optimistic locking
177
+ */
178
+ function updateStateAtomic(statePath, updater) {
179
+ const lockPath = `${statePath}.lock`;
180
+ // Acquire lock
181
+ const maxRetries = 50;
182
+ let acquired = false;
183
+ let retries = 0;
184
+ while (retries < maxRetries && !acquired) {
185
+ acquired = (0, lock_1.tryAcquireLockSync)(lockPath, { operation: 'updateState', staleTimeoutMs: 10000 });
186
+ if (!acquired) {
187
+ retries++;
188
+ const end = Date.now() + 100;
189
+ while (Date.now() < end) { /* wait */ }
190
+ }
191
+ }
192
+ if (!acquired) {
193
+ throw new Error(`Failed to acquire lock for state update: ${statePath}`);
194
+ }
195
+ try {
196
+ const currentState = loadState(statePath);
197
+ const newState = updater(currentState);
198
+ newState.updatedAt = Date.now();
199
+ saveState(statePath, newState);
200
+ return newState;
201
+ }
202
+ finally {
203
+ (0, lock_1.releaseLockSync)(lockPath);
204
+ }
205
+ }
206
+ /**
207
+ * Validate lane state and check for inconsistencies
208
+ */
209
+ function validateLaneState(statePath, options = {}) {
210
+ const state = loadState(statePath);
211
+ const issues = [];
212
+ let repaired = false;
213
+ let repairedState;
214
+ if (!state) {
215
+ return {
216
+ valid: false,
217
+ issues: ['State file not found or corrupted'],
218
+ repaired: false,
219
+ };
220
+ }
221
+ // Check required fields
222
+ if (!state.label) {
223
+ issues.push('Missing label field');
224
+ }
225
+ if (state.status === undefined) {
226
+ issues.push('Missing status field');
227
+ }
228
+ if (state.currentTaskIndex === undefined || state.currentTaskIndex < 0) {
229
+ issues.push(`Invalid currentTaskIndex: ${state.currentTaskIndex}`);
230
+ }
231
+ if (state.totalTasks === undefined || state.totalTasks < 0) {
232
+ issues.push(`Invalid totalTasks: ${state.totalTasks}`);
233
+ }
234
+ if (state.currentTaskIndex > state.totalTasks) {
235
+ issues.push(`currentTaskIndex (${state.currentTaskIndex}) exceeds totalTasks (${state.totalTasks})`);
236
+ }
237
+ // Check worktree existence
238
+ if (options.checkWorktree && state.worktreeDir) {
239
+ if (!fs.existsSync(state.worktreeDir)) {
240
+ issues.push(`Worktree directory not found: ${state.worktreeDir}`);
241
+ if (options.autoRepair) {
242
+ state.worktreeDir = null;
243
+ repaired = true;
244
+ }
245
+ }
246
+ }
247
+ // Check branch existence
248
+ if (options.checkBranch && state.pipelineBranch) {
249
+ try {
250
+ if (!git.branchExists(state.pipelineBranch)) {
251
+ issues.push(`Branch not found: ${state.pipelineBranch}`);
252
+ if (options.autoRepair) {
253
+ state.pipelineBranch = null;
254
+ repaired = true;
255
+ }
256
+ }
257
+ }
258
+ catch {
259
+ // Git check failed, don't add issue
260
+ }
261
+ }
262
+ // Check status consistency
263
+ if (state.status === 'completed' && !state.endTime) {
264
+ issues.push('Status is completed but endTime is not set');
265
+ if (options.autoRepair) {
266
+ state.endTime = Date.now();
267
+ repaired = true;
268
+ }
269
+ }
270
+ if (state.status === 'failed' && !state.error) {
271
+ issues.push('Status is failed but no error message');
272
+ }
273
+ // Save repaired state if auto-repair was enabled
274
+ if (repaired && options.autoRepair) {
275
+ state.updatedAt = Date.now();
276
+ saveState(statePath, state);
277
+ repairedState = state;
278
+ }
279
+ return {
280
+ valid: issues.length === 0,
281
+ issues,
282
+ repaired,
283
+ repairedState,
284
+ };
285
+ }
286
+ /**
287
+ * Repair lane state by resetting inconsistent values
288
+ */
289
+ function repairLaneState(statePath) {
290
+ const result = validateLaneState(statePath, {
291
+ checkWorktree: true,
292
+ checkBranch: true,
293
+ autoRepair: true,
294
+ });
295
+ if (result.repairedState) {
296
+ return result.repairedState;
297
+ }
298
+ // If validation failed completely, try to create minimal valid state
299
+ const state = loadState(statePath);
300
+ if (!state) {
301
+ return null;
302
+ }
303
+ // Ensure all required fields have valid values
304
+ const repairedState = {
305
+ label: state.label || path.basename(path.dirname(statePath)),
306
+ status: 'pending',
307
+ currentTaskIndex: Math.max(0, state.currentTaskIndex || 0),
308
+ totalTasks: Math.max(0, state.totalTasks || 0),
309
+ worktreeDir: state.worktreeDir && fs.existsSync(state.worktreeDir) ? state.worktreeDir : null,
310
+ pipelineBranch: state.pipelineBranch,
311
+ startTime: state.startTime || Date.now(),
312
+ endTime: null,
313
+ error: null,
314
+ dependencyRequest: null,
315
+ tasksFile: state.tasksFile,
316
+ dependsOn: state.dependsOn || [],
317
+ completedTasks: state.completedTasks || [],
318
+ updatedAt: Date.now(),
319
+ };
320
+ // Ensure currentTaskIndex doesn't exceed totalTasks
321
+ if (repairedState.currentTaskIndex > repairedState.totalTasks) {
322
+ repairedState.currentTaskIndex = repairedState.totalTasks;
323
+ }
324
+ saveState(statePath, repairedState);
325
+ return repairedState;
326
+ }
327
+ /**
328
+ * Check if state needs recovery (e.g., after crash)
329
+ */
330
+ function stateNeedsRecovery(statePath) {
331
+ const state = loadState(statePath);
332
+ if (!state) {
333
+ return false;
334
+ }
335
+ // Running state with no recent update might indicate a crash
336
+ if (state.status === 'running') {
337
+ const lastUpdate = state.updatedAt || state.startTime;
338
+ const staleThresholdMs = 5 * 60 * 1000; // 5 minutes
339
+ if (Date.now() - lastUpdate > staleThresholdMs) {
340
+ return true;
341
+ }
342
+ }
343
+ // Check for temp files indicating incomplete write
344
+ const tempPattern = `${statePath}.tmp.`;
345
+ const stateDir = path.dirname(statePath);
346
+ try {
347
+ const files = fs.readdirSync(stateDir);
348
+ for (const file of files) {
349
+ if (file.startsWith(path.basename(tempPattern))) {
350
+ return true;
351
+ }
352
+ }
353
+ }
354
+ catch {
355
+ // Ignore
356
+ }
357
+ return false;
358
+ }
359
+ /**
360
+ * Clean up temp files from incomplete writes
361
+ */
362
+ function cleanupTempFiles(stateDir) {
363
+ let cleaned = 0;
364
+ try {
365
+ const files = fs.readdirSync(stateDir);
366
+ for (const file of files) {
367
+ if (file.includes('.tmp.')) {
368
+ try {
369
+ fs.unlinkSync((0, path_1.safeJoin)(stateDir, file));
370
+ cleaned++;
371
+ }
372
+ catch {
373
+ // Ignore
374
+ }
375
+ }
376
+ }
377
+ }
378
+ catch {
379
+ // Ignore
380
+ }
381
+ return cleaned;
382
+ }
79
383
  /**
80
384
  * Append to JSONL log file
81
385
  */
@@ -109,18 +413,20 @@ function readLog(logPath) {
109
413
  /**
110
414
  * Create initial lane state
111
415
  */
112
- function createLaneState(laneName, config) {
416
+ function createLaneState(laneName, config, tasksFile, options = {}) {
113
417
  return {
114
418
  label: laneName,
115
419
  status: 'pending',
116
420
  currentTaskIndex: 0,
117
421
  totalTasks: config.tasks ? config.tasks.length : 0,
118
- worktreeDir: null,
119
- pipelineBranch: null,
422
+ worktreeDir: options.worktreeDir || null,
423
+ pipelineBranch: options.pipelineBranch || null,
120
424
  startTime: Date.now(),
121
425
  endTime: null,
122
426
  error: null,
123
427
  dependencyRequest: null,
428
+ tasksFile,
429
+ dependsOn: config.dependsOn || [],
124
430
  };
125
431
  }
126
432
  /**
@@ -174,13 +480,13 @@ function getLatestRunDir(logsDir) {
174
480
  return null;
175
481
  }
176
482
  const runs = fs.readdirSync(logsDir)
177
- .filter(f => fs.statSync(path.join(logsDir, f)).isDirectory())
483
+ .filter(f => fs.statSync((0, path_1.safeJoin)(logsDir, f)).isDirectory())
178
484
  .sort()
179
485
  .reverse();
180
486
  if (runs.length === 0) {
181
487
  return null;
182
488
  }
183
- return path.join(logsDir, runs[0]);
489
+ return (0, path_1.safeJoin)(logsDir, runs[0]);
184
490
  }
185
491
  /**
186
492
  * List all lanes in a run directory
@@ -190,11 +496,11 @@ function listLanesInRun(runDir) {
190
496
  return [];
191
497
  }
192
498
  return fs.readdirSync(runDir)
193
- .filter(f => fs.statSync(path.join(runDir, f)).isDirectory())
499
+ .filter(f => fs.statSync((0, path_1.safeJoin)(runDir, f)).isDirectory())
194
500
  .map(laneName => ({
195
501
  name: laneName,
196
- dir: path.join(runDir, laneName),
197
- statePath: path.join(runDir, laneName, 'state.json'),
502
+ dir: (0, path_1.safeJoin)(runDir, laneName),
503
+ statePath: (0, path_1.safeJoin)(runDir, laneName, 'state.json'),
198
504
  }));
199
505
  }
200
506
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/utils/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/utils/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * TaskService - Manages CursorFlow task directories and validation
3
+ *
4
+ * Provides:
5
+ * - List prepared task directories
6
+ * - Get task details (lanes, dependencies)
7
+ * - Validate tasks (doctor integration)
8
+ * - Check run eligibility
9
+ */
10
+ import { TaskDirInfo, ValidationStatus } from './types';
11
+ export { TaskDirInfo, LaneFileInfo, ValidationStatus } from './types';
12
+ export interface ValidationResult {
13
+ /** Combined errors + warnings for backwards compatibility */
14
+ issues: string[];
15
+ status: ValidationStatus;
16
+ errors: string[];
17
+ warnings: string[];
18
+ lastValidated: number;
19
+ }
20
+ export declare class TaskService {
21
+ private tasksDir;
22
+ constructor(tasksDir: string);
23
+ /**
24
+ * List all prepared task directories
25
+ */
26
+ listTaskDirs(): TaskDirInfo[];
27
+ /**
28
+ * Get detailed information about a task directory
29
+ */
30
+ getTaskDirInfo(taskName: string): TaskDirInfo | null;
31
+ /**
32
+ * Scan lane files in a task directory
33
+ */
34
+ private scanLaneFiles;
35
+ /**
36
+ * Extract lane name from filename (e.g., "01-lane-1.json" -> "lane-1")
37
+ */
38
+ private extractLaneName;
39
+ /**
40
+ * Parse timestamp from task name (format: YYMMDDHHMM_FeatureName)
41
+ */
42
+ private parseTimestampFromName;
43
+ /**
44
+ * Extract feature name from task directory name
45
+ */
46
+ private extractFeatureName;
47
+ /**
48
+ * Detect task preset based on task structure
49
+ */
50
+ private detectPreset;
51
+ /**
52
+ * Generate task flow string (e.g., "plan → implement → test")
53
+ */
54
+ private generateTaskFlow;
55
+ /**
56
+ * Validate a task directory
57
+ */
58
+ validateTaskDir(taskName: string): ValidationResult;
59
+ /**
60
+ * Detect circular dependencies in lane dependency graph
61
+ */
62
+ private detectCircularDependencies;
63
+ /**
64
+ * Get cached validation status
65
+ */
66
+ getValidationStatus(taskName: string): ValidationStatus;
67
+ /**
68
+ * Check if a task can be run
69
+ */
70
+ canRun(taskName: string): {
71
+ ok: boolean;
72
+ issues: string[];
73
+ };
74
+ /**
75
+ * Clear validation cache
76
+ */
77
+ clearCache(): void;
78
+ }
79
+ /**
80
+ * Create a TaskService instance with default paths
81
+ */
82
+ export declare function createTaskService(projectRoot?: string): TaskService;