@calmo/task-runner 1.1.1 → 1.2.1

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 (37) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/GEMINI.md +2 -1
  3. package/README.md +5 -0
  4. package/coverage/TaskGraphValidator.ts.html +463 -0
  5. package/coverage/TaskRunner.ts.html +244 -67
  6. package/coverage/coverage-final.json +2 -1
  7. package/coverage/index.html +24 -9
  8. package/coverage/lcov-report/TaskGraphValidator.ts.html +463 -0
  9. package/coverage/lcov-report/TaskRunner.ts.html +244 -67
  10. package/coverage/lcov-report/index.html +24 -9
  11. package/coverage/lcov.info +214 -103
  12. package/dist/TaskGraph.d.ts +18 -0
  13. package/dist/TaskGraph.js +2 -0
  14. package/dist/TaskGraph.js.map +1 -0
  15. package/dist/TaskGraphValidator.d.ts +17 -0
  16. package/dist/TaskGraphValidator.js +103 -0
  17. package/dist/TaskGraphValidator.js.map +1 -0
  18. package/dist/TaskRunner.d.ts +1 -0
  19. package/dist/TaskRunner.js +88 -32
  20. package/dist/TaskRunner.js.map +1 -1
  21. package/dist/contracts/ITaskGraphValidator.d.ts +13 -0
  22. package/dist/contracts/ITaskGraphValidator.js +2 -0
  23. package/dist/contracts/ITaskGraphValidator.js.map +1 -0
  24. package/dist/contracts/ValidationError.d.ts +11 -0
  25. package/dist/contracts/ValidationError.js +2 -0
  26. package/dist/contracts/ValidationError.js.map +1 -0
  27. package/dist/contracts/ValidationResult.d.ts +10 -0
  28. package/dist/contracts/ValidationResult.js +2 -0
  29. package/dist/contracts/ValidationResult.js.map +1 -0
  30. package/package.json +1 -1
  31. package/src/TaskGraph.ts +19 -0
  32. package/src/TaskGraphValidator.ts +126 -0
  33. package/src/TaskRunner.ts +85 -26
  34. package/src/contracts/ITaskGraphValidator.ts +14 -0
  35. package/src/contracts/ValidationError.ts +11 -0
  36. package/src/contracts/ValidationResult.ts +11 -0
  37. package/test-report.xml +51 -23
@@ -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'>51/51</span>
28
+ <span class='fraction'>78/78</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'>27/27</span>
35
+ <span class='fraction'>33/33</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'>12/12</span>
42
+ <span class='fraction'>14/14</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'>48/48</span>
49
+ <span class='fraction'>76/76</span>
50
50
  </div>
51
51
 
52
52
 
@@ -263,7 +263,66 @@
263
263
  <a name='L198'></a><a href='#L198'>198</a>
264
264
  <a name='L199'></a><a href='#L199'>199</a>
265
265
  <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
267
326
  <span class="cline-any cline-neutral">&nbsp;</span>
268
327
  <span class="cline-any cline-neutral">&nbsp;</span>
269
328
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -314,13 +373,16 @@
314
373
  <span class="cline-any cline-neutral">&nbsp;</span>
315
374
  <span class="cline-any cline-neutral">&nbsp;</span>
316
375
  <span class="cline-any cline-neutral">&nbsp;</span>
317
- <span class="cline-any cline-yes">19x</span>
318
- <span class="cline-any cline-yes">19x</span>
319
376
  <span class="cline-any cline-neutral">&nbsp;</span>
320
377
  <span class="cline-any cline-neutral">&nbsp;</span>
378
+ <span class="cline-any cline-yes">22x</span>
379
+ <span class="cline-any cline-yes">22x</span>
380
+ <span class="cline-any cline-yes">22x</span>
321
381
  <span class="cline-any cline-neutral">&nbsp;</span>
322
382
  <span class="cline-any cline-neutral">&nbsp;</span>
323
- <span class="cline-any cline-yes">19x</span>
383
+ <span class="cline-any cline-neutral">&nbsp;</span>
384
+ <span class="cline-any cline-neutral">&nbsp;</span>
385
+ <span class="cline-any cline-yes">22x</span>
324
386
  <span class="cline-any cline-neutral">&nbsp;</span>
325
387
  <span class="cline-any cline-neutral">&nbsp;</span>
326
388
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -367,10 +429,10 @@
367
429
  <span class="cline-any cline-neutral">&nbsp;</span>
368
430
  <span class="cline-any cline-neutral">&nbsp;</span>
369
431
  <span class="cline-any cline-neutral">&nbsp;</span>
370
- <span class="cline-any cline-yes">94x</span>
432
+ <span class="cline-any cline-yes">88x</span>
371
433
  <span class="cline-any cline-neutral">&nbsp;</span>
372
434
  <span class="cline-any cline-neutral">&nbsp;</span>
373
- <span class="cline-any cline-yes">94x</span>
435
+ <span class="cline-any cline-yes">88x</span>
374
436
  <span class="cline-any cline-yes">13x</span>
375
437
  <span class="cline-any cline-yes">13x</span>
376
438
  <span class="cline-any cline-yes">13x</span>
@@ -393,70 +455,126 @@
393
455
  <span class="cline-any cline-neutral">&nbsp;</span>
394
456
  <span class="cline-any cline-neutral">&nbsp;</span>
395
457
  <span class="cline-any cline-neutral">&nbsp;</span>
396
- <span class="cline-any cline-yes">18x</span>
397
458
  <span class="cline-any cline-neutral">&nbsp;</span>
398
- <span class="cline-any cline-yes">18x</span>
459
+ <span class="cline-any cline-yes">21x</span>
460
+ <span class="cline-any cline-yes">43x</span>
399
461
  <span class="cline-any cline-neutral">&nbsp;</span>
400
- <span class="cline-any cline-yes">18x</span>
401
- <span class="cline-any cline-yes">26x</span>
402
- <span class="cline-any cline-yes">80x</span>
403
462
  <span class="cline-any cline-neutral">&nbsp;</span>
404
463
  <span class="cline-any cline-neutral">&nbsp;</span>
405
- <span class="cline-any cline-yes">26x</span>
406
- <span class="cline-any cline-yes">57x</span>
407
- <span class="cline-any cline-yes">57x</span>
408
- <span class="cline-any cline-yes">42x</span>
409
464
  <span class="cline-any cline-neutral">&nbsp;</span>
410
465
  <span class="cline-any cline-neutral">&nbsp;</span>
466
+ <span class="cline-any cline-yes">21x</span>
467
+ <span class="cline-any cline-yes">21x</span>
411
468
  <span class="cline-any cline-neutral">&nbsp;</span>
469
+ <span class="cline-any cline-yes">6x</span>
470
+ <span class="cline-any cline-yes">6x</span>
412
471
  <span class="cline-any cline-neutral">&nbsp;</span>
413
- <span class="cline-any cline-yes">26x</span>
414
- <span class="cline-any cline-yes">57x</span>
415
- <span class="cline-any cline-yes">56x</span>
416
- <span class="cline-any cline-yes">57x</span>
417
- <span class="cline-any cline-yes">45x</span>
472
+ <span class="cline-any cline-yes">6x</span>
473
+ <span class="cline-any cline-yes">6x</span>
474
+ <span class="cline-any cline-yes">6x</span>
418
475
  <span class="cline-any cline-neutral">&nbsp;</span>
419
- <span class="cline-any cline-yes">57x</span>
420
- <span class="cline-any cline-yes">7x</span>
421
476
  <span class="cline-any cline-neutral">&nbsp;</span>
477
+ <span class="cline-any cline-yes">2x</span>
422
478
  <span class="cline-any cline-neutral">&nbsp;</span>
479
+ <span class="cline-any cline-yes">6x</span>
480
+ <span class="cline-any cline-yes">2x</span>
481
+ <span class="cline-any cline-neutral">&nbsp;</span>
482
+ <span class="cline-any cline-neutral">&nbsp;</span>
483
+ <span class="cline-any cline-neutral">&nbsp;</span>
484
+ <span class="cline-any cline-yes">2x</span>
485
+ <span class="cline-any cline-yes">2x</span>
486
+ <span class="cline-any cline-yes">2x</span>
487
+ <span class="cline-any cline-neutral">&nbsp;</span>
488
+ <span class="cline-any cline-neutral">&nbsp;</span>
489
+ <span class="cline-any cline-yes">2x</span>
490
+ <span class="cline-any cline-yes">2x</span>
491
+ <span class="cline-any cline-yes">2x</span>
423
492
  <span class="cline-any cline-neutral">&nbsp;</span>
424
- <span class="cline-any cline-yes">7x</span>
425
- <span class="cline-any cline-yes">7x</span>
426
493
  <span class="cline-any cline-neutral">&nbsp;</span>
427
494
  <span class="cline-any cline-neutral">&nbsp;</span>
428
495
  <span class="cline-any cline-neutral">&nbsp;</span>
429
- <span class="cline-any cline-yes">26x</span>
430
496
  <span class="cline-any cline-neutral">&nbsp;</span>
497
+ <span class="cline-any cline-yes">6x</span>
498
+ <span class="cline-any cline-yes">6x</span>
499
+ <span class="cline-any cline-yes">6x</span>
431
500
  <span class="cline-any cline-neutral">&nbsp;</span>
432
501
  <span class="cline-any cline-neutral">&nbsp;</span>
502
+ <span class="cline-any cline-yes">6x</span>
503
+ <span class="cline-any cline-neutral">&nbsp;</span>
504
+ <span class="cline-any cline-neutral">&nbsp;</span>
505
+ <span class="cline-any cline-yes">15x</span>
506
+ <span class="cline-any cline-neutral">&nbsp;</span>
507
+ <span class="cline-any cline-yes">15x</span>
508
+ <span class="cline-any cline-yes">15x</span>
509
+ <span class="cline-any cline-neutral">&nbsp;</span>
510
+ <span class="cline-any cline-neutral">&nbsp;</span>
511
+ <span class="cline-any cline-yes">15x</span>
512
+ <span class="cline-any cline-yes">35x</span>
513
+ <span class="cline-any cline-yes">98x</span>
433
514
  <span class="cline-any cline-neutral">&nbsp;</span>
515
+ <span class="cline-any cline-neutral">&nbsp;</span>
516
+ <span class="cline-any cline-neutral">&nbsp;</span>
517
+ <span class="cline-any cline-yes">35x</span>
518
+ <span class="cline-any cline-yes">49x</span>
519
+ <span class="cline-any cline-yes">49x</span>
520
+ <span class="cline-any cline-yes">39x</span>
521
+ <span class="cline-any cline-neutral">&nbsp;</span>
522
+ <span class="cline-any cline-yes">49x</span>
523
+ <span class="cline-any cline-yes">6x</span>
524
+ <span class="cline-any cline-neutral">&nbsp;</span>
525
+ <span class="cline-any cline-neutral">&nbsp;</span>
526
+ <span class="cline-any cline-neutral">&nbsp;</span>
527
+ <span class="cline-any cline-yes">6x</span>
434
528
  <span class="cline-any cline-yes">6x</span>
435
- <span class="cline-any cline-yes">3x</span>
436
- <span class="cline-any cline-yes">3x</span>
437
529
  <span class="cline-any cline-neutral">&nbsp;</span>
438
530
  <span class="cline-any cline-neutral">&nbsp;</span>
439
531
  <span class="cline-any cline-neutral">&nbsp;</span>
440
532
  <span class="cline-any cline-neutral">&nbsp;</span>
441
- <span class="cline-any cline-yes">23x</span>
533
+ <span class="cline-any cline-yes">35x</span>
534
+ <span class="cline-any cline-yes">98x</span>
535
+ <span class="cline-any cline-yes">43x</span>
536
+ <span class="cline-any cline-yes">98x</span>
537
+ <span class="cline-any cline-yes">29x</span>
538
+ <span class="cline-any cline-neutral">&nbsp;</span>
539
+ <span class="cline-any cline-neutral">&nbsp;</span>
540
+ <span class="cline-any cline-neutral">&nbsp;</span>
541
+ <span class="cline-any cline-neutral">&nbsp;</span>
542
+ <span class="cline-any cline-yes">35x</span>
543
+ <span class="cline-any cline-yes">26x</span>
544
+ <span class="cline-any cline-yes">26x</span>
442
545
  <span class="cline-any cline-neutral">&nbsp;</span>
443
- <span class="cline-any cline-yes">27x</span>
444
- <span class="cline-any cline-yes">27x</span>
445
- <span class="cline-any cline-yes">27x</span>
446
- <span class="cline-any cline-yes">27x</span>
447
- <span class="cline-any cline-yes">25x</span>
546
+ <span class="cline-any cline-yes">26x</span>
547
+ <span class="cline-any cline-yes">26x</span>
548
+ <span class="cline-any cline-yes">26x</span>
549
+ <span class="cline-any cline-yes">24x</span>
448
550
  <span class="cline-any cline-neutral">&nbsp;</span>
449
551
  <span class="cline-any cline-yes">2x</span>
450
552
  <span class="cline-any cline-neutral">&nbsp;</span>
451
553
  <span class="cline-any cline-neutral">&nbsp;</span>
452
554
  <span class="cline-any cline-neutral">&nbsp;</span>
453
555
  <span class="cline-any cline-neutral">&nbsp;</span>
454
- <span class="cline-any cline-yes">27x</span>
455
- <span class="cline-any cline-yes">27x</span>
456
- <span class="cline-any cline-yes">27x</span>
556
+ <span class="cline-any cline-yes">26x</span>
557
+ <span class="cline-any cline-yes">26x</span>
558
+ <span class="cline-any cline-yes">26x</span>
559
+ <span class="cline-any cline-neutral">&nbsp;</span>
560
+ <span class="cline-any cline-neutral">&nbsp;</span>
457
561
  <span class="cline-any cline-neutral">&nbsp;</span>
458
562
  <span class="cline-any cline-neutral">&nbsp;</span>
563
+ <span class="cline-any cline-yes">26x</span>
564
+ <span class="cline-any cline-yes">26x</span>
459
565
  <span class="cline-any cline-neutral">&nbsp;</span>
566
+ <span class="cline-any cline-yes">26x</span>
567
+ <span class="cline-any cline-neutral">&nbsp;</span>
568
+ <span class="cline-any cline-neutral">&nbsp;</span>
569
+ <span class="cline-any cline-neutral">&nbsp;</span>
570
+ <span class="cline-any cline-neutral">&nbsp;</span>
571
+ <span class="cline-any cline-yes">15x</span>
572
+ <span class="cline-any cline-neutral">&nbsp;</span>
573
+ <span class="cline-any cline-yes">15x</span>
574
+ <span class="cline-any cline-neutral">&nbsp;</span>
575
+ <span class="cline-any cline-yes">20x</span>
576
+ <span class="cline-any cline-neutral">&nbsp;</span>
577
+ <span class="cline-any cline-yes">20x</span>
460
578
  <span class="cline-any cline-neutral">&nbsp;</span>
461
579
  <span class="cline-any cline-neutral">&nbsp;</span>
462
580
  <span class="cline-any cline-yes">15x</span>
@@ -465,6 +583,8 @@
465
583
  <span class="cline-any cline-neutral">&nbsp;</span>
466
584
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { TaskStep } from "./TaskStep.js";
467
585
  import { TaskResult } from "./TaskResult.js";
586
+ import { TaskGraphValidator } from "./TaskGraphValidator.js";
587
+ import { TaskGraph } from "./TaskGraph.js";
468
588
  &nbsp;
469
589
  /**
470
590
  * Define the payload for every possible event in the lifecycle.
@@ -516,6 +636,7 @@ type ListenerMap&lt;TContext&gt; = {
516
636
  export class TaskRunner&lt;TContext&gt; {
517
637
  private running = new Set&lt;string&gt;();
518
638
  private listeners: ListenerMap&lt;TContext&gt; = {};
639
+ private validator = new TaskGraphValidator();
519
640
  &nbsp;
520
641
  /**
521
642
  * @param context The shared context object to be passed to each task.
@@ -593,25 +714,66 @@ export class TaskRunner&lt;TContext&gt; {
593
714
  * and values are the corresponding TaskResult objects.
594
715
  */
595
716
  async execute(steps: TaskStep&lt;TContext&gt;[]): Promise&lt;Map&lt;string, TaskResult&gt;&gt; {
717
+ // Validate the task graph before execution
718
+ const taskGraph: TaskGraph = {
719
+ tasks: steps.map((step) =&gt; ({
720
+ id: step.name,
721
+ dependencies: step.dependencies ?? [],
722
+ })),
723
+ };
724
+ &nbsp;
725
+ const validationResult = this.validator.validate(taskGraph);
726
+ if (!validationResult.isValid) {
727
+ // Construct error message compatible with legacy tests
728
+ const affectedTasks = new Set&lt;string&gt;();
729
+ const errorDetails: string[] = [];
730
+ &nbsp;
731
+ for (const error of validationResult.errors) {
732
+ errorDetails.push(error.message);
733
+ switch (error.type) {
734
+ case "cycle": {
735
+ // details is { cyclePath: string[] }
736
+ const path = (error.details as { cyclePath: string[] }).cyclePath;
737
+ // The last element duplicates the first in the path representation, so valid unique tasks are slice(0, -1) or just all as Set handles uniq
738
+ path.forEach((t) =&gt; affectedTasks.add(t));
739
+ break;
740
+ }
741
+ case "missing_dependency": {
742
+ // details is { taskId: string, missingDependencyId: string }
743
+ const d = error.details as { taskId: string };
744
+ affectedTasks.add(d.taskId);
745
+ break;
746
+ }
747
+ case "duplicate_task": {
748
+ const d = error.details as { taskId: string };
749
+ affectedTasks.add(d.taskId);
750
+ break;
751
+ }
752
+ }
753
+ }
754
+ &nbsp;
755
+ // Legacy error format: "Circular dependency or missing dependency detected. Unable to run tasks: A, B"
756
+ const taskList = Array.from(affectedTasks).join(", ");
757
+ const legacyMessage = `Circular dependency or missing dependency detected. Unable to run tasks: ${taskList}`;
758
+ const detailedMessage = `Task graph validation failed: ${errorDetails.join("; ")}`;
759
+ &nbsp;
760
+ // Combine them to satisfy both legacy tests (checking for legacy message) and new requirements (clear details)
761
+ throw new Error(`${legacyMessage} | ${detailedMessage}`);
762
+ }
763
+ &nbsp;
596
764
  this.emit("workflowStart", { context: this.context, steps });
597
765
  &nbsp;
598
766
  const results = new Map&lt;string, TaskResult&gt;();
767
+ const executingPromises = new Set&lt;Promise&lt;void&gt;&gt;();
599
768
  &nbsp;
600
- while (results.size &lt; steps.length) {
769
+ // Helper to process pending steps and launch ready ones
770
+ const processPendingSteps = () =&gt; {
601
771
  const pendingSteps = steps.filter(
602
772
  (step) =&gt; !results.has(step.name) &amp;&amp; !this.running.has(step.name)
603
773
  );
604
774
  &nbsp;
605
- const readySteps = pendingSteps.filter((step) =&gt; {
606
- const deps = step.dependencies ?? [];
607
- return deps.every(
608
- (dep) =&gt; results.has(dep) &amp;&amp; results.get(dep)?.status === "success"
609
- );
610
- });
611
- &nbsp;
612
- // Skip tasks with failed dependencies
775
+ // 1. Identify and mark skipped tasks
613
776
  for (const step of pendingSteps) {
614
- if (results.has(step.name)) continue;
615
777
  const deps = step.dependencies ?? [];
616
778
  const failedDep = deps.find(
617
779
  (dep) =&gt; results.has(dep) &amp;&amp; results.get(dep)?.status !== "success"
@@ -626,22 +788,21 @@ export class TaskRunner&lt;TContext&gt; {
626
788
  }
627
789
  }
628
790
  &nbsp;
629
- if (
630
- readySteps.length === 0 &amp;&amp;
631
- this.running.size === 0 &amp;&amp;
632
- results.size &lt; steps.length
633
- ) {
634
- const unrunnableSteps = steps.filter((s) =&gt; !results.has(s.name));
635
- const unrunnableStepNames = unrunnableSteps.map((s) =&gt; s.name);
636
- throw new Error(
637
- `Circular dependency or missing dependency detected. Unable to run tasks: ${unrunnableStepNames.join(", ")}`
791
+ // Re-filter pending steps as some might have been skipped above
792
+ const readySteps = steps.filter((step) =&gt; {
793
+ if (results.has(step.name) || this.running.has(step.name)) return false;
794
+ const deps = step.dependencies ?? [];
795
+ return deps.every(
796
+ (dep) =&gt; results.has(dep) &amp;&amp; results.get(dep)?.status === "success"
638
797
  );
639
- }
798
+ });
640
799
  &nbsp;
641
- await Promise.all(
642
- readySteps.map(async (step) =&gt; {
643
- this.running.add(step.name);
644
- this.emit("taskStart", { step });
800
+ // 2. Launch ready tasks
801
+ for (const step of readySteps) {
802
+ this.running.add(step.name);
803
+ this.emit("taskStart", { step });
804
+ &nbsp;
805
+ const taskPromise = (async () =&gt; {
645
806
  try {
646
807
  const result = await step.run(this.context);
647
808
  results.set(step.name, result);
@@ -655,8 +816,24 @@ export class TaskRunner&lt;TContext&gt; {
655
816
  const result = results.get(step.name)!;
656
817
  this.emit("taskEnd", { step, result });
657
818
  }
658
- })
659
- );
819
+ })();
820
+ &nbsp;
821
+ // Wrap the task promise to ensure we can track it in the Set
822
+ const trackedPromise = taskPromise.then(() =&gt; {
823
+ executingPromises.delete(trackedPromise);
824
+ });
825
+ executingPromises.add(trackedPromise);
826
+ }
827
+ };
828
+ &nbsp;
829
+ // Initial check to start independent tasks
830
+ processPendingSteps();
831
+ &nbsp;
832
+ while (results.size &lt; steps.length &amp;&amp; executingPromises.size &gt; 0) {
833
+ // Wait for the next task to finish
834
+ await Promise.race(executingPromises);
835
+ // After a task finishes, check for new work
836
+ processPendingSteps();
660
837
  }
661
838
  &nbsp;
662
839
  this.emit("workflowEnd", { context: this.context, results });
@@ -670,7 +847,7 @@ export class TaskRunner&lt;TContext&gt; {
670
847
  <div class='footer quiet pad2 space-top1 center small'>
671
848
  Code coverage generated by
672
849
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
673
- at 2026-01-18T03:50:46.208Z
850
+ at 2026-01-18T05:09:17.333Z
674
851
  </div>
675
852
  <script src="prettify.js"></script>
676
853
  <script>
@@ -1,2 +1,3 @@
1
- {"/home/runner/work/task-runner/task-runner/src/TaskRunner.ts": {"path":"/home/runner/work/task-runner/task-runner/src/TaskRunner.ts","statementMap":{"0":{"start":{"line":52,"column":20},"end":{"line":52,"column":null}},"1":{"start":{"line":53,"column":45},"end":{"line":53,"column":null}},"2":{"start":{"line":58,"column":22},"end":{"line":58,"column":41}},"3":{"start":{"line":69,"column":4},"end":{"line":73,"column":null}},"4":{"start":{"line":72,"column":6},"end":{"line":72,"column":null}},"5":{"start":{"line":75,"column":5},"end":{"line":77,"column":null}},"6":{"start":{"line":89,"column":4},"end":{"line":93,"column":null}},"7":{"start":{"line":90,"column":7},"end":{"line":92,"column":null}},"8":{"start":{"line":105,"column":22},"end":{"line":105,"column":null}},"9":{"start":{"line":108,"column":4},"end":{"line":120,"column":null}},"10":{"start":{"line":109,"column":6},"end":{"line":119,"column":null}},"11":{"start":{"line":110,"column":8},"end":{"line":118,"column":null}},"12":{"start":{"line":111,"column":10},"end":{"line":111,"column":null}},"13":{"start":{"line":114,"column":10},"end":{"line":117,"column":null}},"14":{"start":{"line":131,"column":4},"end":{"line":131,"column":null}},"15":{"start":{"line":133,"column":20},"end":{"line":133,"column":null}},"16":{"start":{"line":135,"column":4},"end":{"line":195,"column":null}},"17":{"start":{"line":136,"column":27},"end":{"line":138,"column":null}},"18":{"start":{"line":137,"column":18},"end":{"line":137,"column":null}},"19":{"start":{"line":140,"column":25},"end":{"line":145,"column":null}},"20":{"start":{"line":141,"column":21},"end":{"line":141,"column":null}},"21":{"start":{"line":142,"column":8},"end":{"line":144,"column":null}},"22":{"start":{"line":143,"column":19},"end":{"line":143,"column":null}},"23":{"start":{"line":148,"column":6},"end":{"line":162,"column":null}},"24":{"start":{"line":149,"column":8},"end":{"line":149,"column":null}},"25":{"start":{"line":149,"column":36},"end":{"line":149,"column":null}},"26":{"start":{"line":150,"column":21},"end":{"line":150,"column":null}},"27":{"start":{"line":151,"column":26},"end":{"line":153,"column":null}},"28":{"start":{"line":152,"column":19},"end":{"line":152,"column":null}},"29":{"start":{"line":154,"column":8},"end":{"line":161,"column":null}},"30":{"start":{"line":155,"column":37},"end":{"line":158,"column":null}},"31":{"start":{"line":159,"column":10},"end":{"line":159,"column":null}},"32":{"start":{"line":160,"column":10},"end":{"line":160,"column":null}},"33":{"start":{"line":164,"column":6},"end":{"line":174,"column":null}},"34":{"start":{"line":169,"column":32},"end":{"line":169,"column":null}},"35":{"start":{"line":169,"column":52},"end":{"line":169,"column":72}},"36":{"start":{"line":170,"column":36},"end":{"line":170,"column":null}},"37":{"start":{"line":170,"column":63},"end":{"line":170,"column":69}},"38":{"start":{"line":171,"column":8},"end":{"line":173,"column":null}},"39":{"start":{"line":176,"column":6},"end":{"line":194,"column":null}},"40":{"start":{"line":178,"column":10},"end":{"line":178,"column":null}},"41":{"start":{"line":179,"column":10},"end":{"line":179,"column":null}},"42":{"start":{"line":180,"column":10},"end":{"line":192,"column":null}},"43":{"start":{"line":181,"column":27},"end":{"line":181,"column":null}},"44":{"start":{"line":182,"column":12},"end":{"line":182,"column":null}},"45":{"start":{"line":184,"column":12},"end":{"line":187,"column":null}},"46":{"start":{"line":189,"column":12},"end":{"line":189,"column":null}},"47":{"start":{"line":190,"column":27},"end":{"line":190,"column":null}},"48":{"start":{"line":191,"column":12},"end":{"line":191,"column":null}},"49":{"start":{"line":197,"column":4},"end":{"line":197,"column":null}},"50":{"start":{"line":198,"column":4},"end":{"line":198,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":58,"column":2},"end":{"line":58,"column":22}},"loc":{"start":{"line":58,"column":41},"end":{"line":58,"column":null}},"line":58},"1":{"name":"(anonymous_1)","decl":{"start":{"line":65,"column":9},"end":{"line":65,"column":null}},"loc":{"start":{"line":68,"column":10},"end":{"line":78,"column":null}},"line":68},"2":{"name":"(anonymous_2)","decl":{"start":{"line":85,"column":9},"end":{"line":85,"column":null}},"loc":{"start":{"line":88,"column":10},"end":{"line":94,"column":null}},"line":88},"3":{"name":"(anonymous_3)","decl":{"start":{"line":101,"column":10},"end":{"line":101,"column":null}},"loc":{"start":{"line":104,"column":10},"end":{"line":121,"column":null}},"line":104},"4":{"name":"(anonymous_4)","decl":{"start":{"line":130,"column":8},"end":{"line":130,"column":16}},"loc":{"start":{"line":130,"column":79},"end":{"line":199,"column":null}},"line":130},"5":{"name":"(anonymous_5)","decl":{"start":{"line":137,"column":8},"end":{"line":137,"column":9}},"loc":{"start":{"line":137,"column":18},"end":{"line":137,"column":null}},"line":137},"6":{"name":"(anonymous_6)","decl":{"start":{"line":140,"column":45},"end":{"line":140,"column":46}},"loc":{"start":{"line":140,"column":55},"end":{"line":145,"column":7}},"line":140},"7":{"name":"(anonymous_7)","decl":{"start":{"line":143,"column":10},"end":{"line":143,"column":11}},"loc":{"start":{"line":143,"column":19},"end":{"line":143,"column":null}},"line":143},"8":{"name":"(anonymous_8)","decl":{"start":{"line":152,"column":10},"end":{"line":152,"column":11}},"loc":{"start":{"line":152,"column":19},"end":{"line":152,"column":null}},"line":152},"9":{"name":"(anonymous_9)","decl":{"start":{"line":169,"column":45},"end":{"line":169,"column":46}},"loc":{"start":{"line":169,"column":52},"end":{"line":169,"column":72}},"line":169},"10":{"name":"(anonymous_10)","decl":{"start":{"line":170,"column":56},"end":{"line":170,"column":57}},"loc":{"start":{"line":170,"column":63},"end":{"line":170,"column":69}},"line":170},"11":{"name":"(anonymous_11)","decl":{"start":{"line":177,"column":23},"end":{"line":177,"column":30}},"loc":{"start":{"line":177,"column":39},"end":{"line":193,"column":9}},"line":177}},"branchMap":{"0":{"loc":{"start":{"line":69,"column":4},"end":{"line":73,"column":null}},"type":"if","locations":[{"start":{"line":69,"column":4},"end":{"line":73,"column":null}},{"start":{},"end":{}}],"line":69},"1":{"loc":{"start":{"line":89,"column":4},"end":{"line":93,"column":null}},"type":"if","locations":[{"start":{"line":89,"column":4},"end":{"line":93,"column":null}},{"start":{},"end":{}}],"line":89},"2":{"loc":{"start":{"line":108,"column":4},"end":{"line":120,"column":null}},"type":"if","locations":[{"start":{"line":108,"column":4},"end":{"line":120,"column":null}},{"start":{},"end":{}}],"line":108},"3":{"loc":{"start":{"line":137,"column":18},"end":{"line":137,"column":null}},"type":"binary-expr","locations":[{"start":{"line":137,"column":18},"end":{"line":137,"column":45}},{"start":{"line":137,"column":45},"end":{"line":137,"column":null}}],"line":137},"4":{"loc":{"start":{"line":141,"column":21},"end":{"line":141,"column":null}},"type":"binary-expr","locations":[{"start":{"line":141,"column":21},"end":{"line":141,"column":42}},{"start":{"line":141,"column":42},"end":{"line":141,"column":null}}],"line":141},"5":{"loc":{"start":{"line":143,"column":19},"end":{"line":143,"column":null}},"type":"binary-expr","locations":[{"start":{"line":143,"column":19},"end":{"line":143,"column":39}},{"start":{"line":143,"column":39},"end":{"line":143,"column":null}}],"line":143},"6":{"loc":{"start":{"line":149,"column":8},"end":{"line":149,"column":null}},"type":"if","locations":[{"start":{"line":149,"column":8},"end":{"line":149,"column":null}},{"start":{},"end":{}}],"line":149},"7":{"loc":{"start":{"line":150,"column":21},"end":{"line":150,"column":null}},"type":"binary-expr","locations":[{"start":{"line":150,"column":21},"end":{"line":150,"column":42}},{"start":{"line":150,"column":42},"end":{"line":150,"column":null}}],"line":150},"8":{"loc":{"start":{"line":152,"column":19},"end":{"line":152,"column":null}},"type":"binary-expr","locations":[{"start":{"line":152,"column":19},"end":{"line":152,"column":39}},{"start":{"line":152,"column":39},"end":{"line":152,"column":null}}],"line":152},"9":{"loc":{"start":{"line":154,"column":8},"end":{"line":161,"column":null}},"type":"if","locations":[{"start":{"line":154,"column":8},"end":{"line":161,"column":null}},{"start":{},"end":{}}],"line":154},"10":{"loc":{"start":{"line":164,"column":6},"end":{"line":174,"column":null}},"type":"if","locations":[{"start":{"line":164,"column":6},"end":{"line":174,"column":null}},{"start":{},"end":{}}],"line":164},"11":{"loc":{"start":{"line":165,"column":8},"end":{"line":167,"column":null}},"type":"binary-expr","locations":[{"start":{"line":165,"column":8},"end":{"line":165,"column":null}},{"start":{"line":166,"column":8},"end":{"line":166,"column":null}},{"start":{"line":167,"column":8},"end":{"line":167,"column":null}}],"line":165},"12":{"loc":{"start":{"line":186,"column":21},"end":{"line":186,"column":null}},"type":"cond-expr","locations":[{"start":{"line":186,"column":42},"end":{"line":186,"column":54}},{"start":{"line":186,"column":54},"end":{"line":186,"column":null}}],"line":186}},"s":{"0":19,"1":19,"2":19,"3":12,"4":11,"5":12,"6":2,"7":1,"8":94,"9":94,"10":13,"11":13,"12":13,"13":1,"14":18,"15":18,"16":18,"17":26,"18":80,"19":26,"20":57,"21":57,"22":42,"23":26,"24":57,"25":1,"26":56,"27":57,"28":45,"29":57,"30":7,"31":7,"32":7,"33":26,"34":3,"35":6,"36":3,"37":3,"38":3,"39":23,"40":27,"41":27,"42":27,"43":27,"44":25,"45":2,"46":27,"47":27,"48":27,"49":15,"50":15},"f":{"0":19,"1":12,"2":2,"3":94,"4":18,"5":80,"6":57,"7":42,"8":45,"9":6,"10":3,"11":27},"b":{"0":[11,1],"1":[1,1],"2":[13,81],"3":[80,57],"4":[57,19],"5":[42,19],"6":[1,56],"7":[56,19],"8":[45,19],"9":[7,50],"10":[3,23],"11":[26,6,6],"12":[1,1]},"meta":{"lastBranch":13,"lastFunction":12,"lastStatement":51,"seen":{"s:52:20:52:Infinity":0,"s:53:45:53:Infinity":1,"f:58:2:58:22":0,"s:58:22:58:41":2,"f:65:9:65:Infinity":1,"b:69:4:73:Infinity:undefined:undefined:undefined:undefined":0,"s:69:4:73:Infinity":3,"s:72:6:72:Infinity":4,"s:75:5:77:Infinity":5,"f:85:9:85:Infinity":2,"b:89:4:93:Infinity:undefined:undefined:undefined:undefined":1,"s:89:4:93:Infinity":6,"s:90:7:92:Infinity":7,"f:101:10:101:Infinity":3,"s:105:22:105:Infinity":8,"b:108:4:120:Infinity:undefined:undefined:undefined:undefined":2,"s:108:4:120:Infinity":9,"s:109:6:119:Infinity":10,"s:110:8:118:Infinity":11,"s:111:10:111:Infinity":12,"s:114:10:117:Infinity":13,"f:130:8:130:16":4,"s:131:4:131:Infinity":14,"s:133:20:133:Infinity":15,"s:135:4:195:Infinity":16,"s:136:27:138:Infinity":17,"f:137:8:137:9":5,"s:137:18:137:Infinity":18,"b:137:18:137:45:137:45:137:Infinity":3,"s:140:25:145:Infinity":19,"f:140:45:140:46":6,"s:141:21:141:Infinity":20,"b:141:21:141:42:141:42:141:Infinity":4,"s:142:8:144:Infinity":21,"f:143:10:143:11":7,"s:143:19:143:Infinity":22,"b:143:19:143:39:143:39:143:Infinity":5,"s:148:6:162:Infinity":23,"b:149:8:149:Infinity:undefined:undefined:undefined:undefined":6,"s:149:8:149:Infinity":24,"s:149:36:149:Infinity":25,"s:150:21:150:Infinity":26,"b:150:21:150:42:150:42:150:Infinity":7,"s:151:26:153:Infinity":27,"f:152:10:152:11":8,"s:152:19:152:Infinity":28,"b:152:19:152:39:152:39:152:Infinity":8,"b:154:8:161:Infinity:undefined:undefined:undefined:undefined":9,"s:154:8:161:Infinity":29,"s:155:37:158:Infinity":30,"s:159:10:159:Infinity":31,"s:160:10:160:Infinity":32,"b:164:6:174:Infinity:undefined:undefined:undefined:undefined":10,"s:164:6:174:Infinity":33,"b:165:8:165:Infinity:166:8:166:Infinity:167:8:167:Infinity":11,"s:169:32:169:Infinity":34,"f:169:45:169:46":9,"s:169:52:169:72":35,"s:170:36:170:Infinity":36,"f:170:56:170:57":10,"s:170:63:170:69":37,"s:171:8:173:Infinity":38,"s:176:6:194:Infinity":39,"f:177:23:177:30":11,"s:178:10:178:Infinity":40,"s:179:10:179:Infinity":41,"s:180:10:192:Infinity":42,"s:181:27:181:Infinity":43,"s:182:12:182:Infinity":44,"s:184:12:187:Infinity":45,"b:186:42:186:54:186:54:186:Infinity":12,"s:189:12:189:Infinity":46,"s:190:27:190:Infinity":47,"s:191:12:191:Infinity":48,"s:197:4:197:Infinity":49,"s:198:4:198:Infinity":50}}}
1
+ {"/home/runner/work/task-runner/task-runner/src/TaskGraphValidator.ts": {"path":"/home/runner/work/task-runner/task-runner/src/TaskGraphValidator.ts","statementMap":{"0":{"start":{"line":18,"column":42},"end":{"line":18,"column":null}},"1":{"start":{"line":21,"column":24},"end":{"line":21,"column":null}},"2":{"start":{"line":22,"column":8},"end":{"line":32,"column":null}},"3":{"start":{"line":23,"column":12},"end":{"line":31,"column":null}},"4":{"start":{"line":24,"column":16},"end":{"line":28,"column":null}},"5":{"start":{"line":30,"column":16},"end":{"line":30,"column":null}},"6":{"start":{"line":35,"column":8},"end":{"line":45,"column":null}},"7":{"start":{"line":36,"column":12},"end":{"line":44,"column":null}},"8":{"start":{"line":37,"column":16},"end":{"line":43,"column":null}},"9":{"start":{"line":38,"column":20},"end":{"line":42,"column":null}},"10":{"start":{"line":49,"column":39},"end":{"line":49,"column":null}},"11":{"start":{"line":49,"column":56},"end":{"line":49,"column":87}},"12":{"start":{"line":51,"column":8},"end":{"line":56,"column":null}},"13":{"start":{"line":52,"column":12},"end":{"line":55,"column":null}},"14":{"start":{"line":59,"column":30},"end":{"line":59,"column":null}},"15":{"start":{"line":60,"column":8},"end":{"line":62,"column":null}},"16":{"start":{"line":61,"column":12},"end":{"line":61,"column":null}},"17":{"start":{"line":64,"column":24},"end":{"line":64,"column":null}},"18":{"start":{"line":65,"column":31},"end":{"line":65,"column":null}},"19":{"start":{"line":67,"column":8},"end":{"line":88,"column":null}},"20":{"start":{"line":68,"column":12},"end":{"line":70,"column":null}},"21":{"start":{"line":69,"column":16},"end":{"line":69,"column":null}},"22":{"start":{"line":72,"column":35},"end":{"line":72,"column":null}},"23":{"start":{"line":73,"column":12},"end":{"line":87,"column":null}},"24":{"start":{"line":76,"column":35},"end":{"line":76,"column":null}},"25":{"start":{"line":77,"column":40},"end":{"line":77,"column":null}},"26":{"start":{"line":78,"column":34},"end":{"line":78,"column":null}},"27":{"start":{"line":80,"column":16},"end":{"line":84,"column":null}},"28":{"start":{"line":86,"column":16},"end":{"line":86,"column":null}},"29":{"start":{"line":90,"column":8},"end":{"line":93,"column":null}},"30":{"start":{"line":103,"column":8},"end":{"line":103,"column":null}},"31":{"start":{"line":104,"column":8},"end":{"line":104,"column":null}},"32":{"start":{"line":105,"column":8},"end":{"line":105,"column":null}},"33":{"start":{"line":107,"column":29},"end":{"line":107,"column":null}},"34":{"start":{"line":108,"column":8},"end":{"line":120,"column":null}},"35":{"start":{"line":109,"column":12},"end":{"line":119,"column":null}},"36":{"start":{"line":113,"column":16},"end":{"line":113,"column":null}},"37":{"start":{"line":114,"column":12},"end":{"line":119,"column":null}},"38":{"start":{"line":117,"column":16},"end":{"line":117,"column":null}},"39":{"start":{"line":118,"column":16},"end":{"line":118,"column":null}},"40":{"start":{"line":122,"column":8},"end":{"line":122,"column":null}},"41":{"start":{"line":123,"column":8},"end":{"line":123,"column":null}},"42":{"start":{"line":124,"column":8},"end":{"line":124,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":17,"column":4},"end":{"line":17,"column":13}},"loc":{"start":{"line":17,"column":53},"end":{"line":94,"column":null}},"line":17},"1":{"name":"(anonymous_1)","decl":{"start":{"line":49,"column":51},"end":{"line":49,"column":56}},"loc":{"start":{"line":49,"column":56},"end":{"line":49,"column":87}},"line":49},"2":{"name":"(anonymous_2)","decl":{"start":{"line":96,"column":12},"end":{"line":96,"column":null}},"loc":{"start":{"line":102,"column":15},"end":{"line":125,"column":null}},"line":102}},"branchMap":{"0":{"loc":{"start":{"line":23,"column":12},"end":{"line":31,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":12},"end":{"line":31,"column":null}},{"start":{"line":29,"column":19},"end":{"line":31,"column":null}}],"line":23},"1":{"loc":{"start":{"line":37,"column":16},"end":{"line":43,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":16},"end":{"line":43,"column":null}},{"start":{},"end":{}}],"line":37},"2":{"loc":{"start":{"line":51,"column":8},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":51,"column":8},"end":{"line":56,"column":null}},{"start":{},"end":{}}],"line":51},"3":{"loc":{"start":{"line":68,"column":12},"end":{"line":70,"column":null}},"type":"if","locations":[{"start":{"line":68,"column":12},"end":{"line":70,"column":null}},{"start":{},"end":{}}],"line":68},"4":{"loc":{"start":{"line":73,"column":12},"end":{"line":87,"column":null}},"type":"if","locations":[{"start":{"line":73,"column":12},"end":{"line":87,"column":null}},{"start":{},"end":{}}],"line":73},"5":{"loc":{"start":{"line":109,"column":12},"end":{"line":119,"column":null}},"type":"if","locations":[{"start":{"line":109,"column":12},"end":{"line":119,"column":null}},{"start":{"line":114,"column":12},"end":{"line":119,"column":null}}],"line":109},"6":{"loc":{"start":{"line":110,"column":16},"end":{"line":111,"column":null}},"type":"binary-expr","locations":[{"start":{"line":110,"column":16},"end":{"line":110,"column":null}},{"start":{"line":111,"column":16},"end":{"line":111,"column":null}}],"line":110},"7":{"loc":{"start":{"line":114,"column":12},"end":{"line":119,"column":null}},"type":"if","locations":[{"start":{"line":114,"column":12},"end":{"line":119,"column":null}},{"start":{},"end":{}}],"line":114}},"s":{"0":29,"1":29,"2":29,"3":61,"4":3,"5":58,"6":29,"7":61,"8":41,"9":5,"10":29,"11":7,"12":29,"13":4,"14":25,"15":25,"16":54,"17":25,"18":25,"19":25,"20":49,"21":3,"22":46,"23":46,"24":4,"25":4,"26":4,"27":4,"28":4,"29":25,"30":51,"31":51,"32":51,"33":51,"34":51,"35":33,"36":5,"37":28,"38":4,"39":4,"40":42,"41":42,"42":42},"f":{"0":29,"1":7,"2":51},"b":{"0":[3,58],"1":[5,36],"2":[4,25],"3":[3,46],"4":[4,42],"5":[5,28],"6":[33,5],"7":[4,24]},"meta":{"lastBranch":8,"lastFunction":3,"lastStatement":43,"seen":{"f:17:4:17:13":0,"s:18:42:18:Infinity":0,"s:21:24:21:Infinity":1,"s:22:8:32:Infinity":2,"b:23:12:31:Infinity:29:19:31:Infinity":0,"s:23:12:31:Infinity":3,"s:24:16:28:Infinity":4,"s:30:16:30:Infinity":5,"s:35:8:45:Infinity":6,"s:36:12:44:Infinity":7,"b:37:16:43:Infinity:undefined:undefined:undefined:undefined":1,"s:37:16:43:Infinity":8,"s:38:20:42:Infinity":9,"s:49:39:49:Infinity":10,"f:49:51:49:56":1,"s:49:56:49:87":11,"b:51:8:56:Infinity:undefined:undefined:undefined:undefined":2,"s:51:8:56:Infinity":12,"s:52:12:55:Infinity":13,"s:59:30:59:Infinity":14,"s:60:8:62:Infinity":15,"s:61:12:61:Infinity":16,"s:64:24:64:Infinity":17,"s:65:31:65:Infinity":18,"s:67:8:88:Infinity":19,"b:68:12:70:Infinity:undefined:undefined:undefined:undefined":3,"s:68:12:70:Infinity":20,"s:69:16:69:Infinity":21,"s:72:35:72:Infinity":22,"b:73:12:87:Infinity:undefined:undefined:undefined:undefined":4,"s:73:12:87:Infinity":23,"s:76:35:76:Infinity":24,"s:77:40:77:Infinity":25,"s:78:34:78:Infinity":26,"s:80:16:84:Infinity":27,"s:86:16:86:Infinity":28,"s:90:8:93:Infinity":29,"f:96:12:96:Infinity":2,"s:103:8:103:Infinity":30,"s:104:8:104:Infinity":31,"s:105:8:105:Infinity":32,"s:107:29:107:Infinity":33,"s:108:8:120:Infinity":34,"b:109:12:119:Infinity:114:12:119:Infinity":5,"s:109:12:119:Infinity":35,"b:110:16:110:Infinity:111:16:111:Infinity":6,"s:113:16:113:Infinity":36,"b:114:12:119:Infinity:undefined:undefined:undefined:undefined":7,"s:114:12:119:Infinity":37,"s:117:16:117:Infinity":38,"s:118:16:118:Infinity":39,"s:122:8:122:Infinity":40,"s:123:8:123:Infinity":41,"s:124:8:124:Infinity":42}}}
2
+ ,"/home/runner/work/task-runner/task-runner/src/TaskRunner.ts": {"path":"/home/runner/work/task-runner/task-runner/src/TaskRunner.ts","statementMap":{"0":{"start":{"line":54,"column":20},"end":{"line":54,"column":null}},"1":{"start":{"line":55,"column":45},"end":{"line":55,"column":null}},"2":{"start":{"line":56,"column":22},"end":{"line":56,"column":null}},"3":{"start":{"line":61,"column":22},"end":{"line":61,"column":41}},"4":{"start":{"line":72,"column":4},"end":{"line":76,"column":null}},"5":{"start":{"line":75,"column":6},"end":{"line":75,"column":null}},"6":{"start":{"line":78,"column":5},"end":{"line":80,"column":null}},"7":{"start":{"line":92,"column":4},"end":{"line":96,"column":null}},"8":{"start":{"line":93,"column":7},"end":{"line":95,"column":null}},"9":{"start":{"line":108,"column":22},"end":{"line":108,"column":null}},"10":{"start":{"line":111,"column":4},"end":{"line":123,"column":null}},"11":{"start":{"line":112,"column":6},"end":{"line":122,"column":null}},"12":{"start":{"line":113,"column":8},"end":{"line":121,"column":null}},"13":{"start":{"line":114,"column":10},"end":{"line":114,"column":null}},"14":{"start":{"line":117,"column":10},"end":{"line":120,"column":null}},"15":{"start":{"line":135,"column":33},"end":{"line":140,"column":null}},"16":{"start":{"line":136,"column":34},"end":{"line":139,"column":8}},"17":{"start":{"line":142,"column":29},"end":{"line":142,"column":null}},"18":{"start":{"line":143,"column":4},"end":{"line":179,"column":null}},"19":{"start":{"line":145,"column":28},"end":{"line":145,"column":null}},"20":{"start":{"line":146,"column":37},"end":{"line":146,"column":null}},"21":{"start":{"line":148,"column":6},"end":{"line":170,"column":null}},"22":{"start":{"line":149,"column":8},"end":{"line":149,"column":null}},"23":{"start":{"line":150,"column":8},"end":{"line":169,"column":null}},"24":{"start":{"line":153,"column":26},"end":{"line":153,"column":null}},"25":{"start":{"line":155,"column":12},"end":{"line":155,"column":null}},"26":{"start":{"line":155,"column":32},"end":{"line":155,"column":52}},"27":{"start":{"line":156,"column":12},"end":{"line":156,"column":null}},"28":{"start":{"line":160,"column":22},"end":{"line":160,"column":null}},"29":{"start":{"line":161,"column":12},"end":{"line":161,"column":null}},"30":{"start":{"line":162,"column":12},"end":{"line":162,"column":null}},"31":{"start":{"line":165,"column":22},"end":{"line":165,"column":null}},"32":{"start":{"line":166,"column":12},"end":{"line":166,"column":null}},"33":{"start":{"line":167,"column":12},"end":{"line":167,"column":null}},"34":{"start":{"line":173,"column":23},"end":{"line":173,"column":null}},"35":{"start":{"line":174,"column":28},"end":{"line":174,"column":null}},"36":{"start":{"line":175,"column":30},"end":{"line":175,"column":null}},"37":{"start":{"line":178,"column":6},"end":{"line":178,"column":null}},"38":{"start":{"line":181,"column":4},"end":{"line":181,"column":null}},"39":{"start":{"line":183,"column":20},"end":{"line":183,"column":null}},"40":{"start":{"line":184,"column":30},"end":{"line":184,"column":null}},"41":{"start":{"line":187,"column":32},"end":{"line":244,"column":null}},"42":{"start":{"line":188,"column":27},"end":{"line":190,"column":null}},"43":{"start":{"line":189,"column":18},"end":{"line":189,"column":null}},"44":{"start":{"line":193,"column":6},"end":{"line":206,"column":null}},"45":{"start":{"line":194,"column":21},"end":{"line":194,"column":null}},"46":{"start":{"line":195,"column":26},"end":{"line":197,"column":null}},"47":{"start":{"line":196,"column":19},"end":{"line":196,"column":null}},"48":{"start":{"line":198,"column":8},"end":{"line":205,"column":null}},"49":{"start":{"line":199,"column":37},"end":{"line":202,"column":null}},"50":{"start":{"line":203,"column":10},"end":{"line":203,"column":null}},"51":{"start":{"line":204,"column":10},"end":{"line":204,"column":null}},"52":{"start":{"line":209,"column":25},"end":{"line":215,"column":null}},"53":{"start":{"line":210,"column":8},"end":{"line":210,"column":null}},"54":{"start":{"line":210,"column":67},"end":{"line":210,"column":null}},"55":{"start":{"line":211,"column":21},"end":{"line":211,"column":null}},"56":{"start":{"line":212,"column":8},"end":{"line":214,"column":null}},"57":{"start":{"line":213,"column":19},"end":{"line":213,"column":null}},"58":{"start":{"line":218,"column":6},"end":{"line":243,"column":null}},"59":{"start":{"line":219,"column":8},"end":{"line":219,"column":null}},"60":{"start":{"line":220,"column":8},"end":{"line":220,"column":null}},"61":{"start":{"line":222,"column":14},"end":{"line":236,"column":null}},"62":{"start":{"line":223,"column":10},"end":{"line":235,"column":null}},"63":{"start":{"line":224,"column":27},"end":{"line":224,"column":null}},"64":{"start":{"line":225,"column":12},"end":{"line":225,"column":null}},"65":{"start":{"line":227,"column":12},"end":{"line":230,"column":null}},"66":{"start":{"line":232,"column":12},"end":{"line":232,"column":null}},"67":{"start":{"line":233,"column":27},"end":{"line":233,"column":null}},"68":{"start":{"line":234,"column":12},"end":{"line":234,"column":null}},"69":{"start":{"line":239,"column":31},"end":{"line":241,"column":null}},"70":{"start":{"line":240,"column":10},"end":{"line":240,"column":null}},"71":{"start":{"line":242,"column":8},"end":{"line":242,"column":null}},"72":{"start":{"line":247,"column":4},"end":{"line":247,"column":null}},"73":{"start":{"line":249,"column":4},"end":{"line":254,"column":null}},"74":{"start":{"line":251,"column":6},"end":{"line":251,"column":null}},"75":{"start":{"line":253,"column":6},"end":{"line":253,"column":null}},"76":{"start":{"line":256,"column":4},"end":{"line":256,"column":null}},"77":{"start":{"line":257,"column":4},"end":{"line":257,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":61,"column":2},"end":{"line":61,"column":22}},"loc":{"start":{"line":61,"column":41},"end":{"line":61,"column":null}},"line":61},"1":{"name":"(anonymous_1)","decl":{"start":{"line":68,"column":9},"end":{"line":68,"column":null}},"loc":{"start":{"line":71,"column":10},"end":{"line":81,"column":null}},"line":71},"2":{"name":"(anonymous_2)","decl":{"start":{"line":88,"column":9},"end":{"line":88,"column":null}},"loc":{"start":{"line":91,"column":10},"end":{"line":97,"column":null}},"line":91},"3":{"name":"(anonymous_3)","decl":{"start":{"line":104,"column":10},"end":{"line":104,"column":null}},"loc":{"start":{"line":107,"column":10},"end":{"line":124,"column":null}},"line":107},"4":{"name":"(anonymous_4)","decl":{"start":{"line":133,"column":8},"end":{"line":133,"column":16}},"loc":{"start":{"line":133,"column":79},"end":{"line":258,"column":null}},"line":133},"5":{"name":"(anonymous_5)","decl":{"start":{"line":136,"column":23},"end":{"line":136,"column":24}},"loc":{"start":{"line":136,"column":34},"end":{"line":139,"column":8}},"line":136},"6":{"name":"(anonymous_6)","decl":{"start":{"line":155,"column":25},"end":{"line":155,"column":26}},"loc":{"start":{"line":155,"column":32},"end":{"line":155,"column":52}},"line":155},"7":{"name":"(anonymous_7)","decl":{"start":{"line":187,"column":32},"end":{"line":187,"column":38}},"loc":{"start":{"line":187,"column":38},"end":{"line":244,"column":null}},"line":187},"8":{"name":"(anonymous_8)","decl":{"start":{"line":189,"column":8},"end":{"line":189,"column":9}},"loc":{"start":{"line":189,"column":18},"end":{"line":189,"column":null}},"line":189},"9":{"name":"(anonymous_9)","decl":{"start":{"line":196,"column":10},"end":{"line":196,"column":11}},"loc":{"start":{"line":196,"column":19},"end":{"line":196,"column":null}},"line":196},"10":{"name":"(anonymous_10)","decl":{"start":{"line":209,"column":38},"end":{"line":209,"column":39}},"loc":{"start":{"line":209,"column":48},"end":{"line":215,"column":7}},"line":209},"11":{"name":"(anonymous_11)","decl":{"start":{"line":213,"column":10},"end":{"line":213,"column":11}},"loc":{"start":{"line":213,"column":19},"end":{"line":213,"column":null}},"line":213},"12":{"name":"(anonymous_12)","decl":{"start":{"line":222,"column":29},"end":{"line":222,"column":41}},"loc":{"start":{"line":222,"column":41},"end":{"line":236,"column":11}},"line":222},"13":{"name":"(anonymous_13)","decl":{"start":{"line":239,"column":48},"end":{"line":239,"column":54}},"loc":{"start":{"line":239,"column":54},"end":{"line":241,"column":9}},"line":239}},"branchMap":{"0":{"loc":{"start":{"line":72,"column":4},"end":{"line":76,"column":null}},"type":"if","locations":[{"start":{"line":72,"column":4},"end":{"line":76,"column":null}},{"start":{},"end":{}}],"line":72},"1":{"loc":{"start":{"line":92,"column":4},"end":{"line":96,"column":null}},"type":"if","locations":[{"start":{"line":92,"column":4},"end":{"line":96,"column":null}},{"start":{},"end":{}}],"line":92},"2":{"loc":{"start":{"line":111,"column":4},"end":{"line":123,"column":null}},"type":"if","locations":[{"start":{"line":111,"column":4},"end":{"line":123,"column":null}},{"start":{},"end":{}}],"line":111},"3":{"loc":{"start":{"line":138,"column":22},"end":{"line":138,"column":null}},"type":"binary-expr","locations":[{"start":{"line":138,"column":22},"end":{"line":138,"column":43}},{"start":{"line":138,"column":43},"end":{"line":138,"column":null}}],"line":138},"4":{"loc":{"start":{"line":143,"column":4},"end":{"line":179,"column":null}},"type":"if","locations":[{"start":{"line":143,"column":4},"end":{"line":179,"column":null}},{"start":{},"end":{}}],"line":143},"5":{"loc":{"start":{"line":150,"column":8},"end":{"line":169,"column":null}},"type":"switch","locations":[{"start":{"line":151,"column":10},"end":{"line":157,"column":null}},{"start":{"line":158,"column":10},"end":{"line":163,"column":null}},{"start":{"line":164,"column":10},"end":{"line":168,"column":null}}],"line":150},"6":{"loc":{"start":{"line":189,"column":18},"end":{"line":189,"column":null}},"type":"binary-expr","locations":[{"start":{"line":189,"column":18},"end":{"line":189,"column":45}},{"start":{"line":189,"column":45},"end":{"line":189,"column":null}}],"line":189},"7":{"loc":{"start":{"line":194,"column":21},"end":{"line":194,"column":null}},"type":"binary-expr","locations":[{"start":{"line":194,"column":21},"end":{"line":194,"column":42}},{"start":{"line":194,"column":42},"end":{"line":194,"column":null}}],"line":194},"8":{"loc":{"start":{"line":196,"column":19},"end":{"line":196,"column":null}},"type":"binary-expr","locations":[{"start":{"line":196,"column":19},"end":{"line":196,"column":39}},{"start":{"line":196,"column":39},"end":{"line":196,"column":null}}],"line":196},"9":{"loc":{"start":{"line":198,"column":8},"end":{"line":205,"column":null}},"type":"if","locations":[{"start":{"line":198,"column":8},"end":{"line":205,"column":null}},{"start":{},"end":{}}],"line":198},"10":{"loc":{"start":{"line":210,"column":8},"end":{"line":210,"column":null}},"type":"if","locations":[{"start":{"line":210,"column":8},"end":{"line":210,"column":null}},{"start":{},"end":{}}],"line":210},"11":{"loc":{"start":{"line":210,"column":12},"end":{"line":210,"column":67}},"type":"binary-expr","locations":[{"start":{"line":210,"column":12},"end":{"line":210,"column":38}},{"start":{"line":210,"column":38},"end":{"line":210,"column":67}}],"line":210},"12":{"loc":{"start":{"line":211,"column":21},"end":{"line":211,"column":null}},"type":"binary-expr","locations":[{"start":{"line":211,"column":21},"end":{"line":211,"column":42}},{"start":{"line":211,"column":42},"end":{"line":211,"column":null}}],"line":211},"13":{"loc":{"start":{"line":213,"column":19},"end":{"line":213,"column":null}},"type":"binary-expr","locations":[{"start":{"line":213,"column":19},"end":{"line":213,"column":39}},{"start":{"line":213,"column":39},"end":{"line":213,"column":null}}],"line":213},"14":{"loc":{"start":{"line":229,"column":21},"end":{"line":229,"column":null}},"type":"cond-expr","locations":[{"start":{"line":229,"column":42},"end":{"line":229,"column":54}},{"start":{"line":229,"column":54},"end":{"line":229,"column":null}}],"line":229},"15":{"loc":{"start":{"line":249,"column":11},"end":{"line":249,"column":70}},"type":"binary-expr","locations":[{"start":{"line":249,"column":11},"end":{"line":249,"column":42}},{"start":{"line":249,"column":42},"end":{"line":249,"column":70}}],"line":249}},"s":{"0":22,"1":22,"2":22,"3":22,"4":12,"5":11,"6":12,"7":2,"8":1,"9":88,"10":88,"11":13,"12":13,"13":13,"14":1,"15":21,"16":43,"17":21,"18":21,"19":6,"20":6,"21":6,"22":6,"23":6,"24":2,"25":2,"26":6,"27":2,"28":2,"29":2,"30":2,"31":2,"32":2,"33":2,"34":6,"35":6,"36":6,"37":6,"38":15,"39":15,"40":15,"41":15,"42":35,"43":98,"44":35,"45":49,"46":49,"47":39,"48":49,"49":6,"50":6,"51":6,"52":35,"53":98,"54":55,"55":43,"56":98,"57":29,"58":35,"59":26,"60":26,"61":26,"62":26,"63":26,"64":24,"65":2,"66":26,"67":26,"68":26,"69":26,"70":26,"71":26,"72":15,"73":15,"74":20,"75":20,"76":15,"77":15},"f":{"0":22,"1":12,"2":2,"3":88,"4":21,"5":43,"6":6,"7":35,"8":98,"9":39,"10":98,"11":29,"12":26,"13":26},"b":{"0":[11,1],"1":[1,1],"2":[13,75],"3":[43,21],"4":[6,15],"5":[2,2,2],"6":[98,50],"7":[49,18],"8":[39,18],"9":[6,43],"10":[55,43],"11":[98,44],"12":[43,18],"13":[29,12],"14":[1,1],"15":[15,20]},"meta":{"lastBranch":16,"lastFunction":14,"lastStatement":78,"seen":{"s:54:20:54:Infinity":0,"s:55:45:55:Infinity":1,"s:56:22:56:Infinity":2,"f:61:2:61:22":0,"s:61:22:61:41":3,"f:68:9:68:Infinity":1,"b:72:4:76:Infinity:undefined:undefined:undefined:undefined":0,"s:72:4:76:Infinity":4,"s:75:6:75:Infinity":5,"s:78:5:80:Infinity":6,"f:88:9:88:Infinity":2,"b:92:4:96:Infinity:undefined:undefined:undefined:undefined":1,"s:92:4:96:Infinity":7,"s:93:7:95:Infinity":8,"f:104:10:104:Infinity":3,"s:108:22:108:Infinity":9,"b:111:4:123:Infinity:undefined:undefined:undefined:undefined":2,"s:111:4:123:Infinity":10,"s:112:6:122:Infinity":11,"s:113:8:121:Infinity":12,"s:114:10:114:Infinity":13,"s:117:10:120:Infinity":14,"f:133:8:133:16":4,"s:135:33:140:Infinity":15,"f:136:23:136:24":5,"s:136:34:139:8":16,"b:138:22:138:43:138:43:138:Infinity":3,"s:142:29:142:Infinity":17,"b:143:4:179:Infinity:undefined:undefined:undefined:undefined":4,"s:143:4:179:Infinity":18,"s:145:28:145:Infinity":19,"s:146:37:146:Infinity":20,"s:148:6:170:Infinity":21,"s:149:8:149:Infinity":22,"b:151:10:157:Infinity:158:10:163:Infinity:164:10:168:Infinity":5,"s:150:8:169:Infinity":23,"s:153:26:153:Infinity":24,"s:155:12:155:Infinity":25,"f:155:25:155:26":6,"s:155:32:155:52":26,"s:156:12:156:Infinity":27,"s:160:22:160:Infinity":28,"s:161:12:161:Infinity":29,"s:162:12:162:Infinity":30,"s:165:22:165:Infinity":31,"s:166:12:166:Infinity":32,"s:167:12:167:Infinity":33,"s:173:23:173:Infinity":34,"s:174:28:174:Infinity":35,"s:175:30:175:Infinity":36,"s:178:6:178:Infinity":37,"s:181:4:181:Infinity":38,"s:183:20:183:Infinity":39,"s:184:30:184:Infinity":40,"s:187:32:244:Infinity":41,"f:187:32:187:38":7,"s:188:27:190:Infinity":42,"f:189:8:189:9":8,"s:189:18:189:Infinity":43,"b:189:18:189:45:189:45:189:Infinity":6,"s:193:6:206:Infinity":44,"s:194:21:194:Infinity":45,"b:194:21:194:42:194:42:194:Infinity":7,"s:195:26:197:Infinity":46,"f:196:10:196:11":9,"s:196:19:196:Infinity":47,"b:196:19:196:39:196:39:196:Infinity":8,"b:198:8:205:Infinity:undefined:undefined:undefined:undefined":9,"s:198:8:205:Infinity":48,"s:199:37:202:Infinity":49,"s:203:10:203:Infinity":50,"s:204:10:204:Infinity":51,"s:209:25:215:Infinity":52,"f:209:38:209:39":10,"b:210:8:210:Infinity:undefined:undefined:undefined:undefined":10,"s:210:8:210:Infinity":53,"b:210:12:210:38:210:38:210:67":11,"s:210:67:210:Infinity":54,"s:211:21:211:Infinity":55,"b:211:21:211:42:211:42:211:Infinity":12,"s:212:8:214:Infinity":56,"f:213:10:213:11":11,"s:213:19:213:Infinity":57,"b:213:19:213:39:213:39:213:Infinity":13,"s:218:6:243:Infinity":58,"s:219:8:219:Infinity":59,"s:220:8:220:Infinity":60,"s:222:14:236:Infinity":61,"f:222:29:222:41":12,"s:223:10:235:Infinity":62,"s:224:27:224:Infinity":63,"s:225:12:225:Infinity":64,"s:227:12:230:Infinity":65,"b:229:42:229:54:229:54:229:Infinity":14,"s:232:12:232:Infinity":66,"s:233:27:233:Infinity":67,"s:234:12:234:Infinity":68,"s:239:31:241:Infinity":69,"f:239:48:239:54":13,"s:240:10:240:Infinity":70,"s:242:8:242:Infinity":71,"s:247:4:247:Infinity":72,"s:249:4:254:Infinity":73,"b:249:11:249:42:249:42:249:70":15,"s:251:6:251:Infinity":74,"s:253:6:253:Infinity":75,"s:256:4:256:Infinity":76,"s:257:4:257:Infinity":77}}}
2
3
  }