@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
@@ -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'>261/261</span>
28
+ <span class='fraction'>272/272</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'>99/99</span>
35
+ <span class='fraction'>103/103</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'>51/51</span>
42
+ <span class='fraction'>52/52</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'>257/257</span>
49
+ <span class='fraction'>268/268</span>
50
50
  </div>
51
51
 
52
52
 
@@ -84,13 +84,13 @@
84
84
  <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
85
85
  </td>
86
86
  <td data-value="100" class="pct high">100%</td>
87
- <td data-value="219" class="abs high">219/219</td>
87
+ <td data-value="230" class="abs high">230/230</td>
88
88
  <td data-value="100" class="pct high">100%</td>
89
- <td data-value="74" class="abs high">74/74</td>
89
+ <td data-value="78" class="abs high">78/78</td>
90
90
  <td data-value="100" class="pct high">100%</td>
91
- <td data-value="42" class="abs high">42/42</td>
91
+ <td data-value="43" class="abs high">43/43</td>
92
92
  <td data-value="100" class="pct high">100%</td>
93
- <td data-value="215" class="abs high">215/215</td>
93
+ <td data-value="226" class="abs high">226/226</td>
94
94
  </tr>
95
95
 
96
96
  <tr>
@@ -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>
@@ -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'>261/261</span>
28
+ <span class='fraction'>272/272</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'>99/99</span>
35
+ <span class='fraction'>103/103</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'>51/51</span>
42
+ <span class='fraction'>52/52</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'>257/257</span>
49
+ <span class='fraction'>268/268</span>
50
50
  </div>
51
51
 
52
52
 
@@ -84,13 +84,13 @@
84
84
  <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
85
85
  </td>
86
86
  <td data-value="100" class="pct high">100%</td>
87
- <td data-value="219" class="abs high">219/219</td>
87
+ <td data-value="230" class="abs high">230/230</td>
88
88
  <td data-value="100" class="pct high">100%</td>
89
- <td data-value="74" class="abs high">74/74</td>
89
+ <td data-value="78" class="abs high">78/78</td>
90
90
  <td data-value="100" class="pct high">100%</td>
91
- <td data-value="42" class="abs high">42/42</td>
91
+ <td data-value="43" class="abs high">43/43</td>
92
92
  <td data-value="100" class="pct high">100%</td>
93
- <td data-value="215" class="abs high">215/215</td>
93
+ <td data-value="226" class="abs high">226/226</td>
94
94
  </tr>
95
95
 
96
96
  <tr>
@@ -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.776Z
134
+ at 2026-01-18T20:19:46.886Z
135
135
  </div>
136
136
  <script src="prettify.js"></script>
137
137
  <script>
@@ -158,7 +158,7 @@
158
158
  <span class="cline-any cline-neutral">&nbsp;</span>
159
159
  <span class="cline-any cline-neutral">&nbsp;</span>
160
160
  <span class="cline-any cline-neutral">&nbsp;</span>
161
- <span class="cline-any cline-yes">58x</span>
161
+ <span class="cline-any cline-yes">63x</span>
162
162
  <span class="cline-any cline-neutral">&nbsp;</span>
163
163
  <span class="cline-any cline-neutral">&nbsp;</span>
164
164
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -205,10 +205,10 @@
205
205
  <span class="cline-any cline-neutral">&nbsp;</span>
206
206
  <span class="cline-any cline-neutral">&nbsp;</span>
207
207
  <span class="cline-any cline-neutral">&nbsp;</span>
208
- <span class="cline-any cline-yes">306x</span>
208
+ <span class="cline-any cline-yes">342x</span>
209
209
  <span class="cline-any cline-neutral">&nbsp;</span>
210
210
  <span class="cline-any cline-neutral">&nbsp;</span>
211
- <span class="cline-any cline-yes">306x</span>
211
+ <span class="cline-any cline-yes">342x</span>
212
212
  <span class="cline-any cline-yes">14x</span>
213
213
  <span class="cline-any cline-yes">14x</span>
214
214
  <span class="cline-any cline-yes">14x</span>
@@ -322,7 +322,7 @@ export class EventBus&lt;TContext&gt; {
322
322
  <div class='footer quiet pad2 space-top1 center small'>
323
323
  Code coverage generated by
324
324
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
325
- at 2026-01-18T18:46:49.776Z
325
+ at 2026-01-18T20:19:46.886Z
326
326
  </div>
327
327
  <script src="../prettify.js"></script>
328
328
  <script>
@@ -0,0 +1,121 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/TaskGraphValidationError.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../prettify.css" />
9
+ <link rel="stylesheet" href="../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../index.html">All files</a> / <a href="index.html">src</a> TaskGraphValidationError.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">100% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>3/3</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">100% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/0</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>1/1</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">100% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>3/3</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
79
+ <span class="cline-any cline-neutral">&nbsp;</span>
80
+ <span class="cline-any cline-neutral">&nbsp;</span>
81
+ <span class="cline-any cline-neutral">&nbsp;</span>
82
+ <span class="cline-any cline-neutral">&nbsp;</span>
83
+ <span class="cline-any cline-neutral">&nbsp;</span>
84
+ <span class="cline-any cline-neutral">&nbsp;</span>
85
+ <span class="cline-any cline-yes">9x</span>
86
+ <span class="cline-any cline-yes">9x</span>
87
+ <span class="cline-any cline-yes">9x</span>
88
+ <span class="cline-any cline-neutral">&nbsp;</span>
89
+ <span class="cline-any cline-neutral">&nbsp;</span>
90
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { ValidationResult } from "./contracts/ValidationResult.js";
91
+ &nbsp;
92
+ /**
93
+ * Error thrown when a task graph fails validation.
94
+ * Contains the validation result with detailed error information.
95
+ */
96
+ export class TaskGraphValidationError extends Error {
97
+ constructor(public result: ValidationResult, message: string) {
98
+ super(message);
99
+ this.name = "TaskGraphValidationError";
100
+ }
101
+ }
102
+ &nbsp;</pre></td></tr></table></pre>
103
+
104
+ <div class='push'></div><!-- for sticky footer -->
105
+ </div><!-- /wrapper -->
106
+ <div class='footer quiet pad2 space-top1 center small'>
107
+ Code coverage generated by
108
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
109
+ at 2026-01-18T20:19:46.886Z
110
+ </div>
111
+ <script src="../prettify.js"></script>
112
+ <script>
113
+ window.onload = function () {
114
+ prettyPrint();
115
+ };
116
+ </script>
117
+ <script src="../sorter.js"></script>
118
+ <script src="../block-navigation.js"></script>
119
+ </body>
120
+ </html>
121
+
@@ -243,27 +243,27 @@
243
243
  <span class="cline-any cline-neutral">&nbsp;</span>
244
244
  <span class="cline-any cline-neutral">&nbsp;</span>
245
245
  <span class="cline-any cline-neutral">&nbsp;</span>
246
- <span class="cline-any cline-yes">56x</span>
246
+ <span class="cline-any cline-yes">61x</span>
247
247
  <span class="cline-any cline-neutral">&nbsp;</span>
248
248
  <span class="cline-any cline-neutral">&nbsp;</span>
249
- <span class="cline-any cline-yes">56x</span>
250
- <span class="cline-any cline-yes">56x</span>
251
- <span class="cline-any cline-yes">20143x</span>
249
+ <span class="cline-any cline-yes">61x</span>
250
+ <span class="cline-any cline-yes">61x</span>
251
+ <span class="cline-any cline-yes">20158x</span>
252
252
  <span class="cline-any cline-yes">3x</span>
253
253
  <span class="cline-any cline-neutral">&nbsp;</span>
254
254
  <span class="cline-any cline-neutral">&nbsp;</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">20140x</span>
258
+ <span class="cline-any cline-yes">20155x</span>
259
259
  <span class="cline-any cline-neutral">&nbsp;</span>
260
260
  <span class="cline-any cline-neutral">&nbsp;</span>
261
261
  <span class="cline-any cline-neutral">&nbsp;</span>
262
262
  <span class="cline-any cline-neutral">&nbsp;</span>
263
- <span class="cline-any cline-yes">56x</span>
264
- <span class="cline-any cline-yes">20143x</span>
265
- <span class="cline-any cline-yes">20168x</span>
266
- <span class="cline-any cline-yes">6x</span>
263
+ <span class="cline-any cline-yes">61x</span>
264
+ <span class="cline-any cline-yes">20158x</span>
265
+ <span class="cline-any cline-yes">20169x</span>
266
+ <span class="cline-any cline-yes">7x</span>
267
267
  <span class="cline-any cline-neutral">&nbsp;</span>
268
268
  <span class="cline-any cline-neutral">&nbsp;</span>
269
269
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -274,31 +274,31 @@
274
274
  <span class="cline-any cline-neutral">&nbsp;</span>
275
275
  <span class="cline-any cline-neutral">&nbsp;</span>
276
276
  <span class="cline-any cline-neutral">&nbsp;</span>
277
- <span class="cline-any cline-yes">56x</span>
277
+ <span class="cline-any cline-yes">61x</span>
278
278
  <span class="cline-any cline-neutral">&nbsp;</span>
279
- <span class="cline-any cline-yes">56x</span>
280
- <span class="cline-any cline-yes">5x</span>
279
+ <span class="cline-any cline-yes">61x</span>
280
+ <span class="cline-any cline-yes">6x</span>
281
281
  <span class="cline-any cline-neutral">&nbsp;</span>
282
282
  <span class="cline-any cline-neutral">&nbsp;</span>
283
283
  <span class="cline-any cline-neutral">&nbsp;</span>
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">51x</span>
288
- <span class="cline-any cline-yes">51x</span>
289
- <span class="cline-any cline-yes">20135x</span>
287
+ <span class="cline-any cline-yes">55x</span>
288
+ <span class="cline-any cline-yes">55x</span>
289
+ <span class="cline-any cline-yes">20149x</span>
290
290
  <span class="cline-any cline-neutral">&nbsp;</span>
291
291
  <span class="cline-any cline-neutral">&nbsp;</span>
292
- <span class="cline-any cline-yes">51x</span>
293
- <span class="cline-any cline-yes">51x</span>
292
+ <span class="cline-any cline-yes">55x</span>
293
+ <span class="cline-any cline-yes">55x</span>
294
294
  <span class="cline-any cline-neutral">&nbsp;</span>
295
- <span class="cline-any cline-yes">51x</span>
296
- <span class="cline-any cline-yes">20128x</span>
295
+ <span class="cline-any cline-yes">55x</span>
296
+ <span class="cline-any cline-yes">20142x</span>
297
297
  <span class="cline-any cline-yes">3x</span>
298
298
  <span class="cline-any cline-neutral">&nbsp;</span>
299
299
  <span class="cline-any cline-neutral">&nbsp;</span>
300
- <span class="cline-any cline-yes">20125x</span>
301
- <span class="cline-any cline-yes">20125x</span>
300
+ <span class="cline-any cline-yes">20139x</span>
301
+ <span class="cline-any cline-yes">20139x</span>
302
302
  <span class="cline-any cline-neutral">&nbsp;</span>
303
303
  <span class="cline-any cline-neutral">&nbsp;</span>
304
304
  <span class="cline-any cline-yes">5x</span>
@@ -315,7 +315,7 @@
315
315
  <span class="cline-any cline-neutral">&nbsp;</span>
316
316
  <span class="cline-any cline-neutral">&nbsp;</span>
317
317
  <span class="cline-any cline-neutral">&nbsp;</span>
318
- <span class="cline-any cline-yes">51x</span>
318
+ <span class="cline-any cline-yes">55x</span>
319
319
  <span class="cline-any cline-neutral">&nbsp;</span>
320
320
  <span class="cline-any cline-neutral">&nbsp;</span>
321
321
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -327,8 +327,8 @@
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
- <span class="cline-any cline-yes">8x</span>
331
- <span class="cline-any cline-yes">8x</span>
330
+ <span class="cline-any cline-yes">9x</span>
331
+ <span class="cline-any cline-yes">9x</span>
332
332
  <span class="cline-any cline-neutral">&nbsp;</span>
333
333
  <span class="cline-any cline-neutral">&nbsp;</span>
334
334
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -339,24 +339,24 @@
339
339
  <span class="cline-any cline-neutral">&nbsp;</span>
340
340
  <span class="cline-any cline-neutral">&nbsp;</span>
341
341
  <span class="cline-any cline-neutral">&nbsp;</span>
342
- <span class="cline-any cline-yes">20125x</span>
342
+ <span class="cline-any cline-yes">20139x</span>
343
343
  <span class="cline-any cline-neutral">&nbsp;</span>
344
- <span class="cline-any cline-yes">20125x</span>
345
- <span class="cline-any cline-yes">20125x</span>
346
- <span class="cline-any cline-yes">20125x</span>
344
+ <span class="cline-any cline-yes">20139x</span>
345
+ <span class="cline-any cline-yes">20139x</span>
346
+ <span class="cline-any cline-yes">20139x</span>
347
347
  <span class="cline-any cline-neutral">&nbsp;</span>
348
- <span class="cline-any cline-yes">20125x</span>
348
+ <span class="cline-any cline-yes">20139x</span>
349
349
  <span class="cline-any cline-neutral">&nbsp;</span>
350
350
  <span class="cline-any cline-neutral">&nbsp;</span>
351
351
  <span class="cline-any cline-neutral">&nbsp;</span>
352
352
  <span class="cline-any cline-neutral">&nbsp;</span>
353
353
  <span class="cline-any cline-neutral">&nbsp;</span>
354
354
  <span class="cline-any cline-neutral">&nbsp;</span>
355
- <span class="cline-any cline-yes">20125x</span>
356
- <span class="cline-any cline-yes">40279x</span>
357
- <span class="cline-any cline-yes">40279x</span>
355
+ <span class="cline-any cline-yes">20139x</span>
356
+ <span class="cline-any cline-yes">40293x</span>
357
+ <span class="cline-any cline-yes">40293x</span>
358
358
  <span class="cline-any cline-neutral">&nbsp;</span>
359
- <span class="cline-any cline-yes">40279x</span>
359
+ <span class="cline-any cline-yes">40293x</span>
360
360
  <span class="cline-any cline-yes">20159x</span>
361
361
  <span class="cline-any cline-yes">20159x</span>
362
362
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -380,13 +380,13 @@
380
380
  <span class="cline-any cline-neutral">&nbsp;</span>
381
381
  <span class="cline-any cline-neutral">&nbsp;</span>
382
382
  <span class="cline-any cline-neutral">&nbsp;</span>
383
- <span class="cline-any cline-yes">20120x</span>
384
- <span class="cline-any cline-yes">20120x</span>
385
- <span class="cline-any cline-yes">20120x</span>
383
+ <span class="cline-any cline-yes">20134x</span>
384
+ <span class="cline-any cline-yes">20134x</span>
385
+ <span class="cline-any cline-yes">20134x</span>
386
386
  <span class="cline-any cline-neutral">&nbsp;</span>
387
387
  <span class="cline-any cline-neutral">&nbsp;</span>
388
388
  <span class="cline-any cline-neutral">&nbsp;</span>
389
- <span class="cline-any cline-yes">20120x</span>
389
+ <span class="cline-any cline-yes">20134x</span>
390
390
  <span class="cline-any cline-neutral">&nbsp;</span>
391
391
  <span class="cline-any cline-neutral">&nbsp;</span>
392
392
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { ITaskGraphValidator } from "./contracts/ITaskGraphValidator.js";
@@ -559,7 +559,7 @@ export class TaskGraphValidator implements ITaskGraphValidator {
559
559
  <div class='footer quiet pad2 space-top1 center small'>
560
560
  Code coverage generated by
561
561
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
562
- at 2026-01-18T18:46:49.776Z
562
+ at 2026-01-18T20:19:46.886Z
563
563
  </div>
564
564
  <script src="../prettify.js"></script>
565
565
  <script>
@@ -259,7 +259,12 @@
259
259
  <a name='L194'></a><a href='#L194'>194</a>
260
260
  <a name='L195'></a><a href='#L195'>195</a>
261
261
  <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
263
268
  <span class="cline-any cline-neutral">&nbsp;</span>
264
269
  <span class="cline-any cline-neutral">&nbsp;</span>
265
270
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -282,16 +287,17 @@
282
287
  <span class="cline-any cline-neutral">&nbsp;</span>
283
288
  <span class="cline-any cline-neutral">&nbsp;</span>
284
289
  <span class="cline-any cline-neutral">&nbsp;</span>
285
- <span class="cline-any cline-yes">52x</span>
286
- <span class="cline-any cline-yes">52x</span>
287
- <span class="cline-any cline-yes">52x</span>
288
290
  <span class="cline-any cline-neutral">&nbsp;</span>
291
+ <span class="cline-any cline-yes">57x</span>
292
+ <span class="cline-any cline-yes">57x</span>
293
+ <span class="cline-any cline-yes">57x</span>
289
294
  <span class="cline-any cline-neutral">&nbsp;</span>
290
295
  <span class="cline-any cline-neutral">&nbsp;</span>
291
296
  <span class="cline-any cline-neutral">&nbsp;</span>
292
297
  <span class="cline-any cline-neutral">&nbsp;</span>
293
298
  <span class="cline-any cline-neutral">&nbsp;</span>
294
- <span class="cline-any cline-yes">52x</span>
299
+ <span class="cline-any cline-neutral">&nbsp;</span>
300
+ <span class="cline-any cline-yes">57x</span>
295
301
  <span class="cline-any cline-neutral">&nbsp;</span>
296
302
  <span class="cline-any cline-neutral">&nbsp;</span>
297
303
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -390,26 +396,30 @@
390
396
  <span class="cline-any cline-neutral">&nbsp;</span>
391
397
  <span class="cline-any cline-neutral">&nbsp;</span>
392
398
  <span class="cline-any cline-neutral">&nbsp;</span>
393
- <span class="cline-any cline-yes">47x</span>
394
- <span class="cline-any cline-yes">125x</span>
399
+ <span class="cline-any cline-yes">52x</span>
400
+ <span class="cline-any cline-yes">140x</span>
395
401
  <span class="cline-any cline-neutral">&nbsp;</span>
396
402
  <span class="cline-any cline-neutral">&nbsp;</span>
397
403
  <span class="cline-any cline-neutral">&nbsp;</span>
398
404
  <span class="cline-any cline-neutral">&nbsp;</span>
399
405
  <span class="cline-any cline-neutral">&nbsp;</span>
400
- <span class="cline-any cline-yes">47x</span>
401
- <span class="cline-any cline-yes">47x</span>
402
- <span class="cline-any cline-yes">8x</span>
406
+ <span class="cline-any cline-yes">52x</span>
407
+ <span class="cline-any cline-yes">52x</span>
408
+ <span class="cline-any cline-yes">9x</span>
409
+ <span class="cline-any cline-neutral">&nbsp;</span>
410
+ <span class="cline-any cline-neutral">&nbsp;</span>
403
411
  <span class="cline-any cline-neutral">&nbsp;</span>
404
412
  <span class="cline-any cline-neutral">&nbsp;</span>
405
- <span class="cline-any cline-yes">39x</span>
406
413
  <span class="cline-any cline-neutral">&nbsp;</span>
407
- <span class="cline-any cline-yes">39x</span>
408
- <span class="cline-any cline-yes">39x</span>
414
+ <span class="cline-any cline-yes">43x</span>
415
+ <span class="cline-any cline-neutral">&nbsp;</span>
416
+ <span class="cline-any cline-yes">43x</span>
417
+ <span class="cline-any cline-yes">43x</span>
409
418
  <span class="cline-any cline-yes">2x</span>
410
419
  <span class="cline-any cline-neutral">&nbsp;</span>
411
420
  <span class="cline-any cline-neutral">&nbsp;</span>
412
- <span class="cline-any cline-yes">39x</span>
421
+ <span class="cline-any cline-yes">43x</span>
422
+ <span class="cline-any cline-neutral">&nbsp;</span>
413
423
  <span class="cline-any cline-neutral">&nbsp;</span>
414
424
  <span class="cline-any cline-neutral">&nbsp;</span>
415
425
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -417,7 +427,7 @@
417
427
  <span class="cline-any cline-neutral">&nbsp;</span>
418
428
  <span class="cline-any cline-neutral">&nbsp;</span>
419
429
  <span class="cline-any cline-neutral">&nbsp;</span>
420
- <span class="cline-any cline-yes">39x</span>
430
+ <span class="cline-any cline-yes">52x</span>
421
431
  <span class="cline-any cline-yes">5x</span>
422
432
  <span class="cline-any cline-yes">5x</span>
423
433
  <span class="cline-any cline-yes">3x</span>
@@ -451,7 +461,7 @@
451
461
  <span class="cline-any cline-neutral">&nbsp;</span>
452
462
  <span class="cline-any cline-neutral">&nbsp;</span>
453
463
  <span class="cline-any cline-neutral">&nbsp;</span>
454
- <span class="cline-any cline-yes">34x</span>
464
+ <span class="cline-any cline-yes">38x</span>
455
465
  <span class="cline-any cline-neutral">&nbsp;</span>
456
466
  <span class="cline-any cline-neutral">&nbsp;</span>
457
467
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -464,6 +474,7 @@ import { EventBus } from "./EventBus.js";
464
474
  import { WorkflowExecutor } from "./WorkflowExecutor.js";
465
475
  import { TaskRunnerExecutionConfig } from "./TaskRunnerExecutionConfig.js";
466
476
  import { TaskStateManager } from "./TaskStateManager.js";
477
+ import { TaskGraphValidationError } from "./TaskGraphValidationError.js";
467
478
  import { IExecutionStrategy } from "./strategies/IExecutionStrategy.js";
468
479
  import { StandardExecutionStrategy } from "./strategies/StandardExecutionStrategy.js";
469
480
  import { RetryingExecutionStrategy } from "./strategies/RetryingExecutionStrategy.js";
@@ -595,7 +606,10 @@ export class TaskRunner&lt;TContext&gt; {
595
606
  &nbsp;
596
607
  const validationResult = this.validator.validate(taskGraph);
597
608
  if (!validationResult.isValid) {
598
- throw new Error(this.validator.createErrorMessage(validationResult));
609
+ throw new TaskGraphValidationError(
610
+ validationResult,
611
+ this.validator.createErrorMessage(validationResult)
612
+ );
599
613
  }
600
614
  &nbsp;
601
615
  const stateManager = new TaskStateManager(this.eventBus);
@@ -609,7 +623,8 @@ export class TaskRunner&lt;TContext&gt; {
609
623
  this.context,
610
624
  this.eventBus,
611
625
  stateManager,
612
- strategy
626
+ strategy,
627
+ config?.concurrency
613
628
  );
614
629
  &nbsp;
615
630
  // We need to handle the timeout cleanup properly.
@@ -658,7 +673,7 @@ export class TaskRunner&lt;TContext&gt; {
658
673
  <div class='footer quiet pad2 space-top1 center small'>
659
674
  Code coverage generated by
660
675
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
661
- at 2026-01-18T18:46:49.776Z
676
+ at 2026-01-18T20:19:46.886Z
662
677
  </div>
663
678
  <script src="../prettify.js"></script>
664
679
  <script>
@@ -298,7 +298,7 @@ export class TaskRunnerBuilder&lt;TContext&gt; {
298
298
  <div class='footer quiet pad2 space-top1 center small'>
299
299
  Code coverage generated by
300
300
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
301
- at 2026-01-18T18:46:49.776Z
301
+ at 2026-01-18T20:19:46.886Z
302
302
  </div>
303
303
  <script src="../prettify.js"></script>
304
304
  <script>
@@ -81,7 +81,17 @@
81
81
  <a name='L16'></a><a href='#L16'>16</a>
82
82
  <a name='L17'></a><a href='#L17'>17</a>
83
83
  <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
90
+ <span class="cline-any cline-neutral">&nbsp;</span>
91
+ <span class="cline-any cline-neutral">&nbsp;</span>
92
+ <span class="cline-any cline-neutral">&nbsp;</span>
93
+ <span class="cline-any cline-neutral">&nbsp;</span>
94
+ <span class="cline-any cline-neutral">&nbsp;</span>
85
95
  <span class="cline-any cline-neutral">&nbsp;</span>
86
96
  <span class="cline-any cline-neutral">&nbsp;</span>
87
97
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -116,6 +126,11 @@ export interface TaskRunnerExecutionConfig {
116
126
  * Useful for verifying the execution order and graph structure.
117
127
  */
118
128
  dryRun?: boolean;
129
+ /**
130
+ * The maximum number of tasks to run concurrently.
131
+ * If undefined, all ready tasks will be run in parallel.
132
+ */
133
+ concurrency?: number;
119
134
  }
120
135
  &nbsp;</pre></td></tr></table></pre>
121
136
 
@@ -124,7 +139,7 @@ export interface TaskRunnerExecutionConfig {
124
139
  <div class='footer quiet pad2 space-top1 center small'>
125
140
  Code coverage generated by
126
141
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
127
- at 2026-01-18T18:46:49.776Z
142
+ at 2026-01-18T20:19:46.886Z
128
143
  </div>
129
144
  <script src="../prettify.js"></script>
130
145
  <script>