@calmo/task-runner 3.3.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 (52) hide show
  1. package/.jules/backlog_maniac.md +3 -0
  2. package/CHANGELOG.md +10 -0
  3. package/coverage/coverage-final.json +5 -4
  4. package/coverage/index.html +7 -7
  5. package/coverage/lcov-report/index.html +7 -7
  6. package/coverage/lcov-report/src/EventBus.ts.html +2 -2
  7. package/coverage/lcov-report/src/TaskGraphValidationError.ts.html +121 -0
  8. package/coverage/lcov-report/src/TaskGraphValidator.ts.html +15 -15
  9. package/coverage/lcov-report/src/TaskRunner.ts.html +25 -13
  10. package/coverage/lcov-report/src/TaskRunnerBuilder.ts.html +1 -1
  11. package/coverage/lcov-report/src/TaskRunnerExecutionConfig.ts.html +1 -1
  12. package/coverage/lcov-report/src/TaskStateManager.ts.html +1 -1
  13. package/coverage/lcov-report/src/WorkflowExecutor.ts.html +1 -1
  14. package/coverage/lcov-report/src/contracts/RunnerEvents.ts.html +1 -1
  15. package/coverage/lcov-report/src/contracts/index.html +1 -1
  16. package/coverage/lcov-report/src/index.html +19 -4
  17. package/coverage/lcov-report/src/strategies/DryRunExecutionStrategy.ts.html +1 -1
  18. package/coverage/lcov-report/src/strategies/RetryingExecutionStrategy.ts.html +2 -2
  19. package/coverage/lcov-report/src/strategies/StandardExecutionStrategy.ts.html +1 -1
  20. package/coverage/lcov-report/src/strategies/index.html +1 -1
  21. package/coverage/lcov.info +112 -98
  22. package/coverage/src/EventBus.ts.html +2 -2
  23. package/coverage/src/TaskGraphValidationError.ts.html +121 -0
  24. package/coverage/src/TaskGraphValidator.ts.html +15 -15
  25. package/coverage/src/TaskRunner.ts.html +25 -13
  26. package/coverage/src/TaskRunnerBuilder.ts.html +1 -1
  27. package/coverage/src/TaskRunnerExecutionConfig.ts.html +1 -1
  28. package/coverage/src/TaskStateManager.ts.html +1 -1
  29. package/coverage/src/WorkflowExecutor.ts.html +1 -1
  30. package/coverage/src/contracts/RunnerEvents.ts.html +1 -1
  31. package/coverage/src/contracts/index.html +1 -1
  32. package/coverage/src/index.html +19 -4
  33. package/coverage/src/strategies/DryRunExecutionStrategy.ts.html +1 -1
  34. package/coverage/src/strategies/RetryingExecutionStrategy.ts.html +2 -2
  35. package/coverage/src/strategies/StandardExecutionStrategy.ts.html +1 -1
  36. package/coverage/src/strategies/index.html +1 -1
  37. package/dist/TaskGraphValidationError.d.ts +9 -0
  38. package/dist/TaskGraphValidationError.js +13 -0
  39. package/dist/TaskGraphValidationError.js.map +1 -0
  40. package/dist/TaskRunner.js +2 -1
  41. package/dist/TaskRunner.js.map +1 -1
  42. package/dist/index.d.ts +1 -0
  43. package/dist/index.js +1 -0
  44. package/dist/index.js.map +1 -1
  45. package/openspec/changes/archive/2026-01-18-add-concurrency-control/tasks.md +9 -0
  46. package/package.json +1 -1
  47. package/src/TaskGraphValidationError.ts +12 -0
  48. package/src/TaskRunner.ts +5 -1
  49. package/src/index.ts +1 -0
  50. package/test-report.xml +109 -107
  51. package/openspec/changes/add-concurrency-control/tasks.md +0 -9
  52. /package/openspec/changes/{add-concurrency-control → archive/2026-01-18-add-concurrency-control}/proposal.md +0 -0
@@ -10,7 +10,7 @@ FNDA:16,(anonymous_0)
10
10
  FNDA:3,(anonymous_1)
11
11
  FNDA:342,(anonymous_2)
12
12
  FNDA:1,(anonymous_3)
13
- DA:12,62
13
+ DA:12,63
14
14
  DA:23,16
15
15
  DA:26,14
16
16
  DA:29,16
@@ -39,6 +39,20 @@ BRF:8
39
39
  BRH:8
40
40
  end_of_record
41
41
  TN:
42
+ SF:src/TaskGraphValidationError.ts
43
+ FN:8,(anonymous_0)
44
+ FNF:1
45
+ FNH:1
46
+ FNDA:9,(anonymous_0)
47
+ DA:8,9
48
+ DA:9,9
49
+ DA:10,9
50
+ LF:3
51
+ LH:3
52
+ BRF:0
53
+ BRH:0
54
+ end_of_record
55
+ TN:
42
56
  SF:src/TaskGraphValidator.ts
43
57
  FN:17,(anonymous_0)
44
58
  FN:49,(anonymous_1)
@@ -47,24 +61,24 @@ FN:102,(anonymous_3)
47
61
  FN:106,(anonymous_4)
48
62
  FNF:5
49
63
  FNH:5
50
- FNDA:60,(anonymous_0)
51
- FNDA:8,(anonymous_1)
52
- FNDA:8,(anonymous_2)
53
- FNDA:8,(anonymous_3)
64
+ FNDA:61,(anonymous_0)
65
+ FNDA:9,(anonymous_1)
66
+ FNDA:9,(anonymous_2)
67
+ FNDA:9,(anonymous_3)
54
68
  FNDA:20139,(anonymous_4)
55
- DA:18,60
56
- DA:21,60
57
- DA:22,60
58
- DA:23,20157
69
+ DA:18,61
70
+ DA:21,61
71
+ DA:22,61
72
+ DA:23,20158
59
73
  DA:24,3
60
- DA:30,20154
61
- DA:35,60
62
- DA:36,20157
63
- DA:37,20168
64
- DA:38,6
65
- DA:49,60
66
- DA:51,60
67
- DA:52,5
74
+ DA:30,20155
75
+ DA:35,61
76
+ DA:36,20158
77
+ DA:37,20169
78
+ DA:38,7
79
+ DA:49,61
80
+ DA:51,61
81
+ DA:52,6
68
82
  DA:59,55
69
83
  DA:60,55
70
84
  DA:61,20149
@@ -81,8 +95,8 @@ DA:78,5
81
95
  DA:80,5
82
96
  DA:86,5
83
97
  DA:90,55
84
- DA:102,8
85
- DA:103,8
98
+ DA:102,9
99
+ DA:103,9
86
100
  DA:114,20139
87
101
  DA:116,20139
88
102
  DA:117,20139
@@ -109,10 +123,10 @@ DA:161,20134
109
123
  LF:54
110
124
  LH:54
111
125
  BRDA:23,0,0,3
112
- BRDA:23,0,1,20154
113
- BRDA:37,1,0,6
126
+ BRDA:23,0,1,20155
127
+ BRDA:37,1,0,7
114
128
  BRDA:37,1,1,20162
115
- BRDA:51,2,0,5
129
+ BRDA:51,2,0,6
116
130
  BRDA:51,2,1,55
117
131
  BRDA:68,3,0,3
118
132
  BRDA:68,3,1,20139
@@ -129,21 +143,21 @@ BRH:16
129
143
  end_of_record
130
144
  TN:
131
145
  SF:src/TaskRunner.ts
132
- FN:33,(anonymous_0)
133
- FN:40,(anonymous_1)
134
- FN:52,(anonymous_2)
135
- FN:65,(anonymous_3)
136
- FN:76,(anonymous_4)
137
- FN:84,(anonymous_5)
138
- FN:85,(anonymous_6)
139
- FN:115,(anonymous_7)
140
- FN:127,(anonymous_8)
141
- FN:133,(anonymous_9)
142
- FN:162,(anonymous_10)
143
- FN:178,(anonymous_11)
146
+ FN:34,(anonymous_0)
147
+ FN:41,(anonymous_1)
148
+ FN:53,(anonymous_2)
149
+ FN:66,(anonymous_3)
150
+ FN:77,(anonymous_4)
151
+ FN:85,(anonymous_5)
152
+ FN:86,(anonymous_6)
153
+ FN:116,(anonymous_7)
154
+ FN:128,(anonymous_8)
155
+ FN:134,(anonymous_9)
156
+ FN:166,(anonymous_10)
157
+ FN:182,(anonymous_11)
144
158
  FNF:12
145
159
  FNH:12
146
- FNDA:56,(anonymous_0)
160
+ FNDA:57,(anonymous_0)
147
161
  FNDA:15,(anonymous_1)
148
162
  FNDA:3,(anonymous_2)
149
163
  FNDA:2,(anonymous_3)
@@ -151,77 +165,77 @@ FNDA:14,(anonymous_4)
151
165
  FNDA:12,(anonymous_5)
152
166
  FNDA:24,(anonymous_6)
153
167
  FNDA:14,(anonymous_7)
154
- FNDA:51,(anonymous_8)
155
- FNDA:139,(anonymous_9)
168
+ FNDA:52,(anonymous_8)
169
+ FNDA:140,(anonymous_9)
156
170
  FNDA:3,(anonymous_10)
157
171
  FNDA:1,(anonymous_11)
158
- DA:24,56
159
- DA:25,56
160
- DA:26,56
161
- DA:33,56
162
- DA:44,15
163
- DA:57,3
164
- DA:67,2
172
+ DA:25,57
173
+ DA:26,57
174
+ DA:27,57
175
+ DA:34,57
176
+ DA:45,15
177
+ DA:58,3
165
178
  DA:68,2
166
- DA:77,4
167
- DA:84,12
168
- DA:85,24
169
- DA:89,4
170
- DA:93,12
171
- DA:97,4
172
- DA:98,12
173
- DA:99,5
174
- DA:100,6
175
- DA:107,4
176
- DA:116,24
177
- DA:132,51
178
- DA:133,139
179
- DA:139,51
180
- DA:140,51
181
- DA:141,8
182
- DA:144,43
183
- DA:146,43
184
- DA:147,43
185
- DA:148,2
179
+ DA:69,2
180
+ DA:78,4
181
+ DA:85,12
182
+ DA:86,24
183
+ DA:90,4
184
+ DA:94,12
185
+ DA:98,4
186
+ DA:99,12
187
+ DA:100,5
188
+ DA:101,6
189
+ DA:108,4
190
+ DA:117,24
191
+ DA:133,52
192
+ DA:134,140
193
+ DA:140,52
194
+ DA:141,52
195
+ DA:142,9
196
+ DA:148,43
197
+ DA:150,43
186
198
  DA:151,43
187
- DA:160,51
188
- DA:161,5
189
- DA:162,5
190
- DA:163,3
199
+ DA:152,2
200
+ DA:155,43
201
+ DA:164,52
202
+ DA:165,5
191
203
  DA:166,5
204
+ DA:167,3
192
205
  DA:170,5
193
- DA:171,3
194
- DA:174,1
195
- DA:175,1
196
- DA:178,2
206
+ DA:174,5
207
+ DA:175,3
208
+ DA:178,1
197
209
  DA:179,1
198
- DA:181,2
199
- DA:185,5
200
- DA:186,5
201
- DA:188,5
210
+ DA:182,2
211
+ DA:183,1
212
+ DA:185,2
202
213
  DA:189,5
203
- DA:190,2
204
- DA:194,38
214
+ DA:190,5
215
+ DA:192,5
216
+ DA:193,5
217
+ DA:194,2
218
+ DA:198,38
205
219
  LF:47
206
220
  LH:47
207
- BRDA:98,0,0,5
208
- BRDA:98,0,1,7
209
- BRDA:135,1,0,139
210
- BRDA:135,1,1,72
211
- BRDA:140,2,0,8
212
- BRDA:140,2,1,43
213
- BRDA:147,3,0,2
214
- BRDA:147,3,1,41
215
- BRDA:160,4,0,5
216
- BRDA:160,4,1,38
217
- BRDA:170,5,0,3
218
- BRDA:170,5,1,2
219
- BRDA:171,6,0,1
220
- BRDA:171,6,1,2
221
- BRDA:189,7,0,2
222
- BRDA:189,7,1,3
223
- BRDA:189,8,0,5
224
- BRDA:189,8,1,3
221
+ BRDA:99,0,0,5
222
+ BRDA:99,0,1,7
223
+ BRDA:136,1,0,140
224
+ BRDA:136,1,1,72
225
+ BRDA:141,2,0,9
226
+ BRDA:141,2,1,43
227
+ BRDA:151,3,0,2
228
+ BRDA:151,3,1,41
229
+ BRDA:164,4,0,5
230
+ BRDA:164,4,1,38
231
+ BRDA:174,5,0,3
232
+ BRDA:174,5,1,2
233
+ BRDA:175,6,0,1
234
+ BRDA:175,6,1,2
235
+ BRDA:193,7,0,2
236
+ BRDA:193,7,1,3
237
+ BRDA:193,8,0,5
238
+ BRDA:193,8,1,3
225
239
  BRF:18
226
240
  BRH:18
227
241
  end_of_record
@@ -478,14 +492,14 @@ FN:77,(anonymous_5)
478
492
  FN:83,(anonymous_6)
479
493
  FNF:7
480
494
  FNH:7
481
- FNDA:66,(anonymous_0)
495
+ FNDA:67,(anonymous_0)
482
496
  FNDA:119,(anonymous_1)
483
497
  FNDA:8,(anonymous_2)
484
498
  FNDA:8,(anonymous_3)
485
499
  FNDA:6,(anonymous_4)
486
500
  FNDA:1,(anonymous_5)
487
501
  FNDA:7,(anonymous_6)
488
- DA:9,66
502
+ DA:9,67
489
503
  DA:16,119
490
504
  DA:17,119
491
505
  DA:18,112
@@ -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">62x</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>
@@ -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-18T20:12:36.619Z
325
+ at 2026-01-18T20:19:46.875Z
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.875Z
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">60x</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">60x</span>
250
- <span class="cline-any cline-yes">60x</span>
251
- <span class="cline-any cline-yes">20157x</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">20154x</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">60x</span>
264
- <span class="cline-any cline-yes">20157x</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,10 +274,10 @@
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">60x</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">60x</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>
@@ -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>
@@ -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-18T20:12:36.619Z
562
+ at 2026-01-18T20:19:46.875Z
563
563
  </div>
564
564
  <script src="../prettify.js"></script>
565
565
  <script>
@@ -260,7 +260,11 @@
260
260
  <a name='L195'></a><a href='#L195'>195</a>
261
261
  <a name='L196'></a><a href='#L196'>196</a>
262
262
  <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
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>
264
268
  <span class="cline-any cline-neutral">&nbsp;</span>
265
269
  <span class="cline-any cline-neutral">&nbsp;</span>
266
270
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -283,16 +287,17 @@
283
287
  <span class="cline-any cline-neutral">&nbsp;</span>
284
288
  <span class="cline-any cline-neutral">&nbsp;</span>
285
289
  <span class="cline-any cline-neutral">&nbsp;</span>
286
- <span class="cline-any cline-yes">56x</span>
287
- <span class="cline-any cline-yes">56x</span>
288
- <span class="cline-any cline-yes">56x</span>
289
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>
290
294
  <span class="cline-any cline-neutral">&nbsp;</span>
291
295
  <span class="cline-any cline-neutral">&nbsp;</span>
292
296
  <span class="cline-any cline-neutral">&nbsp;</span>
293
297
  <span class="cline-any cline-neutral">&nbsp;</span>
294
298
  <span class="cline-any cline-neutral">&nbsp;</span>
295
- <span class="cline-any cline-yes">56x</span>
299
+ <span class="cline-any cline-neutral">&nbsp;</span>
300
+ <span class="cline-any cline-yes">57x</span>
296
301
  <span class="cline-any cline-neutral">&nbsp;</span>
297
302
  <span class="cline-any cline-neutral">&nbsp;</span>
298
303
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -391,16 +396,19 @@
391
396
  <span class="cline-any cline-neutral">&nbsp;</span>
392
397
  <span class="cline-any cline-neutral">&nbsp;</span>
393
398
  <span class="cline-any cline-neutral">&nbsp;</span>
394
- <span class="cline-any cline-yes">51x</span>
395
- <span class="cline-any cline-yes">139x</span>
399
+ <span class="cline-any cline-yes">52x</span>
400
+ <span class="cline-any cline-yes">140x</span>
401
+ <span class="cline-any cline-neutral">&nbsp;</span>
402
+ <span class="cline-any cline-neutral">&nbsp;</span>
403
+ <span class="cline-any cline-neutral">&nbsp;</span>
396
404
  <span class="cline-any cline-neutral">&nbsp;</span>
397
405
  <span class="cline-any cline-neutral">&nbsp;</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>
398
409
  <span class="cline-any cline-neutral">&nbsp;</span>
399
410
  <span class="cline-any cline-neutral">&nbsp;</span>
400
411
  <span class="cline-any cline-neutral">&nbsp;</span>
401
- <span class="cline-any cline-yes">51x</span>
402
- <span class="cline-any cline-yes">51x</span>
403
- <span class="cline-any cline-yes">8x</span>
404
412
  <span class="cline-any cline-neutral">&nbsp;</span>
405
413
  <span class="cline-any cline-neutral">&nbsp;</span>
406
414
  <span class="cline-any cline-yes">43x</span>
@@ -419,7 +427,7 @@
419
427
  <span class="cline-any cline-neutral">&nbsp;</span>
420
428
  <span class="cline-any cline-neutral">&nbsp;</span>
421
429
  <span class="cline-any cline-neutral">&nbsp;</span>
422
- <span class="cline-any cline-yes">51x</span>
430
+ <span class="cline-any cline-yes">52x</span>
423
431
  <span class="cline-any cline-yes">5x</span>
424
432
  <span class="cline-any cline-yes">5x</span>
425
433
  <span class="cline-any cline-yes">3x</span>
@@ -466,6 +474,7 @@ import { EventBus } from "./EventBus.js";
466
474
  import { WorkflowExecutor } from "./WorkflowExecutor.js";
467
475
  import { TaskRunnerExecutionConfig } from "./TaskRunnerExecutionConfig.js";
468
476
  import { TaskStateManager } from "./TaskStateManager.js";
477
+ import { TaskGraphValidationError } from "./TaskGraphValidationError.js";
469
478
  import { IExecutionStrategy } from "./strategies/IExecutionStrategy.js";
470
479
  import { StandardExecutionStrategy } from "./strategies/StandardExecutionStrategy.js";
471
480
  import { RetryingExecutionStrategy } from "./strategies/RetryingExecutionStrategy.js";
@@ -597,7 +606,10 @@ export class TaskRunner&lt;TContext&gt; {
597
606
  &nbsp;
598
607
  const validationResult = this.validator.validate(taskGraph);
599
608
  if (!validationResult.isValid) {
600
- throw new Error(this.validator.createErrorMessage(validationResult));
609
+ throw new TaskGraphValidationError(
610
+ validationResult,
611
+ this.validator.createErrorMessage(validationResult)
612
+ );
601
613
  }
602
614
  &nbsp;
603
615
  const stateManager = new TaskStateManager(this.eventBus);
@@ -661,7 +673,7 @@ export class TaskRunner&lt;TContext&gt; {
661
673
  <div class='footer quiet pad2 space-top1 center small'>
662
674
  Code coverage generated by
663
675
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
664
- at 2026-01-18T20:12:36.619Z
676
+ at 2026-01-18T20:19:46.875Z
665
677
  </div>
666
678
  <script src="../prettify.js"></script>
667
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-18T20:12:36.619Z
301
+ at 2026-01-18T20:19:46.875Z
302
302
  </div>
303
303
  <script src="../prettify.js"></script>
304
304
  <script>
@@ -139,7 +139,7 @@ export interface TaskRunnerExecutionConfig {
139
139
  <div class='footer quiet pad2 space-top1 center small'>
140
140
  Code coverage generated by
141
141
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
142
- at 2026-01-18T20:12:36.619Z
142
+ at 2026-01-18T20:19:46.875Z
143
143
  </div>
144
144
  <script src="../prettify.js"></script>
145
145
  <script>
@@ -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-18T20:12:36.619Z
499
+ at 2026-01-18T20:19:46.875Z
500
500
  </div>
501
501
  <script src="../prettify.js"></script>
502
502
  <script>
@@ -490,7 +490,7 @@ export class WorkflowExecutor&lt;TContext&gt; {
490
490
  <div class='footer quiet pad2 space-top1 center small'>
491
491
  Code coverage generated by
492
492
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
493
- at 2026-01-18T20:12:36.619Z
493
+ at 2026-01-18T20:19:46.875Z
494
494
  </div>
495
495
  <script src="../prettify.js"></script>
496
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-18T20:12:36.619Z
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-18T20:12:36.619Z
104
+ at 2026-01-18T20:19:46.875Z
105
105
  </div>
106
106
  <script src="../../prettify.js"></script>
107
107
  <script>