@calmo/task-runner 1.2.2 → 1.2.3

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 (43) hide show
  1. package/.gemini/commands/openspec/apply.toml +21 -0
  2. package/.gemini/commands/openspec/archive.toml +25 -0
  3. package/.gemini/commands/openspec/proposal.toml +26 -0
  4. package/AGENTS.md +18 -0
  5. package/CHANGELOG.md +16 -0
  6. package/GEMINI.md +8 -0
  7. package/coverage/coverage-final.json +4 -4
  8. package/coverage/index.html +9 -9
  9. package/coverage/lcov-report/index.html +9 -9
  10. package/coverage/lcov-report/src/EventBus.ts.html +4 -4
  11. package/coverage/lcov-report/src/TaskGraphValidator.ts.html +35 -5
  12. package/coverage/lcov-report/src/TaskRunner.ts.html +7 -109
  13. package/coverage/lcov-report/src/WorkflowExecutor.ts.html +166 -109
  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 +16 -16
  17. package/coverage/lcov.info +120 -144
  18. package/coverage/src/EventBus.ts.html +4 -4
  19. package/coverage/src/TaskGraphValidator.ts.html +35 -5
  20. package/coverage/src/TaskRunner.ts.html +7 -109
  21. package/coverage/src/WorkflowExecutor.ts.html +166 -109
  22. package/coverage/src/contracts/RunnerEvents.ts.html +1 -1
  23. package/coverage/src/contracts/index.html +1 -1
  24. package/coverage/src/index.html +16 -16
  25. package/dist/TaskGraphValidator.d.ts +6 -0
  26. package/dist/TaskGraphValidator.js +9 -0
  27. package/dist/TaskGraphValidator.js.map +1 -1
  28. package/dist/TaskRunner.js +1 -32
  29. package/dist/TaskRunner.js.map +1 -1
  30. package/dist/WorkflowExecutor.d.ts +9 -0
  31. package/dist/WorkflowExecutor.js +74 -54
  32. package/dist/WorkflowExecutor.js.map +1 -1
  33. package/dist/contracts/ITaskGraphValidator.d.ts +6 -0
  34. package/openspec/AGENTS.md +456 -0
  35. package/openspec/changes/add-external-task-cancellation/proposal.md +14 -0
  36. package/openspec/changes/add-external-task-cancellation/tasks.md +10 -0
  37. package/openspec/project.md +31 -0
  38. package/package.json +1 -1
  39. package/src/TaskGraphValidator.ts +10 -0
  40. package/src/TaskRunner.ts +1 -35
  41. package/src/WorkflowExecutor.ts +81 -62
  42. package/src/contracts/ITaskGraphValidator.ts +7 -0
  43. package/test-report.xml +47 -39
@@ -202,7 +202,7 @@ export type ListenerMap<TContext> = {
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-18T05:44:30.766Z
205
+ at 2026-01-18T14:25:37.520Z
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-18T05:44:30.766Z
104
+ at 2026-01-18T14:25:37.520Z
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'>131/131</span>
28
+ <span class='fraction'>121/121</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
33
  <span class="strong">100% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>51/51</span>
35
+ <span class='fraction'>42/42</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'>22/22</span>
42
+ <span class='fraction'>19/19</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'>128/128</span>
49
+ <span class='fraction'>119/119</span>
50
50
  </div>
51
51
 
52
52
 
@@ -99,13 +99,13 @@
99
99
  <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
100
100
  </td>
101
101
  <td data-value="100" class="pct high">100%</td>
102
- <td data-value="43" class="abs high">43/43</td>
102
+ <td data-value="46" class="abs high">46/46</td>
103
103
  <td data-value="100" class="pct high">100%</td>
104
104
  <td data-value="16" class="abs high">16/16</td>
105
105
  <td data-value="100" class="pct high">100%</td>
106
- <td data-value="3" class="abs high">3/3</td>
106
+ <td data-value="5" class="abs high">5/5</td>
107
107
  <td data-value="100" class="pct high">100%</td>
108
- <td data-value="42" class="abs high">42/42</td>
108
+ <td data-value="44" class="abs high">44/44</td>
109
109
  </tr>
110
110
 
111
111
  <tr>
@@ -114,13 +114,13 @@
114
114
  <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
115
115
  </td>
116
116
  <td data-value="100" class="pct high">100%</td>
117
- <td data-value="30" class="abs high">30/30</td>
117
+ <td data-value="12" class="abs high">12/12</td>
118
118
  <td data-value="100" class="pct high">100%</td>
119
- <td data-value="7" class="abs high">7/7</td>
119
+ <td data-value="4" class="abs high">4/4</td>
120
120
  <td data-value="100" class="pct high">100%</td>
121
- <td data-value="6" class="abs high">6/6</td>
121
+ <td data-value="5" class="abs high">5/5</td>
122
122
  <td data-value="100" class="pct high">100%</td>
123
- <td data-value="29" class="abs high">29/29</td>
123
+ <td data-value="12" class="abs high">12/12</td>
124
124
  </tr>
125
125
 
126
126
  <tr>
@@ -129,13 +129,13 @@
129
129
  <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
130
130
  </td>
131
131
  <td data-value="100" class="pct high">100%</td>
132
- <td data-value="43" class="abs high">43/43</td>
132
+ <td data-value="48" class="abs high">48/48</td>
133
133
  <td data-value="100" class="pct high">100%</td>
134
- <td data-value="20" class="abs high">20/20</td>
134
+ <td data-value="14" class="abs high">14/14</td>
135
135
  <td data-value="100" class="pct high">100%</td>
136
- <td data-value="9" class="abs high">9/9</td>
136
+ <td data-value="5" class="abs high">5/5</td>
137
137
  <td data-value="100" class="pct high">100%</td>
138
- <td data-value="42" class="abs high">42/42</td>
138
+ <td data-value="48" class="abs high">48/48</td>
139
139
  </tr>
140
140
 
141
141
  </tbody>
@@ -146,7 +146,7 @@
146
146
  <div class='footer quiet pad2 space-top1 center small'>
147
147
  Code coverage generated by
148
148
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
149
- at 2026-01-18T05:44:30.766Z
149
+ at 2026-01-18T14:25:37.520Z
150
150
  </div>
151
151
  <script src="../prettify.js"></script>
152
152
  <script>
@@ -8,16 +8,16 @@ FNF:4
8
8
  FNH:4
9
9
  FNDA:13,(anonymous_0)
10
10
  FNDA:2,(anonymous_1)
11
- FNDA:89,(anonymous_2)
11
+ FNDA:106,(anonymous_2)
12
12
  FNDA:1,(anonymous_3)
13
- DA:12,23
13
+ DA:12,26
14
14
  DA:23,13
15
15
  DA:26,12
16
16
  DA:29,13
17
17
  DA:43,2
18
18
  DA:44,1
19
- DA:59,89
20
- DA:62,89
19
+ DA:59,106
20
+ DA:62,106
21
21
  DA:63,14
22
22
  DA:64,14
23
23
  DA:65,14
@@ -32,7 +32,7 @@ BRDA:23,0,1,1
32
32
  BRDA:43,1,0,1
33
33
  BRDA:43,1,1,1
34
34
  BRDA:62,2,0,14
35
- BRDA:62,2,1,75
35
+ BRDA:62,2,1,92
36
36
  BRDA:66,3,0,1
37
37
  BRDA:66,3,1,13
38
38
  BRF:8
@@ -42,12 +42,16 @@ TN:
42
42
  SF:src/TaskGraphValidator.ts
43
43
  FN:17,(anonymous_0)
44
44
  FN:49,(anonymous_1)
45
- FN:96,(anonymous_2)
46
- FNF:3
47
- FNH:3
45
+ FN:101,(anonymous_2)
46
+ FN:102,(anonymous_3)
47
+ FN:106,(anonymous_4)
48
+ FNF:5
49
+ FNH:5
48
50
  FNDA:29,(anonymous_0)
49
51
  FNDA:7,(anonymous_1)
50
- FNDA:51,(anonymous_2)
52
+ FNDA:6,(anonymous_2)
53
+ FNDA:6,(anonymous_3)
54
+ FNDA:51,(anonymous_4)
51
55
  DA:18,29
52
56
  DA:21,29
53
57
  DA:22,29
@@ -77,21 +81,23 @@ DA:78,4
77
81
  DA:80,4
78
82
  DA:86,4
79
83
  DA:90,25
80
- DA:103,51
81
- DA:104,51
82
- DA:105,51
83
- DA:107,51
84
- DA:108,51
85
- DA:109,33
86
- DA:113,5
87
- DA:114,28
88
- DA:117,4
89
- DA:118,4
90
- DA:122,42
91
- DA:123,42
92
- DA:124,42
93
- LF:42
94
- LH:42
84
+ DA:102,6
85
+ DA:103,6
86
+ DA:113,51
87
+ DA:114,51
88
+ DA:115,51
89
+ DA:117,51
90
+ DA:118,51
91
+ DA:119,33
92
+ DA:123,5
93
+ DA:124,28
94
+ DA:127,4
95
+ DA:128,4
96
+ DA:132,42
97
+ DA:133,42
98
+ DA:134,42
99
+ LF:44
100
+ LH:44
95
101
  BRDA:23,0,0,3
96
102
  BRDA:23,0,1,58
97
103
  BRDA:37,1,0,5
@@ -102,12 +108,12 @@ BRDA:68,3,0,3
102
108
  BRDA:68,3,1,46
103
109
  BRDA:73,4,0,4
104
110
  BRDA:73,4,1,42
105
- BRDA:109,5,0,5
106
- BRDA:109,5,1,28
107
- BRDA:110,6,0,33
108
- BRDA:110,6,1,5
109
- BRDA:114,7,0,4
110
- BRDA:114,7,1,24
111
+ BRDA:119,5,0,5
112
+ BRDA:119,5,1,28
113
+ BRDA:120,6,0,33
114
+ BRDA:120,6,1,5
115
+ BRDA:124,7,0,4
116
+ BRDA:124,7,1,24
111
117
  BRF:16
112
118
  BRH:16
113
119
  end_of_record
@@ -118,15 +124,13 @@ FN:31,(anonymous_1)
118
124
  FN:43,(anonymous_2)
119
125
  FN:57,(anonymous_3)
120
126
  FN:60,(anonymous_4)
121
- FN:79,(anonymous_5)
122
- FNF:6
123
- FNH:6
127
+ FNF:5
128
+ FNH:5
124
129
  FNDA:22,(anonymous_0)
125
130
  FNDA:12,(anonymous_1)
126
131
  FNDA:2,(anonymous_2)
127
132
  FNDA:21,(anonymous_3)
128
133
  FNDA:43,(anonymous_4)
129
- FNDA:6,(anonymous_5)
130
134
  DA:18,22
131
135
  DA:19,22
132
136
  DA:24,22
@@ -136,126 +140,98 @@ DA:59,21
136
140
  DA:60,43
137
141
  DA:66,21
138
142
  DA:67,21
139
- DA:69,6
140
- DA:70,6
141
- DA:72,6
142
- DA:73,6
143
- DA:74,6
144
- DA:77,2
145
- DA:79,6
146
- DA:80,2
147
- DA:84,2
148
- DA:85,2
149
- DA:86,2
150
- DA:89,2
151
- DA:90,2
152
- DA:91,2
153
- DA:97,6
154
- DA:98,6
155
- DA:99,6
156
- DA:102,6
157
- DA:105,15
158
- DA:106,15
159
- LF:29
160
- LH:29
143
+ DA:68,6
144
+ DA:71,15
145
+ DA:72,15
146
+ LF:12
147
+ LH:12
161
148
  BRDA:62,0,0,43
162
149
  BRDA:62,0,1,21
163
150
  BRDA:67,1,0,6
164
151
  BRDA:67,1,1,15
165
- BRDA:74,2,0,2
166
- BRDA:74,2,1,2
167
- BRDA:74,2,2,2
168
- BRF:7
169
- BRH:7
152
+ BRF:4
153
+ BRH:4
170
154
  end_of_record
171
155
  TN:
172
156
  SF:src/WorkflowExecutor.ts
173
157
  FN:16,(anonymous_0)
174
158
  FN:26,(anonymous_1)
175
- FN:33,(anonymous_2)
176
- FN:35,(anonymous_3)
177
- FN:42,(anonymous_4)
178
- FN:55,(anonymous_5)
179
- FN:59,(anonymous_6)
180
- FN:68,(anonymous_7)
181
- FN:85,(anonymous_8)
182
- FNF:9
183
- FNH:9
184
- FNDA:15,(anonymous_0)
185
- FNDA:15,(anonymous_1)
186
- FNDA:35,(anonymous_2)
187
- FNDA:98,(anonymous_3)
188
- FNDA:39,(anonymous_4)
189
- FNDA:98,(anonymous_5)
190
- FNDA:29,(anonymous_6)
191
- FNDA:26,(anonymous_7)
192
- FNDA:26,(anonymous_8)
193
- DA:10,15
194
- DA:17,15
195
- DA:18,15
196
- DA:27,15
197
- DA:29,15
198
- DA:30,15
199
- DA:33,15
200
- DA:34,35
201
- DA:35,98
202
- DA:39,35
203
- DA:40,49
204
- DA:41,49
205
- DA:42,39
206
- DA:44,49
207
- DA:45,6
208
- DA:49,6
209
- DA:50,6
210
- DA:55,35
211
- DA:56,98
159
+ FN:51,(anonymous_2)
160
+ FN:96,(anonymous_3)
161
+ FN:106,(anonymous_4)
162
+ FNF:5
163
+ FNH:5
164
+ FNDA:18,(anonymous_0)
165
+ FNDA:18,(anonymous_1)
166
+ FNDA:43,(anonymous_2)
167
+ FNDA:31,(anonymous_3)
168
+ FNDA:31,(anonymous_4)
169
+ DA:10,18
170
+ DA:17,18
171
+ DA:18,18
172
+ DA:27,18
173
+ DA:29,18
174
+ DA:30,18
175
+ DA:31,18
176
+ DA:34,18
177
+ DA:36,18
178
+ DA:38,25
179
+ DA:40,25
180
+ DA:43,18
181
+ DA:44,18
182
+ DA:56,43
212
183
  DA:57,43
213
- DA:58,98
214
- DA:59,29
215
- DA:64,35
216
- DA:65,26
217
- DA:66,26
218
- DA:68,26
219
- DA:69,26
220
- DA:70,26
221
- DA:71,24
222
- DA:73,2
223
- DA:78,26
224
- DA:79,26
225
- DA:80,26
226
- DA:85,26
227
- DA:86,26
228
- DA:88,26
229
- DA:93,15
230
- DA:95,15
231
- DA:97,20
232
- DA:99,20
233
- DA:102,15
234
- DA:103,15
235
- LF:42
236
- LH:42
237
- BRDA:35,0,0,98
238
- BRDA:35,0,1,50
239
- BRDA:40,1,0,49
240
- BRDA:40,1,1,18
241
- BRDA:42,2,0,39
242
- BRDA:42,2,1,18
243
- BRDA:44,3,0,6
244
- BRDA:44,3,1,43
245
- BRDA:56,4,0,55
246
- BRDA:56,4,1,43
247
- BRDA:56,5,0,98
248
- BRDA:56,5,1,44
249
- BRDA:57,6,0,43
250
- BRDA:57,6,1,18
251
- BRDA:59,7,0,29
252
- BRDA:59,7,1,12
253
- BRDA:75,8,0,1
254
- BRDA:75,8,1,1
255
- BRDA:95,9,0,15
256
- BRDA:95,9,1,20
257
- BRF:20
258
- BRH:20
184
+ DA:59,43
185
+ DA:60,57
186
+ DA:61,57
187
+ DA:64,57
188
+ DA:65,43
189
+ DA:66,43
190
+ DA:68,23
191
+ DA:69,20
192
+ DA:70,7
193
+ DA:71,7
194
+ DA:75,57
195
+ DA:76,7
196
+ DA:80,7
197
+ DA:81,7
198
+ DA:82,7
199
+ DA:83,50
200
+ DA:84,31
201
+ DA:85,31
202
+ DA:90,43
203
+ DA:91,38
204
+ DA:95,43
205
+ DA:96,31
206
+ DA:97,31
207
+ DA:99,31
208
+ DA:107,31
209
+ DA:108,31
210
+ DA:110,31
211
+ DA:111,31
212
+ DA:112,29
213
+ DA:114,2
214
+ DA:119,31
215
+ DA:120,31
216
+ DA:121,31
217
+ LF:48
218
+ LH:48
219
+ BRDA:36,0,0,18
220
+ BRDA:36,0,1,25
221
+ BRDA:60,1,0,57
222
+ BRDA:60,1,1,22
223
+ BRDA:66,2,0,23
224
+ BRDA:66,2,1,20
225
+ BRDA:69,3,0,7
226
+ BRDA:69,3,1,13
227
+ BRDA:75,4,0,7
228
+ BRDA:75,4,1,50
229
+ BRDA:83,5,0,31
230
+ BRDA:83,5,1,19
231
+ BRDA:116,6,0,1
232
+ BRDA:116,6,1,1
233
+ BRF:14
234
+ BRH:14
259
235
  end_of_record
260
236
  TN:
261
237
  SF:src/contracts/RunnerEvents.ts
@@ -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">23x</span>
161
+ <span class="cline-any cline-yes">26x</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">89x</span>
208
+ <span class="cline-any cline-yes">106x</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">89x</span>
211
+ <span class="cline-any cline-yes">106x</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-18T05:44:30.758Z
325
+ at 2026-01-18T14:25:37.513Z
326
326
  </div>
327
327
  <script src="../prettify.js"></script>
328
328
  <script>
@@ -25,7 +25,7 @@
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'>43/43</span>
28
+ <span class='fraction'>46/46</span>
29
29
  </div>
30
30
 
31
31
 
@@ -39,14 +39,14 @@
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'>3/3</span>
42
+ <span class='fraction'>5/5</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'>42/42</span>
49
+ <span class='fraction'>44/44</span>
50
50
  </div>
51
51
 
52
52
 
@@ -189,7 +189,17 @@
189
189
  <a name='L124'></a><a href='#L124'>124</a>
190
190
  <a name='L125'></a><a href='#L125'>125</a>
191
191
  <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
193
203
  <span class="cline-any cline-neutral">&nbsp;</span>
194
204
  <span class="cline-any cline-neutral">&nbsp;</span>
195
205
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -290,6 +300,16 @@
290
300
  <span class="cline-any cline-neutral">&nbsp;</span>
291
301
  <span class="cline-any cline-neutral">&nbsp;</span>
292
302
  <span class="cline-any cline-neutral">&nbsp;</span>
303
+ <span class="cline-any cline-yes">6x</span>
304
+ <span class="cline-any cline-yes">6x</span>
305
+ <span class="cline-any cline-neutral">&nbsp;</span>
306
+ <span class="cline-any cline-neutral">&nbsp;</span>
307
+ <span class="cline-any cline-neutral">&nbsp;</span>
308
+ <span class="cline-any cline-neutral">&nbsp;</span>
309
+ <span class="cline-any cline-neutral">&nbsp;</span>
310
+ <span class="cline-any cline-neutral">&nbsp;</span>
311
+ <span class="cline-any cline-neutral">&nbsp;</span>
312
+ <span class="cline-any cline-neutral">&nbsp;</span>
293
313
  <span class="cline-any cline-neutral">&nbsp;</span>
294
314
  <span class="cline-any cline-yes">51x</span>
295
315
  <span class="cline-any cline-yes">51x</span>
@@ -409,6 +429,16 @@ export class TaskGraphValidator implements ITaskGraphValidator {
409
429
  errors
410
430
  };
411
431
  }
432
+ &nbsp;
433
+ /**
434
+ * Creates a human-readable error message from a validation result.
435
+ * @param result The validation result containing errors.
436
+ * @returns A formatted error string.
437
+ */
438
+ createErrorMessage(result: ValidationResult): string {
439
+ const errorDetails = result.errors.map(e =&gt; e.message);
440
+ return `Task graph validation failed: ${errorDetails.join("; ")}`;
441
+ }
412
442
  &nbsp;
413
443
  private detectCycle(
414
444
  taskId: string,
@@ -448,7 +478,7 @@ export class TaskGraphValidator implements ITaskGraphValidator {
448
478
  <div class='footer quiet pad2 space-top1 center small'>
449
479
  Code coverage generated by
450
480
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
451
- at 2026-01-18T05:44:30.758Z
481
+ at 2026-01-18T14:25:37.513Z
452
482
  </div>
453
483
  <script src="../prettify.js"></script>
454
484
  <script>