@calmo/task-runner 1.2.3 → 2.0.0
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/.jules/sentinel.md +4 -0
- package/AGENTS.md +4 -1
- package/CHANGELOG.md +20 -15
- package/GEMINI.md +2 -0
- package/coverage/coverage-final.json +2 -2
- package/coverage/index.html +9 -9
- package/coverage/lcov-report/index.html +9 -9
- package/coverage/lcov-report/src/EventBus.ts.html +1 -1
- package/coverage/lcov-report/src/TaskGraphValidator.ts.html +134 -53
- package/coverage/lcov-report/src/TaskRunner.ts.html +1 -1
- package/coverage/lcov-report/src/WorkflowExecutor.ts.html +66 -60
- package/coverage/lcov-report/src/contracts/RunnerEvents.ts.html +1 -1
- package/coverage/lcov-report/src/contracts/index.html +1 -1
- package/coverage/lcov-report/src/index.html +11 -11
- package/coverage/lcov.info +129 -107
- package/coverage/src/EventBus.ts.html +1 -1
- package/coverage/src/TaskGraphValidator.ts.html +134 -53
- package/coverage/src/TaskRunner.ts.html +1 -1
- package/coverage/src/WorkflowExecutor.ts.html +66 -60
- package/coverage/src/contracts/RunnerEvents.ts.html +1 -1
- package/coverage/src/contracts/index.html +1 -1
- package/coverage/src/index.html +11 -11
- package/dist/TaskGraphValidator.js +39 -16
- package/dist/TaskGraphValidator.js.map +1 -1
- package/dist/WorkflowExecutor.d.ts +8 -1
- package/dist/WorkflowExecutor.js +29 -36
- package/dist/WorkflowExecutor.js.map +1 -1
- package/package.json +1 -1
- package/src/TaskGraphValidator.ts +46 -19
- package/src/WorkflowExecutor.ts +37 -35
- package/test-report.xml +47 -43
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
26
|
<span class="strong">100% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>56/56</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
47
|
<span class="strong">100% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>54/54</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -199,7 +199,34 @@
|
|
|
199
199
|
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
200
|
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
201
|
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
-
<a name='L137'></a><a href='#L137'>137</a
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
203
230
|
<span class="cline-any cline-neutral"> </span>
|
|
204
231
|
<span class="cline-any cline-neutral"> </span>
|
|
205
232
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -216,26 +243,26 @@
|
|
|
216
243
|
<span class="cline-any cline-neutral"> </span>
|
|
217
244
|
<span class="cline-any cline-neutral"> </span>
|
|
218
245
|
<span class="cline-any cline-neutral"> </span>
|
|
219
|
-
<span class="cline-any cline-yes">
|
|
246
|
+
<span class="cline-any cline-yes">30x</span>
|
|
220
247
|
<span class="cline-any cline-neutral"> </span>
|
|
221
248
|
<span class="cline-any cline-neutral"> </span>
|
|
222
|
-
<span class="cline-any cline-yes">
|
|
223
|
-
<span class="cline-any cline-yes">
|
|
224
|
-
<span class="cline-any cline-yes">
|
|
249
|
+
<span class="cline-any cline-yes">30x</span>
|
|
250
|
+
<span class="cline-any cline-yes">30x</span>
|
|
251
|
+
<span class="cline-any cline-yes">20061x</span>
|
|
225
252
|
<span class="cline-any cline-yes">3x</span>
|
|
226
253
|
<span class="cline-any cline-neutral"> </span>
|
|
227
254
|
<span class="cline-any cline-neutral"> </span>
|
|
228
255
|
<span class="cline-any cline-neutral"> </span>
|
|
229
256
|
<span class="cline-any cline-neutral"> </span>
|
|
230
257
|
<span class="cline-any cline-neutral"> </span>
|
|
231
|
-
<span class="cline-any cline-yes">
|
|
258
|
+
<span class="cline-any cline-yes">20058x</span>
|
|
232
259
|
<span class="cline-any cline-neutral"> </span>
|
|
233
260
|
<span class="cline-any cline-neutral"> </span>
|
|
234
261
|
<span class="cline-any cline-neutral"> </span>
|
|
235
262
|
<span class="cline-any cline-neutral"> </span>
|
|
236
|
-
<span class="cline-any cline-yes">
|
|
237
|
-
<span class="cline-any cline-yes">
|
|
238
|
-
<span class="cline-any cline-yes">
|
|
263
|
+
<span class="cline-any cline-yes">30x</span>
|
|
264
|
+
<span class="cline-any cline-yes">20061x</span>
|
|
265
|
+
<span class="cline-any cline-yes">20040x</span>
|
|
239
266
|
<span class="cline-any cline-yes">5x</span>
|
|
240
267
|
<span class="cline-any cline-neutral"> </span>
|
|
241
268
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -247,9 +274,9 @@
|
|
|
247
274
|
<span class="cline-any cline-neutral"> </span>
|
|
248
275
|
<span class="cline-any cline-neutral"> </span>
|
|
249
276
|
<span class="cline-any cline-neutral"> </span>
|
|
250
|
-
<span class="cline-any cline-yes">
|
|
277
|
+
<span class="cline-any cline-yes">30x</span>
|
|
251
278
|
<span class="cline-any cline-neutral"> </span>
|
|
252
|
-
<span class="cline-any cline-yes">
|
|
279
|
+
<span class="cline-any cline-yes">30x</span>
|
|
253
280
|
<span class="cline-any cline-yes">4x</span>
|
|
254
281
|
<span class="cline-any cline-neutral"> </span>
|
|
255
282
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -257,21 +284,21 @@
|
|
|
257
284
|
<span class="cline-any cline-neutral"> </span>
|
|
258
285
|
<span class="cline-any cline-neutral"> </span>
|
|
259
286
|
<span class="cline-any cline-neutral"> </span>
|
|
260
|
-
<span class="cline-any cline-yes">
|
|
261
|
-
<span class="cline-any cline-yes">
|
|
262
|
-
<span class="cline-any cline-yes">
|
|
287
|
+
<span class="cline-any cline-yes">26x</span>
|
|
288
|
+
<span class="cline-any cline-yes">26x</span>
|
|
289
|
+
<span class="cline-any cline-yes">20054x</span>
|
|
263
290
|
<span class="cline-any cline-neutral"> </span>
|
|
264
291
|
<span class="cline-any cline-neutral"> </span>
|
|
265
|
-
<span class="cline-any cline-yes">
|
|
266
|
-
<span class="cline-any cline-yes">
|
|
292
|
+
<span class="cline-any cline-yes">26x</span>
|
|
293
|
+
<span class="cline-any cline-yes">26x</span>
|
|
267
294
|
<span class="cline-any cline-neutral"> </span>
|
|
268
|
-
<span class="cline-any cline-yes">
|
|
269
|
-
<span class="cline-any cline-yes">
|
|
295
|
+
<span class="cline-any cline-yes">26x</span>
|
|
296
|
+
<span class="cline-any cline-yes">20049x</span>
|
|
270
297
|
<span class="cline-any cline-yes">3x</span>
|
|
271
298
|
<span class="cline-any cline-neutral"> </span>
|
|
272
299
|
<span class="cline-any cline-neutral"> </span>
|
|
273
|
-
<span class="cline-any cline-yes">
|
|
274
|
-
<span class="cline-any cline-yes">
|
|
300
|
+
<span class="cline-any cline-yes">20046x</span>
|
|
301
|
+
<span class="cline-any cline-yes">20046x</span>
|
|
275
302
|
<span class="cline-any cline-neutral"> </span>
|
|
276
303
|
<span class="cline-any cline-neutral"> </span>
|
|
277
304
|
<span class="cline-any cline-yes">4x</span>
|
|
@@ -288,7 +315,7 @@
|
|
|
288
315
|
<span class="cline-any cline-neutral"> </span>
|
|
289
316
|
<span class="cline-any cline-neutral"> </span>
|
|
290
317
|
<span class="cline-any cline-neutral"> </span>
|
|
291
|
-
<span class="cline-any cline-yes">
|
|
318
|
+
<span class="cline-any cline-yes">26x</span>
|
|
292
319
|
<span class="cline-any cline-neutral"> </span>
|
|
293
320
|
<span class="cline-any cline-neutral"> </span>
|
|
294
321
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -311,28 +338,55 @@
|
|
|
311
338
|
<span class="cline-any cline-neutral"> </span>
|
|
312
339
|
<span class="cline-any cline-neutral"> </span>
|
|
313
340
|
<span class="cline-any cline-neutral"> </span>
|
|
314
|
-
<span class="cline-any cline-yes">51x</span>
|
|
315
|
-
<span class="cline-any cline-yes">51x</span>
|
|
316
|
-
<span class="cline-any cline-yes">51x</span>
|
|
317
341
|
<span class="cline-any cline-neutral"> </span>
|
|
318
|
-
<span class="cline-any cline-yes">
|
|
319
|
-
<span class="cline-any cline-
|
|
320
|
-
<span class="cline-any cline-yes">
|
|
342
|
+
<span class="cline-any cline-yes">20046x</span>
|
|
343
|
+
<span class="cline-any cline-neutral"> </span>
|
|
344
|
+
<span class="cline-any cline-yes">20046x</span>
|
|
345
|
+
<span class="cline-any cline-yes">20046x</span>
|
|
346
|
+
<span class="cline-any cline-yes">20046x</span>
|
|
347
|
+
<span class="cline-any cline-neutral"> </span>
|
|
348
|
+
<span class="cline-any cline-yes">20046x</span>
|
|
349
|
+
<span class="cline-any cline-neutral"> </span>
|
|
321
350
|
<span class="cline-any cline-neutral"> </span>
|
|
322
351
|
<span class="cline-any cline-neutral"> </span>
|
|
323
352
|
<span class="cline-any cline-neutral"> </span>
|
|
324
|
-
<span class="cline-any cline-yes">5x</span>
|
|
325
|
-
<span class="cline-any cline-yes">28x</span>
|
|
326
353
|
<span class="cline-any cline-neutral"> </span>
|
|
327
354
|
<span class="cline-any cline-neutral"> </span>
|
|
355
|
+
<span class="cline-any cline-yes">20046x</span>
|
|
356
|
+
<span class="cline-any cline-yes">40074x</span>
|
|
357
|
+
<span class="cline-any cline-yes">40074x</span>
|
|
358
|
+
<span class="cline-any cline-neutral"> </span>
|
|
359
|
+
<span class="cline-any cline-yes">40074x</span>
|
|
360
|
+
<span class="cline-any cline-yes">20032x</span>
|
|
361
|
+
<span class="cline-any cline-yes">20032x</span>
|
|
362
|
+
<span class="cline-any cline-neutral"> </span>
|
|
363
|
+
<span class="cline-any cline-yes">20032x</span>
|
|
364
|
+
<span class="cline-any cline-neutral"> </span>
|
|
328
365
|
<span class="cline-any cline-yes">4x</span>
|
|
329
366
|
<span class="cline-any cline-yes">4x</span>
|
|
330
367
|
<span class="cline-any cline-neutral"> </span>
|
|
331
368
|
<span class="cline-any cline-neutral"> </span>
|
|
369
|
+
<span class="cline-any cline-yes">20028x</span>
|
|
370
|
+
<span class="cline-any cline-yes">5x</span>
|
|
371
|
+
<span class="cline-any cline-yes">5x</span>
|
|
372
|
+
<span class="cline-any cline-yes">5x</span>
|
|
373
|
+
<span class="cline-any cline-neutral"> </span>
|
|
374
|
+
<span class="cline-any cline-yes">5x</span>
|
|
375
|
+
<span class="cline-any cline-neutral"> </span>
|
|
376
|
+
<span class="cline-any cline-neutral"> </span>
|
|
377
|
+
<span class="cline-any cline-neutral"> </span>
|
|
378
|
+
<span class="cline-any cline-neutral"> </span>
|
|
332
379
|
<span class="cline-any cline-neutral"> </span>
|
|
333
|
-
<span class="cline-any cline-
|
|
334
|
-
<span class="cline-any cline-
|
|
335
|
-
<span class="cline-any cline-
|
|
380
|
+
<span class="cline-any cline-neutral"> </span>
|
|
381
|
+
<span class="cline-any cline-neutral"> </span>
|
|
382
|
+
<span class="cline-any cline-neutral"> </span>
|
|
383
|
+
<span class="cline-any cline-yes">20042x</span>
|
|
384
|
+
<span class="cline-any cline-yes">20042x</span>
|
|
385
|
+
<span class="cline-any cline-yes">20042x</span>
|
|
386
|
+
<span class="cline-any cline-neutral"> </span>
|
|
387
|
+
<span class="cline-any cline-neutral"> </span>
|
|
388
|
+
<span class="cline-any cline-neutral"> </span>
|
|
389
|
+
<span class="cline-any cline-yes">20042x</span>
|
|
336
390
|
<span class="cline-any cline-neutral"> </span>
|
|
337
391
|
<span class="cline-any cline-neutral"> </span>
|
|
338
392
|
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { ITaskGraphValidator } from "./contracts/ITaskGraphValidator.js";
|
|
@@ -441,33 +495,60 @@ export class TaskGraphValidator implements ITaskGraphValidator {
|
|
|
441
495
|
}
|
|
442
496
|
|
|
443
497
|
private detectCycle(
|
|
444
|
-
|
|
498
|
+
startTaskId: string,
|
|
445
499
|
path: string[],
|
|
446
500
|
visited: Set<string>,
|
|
447
501
|
recursionStack: Set<string>,
|
|
448
502
|
adjacencyList: Map<string, string[]>
|
|
449
503
|
): boolean {
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
504
|
+
// Use an explicit stack to avoid maximum call stack size exceeded errors
|
|
505
|
+
const stack: { taskId: string; index: number; dependencies: string[] }[] = [];
|
|
506
|
+
|
|
507
|
+
visited.add(startTaskId);
|
|
508
|
+
recursionStack.add(startTaskId);
|
|
509
|
+
path.push(startTaskId);
|
|
510
|
+
|
|
511
|
+
stack.push({
|
|
512
|
+
taskId: startTaskId,
|
|
513
|
+
index: 0,
|
|
514
|
+
/* v8 ignore next */
|
|
515
|
+
dependencies: adjacencyList.get(startTaskId) ?? []
|
|
516
|
+
});
|
|
453
517
|
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
518
|
+
while (stack.length > 0) {
|
|
519
|
+
const frame = stack[stack.length - 1];
|
|
520
|
+
const { taskId, dependencies } = frame;
|
|
521
|
+
|
|
522
|
+
if (frame.index < dependencies.length) {
|
|
523
|
+
const dependenceId = dependencies[frame.index];
|
|
524
|
+
frame.index++;
|
|
525
|
+
|
|
526
|
+
if (recursionStack.has(dependenceId)) {
|
|
527
|
+
// Cycle detected
|
|
528
|
+
path.push(dependenceId);
|
|
529
|
+
return true;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
if (!visited.has(dependenceId)) {
|
|
533
|
+
visited.add(dependenceId);
|
|
534
|
+
recursionStack.add(dependenceId);
|
|
535
|
+
path.push(dependenceId);
|
|
536
|
+
|
|
537
|
+
stack.push({
|
|
538
|
+
taskId: dependenceId,
|
|
539
|
+
index: 0,
|
|
540
|
+
/* v8 ignore next */
|
|
541
|
+
dependencies: adjacencyList.get(dependenceId) ?? []
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
} else {
|
|
545
|
+
// Finished all dependencies for this node
|
|
546
|
+
recursionStack.delete(taskId);
|
|
547
|
+
path.pop();
|
|
548
|
+
stack.pop();
|
|
466
549
|
}
|
|
467
550
|
}
|
|
468
551
|
|
|
469
|
-
recursionStack.delete(taskId);
|
|
470
|
-
path.pop();
|
|
471
552
|
return false;
|
|
472
553
|
}
|
|
473
554
|
}
|
|
@@ -478,7 +559,7 @@ export class TaskGraphValidator implements ITaskGraphValidator {
|
|
|
478
559
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
479
560
|
Code coverage generated by
|
|
480
561
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
481
|
-
at 2026-01-
|
|
562
|
+
at 2026-01-18T15:13:46.748Z
|
|
482
563
|
</div>
|
|
483
564
|
<script src="../prettify.js"></script>
|
|
484
565
|
<script>
|
|
@@ -292,7 +292,7 @@ export class TaskRunner<TContext> {
|
|
|
292
292
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
293
293
|
Code coverage generated by
|
|
294
294
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
295
|
-
at 2026-01-
|
|
295
|
+
at 2026-01-18T15:13:46.748Z
|
|
296
296
|
</div>
|
|
297
297
|
<script src="../prettify.js"></script>
|
|
298
298
|
<script>
|
|
@@ -25,28 +25,28 @@
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
26
|
<span class="strong">100% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>43/43</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
33
|
<span class="strong">100% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>20/20</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
40
|
<span class="strong">100% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>11/11</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
47
|
<span class="strong">100% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>42/42</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -187,7 +187,9 @@
|
|
|
187
187
|
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
188
|
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
189
|
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
-
<a name='L125'></a><a href='#L125'>125</a
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
191
193
|
<span class="cline-any cline-neutral"> </span>
|
|
192
194
|
<span class="cline-any cline-neutral"> </span>
|
|
193
195
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -217,7 +219,6 @@
|
|
|
217
219
|
<span class="cline-any cline-neutral"> </span>
|
|
218
220
|
<span class="cline-any cline-yes">18x</span>
|
|
219
221
|
<span class="cline-any cline-yes">18x</span>
|
|
220
|
-
<span class="cline-any cline-yes">18x</span>
|
|
221
222
|
<span class="cline-any cline-neutral"> </span>
|
|
222
223
|
<span class="cline-any cline-neutral"> </span>
|
|
223
224
|
<span class="cline-any cline-yes">18x</span>
|
|
@@ -241,24 +242,30 @@
|
|
|
241
242
|
<span class="cline-any cline-neutral"> </span>
|
|
242
243
|
<span class="cline-any cline-neutral"> </span>
|
|
243
244
|
<span class="cline-any cline-neutral"> </span>
|
|
244
|
-
<span class="cline-any cline-neutral"> </span>
|
|
245
245
|
<span class="cline-any cline-yes">43x</span>
|
|
246
|
+
<span class="cline-any cline-neutral"> </span>
|
|
246
247
|
<span class="cline-any cline-yes">43x</span>
|
|
247
248
|
<span class="cline-any cline-neutral"> </span>
|
|
248
249
|
<span class="cline-any cline-yes">43x</span>
|
|
249
|
-
<span class="cline-any cline-yes">
|
|
250
|
-
<span class="cline-any cline-yes">
|
|
250
|
+
<span class="cline-any cline-yes">31x</span>
|
|
251
|
+
<span class="cline-any cline-yes">31x</span>
|
|
252
|
+
<span class="cline-any cline-neutral"> </span>
|
|
253
|
+
<span class="cline-any cline-yes">31x</span>
|
|
254
|
+
<span class="cline-any cline-neutral"> </span>
|
|
255
|
+
<span class="cline-any cline-neutral"> </span>
|
|
256
|
+
<span class="cline-any cline-neutral"> </span>
|
|
257
|
+
<span class="cline-any cline-neutral"> </span>
|
|
258
|
+
<span class="cline-any cline-neutral"> </span>
|
|
251
259
|
<span class="cline-any cline-neutral"> </span>
|
|
252
260
|
<span class="cline-any cline-neutral"> </span>
|
|
253
|
-
<span class="cline-any cline-yes">57x</span>
|
|
254
|
-
<span class="cline-any cline-yes">43x</span>
|
|
255
261
|
<span class="cline-any cline-yes">43x</span>
|
|
262
|
+
<span class="cline-any cline-yes">114x</span>
|
|
256
263
|
<span class="cline-any cline-neutral"> </span>
|
|
257
|
-
<span class="cline-any cline-yes">23x</span>
|
|
258
|
-
<span class="cline-any cline-yes">20x</span>
|
|
259
|
-
<span class="cline-any cline-yes">7x</span>
|
|
260
|
-
<span class="cline-any cline-yes">7x</span>
|
|
261
264
|
<span class="cline-any cline-neutral"> </span>
|
|
265
|
+
<span class="cline-any cline-yes">43x</span>
|
|
266
|
+
<span class="cline-any cline-yes">57x</span>
|
|
267
|
+
<span class="cline-any cline-yes">57x</span>
|
|
268
|
+
<span class="cline-any cline-yes">43x</span>
|
|
262
269
|
<span class="cline-any cline-neutral"> </span>
|
|
263
270
|
<span class="cline-any cline-neutral"> </span>
|
|
264
271
|
<span class="cline-any cline-yes">57x</span>
|
|
@@ -268,24 +275,21 @@
|
|
|
268
275
|
<span class="cline-any cline-neutral"> </span>
|
|
269
276
|
<span class="cline-any cline-yes">7x</span>
|
|
270
277
|
<span class="cline-any cline-yes">7x</span>
|
|
271
|
-
<span class="cline-any cline-yes">7x</span>
|
|
272
|
-
<span class="cline-any cline-yes">50x</span>
|
|
273
|
-
<span class="cline-any cline-yes">31x</span>
|
|
274
|
-
<span class="cline-any cline-yes">31x</span>
|
|
275
278
|
<span class="cline-any cline-neutral"> </span>
|
|
276
279
|
<span class="cline-any cline-neutral"> </span>
|
|
277
280
|
<span class="cline-any cline-neutral"> </span>
|
|
278
281
|
<span class="cline-any cline-neutral"> </span>
|
|
279
|
-
<span class="cline-any cline-
|
|
280
|
-
<span class="cline-any cline-yes">38x</span>
|
|
282
|
+
<span class="cline-any cline-neutral"> </span>
|
|
281
283
|
<span class="cline-any cline-neutral"> </span>
|
|
282
284
|
<span class="cline-any cline-neutral"> </span>
|
|
283
285
|
<span class="cline-any cline-neutral"> </span>
|
|
284
286
|
<span class="cline-any cline-yes">43x</span>
|
|
285
|
-
<span class="cline-any cline-yes">
|
|
286
|
-
<span class="cline-any cline-
|
|
287
|
+
<span class="cline-any cline-yes">114x</span>
|
|
288
|
+
<span class="cline-any cline-neutral"> </span>
|
|
289
|
+
<span class="cline-any cline-yes">50x</span>
|
|
290
|
+
<span class="cline-any cline-yes">114x</span>
|
|
291
|
+
<span class="cline-any cline-yes">32x</span>
|
|
287
292
|
<span class="cline-any cline-neutral"> </span>
|
|
288
|
-
<span class="cline-any cline-yes">31x</span>
|
|
289
293
|
<span class="cline-any cline-neutral"> </span>
|
|
290
294
|
<span class="cline-any cline-neutral"> </span>
|
|
291
295
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -341,16 +345,15 @@ export class WorkflowExecutor<TContext> {
|
|
|
341
345
|
|
|
342
346
|
const results = new Map<string, TaskResult>();
|
|
343
347
|
const executingPromises = new Set<Promise<void>>();
|
|
344
|
-
const pendingSteps = new Set(steps);
|
|
345
348
|
|
|
346
349
|
// Initial pass
|
|
347
|
-
this.processQueue(
|
|
350
|
+
this.processQueue(steps, results, executingPromises);
|
|
348
351
|
|
|
349
352
|
while (results.size < steps.length && executingPromises.size > 0) {
|
|
350
353
|
// Wait for the next task to finish
|
|
351
354
|
await Promise.race(executingPromises);
|
|
352
355
|
// After a task finishes, check for new work
|
|
353
|
-
this.processQueue(
|
|
356
|
+
this.processQueue(steps, results, executingPromises);
|
|
354
357
|
}
|
|
355
358
|
|
|
356
359
|
this.eventBus.emit("workflowEnd", { context: this.context, results });
|
|
@@ -359,31 +362,37 @@ export class WorkflowExecutor<TContext> {
|
|
|
359
362
|
|
|
360
363
|
/**
|
|
361
364
|
* Logic to identify tasks that can be started or must be skipped.
|
|
362
|
-
* Iterate only over pending steps to avoid O(N^2) checks on completed tasks.
|
|
363
365
|
*/
|
|
364
366
|
private processQueue(
|
|
365
|
-
|
|
367
|
+
steps: TaskStep<TContext>[],
|
|
366
368
|
results: Map<string, TaskResult>,
|
|
367
369
|
executingPromises: Set<Promise<void>>
|
|
368
370
|
): void {
|
|
369
|
-
|
|
370
|
-
|
|
371
|
+
this.handleSkippedTasks(steps, results);
|
|
372
|
+
|
|
373
|
+
const readySteps = this.getReadySteps(steps, results);
|
|
374
|
+
|
|
375
|
+
for (const step of readySteps) {
|
|
376
|
+
const taskPromise = this.runStep(step, results).then(() => {
|
|
377
|
+
executingPromises.delete(taskPromise);
|
|
378
|
+
});
|
|
379
|
+
executingPromises.add(taskPromise);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Identifies steps that cannot run because a dependency failed.
|
|
385
|
+
*/
|
|
386
|
+
private handleSkippedTasks(steps: TaskStep<TContext>[], results: Map<string, TaskResult>): void {
|
|
387
|
+
const pendingSteps = steps.filter(
|
|
388
|
+
(step) => !results.has(step.name) && !this.running.has(step.name)
|
|
389
|
+
);
|
|
371
390
|
|
|
372
391
|
for (const step of pendingSteps) {
|
|
373
392
|
const deps = step.dependencies ?? [];
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
for (const dep of deps) {
|
|
378
|
-
const depResult = results.get(dep);
|
|
379
|
-
if (!depResult) {
|
|
380
|
-
// Dependency not finished yet
|
|
381
|
-
blocked = true;
|
|
382
|
-
} else if (depResult.status !== "success") {
|
|
383
|
-
failedDep = dep;
|
|
384
|
-
break;
|
|
385
|
-
}
|
|
386
|
-
}
|
|
393
|
+
const failedDep = deps.find(
|
|
394
|
+
(dep) => results.has(dep) && results.get(dep)?.status !== "success"
|
|
395
|
+
);
|
|
387
396
|
|
|
388
397
|
if (failedDep) {
|
|
389
398
|
const result: TaskResult = {
|
|
@@ -392,25 +401,22 @@ export class WorkflowExecutor<TContext> {
|
|
|
392
401
|
};
|
|
393
402
|
results.set(step.name, result);
|
|
394
403
|
this.eventBus.emit("taskSkipped", { step, result });
|
|
395
|
-
toRemove.push(step);
|
|
396
|
-
} else if (!blocked) {
|
|
397
|
-
toRun.push(step);
|
|
398
|
-
toRemove.push(step);
|
|
399
404
|
}
|
|
400
405
|
}
|
|
406
|
+
}
|
|
401
407
|
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
408
|
+
/**
|
|
409
|
+
* Returns steps where all dependencies have finished successfully.
|
|
410
|
+
*/
|
|
411
|
+
private getReadySteps(steps: TaskStep<TContext>[], results: Map<string, TaskResult>): TaskStep<TContext>[] {
|
|
412
|
+
return steps.filter((step) => {
|
|
413
|
+
if (results.has(step.name) || this.running.has(step.name)) return false;
|
|
406
414
|
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
executingPromises.add(taskPromise);
|
|
413
|
-
}
|
|
415
|
+
const deps = step.dependencies ?? [];
|
|
416
|
+
return deps.every(
|
|
417
|
+
(dep) => results.has(dep) && results.get(dep)?.status === "success"
|
|
418
|
+
);
|
|
419
|
+
});
|
|
414
420
|
}
|
|
415
421
|
|
|
416
422
|
/**
|
|
@@ -442,7 +448,7 @@ export class WorkflowExecutor<TContext> {
|
|
|
442
448
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
443
449
|
Code coverage generated by
|
|
444
450
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
445
|
-
at 2026-01-
|
|
451
|
+
at 2026-01-18T15:13:46.748Z
|
|
446
452
|
</div>
|
|
447
453
|
<script src="../prettify.js"></script>
|
|
448
454
|
<script>
|
|
@@ -202,7 +202,7 @@ export type ListenerMap<TContext> = {
|
|
|
202
202
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
203
203
|
Code coverage generated by
|
|
204
204
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
205
|
-
at 2026-01-
|
|
205
|
+
at 2026-01-18T15:13:46.748Z
|
|
206
206
|
</div>
|
|
207
207
|
<script src="../../prettify.js"></script>
|
|
208
208
|
<script>
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
102
102
|
Code coverage generated by
|
|
103
103
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
104
|
-
at 2026-01-
|
|
104
|
+
at 2026-01-18T15:13:46.748Z
|
|
105
105
|
</div>
|
|
106
106
|
<script src="../../prettify.js"></script>
|
|
107
107
|
<script>
|