@calmo/task-runner 1.2.0 → 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.
@@ -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'>67/67</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'>66/66</span>
49
+ <span class='fraction'>76/76</span>
50
50
  </div>
51
51
 
52
52
 
@@ -300,7 +300,29 @@
300
300
  <a name='L235'></a><a href='#L235'>235</a>
301
301
  <a name='L236'></a><a href='#L236'>236</a>
302
302
  <a name='L237'></a><a href='#L237'>237</a>
303
- <a name='L238'></a><a href='#L238'>238</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
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>
304
326
  <span class="cline-any cline-neutral">&nbsp;</span>
305
327
  <span class="cline-any cline-neutral">&nbsp;</span>
306
328
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -483,21 +505,16 @@
483
505
  <span class="cline-any cline-yes">15x</span>
484
506
  <span class="cline-any cline-neutral">&nbsp;</span>
485
507
  <span class="cline-any cline-yes">15x</span>
486
- <span class="cline-any cline-neutral">&nbsp;</span>
487
508
  <span class="cline-any cline-yes">15x</span>
488
- <span class="cline-any cline-yes">22x</span>
489
- <span class="cline-any cline-yes">71x</span>
490
509
  <span class="cline-any cline-neutral">&nbsp;</span>
491
510
  <span class="cline-any cline-neutral">&nbsp;</span>
492
- <span class="cline-any cline-yes">22x</span>
493
- <span class="cline-any cline-yes">49x</span>
494
- <span class="cline-any cline-yes">49x</span>
511
+ <span class="cline-any cline-yes">15x</span>
495
512
  <span class="cline-any cline-yes">35x</span>
513
+ <span class="cline-any cline-yes">98x</span>
496
514
  <span class="cline-any cline-neutral">&nbsp;</span>
497
515
  <span class="cline-any cline-neutral">&nbsp;</span>
498
516
  <span class="cline-any cline-neutral">&nbsp;</span>
499
- <span class="cline-any cline-neutral">&nbsp;</span>
500
- <span class="cline-any cline-yes">22x</span>
517
+ <span class="cline-any cline-yes">35x</span>
501
518
  <span class="cline-any cline-yes">49x</span>
502
519
  <span class="cline-any cline-yes">49x</span>
503
520
  <span class="cline-any cline-yes">39x</span>
@@ -512,10 +529,21 @@
512
529
  <span class="cline-any cline-neutral">&nbsp;</span>
513
530
  <span class="cline-any cline-neutral">&nbsp;</span>
514
531
  <span class="cline-any cline-neutral">&nbsp;</span>
515
- <span class="cline-any cline-yes">22x</span>
516
532
  <span class="cline-any cline-neutral">&nbsp;</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>
517
543
  <span class="cline-any cline-yes">26x</span>
518
544
  <span class="cline-any cline-yes">26x</span>
545
+ <span class="cline-any cline-neutral">&nbsp;</span>
546
+ <span class="cline-any cline-yes">26x</span>
519
547
  <span class="cline-any cline-yes">26x</span>
520
548
  <span class="cline-any cline-yes">26x</span>
521
549
  <span class="cline-any cline-yes">24x</span>
@@ -532,6 +560,22 @@
532
560
  <span class="cline-any cline-neutral">&nbsp;</span>
533
561
  <span class="cline-any cline-neutral">&nbsp;</span>
534
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>
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>
578
+ <span class="cline-any cline-neutral">&nbsp;</span>
535
579
  <span class="cline-any cline-neutral">&nbsp;</span>
536
580
  <span class="cline-any cline-yes">15x</span>
537
581
  <span class="cline-any cline-yes">15x</span>
@@ -720,20 +764,15 @@ export class TaskRunner&lt;TContext&gt; {
720
764
  this.emit("workflowStart", { context: this.context, steps });
721
765
  &nbsp;
722
766
  const results = new Map&lt;string, TaskResult&gt;();
767
+ const executingPromises = new Set&lt;Promise&lt;void&gt;&gt;();
723
768
  &nbsp;
724
- while (results.size &lt; steps.length) {
769
+ // Helper to process pending steps and launch ready ones
770
+ const processPendingSteps = () =&gt; {
725
771
  const pendingSteps = steps.filter(
726
772
  (step) =&gt; !results.has(step.name) &amp;&amp; !this.running.has(step.name)
727
773
  );
728
774
  &nbsp;
729
- const readySteps = pendingSteps.filter((step) =&gt; {
730
- const deps = step.dependencies ?? [];
731
- return deps.every(
732
- (dep) =&gt; results.has(dep) &amp;&amp; results.get(dep)?.status === "success"
733
- );
734
- });
735
- &nbsp;
736
- // Skip tasks with failed dependencies
775
+ // 1. Identify and mark skipped tasks
737
776
  for (const step of pendingSteps) {
738
777
  const deps = step.dependencies ?? [];
739
778
  const failedDep = deps.find(
@@ -749,10 +788,21 @@ export class TaskRunner&lt;TContext&gt; {
749
788
  }
750
789
  }
751
790
  &nbsp;
752
- await Promise.all(
753
- readySteps.map(async (step) =&gt; {
754
- this.running.add(step.name);
755
- this.emit("taskStart", { step });
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"
797
+ );
798
+ });
799
+ &nbsp;
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; {
756
806
  try {
757
807
  const result = await step.run(this.context);
758
808
  results.set(step.name, result);
@@ -766,8 +816,24 @@ export class TaskRunner&lt;TContext&gt; {
766
816
  const result = results.get(step.name)!;
767
817
  this.emit("taskEnd", { step, result });
768
818
  }
769
- })
770
- );
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();
771
837
  }
772
838
  &nbsp;
773
839
  this.emit("workflowEnd", { context: this.context, results });
@@ -781,7 +847,7 @@ export class TaskRunner&lt;TContext&gt; {
781
847
  <div class='footer quiet pad2 space-top1 center small'>
782
848
  Code coverage generated by
783
849
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
784
- at 2026-01-18T03:56:21.886Z
850
+ at 2026-01-18T05:09:17.338Z
785
851
  </div>
786
852
  <script src="prettify.js"></script>
787
853
  <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'>110/110</span>
28
+ <span class='fraction'>121/121</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'>43/43</span>
35
+ <span class='fraction'>49/49</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'>15/15</span>
42
+ <span class='fraction'>17/17</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'>108/108</span>
49
+ <span class='fraction'>118/118</span>
50
50
  </div>
51
51
 
52
52
 
@@ -99,13 +99,13 @@
99
99
  <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
100
100
  </td>
101
101
  <td data-value="100" class="pct high">100%</td>
102
- <td data-value="67" class="abs high">67/67</td>
102
+ <td data-value="78" class="abs high">78/78</td>
103
103
  <td data-value="100" class="pct high">100%</td>
104
- <td data-value="27" class="abs high">27/27</td>
104
+ <td data-value="33" class="abs high">33/33</td>
105
105
  <td data-value="100" class="pct high">100%</td>
106
- <td data-value="12" class="abs high">12/12</td>
106
+ <td data-value="14" class="abs high">14/14</td>
107
107
  <td data-value="100" class="pct high">100%</td>
108
- <td data-value="66" class="abs high">66/66</td>
108
+ <td data-value="76" class="abs high">76/76</td>
109
109
  </tr>
110
110
 
111
111
  </tbody>
@@ -116,7 +116,7 @@
116
116
  <div class='footer quiet pad2 space-top1 center small'>
117
117
  Code coverage generated by
118
118
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2026-01-18T03:56:21.886Z
119
+ at 2026-01-18T05:09:17.338Z
120
120
  </div>
121
121
  <script src="prettify.js"></script>
122
122
  <script>
@@ -81,12 +81,14 @@ FN:133,(anonymous_4)
81
81
  FN:136,(anonymous_5)
82
82
  FN:155,(anonymous_6)
83
83
  FN:187,(anonymous_7)
84
- FN:190,(anonymous_8)
85
- FN:193,(anonymous_9)
86
- FN:201,(anonymous_10)
87
- FN:214,(anonymous_11)
88
- FNF:12
89
- FNH:12
84
+ FN:189,(anonymous_8)
85
+ FN:196,(anonymous_9)
86
+ FN:209,(anonymous_10)
87
+ FN:213,(anonymous_11)
88
+ FN:222,(anonymous_12)
89
+ FN:239,(anonymous_13)
90
+ FNF:14
91
+ FNH:14
90
92
  FNDA:22,(anonymous_0)
91
93
  FNDA:12,(anonymous_1)
92
94
  FNDA:2,(anonymous_2)
@@ -94,11 +96,13 @@ FNDA:88,(anonymous_3)
94
96
  FNDA:21,(anonymous_4)
95
97
  FNDA:43,(anonymous_5)
96
98
  FNDA:6,(anonymous_6)
97
- FNDA:71,(anonymous_7)
98
- FNDA:49,(anonymous_8)
99
- FNDA:35,(anonymous_9)
100
- FNDA:39,(anonymous_10)
101
- FNDA:26,(anonymous_11)
99
+ FNDA:35,(anonymous_7)
100
+ FNDA:98,(anonymous_8)
101
+ FNDA:39,(anonymous_9)
102
+ FNDA:98,(anonymous_10)
103
+ FNDA:29,(anonymous_11)
104
+ FNDA:26,(anonymous_12)
105
+ FNDA:26,(anonymous_13)
102
106
  DA:54,22
103
107
  DA:55,22
104
108
  DA:56,22
@@ -138,35 +142,45 @@ DA:175,6
138
142
  DA:178,6
139
143
  DA:181,15
140
144
  DA:183,15
141
- DA:185,15
142
- DA:186,22
143
- DA:187,71
144
- DA:190,22
145
- DA:191,49
146
- DA:192,49
145
+ DA:184,15
146
+ DA:187,15
147
+ DA:188,35
148
+ DA:189,98
147
149
  DA:193,35
148
- DA:198,22
149
- DA:199,49
150
- DA:200,49
151
- DA:201,39
152
- DA:203,49
150
+ DA:194,49
151
+ DA:195,49
152
+ DA:196,39
153
+ DA:198,49
154
+ DA:199,6
155
+ DA:203,6
153
156
  DA:204,6
154
- DA:208,6
155
- DA:209,6
156
- DA:213,22
157
- DA:215,26
158
- DA:216,26
159
- DA:217,26
160
- DA:218,26
161
- DA:219,24
162
- DA:221,2
163
- DA:226,26
164
- DA:227,26
165
- DA:228,26
166
- DA:234,15
167
- DA:235,15
168
- LF:66
169
- LH:66
157
+ DA:209,35
158
+ DA:210,98
159
+ DA:211,43
160
+ DA:212,98
161
+ DA:213,29
162
+ DA:218,35
163
+ DA:219,26
164
+ DA:220,26
165
+ DA:222,26
166
+ DA:223,26
167
+ DA:224,26
168
+ DA:225,24
169
+ DA:227,2
170
+ DA:232,26
171
+ DA:233,26
172
+ DA:234,26
173
+ DA:239,26
174
+ DA:240,26
175
+ DA:242,26
176
+ DA:247,15
177
+ DA:249,15
178
+ DA:251,20
179
+ DA:253,20
180
+ DA:256,15
181
+ DA:257,15
182
+ LF:76
183
+ LH:76
170
184
  BRDA:72,0,0,11
171
185
  BRDA:72,0,1,1
172
186
  BRDA:92,1,0,1
@@ -180,20 +194,26 @@ BRDA:143,4,1,15
180
194
  BRDA:150,5,0,2
181
195
  BRDA:150,5,1,2
182
196
  BRDA:150,5,2,2
183
- BRDA:187,6,0,71
184
- BRDA:187,6,1,49
185
- BRDA:191,7,0,49
186
- BRDA:191,7,1,18
187
- BRDA:193,8,0,35
188
- BRDA:193,8,1,17
189
- BRDA:199,9,0,49
190
- BRDA:199,9,1,18
191
- BRDA:201,10,0,39
192
- BRDA:201,10,1,18
193
- BRDA:203,11,0,6
194
- BRDA:203,11,1,43
195
- BRDA:223,12,0,1
196
- BRDA:223,12,1,1
197
- BRF:27
198
- BRH:27
197
+ BRDA:189,6,0,98
198
+ BRDA:189,6,1,50
199
+ BRDA:194,7,0,49
200
+ BRDA:194,7,1,18
201
+ BRDA:196,8,0,39
202
+ BRDA:196,8,1,18
203
+ BRDA:198,9,0,6
204
+ BRDA:198,9,1,43
205
+ BRDA:210,10,0,55
206
+ BRDA:210,10,1,43
207
+ BRDA:210,11,0,98
208
+ BRDA:210,11,1,44
209
+ BRDA:211,12,0,43
210
+ BRDA:211,12,1,18
211
+ BRDA:213,13,0,29
212
+ BRDA:213,13,1,12
213
+ BRDA:229,14,0,1
214
+ BRDA:229,14,1,1
215
+ BRDA:249,15,0,15
216
+ BRDA:249,15,1,20
217
+ BRF:33
218
+ BRH:33
199
219
  end_of_record
@@ -110,13 +110,11 @@ export class TaskRunner {
110
110
  }
111
111
  this.emit("workflowStart", { context: this.context, steps });
112
112
  const results = new Map();
113
- while (results.size < steps.length) {
113
+ const executingPromises = new Set();
114
+ // Helper to process pending steps and launch ready ones
115
+ const processPendingSteps = () => {
114
116
  const pendingSteps = steps.filter((step) => !results.has(step.name) && !this.running.has(step.name));
115
- const readySteps = pendingSteps.filter((step) => {
116
- const deps = step.dependencies ?? [];
117
- return deps.every((dep) => results.has(dep) && results.get(dep)?.status === "success");
118
- });
119
- // Skip tasks with failed dependencies
117
+ // 1. Identify and mark skipped tasks
120
118
  for (const step of pendingSteps) {
121
119
  const deps = step.dependencies ?? [];
122
120
  const failedDep = deps.find((dep) => results.has(dep) && results.get(dep)?.status !== "success");
@@ -129,25 +127,48 @@ export class TaskRunner {
129
127
  this.emit("taskSkipped", { step, result });
130
128
  }
131
129
  }
132
- await Promise.all(readySteps.map(async (step) => {
130
+ // Re-filter pending steps as some might have been skipped above
131
+ const readySteps = steps.filter((step) => {
132
+ if (results.has(step.name) || this.running.has(step.name))
133
+ return false;
134
+ const deps = step.dependencies ?? [];
135
+ return deps.every((dep) => results.has(dep) && results.get(dep)?.status === "success");
136
+ });
137
+ // 2. Launch ready tasks
138
+ for (const step of readySteps) {
133
139
  this.running.add(step.name);
134
140
  this.emit("taskStart", { step });
135
- try {
136
- const result = await step.run(this.context);
137
- results.set(step.name, result);
138
- }
139
- catch (e) {
140
- results.set(step.name, {
141
- status: "failure",
142
- error: e instanceof Error ? e.message : String(e),
143
- });
144
- }
145
- finally {
146
- this.running.delete(step.name);
147
- const result = results.get(step.name);
148
- this.emit("taskEnd", { step, result });
149
- }
150
- }));
141
+ const taskPromise = (async () => {
142
+ try {
143
+ const result = await step.run(this.context);
144
+ results.set(step.name, result);
145
+ }
146
+ catch (e) {
147
+ results.set(step.name, {
148
+ status: "failure",
149
+ error: e instanceof Error ? e.message : String(e),
150
+ });
151
+ }
152
+ finally {
153
+ this.running.delete(step.name);
154
+ const result = results.get(step.name);
155
+ this.emit("taskEnd", { step, result });
156
+ }
157
+ })();
158
+ // Wrap the task promise to ensure we can track it in the Set
159
+ const trackedPromise = taskPromise.then(() => {
160
+ executingPromises.delete(trackedPromise);
161
+ });
162
+ executingPromises.add(trackedPromise);
163
+ }
164
+ };
165
+ // Initial check to start independent tasks
166
+ processPendingSteps();
167
+ while (results.size < steps.length && executingPromises.size > 0) {
168
+ // Wait for the next task to finish
169
+ await Promise.race(executingPromises);
170
+ // After a task finishes, check for new work
171
+ processPendingSteps();
151
172
  }
152
173
  this.emit("workflowEnd", { context: this.context, results });
153
174
  return results;
@@ -1 +1 @@
1
- {"version":3,"file":"TaskRunner.js","sourceRoot":"","sources":["../src/TaskRunner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TaskRunner.js","sourceRoot":"","sources":["../src/TaskRunner.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@calmo/task-runner",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "description": "",
5
5
  "repository": {
6
6
  "type": "git",
package/src/TaskRunner.ts CHANGED
@@ -181,20 +181,15 @@ export class TaskRunner<TContext> {
181
181
  this.emit("workflowStart", { context: this.context, steps });
182
182
 
183
183
  const results = new Map<string, TaskResult>();
184
+ const executingPromises = new Set<Promise<void>>();
184
185
 
185
- while (results.size < steps.length) {
186
+ // Helper to process pending steps and launch ready ones
187
+ const processPendingSteps = () => {
186
188
  const pendingSteps = steps.filter(
187
189
  (step) => !results.has(step.name) && !this.running.has(step.name)
188
190
  );
189
191
 
190
- const readySteps = pendingSteps.filter((step) => {
191
- const deps = step.dependencies ?? [];
192
- return deps.every(
193
- (dep) => results.has(dep) && results.get(dep)?.status === "success"
194
- );
195
- });
196
-
197
- // Skip tasks with failed dependencies
192
+ // 1. Identify and mark skipped tasks
198
193
  for (const step of pendingSteps) {
199
194
  const deps = step.dependencies ?? [];
200
195
  const failedDep = deps.find(
@@ -210,10 +205,21 @@ export class TaskRunner<TContext> {
210
205
  }
211
206
  }
212
207
 
213
- await Promise.all(
214
- readySteps.map(async (step) => {
215
- this.running.add(step.name);
216
- this.emit("taskStart", { step });
208
+ // Re-filter pending steps as some might have been skipped above
209
+ const readySteps = steps.filter((step) => {
210
+ if (results.has(step.name) || this.running.has(step.name)) return false;
211
+ const deps = step.dependencies ?? [];
212
+ return deps.every(
213
+ (dep) => results.has(dep) && results.get(dep)?.status === "success"
214
+ );
215
+ });
216
+
217
+ // 2. Launch ready tasks
218
+ for (const step of readySteps) {
219
+ this.running.add(step.name);
220
+ this.emit("taskStart", { step });
221
+
222
+ const taskPromise = (async () => {
217
223
  try {
218
224
  const result = await step.run(this.context);
219
225
  results.set(step.name, result);
@@ -227,8 +233,24 @@ export class TaskRunner<TContext> {
227
233
  const result = results.get(step.name)!;
228
234
  this.emit("taskEnd", { step, result });
229
235
  }
230
- })
231
- );
236
+ })();
237
+
238
+ // Wrap the task promise to ensure we can track it in the Set
239
+ const trackedPromise = taskPromise.then(() => {
240
+ executingPromises.delete(trackedPromise);
241
+ });
242
+ executingPromises.add(trackedPromise);
243
+ }
244
+ };
245
+
246
+ // Initial check to start independent tasks
247
+ processPendingSteps();
248
+
249
+ while (results.size < steps.length && executingPromises.size > 0) {
250
+ // Wait for the next task to finish
251
+ await Promise.race(executingPromises);
252
+ // After a task finishes, check for new work
253
+ processPendingSteps();
232
254
  }
233
255
 
234
256
  this.emit("workflowEnd", { context: this.context, results });