@calmo/task-runner 3.2.0 → 3.4.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.
Files changed (63) hide show
  1. package/.jules/backlog_maniac.md +3 -0
  2. package/AGENTS.md +4 -0
  3. package/CHANGELOG.md +26 -0
  4. package/coverage/coverage-final.json +8 -7
  5. package/coverage/index.html +9 -9
  6. package/coverage/lcov-report/index.html +9 -9
  7. package/coverage/lcov-report/src/EventBus.ts.html +4 -4
  8. package/coverage/lcov-report/src/TaskGraphValidationError.ts.html +121 -0
  9. package/coverage/lcov-report/src/TaskGraphValidator.ts.html +38 -38
  10. package/coverage/lcov-report/src/TaskRunner.ts.html +34 -19
  11. package/coverage/lcov-report/src/TaskRunnerBuilder.ts.html +1 -1
  12. package/coverage/lcov-report/src/TaskRunnerExecutionConfig.ts.html +17 -2
  13. package/coverage/lcov-report/src/TaskStateManager.ts.html +35 -35
  14. package/coverage/lcov-report/src/WorkflowExecutor.ts.html +94 -34
  15. package/coverage/lcov-report/src/contracts/RunnerEvents.ts.html +1 -1
  16. package/coverage/lcov-report/src/contracts/index.html +1 -1
  17. package/coverage/lcov-report/src/index.html +23 -8
  18. package/coverage/lcov-report/src/strategies/DryRunExecutionStrategy.ts.html +1 -1
  19. package/coverage/lcov-report/src/strategies/RetryingExecutionStrategy.ts.html +5 -5
  20. package/coverage/lcov-report/src/strategies/StandardExecutionStrategy.ts.html +3 -3
  21. package/coverage/lcov-report/src/strategies/index.html +1 -1
  22. package/coverage/lcov.info +284 -258
  23. package/coverage/src/EventBus.ts.html +4 -4
  24. package/coverage/src/TaskGraphValidationError.ts.html +121 -0
  25. package/coverage/src/TaskGraphValidator.ts.html +38 -38
  26. package/coverage/src/TaskRunner.ts.html +34 -19
  27. package/coverage/src/TaskRunnerBuilder.ts.html +1 -1
  28. package/coverage/src/TaskRunnerExecutionConfig.ts.html +17 -2
  29. package/coverage/src/TaskStateManager.ts.html +35 -35
  30. package/coverage/src/WorkflowExecutor.ts.html +94 -34
  31. package/coverage/src/contracts/RunnerEvents.ts.html +1 -1
  32. package/coverage/src/contracts/index.html +1 -1
  33. package/coverage/src/index.html +23 -8
  34. package/coverage/src/strategies/DryRunExecutionStrategy.ts.html +1 -1
  35. package/coverage/src/strategies/RetryingExecutionStrategy.ts.html +5 -5
  36. package/coverage/src/strategies/StandardExecutionStrategy.ts.html +3 -3
  37. package/coverage/src/strategies/index.html +1 -1
  38. package/dist/TaskGraphValidationError.d.ts +9 -0
  39. package/dist/TaskGraphValidationError.js +13 -0
  40. package/dist/TaskGraphValidationError.js.map +1 -0
  41. package/dist/TaskRunner.js +3 -2
  42. package/dist/TaskRunner.js.map +1 -1
  43. package/dist/TaskRunnerExecutionConfig.d.ts +5 -0
  44. package/dist/WorkflowExecutor.d.ts +4 -1
  45. package/dist/WorkflowExecutor.js +19 -4
  46. package/dist/WorkflowExecutor.js.map +1 -1
  47. package/dist/index.d.ts +1 -0
  48. package/dist/index.js +1 -0
  49. package/dist/index.js.map +1 -1
  50. package/openspec/changes/archive/2026-01-18-add-concurrency-control/tasks.md +9 -0
  51. package/openspec/changes/archive/2026-01-18-add-task-retry-policy/tasks.md +10 -0
  52. package/openspec/project.md +1 -0
  53. package/package.json +1 -1
  54. package/src/TaskGraphValidationError.ts +12 -0
  55. package/src/TaskRunner.ts +7 -2
  56. package/src/TaskRunnerExecutionConfig.ts +5 -0
  57. package/src/WorkflowExecutor.ts +24 -4
  58. package/src/index.ts +1 -0
  59. package/test-report.xml +114 -102
  60. package/openspec/changes/add-concurrency-control/tasks.md +0 -9
  61. package/openspec/changes/add-task-retry-policy/tasks.md +0 -10
  62. /package/openspec/changes/{add-concurrency-control → archive/2026-01-18-add-concurrency-control}/proposal.md +0 -0
  63. /package/openspec/changes/{add-task-retry-policy → archive/2026-01-18-add-task-retry-policy}/proposal.md +0 -0
@@ -214,20 +214,20 @@
214
214
  <span class="cline-any cline-neutral">&nbsp;</span>
215
215
  <span class="cline-any cline-neutral">&nbsp;</span>
216
216
  <span class="cline-any cline-neutral">&nbsp;</span>
217
- <span class="cline-any cline-yes">44x</span>
218
- <span class="cline-any cline-yes">44x</span>
219
- <span class="cline-any cline-yes">44x</span>
217
+ <span class="cline-any cline-yes">48x</span>
218
+ <span class="cline-any cline-yes">48x</span>
219
+ <span class="cline-any cline-yes">48x</span>
220
220
  <span class="cline-any cline-neutral">&nbsp;</span>
221
- <span class="cline-any cline-yes">44x</span>
221
+ <span class="cline-any cline-yes">48x</span>
222
222
  <span class="cline-any cline-neutral">&nbsp;</span>
223
223
  <span class="cline-any cline-neutral">&nbsp;</span>
224
224
  <span class="cline-any cline-neutral">&nbsp;</span>
225
225
  <span class="cline-any cline-neutral">&nbsp;</span>
226
226
  <span class="cline-any cline-neutral">&nbsp;</span>
227
227
  <span class="cline-any cline-neutral">&nbsp;</span>
228
- <span class="cline-any cline-yes">43x</span>
229
- <span class="cline-any cline-yes">43x</span>
230
- <span class="cline-any cline-yes">43x</span>
228
+ <span class="cline-any cline-yes">47x</span>
229
+ <span class="cline-any cline-yes">47x</span>
230
+ <span class="cline-any cline-yes">47x</span>
231
231
  <span class="cline-any cline-neutral">&nbsp;</span>
232
232
  <span class="cline-any cline-neutral">&nbsp;</span>
233
233
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -236,26 +236,26 @@
236
236
  <span class="cline-any cline-neutral">&nbsp;</span>
237
237
  <span class="cline-any cline-neutral">&nbsp;</span>
238
238
  <span class="cline-any cline-neutral">&nbsp;</span>
239
- <span class="cline-any cline-yes">109x</span>
240
- <span class="cline-any cline-yes">109x</span>
239
+ <span class="cline-any cline-yes">232x</span>
240
+ <span class="cline-any cline-yes">232x</span>
241
241
  <span class="cline-any cline-neutral">&nbsp;</span>
242
- <span class="cline-any cline-yes">109x</span>
243
- <span class="cline-any cline-yes">214x</span>
244
- <span class="cline-any cline-yes">214x</span>
242
+ <span class="cline-any cline-yes">232x</span>
243
+ <span class="cline-any cline-yes">374x</span>
244
+ <span class="cline-any cline-yes">374x</span>
245
245
  <span class="cline-any cline-neutral">&nbsp;</span>
246
246
  <span class="cline-any cline-neutral">&nbsp;</span>
247
- <span class="cline-any cline-yes">214x</span>
248
- <span class="cline-any cline-yes">457x</span>
249
- <span class="cline-any cline-yes">457x</span>
247
+ <span class="cline-any cline-yes">374x</span>
248
+ <span class="cline-any cline-yes">1133x</span>
249
+ <span class="cline-any cline-yes">1133x</span>
250
250
  <span class="cline-any cline-neutral">&nbsp;</span>
251
- <span class="cline-any cline-yes">311x</span>
252
- <span class="cline-any cline-yes">146x</span>
251
+ <span class="cline-any cline-yes">980x</span>
252
+ <span class="cline-any cline-yes">153x</span>
253
253
  <span class="cline-any cline-yes">8x</span>
254
254
  <span class="cline-any cline-yes">8x</span>
255
255
  <span class="cline-any cline-neutral">&nbsp;</span>
256
256
  <span class="cline-any cline-neutral">&nbsp;</span>
257
257
  <span class="cline-any cline-neutral">&nbsp;</span>
258
- <span class="cline-any cline-yes">214x</span>
258
+ <span class="cline-any cline-yes">374x</span>
259
259
  <span class="cline-any cline-yes">8x</span>
260
260
  <span class="cline-any cline-yes">8x</span>
261
261
  <span class="cline-any cline-yes">8x</span>
@@ -265,18 +265,18 @@
265
265
  <span class="cline-any cline-yes">8x</span>
266
266
  <span class="cline-any cline-yes">8x</span>
267
267
  <span class="cline-any cline-yes">8x</span>
268
- <span class="cline-any cline-yes">206x</span>
269
- <span class="cline-any cline-yes">105x</span>
270
- <span class="cline-any cline-yes">105x</span>
268
+ <span class="cline-any cline-yes">366x</span>
269
+ <span class="cline-any cline-yes">119x</span>
270
+ <span class="cline-any cline-yes">119x</span>
271
271
  <span class="cline-any cline-neutral">&nbsp;</span>
272
272
  <span class="cline-any cline-neutral">&nbsp;</span>
273
273
  <span class="cline-any cline-neutral">&nbsp;</span>
274
274
  <span class="cline-any cline-neutral">&nbsp;</span>
275
- <span class="cline-any cline-yes">109x</span>
276
- <span class="cline-any cline-yes">113x</span>
275
+ <span class="cline-any cline-yes">232x</span>
276
+ <span class="cline-any cline-yes">127x</span>
277
277
  <span class="cline-any cline-neutral">&nbsp;</span>
278
278
  <span class="cline-any cline-neutral">&nbsp;</span>
279
- <span class="cline-any cline-yes">109x</span>
279
+ <span class="cline-any cline-yes">232x</span>
280
280
  <span class="cline-any cline-neutral">&nbsp;</span>
281
281
  <span class="cline-any cline-neutral">&nbsp;</span>
282
282
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -284,8 +284,8 @@
284
284
  <span class="cline-any cline-neutral">&nbsp;</span>
285
285
  <span class="cline-any cline-neutral">&nbsp;</span>
286
286
  <span class="cline-any cline-neutral">&nbsp;</span>
287
- <span class="cline-any cline-yes">105x</span>
288
- <span class="cline-any cline-yes">105x</span>
287
+ <span class="cline-any cline-yes">119x</span>
288
+ <span class="cline-any cline-yes">119x</span>
289
289
  <span class="cline-any cline-neutral">&nbsp;</span>
290
290
  <span class="cline-any cline-neutral">&nbsp;</span>
291
291
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -295,9 +295,9 @@
295
295
  <span class="cline-any cline-neutral">&nbsp;</span>
296
296
  <span class="cline-any cline-neutral">&nbsp;</span>
297
297
  <span class="cline-any cline-neutral">&nbsp;</span>
298
- <span class="cline-any cline-yes">106x</span>
299
- <span class="cline-any cline-yes">106x</span>
300
- <span class="cline-any cline-yes">106x</span>
298
+ <span class="cline-any cline-yes">120x</span>
299
+ <span class="cline-any cline-yes">120x</span>
300
+ <span class="cline-any cline-yes">120x</span>
301
301
  <span class="cline-any cline-neutral">&nbsp;</span>
302
302
  <span class="cline-any cline-neutral">&nbsp;</span>
303
303
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -306,7 +306,7 @@
306
306
  <span class="cline-any cline-neutral">&nbsp;</span>
307
307
  <span class="cline-any cline-neutral">&nbsp;</span>
308
308
  <span class="cline-any cline-neutral">&nbsp;</span>
309
- <span class="cline-any cline-yes">62x</span>
309
+ <span class="cline-any cline-yes">66x</span>
310
310
  <span class="cline-any cline-neutral">&nbsp;</span>
311
311
  <span class="cline-any cline-neutral">&nbsp;</span>
312
312
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -323,28 +323,28 @@
323
323
  <span class="cline-any cline-neutral">&nbsp;</span>
324
324
  <span class="cline-any cline-neutral">&nbsp;</span>
325
325
  <span class="cline-any cline-neutral">&nbsp;</span>
326
- <span class="cline-any cline-yes">62x</span>
326
+ <span class="cline-any cline-yes">66x</span>
327
327
  <span class="cline-any cline-neutral">&nbsp;</span>
328
328
  <span class="cline-any cline-neutral">&nbsp;</span>
329
329
  <span class="cline-any cline-neutral">&nbsp;</span>
330
330
  <span class="cline-any cline-neutral">&nbsp;</span>
331
331
  <span class="cline-any cline-neutral">&nbsp;</span>
332
332
  <span class="cline-any cline-neutral">&nbsp;</span>
333
- <span class="cline-any cline-yes">44x</span>
333
+ <span class="cline-any cline-yes">48x</span>
334
334
  <span class="cline-any cline-neutral">&nbsp;</span>
335
335
  <span class="cline-any cline-neutral">&nbsp;</span>
336
336
  <span class="cline-any cline-neutral">&nbsp;</span>
337
337
  <span class="cline-any cline-neutral">&nbsp;</span>
338
338
  <span class="cline-any cline-neutral">&nbsp;</span>
339
339
  <span class="cline-any cline-neutral">&nbsp;</span>
340
- <span class="cline-any cline-yes">83x</span>
340
+ <span class="cline-any cline-yes">92x</span>
341
341
  <span class="cline-any cline-neutral">&nbsp;</span>
342
342
  <span class="cline-any cline-neutral">&nbsp;</span>
343
343
  <span class="cline-any cline-neutral">&nbsp;</span>
344
344
  <span class="cline-any cline-neutral">&nbsp;</span>
345
345
  <span class="cline-any cline-neutral">&nbsp;</span>
346
346
  <span class="cline-any cline-neutral">&nbsp;</span>
347
- <span class="cline-any cline-yes">118x</span>
347
+ <span class="cline-any cline-yes">122x</span>
348
348
  <span class="cline-any cline-neutral">&nbsp;</span>
349
349
  <span class="cline-any cline-neutral">&nbsp;</span>
350
350
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { TaskStep } from "./TaskStep.js";
@@ -496,7 +496,7 @@ export class TaskStateManager&lt;TContext&gt; {
496
496
  <div class='footer quiet pad2 space-top1 center small'>
497
497
  Code coverage generated by
498
498
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
499
- at 2026-01-18T18:46:49.766Z
499
+ at 2026-01-18T20:19:46.875Z
500
500
  </div>
501
501
  <script src="../prettify.js"></script>
502
502
  <script>
@@ -25,14 +25,14 @@
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'>38/38</span>
28
+ <span class='fraction'>46/46</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'>12/12</span>
35
+ <span class='fraction'>16/16</span>
36
36
  </div>
37
37
 
38
38
 
@@ -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'>38/38</span>
49
+ <span class='fraction'>46/46</span>
50
50
  </div>
51
51
 
52
52
 
@@ -183,7 +183,27 @@
183
183
  <a name='L118'></a><a href='#L118'>118</a>
184
184
  <a name='L119'></a><a href='#L119'>119</a>
185
185
  <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</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>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
187
207
  <span class="cline-any cline-neutral">&nbsp;</span>
188
208
  <span class="cline-any cline-neutral">&nbsp;</span>
189
209
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -194,6 +214,7 @@
194
214
  <span class="cline-any cline-neutral">&nbsp;</span>
195
215
  <span class="cline-any cline-neutral">&nbsp;</span>
196
216
  <span class="cline-any cline-neutral">&nbsp;</span>
217
+ <span class="cline-any cline-yes">47x</span>
197
218
  <span class="cline-any cline-neutral">&nbsp;</span>
198
219
  <span class="cline-any cline-neutral">&nbsp;</span>
199
220
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -201,12 +222,13 @@
201
222
  <span class="cline-any cline-neutral">&nbsp;</span>
202
223
  <span class="cline-any cline-neutral">&nbsp;</span>
203
224
  <span class="cline-any cline-neutral">&nbsp;</span>
204
- <span class="cline-any cline-yes">43x</span>
205
- <span class="cline-any cline-yes">43x</span>
206
- <span class="cline-any cline-yes">43x</span>
207
- <span class="cline-any cline-yes">43x</span>
208
225
  <span class="cline-any cline-neutral">&nbsp;</span>
209
226
  <span class="cline-any cline-neutral">&nbsp;</span>
227
+ <span class="cline-any cline-yes">47x</span>
228
+ <span class="cline-any cline-yes">47x</span>
229
+ <span class="cline-any cline-yes">47x</span>
230
+ <span class="cline-any cline-yes">47x</span>
231
+ <span class="cline-any cline-yes">47x</span>
210
232
  <span class="cline-any cline-neutral">&nbsp;</span>
211
233
  <span class="cline-any cline-neutral">&nbsp;</span>
212
234
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -217,33 +239,35 @@
217
239
  <span class="cline-any cline-neutral">&nbsp;</span>
218
240
  <span class="cline-any cline-neutral">&nbsp;</span>
219
241
  <span class="cline-any cline-neutral">&nbsp;</span>
220
- <span class="cline-any cline-yes">43x</span>
221
- <span class="cline-any cline-yes">43x</span>
222
242
  <span class="cline-any cline-neutral">&nbsp;</span>
223
243
  <span class="cline-any cline-neutral">&nbsp;</span>
224
- <span class="cline-any cline-yes">43x</span>
244
+ <span class="cline-any cline-yes">47x</span>
245
+ <span class="cline-any cline-yes">47x</span>
246
+ <span class="cline-any cline-neutral">&nbsp;</span>
247
+ <span class="cline-any cline-neutral">&nbsp;</span>
248
+ <span class="cline-any cline-yes">47x</span>
225
249
  <span class="cline-any cline-yes">2x</span>
226
250
  <span class="cline-any cline-yes">2x</span>
227
251
  <span class="cline-any cline-yes">2x</span>
228
252
  <span class="cline-any cline-yes">2x</span>
229
253
  <span class="cline-any cline-neutral">&nbsp;</span>
230
254
  <span class="cline-any cline-neutral">&nbsp;</span>
231
- <span class="cline-any cline-yes">41x</span>
255
+ <span class="cline-any cline-yes">45x</span>
232
256
  <span class="cline-any cline-neutral">&nbsp;</span>
233
- <span class="cline-any cline-yes">41x</span>
257
+ <span class="cline-any cline-yes">45x</span>
234
258
  <span class="cline-any cline-neutral">&nbsp;</span>
235
259
  <span class="cline-any cline-yes">9x</span>
236
260
  <span class="cline-any cline-neutral">&nbsp;</span>
237
261
  <span class="cline-any cline-neutral">&nbsp;</span>
238
- <span class="cline-any cline-yes">41x</span>
262
+ <span class="cline-any cline-yes">45x</span>
239
263
  <span class="cline-any cline-yes">9x</span>
240
264
  <span class="cline-any cline-neutral">&nbsp;</span>
241
265
  <span class="cline-any cline-neutral">&nbsp;</span>
242
- <span class="cline-any cline-yes">41x</span>
266
+ <span class="cline-any cline-yes">45x</span>
243
267
  <span class="cline-any cline-neutral">&nbsp;</span>
244
- <span class="cline-any cline-yes">41x</span>
268
+ <span class="cline-any cline-yes">45x</span>
245
269
  <span class="cline-any cline-neutral">&nbsp;</span>
246
- <span class="cline-any cline-yes">41x</span>
270
+ <span class="cline-any cline-yes">45x</span>
247
271
  <span class="cline-any cline-neutral">&nbsp;</span>
248
272
  <span class="cline-any cline-neutral">&nbsp;</span>
249
273
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -266,13 +290,13 @@
266
290
  <span class="cline-any cline-neutral">&nbsp;</span>
267
291
  <span class="cline-any cline-neutral">&nbsp;</span>
268
292
  <span class="cline-any cline-neutral">&nbsp;</span>
269
- <span class="cline-any cline-yes">41x</span>
293
+ <span class="cline-any cline-yes">45x</span>
270
294
  <span class="cline-any cline-neutral">&nbsp;</span>
271
- <span class="cline-any cline-yes">41x</span>
272
- <span class="cline-any cline-yes">41x</span>
273
- <span class="cline-any cline-yes">41x</span>
295
+ <span class="cline-any cline-yes">45x</span>
296
+ <span class="cline-any cline-yes">45x</span>
297
+ <span class="cline-any cline-yes">45x</span>
274
298
  <span class="cline-any cline-neutral">&nbsp;</span>
275
- <span class="cline-any cline-yes">41x</span>
299
+ <span class="cline-any cline-yes">45x</span>
276
300
  <span class="cline-any cline-yes">9x</span>
277
301
  <span class="cline-any cline-neutral">&nbsp;</span>
278
302
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -285,21 +309,37 @@
285
309
  <span class="cline-any cline-neutral">&nbsp;</span>
286
310
  <span class="cline-any cline-neutral">&nbsp;</span>
287
311
  <span class="cline-any cline-neutral">&nbsp;</span>
288
- <span class="cline-any cline-yes">110x</span>
312
+ <span class="cline-any cline-yes">233x</span>
313
+ <span class="cline-any cline-neutral">&nbsp;</span>
314
+ <span class="cline-any cline-neutral">&nbsp;</span>
315
+ <span class="cline-any cline-yes">233x</span>
316
+ <span class="cline-any cline-yes">119x</span>
317
+ <span class="cline-any cline-neutral">&nbsp;</span>
318
+ <span class="cline-any cline-neutral">&nbsp;</span>
319
+ <span class="cline-any cline-neutral">&nbsp;</span>
320
+ <span class="cline-any cline-yes">233x</span>
321
+ <span class="cline-any cline-yes">130x</span>
322
+ <span class="cline-any cline-neutral">&nbsp;</span>
323
+ <span class="cline-any cline-neutral">&nbsp;</span>
324
+ <span class="cline-any cline-neutral">&nbsp;</span>
325
+ <span class="cline-any cline-yes">11x</span>
289
326
  <span class="cline-any cline-neutral">&nbsp;</span>
290
327
  <span class="cline-any cline-neutral">&nbsp;</span>
291
- <span class="cline-any cline-yes">110x</span>
292
- <span class="cline-any cline-yes">105x</span>
328
+ <span class="cline-any cline-yes">119x</span>
293
329
  <span class="cline-any cline-neutral">&nbsp;</span>
294
- <span class="cline-any cline-yes">105x</span>
330
+ <span class="cline-any cline-yes">119x</span>
295
331
  <span class="cline-any cline-neutral">&nbsp;</span>
296
- <span class="cline-any cline-yes">105x</span>
332
+ <span class="cline-any cline-yes">119x</span>
297
333
  <span class="cline-any cline-neutral">&nbsp;</span>
334
+ <span class="cline-any cline-yes">119x</span>
298
335
  <span class="cline-any cline-neutral">&nbsp;</span>
299
- <span class="cline-any cline-yes">105x</span>
300
336
  <span class="cline-any cline-neutral">&nbsp;</span>
337
+ <span class="cline-any cline-yes">119x</span>
301
338
  <span class="cline-any cline-neutral">&nbsp;</span>
302
- <span class="cline-any cline-yes">105x</span>
339
+ <span class="cline-any cline-yes">119x</span>
340
+ <span class="cline-any cline-neutral">&nbsp;</span>
341
+ <span class="cline-any cline-neutral">&nbsp;</span>
342
+ <span class="cline-any cline-yes">119x</span>
303
343
  <span class="cline-any cline-neutral">&nbsp;</span>
304
344
  <span class="cline-any cline-neutral">&nbsp;</span>
305
345
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -314,17 +354,21 @@ import { IExecutionStrategy } from "./strategies/IExecutionStrategy.js";
314
354
  * @template TContext The shape of the shared context object.
315
355
  */
316
356
  export class WorkflowExecutor&lt;TContext&gt; {
357
+ private readyQueue: TaskStep&lt;TContext&gt;[] = [];
358
+ &nbsp;
317
359
  /**
318
360
  * @param context The shared context object.
319
361
  * @param eventBus The event bus to emit events.
320
362
  * @param stateManager Manages execution state.
321
363
  * @param strategy Execution strategy.
364
+ * @param concurrency Maximum number of concurrent tasks.
322
365
  */
323
366
  constructor(
324
367
  private context: TContext,
325
368
  private eventBus: EventBus&lt;TContext&gt;,
326
369
  private stateManager: TaskStateManager&lt;TContext&gt;,
327
- private strategy: IExecutionStrategy&lt;TContext&gt;
370
+ private strategy: IExecutionStrategy&lt;TContext&gt;,
371
+ private concurrency?: number
328
372
  ) {}
329
373
  &nbsp;
330
374
  /**
@@ -405,10 +449,24 @@ export class WorkflowExecutor&lt;TContext&gt; {
405
449
  executingPromises: Set&lt;Promise&lt;void&gt;&gt;,
406
450
  signal?: AbortSignal
407
451
  ): void {
408
- const toRun = this.stateManager.processDependencies();
452
+ const newlyReady = this.stateManager.processDependencies();
453
+ &nbsp;
454
+ // Add newly ready tasks to the queue
455
+ for (const task of newlyReady) {
456
+ this.readyQueue.push(task);
457
+ }
458
+ &nbsp;
459
+ // Execute ready tasks while respecting concurrency limit
460
+ while (this.readyQueue.length &gt; 0) {
461
+ if (
462
+ this.concurrency !== undefined &amp;&amp;
463
+ executingPromises.size &gt;= this.concurrency
464
+ ) {
465
+ break;
466
+ }
467
+ &nbsp;
468
+ const step = this.readyQueue.shift()!;
409
469
  &nbsp;
410
- // Execute ready tasks
411
- for (const step of toRun) {
412
470
  this.stateManager.markRunning(step);
413
471
  &nbsp;
414
472
  const taskPromise = this.strategy.execute(step, this.context, signal)
@@ -417,6 +475,8 @@ export class WorkflowExecutor&lt;TContext&gt; {
417
475
  })
418
476
  .finally(() =&gt; {
419
477
  executingPromises.delete(taskPromise);
478
+ // When a task finishes, we try to run more
479
+ this.processLoop(executingPromises, signal);
420
480
  });
421
481
  &nbsp;
422
482
  executingPromises.add(taskPromise);
@@ -430,7 +490,7 @@ export class WorkflowExecutor&lt;TContext&gt; {
430
490
  <div class='footer quiet pad2 space-top1 center small'>
431
491
  Code coverage generated by
432
492
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
433
- at 2026-01-18T18:46:49.766Z
493
+ at 2026-01-18T20:19:46.875Z
434
494
  </div>
435
495
  <script src="../prettify.js"></script>
436
496
  <script>
@@ -202,7 +202,7 @@ export type ListenerMap&lt;TContext&gt; = {
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-18T18:46:49.766Z
205
+ at 2026-01-18T20:19:46.875Z
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-18T18:46:49.766Z
104
+ at 2026-01-18T20:19:46.875Z
105
105
  </div>
106
106
  <script src="../../prettify.js"></script>
107
107
  <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'>219/219</span>
28
+ <span class='fraction'>230/230</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'>74/74</span>
35
+ <span class='fraction'>78/78</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/42</span>
42
+ <span class='fraction'>43/43</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'>215/215</span>
49
+ <span class='fraction'>226/226</span>
50
50
  </div>
51
51
 
52
52
 
@@ -93,6 +93,21 @@
93
93
  <td data-value="15" class="abs high">15/15</td>
94
94
  </tr>
95
95
 
96
+ <tr>
97
+ <td class="file high" data-value="TaskGraphValidationError.ts"><a href="TaskGraphValidationError.ts.html">TaskGraphValidationError.ts</a></td>
98
+ <td data-value="100" class="pic high">
99
+ <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
100
+ </td>
101
+ <td data-value="100" class="pct high">100%</td>
102
+ <td data-value="3" class="abs high">3/3</td>
103
+ <td data-value="100" class="pct high">100%</td>
104
+ <td data-value="0" class="abs high">0/0</td>
105
+ <td data-value="100" class="pct high">100%</td>
106
+ <td data-value="1" class="abs high">1/1</td>
107
+ <td data-value="100" class="pct high">100%</td>
108
+ <td data-value="3" class="abs high">3/3</td>
109
+ </tr>
110
+
96
111
  <tr>
97
112
  <td class="file high" data-value="TaskGraphValidator.ts"><a href="TaskGraphValidator.ts.html">TaskGraphValidator.ts</a></td>
98
113
  <td data-value="100" class="pic high">
@@ -174,13 +189,13 @@
174
189
  <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
175
190
  </td>
176
191
  <td data-value="100" class="pct high">100%</td>
177
- <td data-value="38" class="abs high">38/38</td>
192
+ <td data-value="46" class="abs high">46/46</td>
178
193
  <td data-value="100" class="pct high">100%</td>
179
- <td data-value="12" class="abs high">12/12</td>
194
+ <td data-value="16" class="abs high">16/16</td>
180
195
  <td data-value="100" class="pct high">100%</td>
181
196
  <td data-value="6" class="abs high">6/6</td>
182
197
  <td data-value="100" class="pct high">100%</td>
183
- <td data-value="38" class="abs high">38/38</td>
198
+ <td data-value="46" class="abs high">46/46</td>
184
199
  </tr>
185
200
 
186
201
  </tbody>
@@ -191,7 +206,7 @@
191
206
  <div class='footer quiet pad2 space-top1 center small'>
192
207
  Code coverage generated by
193
208
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
194
- at 2026-01-18T18:46:49.766Z
209
+ at 2026-01-18T20:19:46.875Z
195
210
  </div>
196
211
  <script src="../prettify.js"></script>
197
212
  <script>
@@ -163,7 +163,7 @@ export class DryRunExecutionStrategy&lt;TContext&gt;
163
163
  <div class='footer quiet pad2 space-top1 center small'>
164
164
  Code coverage generated by
165
165
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
166
- at 2026-01-18T18:46:49.766Z
166
+ at 2026-01-18T20:19:46.875Z
167
167
  </div>
168
168
  <script src="../../prettify.js"></script>
169
169
  <script>
@@ -161,16 +161,16 @@
161
161
  <span class="cline-any cline-neutral">&nbsp;</span>
162
162
  <span class="cline-any cline-neutral">&nbsp;</span>
163
163
  <span class="cline-any cline-neutral">&nbsp;</span>
164
- <span class="cline-any cline-yes">62x</span>
164
+ <span class="cline-any cline-yes">67x</span>
165
165
  <span class="cline-any cline-neutral">&nbsp;</span>
166
166
  <span class="cline-any cline-neutral">&nbsp;</span>
167
167
  <span class="cline-any cline-neutral">&nbsp;</span>
168
168
  <span class="cline-any cline-neutral">&nbsp;</span>
169
169
  <span class="cline-any cline-neutral">&nbsp;</span>
170
170
  <span class="cline-any cline-neutral">&nbsp;</span>
171
- <span class="cline-any cline-yes">105x</span>
172
- <span class="cline-any cline-yes">105x</span>
173
- <span class="cline-any cline-yes">98x</span>
171
+ <span class="cline-any cline-yes">119x</span>
172
+ <span class="cline-any cline-yes">119x</span>
173
+ <span class="cline-any cline-yes">112x</span>
174
174
  <span class="cline-any cline-neutral">&nbsp;</span>
175
175
  <span class="cline-any cline-neutral">&nbsp;</span>
176
176
  <span class="cline-any cline-yes">7x</span>
@@ -340,7 +340,7 @@ export class RetryingExecutionStrategy&lt;TContext&gt; implements IExecutionStra
340
340
  <div class='footer quiet pad2 space-top1 center small'>
341
341
  Code coverage generated by
342
342
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
343
- at 2026-01-18T18:46:49.766Z
343
+ at 2026-01-18T20:19:46.875Z
344
344
  </div>
345
345
  <script src="../../prettify.js"></script>
346
346
  <script>
@@ -113,8 +113,8 @@
113
113
  <span class="cline-any cline-neutral">&nbsp;</span>
114
114
  <span class="cline-any cline-neutral">&nbsp;</span>
115
115
  <span class="cline-any cline-neutral">&nbsp;</span>
116
- <span class="cline-any cline-yes">114x</span>
117
- <span class="cline-any cline-yes">114x</span>
116
+ <span class="cline-any cline-yes">128x</span>
117
+ <span class="cline-any cline-yes">128x</span>
118
118
  <span class="cline-any cline-neutral">&nbsp;</span>
119
119
  <span class="cline-any cline-neutral">&nbsp;</span>
120
120
  <span class="cline-any cline-yes">10x</span>
@@ -175,7 +175,7 @@ export class StandardExecutionStrategy&lt;TContext&gt;
175
175
  <div class='footer quiet pad2 space-top1 center small'>
176
176
  Code coverage generated by
177
177
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
178
- at 2026-01-18T18:46:49.766Z
178
+ at 2026-01-18T20:19:46.875Z
179
179
  </div>
180
180
  <script src="../../prettify.js"></script>
181
181
  <script>
@@ -131,7 +131,7 @@
131
131
  <div class='footer quiet pad2 space-top1 center small'>
132
132
  Code coverage generated by
133
133
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
134
- at 2026-01-18T18:46:49.766Z
134
+ at 2026-01-18T20:19:46.875Z
135
135
  </div>
136
136
  <script src="../../prettify.js"></script>
137
137
  <script>
@@ -0,0 +1,9 @@
1
+ import { ValidationResult } from "./contracts/ValidationResult.js";
2
+ /**
3
+ * Error thrown when a task graph fails validation.
4
+ * Contains the validation result with detailed error information.
5
+ */
6
+ export declare class TaskGraphValidationError extends Error {
7
+ result: ValidationResult;
8
+ constructor(result: ValidationResult, message: string);
9
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Error thrown when a task graph fails validation.
3
+ * Contains the validation result with detailed error information.
4
+ */
5
+ export class TaskGraphValidationError extends Error {
6
+ result;
7
+ constructor(result, message) {
8
+ super(message);
9
+ this.result = result;
10
+ this.name = "TaskGraphValidationError";
11
+ }
12
+ }
13
+ //# sourceMappingURL=TaskGraphValidationError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TaskGraphValidationError.js","sourceRoot":"","sources":["../src/TaskGraphValidationError.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IAC9B;IAAnB,YAAmB,MAAwB,EAAE,OAAe;QAC1D,KAAK,CAAC,OAAO,CAAC,CAAC;QADE,WAAM,GAAN,MAAM,CAAkB;QAEzC,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF"}