@calmo/task-runner 1.2.2 → 2.0.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.
- package/.gemini/commands/openspec/apply.toml +21 -0
- package/.gemini/commands/openspec/archive.toml +25 -0
- package/.gemini/commands/openspec/proposal.toml +26 -0
- package/.jules/sentinel.md +4 -0
- package/AGENTS.md +21 -0
- package/CHANGELOG.md +21 -0
- package/GEMINI.md +10 -0
- package/coverage/coverage-final.json +4 -4
- package/coverage/index.html +9 -9
- package/coverage/lcov-report/index.html +9 -9
- package/coverage/lcov-report/src/EventBus.ts.html +4 -4
- package/coverage/lcov-report/src/TaskGraphValidator.ts.html +165 -54
- package/coverage/lcov-report/src/TaskRunner.ts.html +7 -109
- package/coverage/lcov-report/src/WorkflowExecutor.ts.html +169 -106
- package/coverage/lcov-report/src/contracts/RunnerEvents.ts.html +1 -1
- package/coverage/lcov-report/src/contracts/index.html +1 -1
- package/coverage/lcov-report/src/index.html +13 -13
- package/coverage/lcov.info +165 -167
- package/coverage/src/EventBus.ts.html +4 -4
- package/coverage/src/TaskGraphValidator.ts.html +165 -54
- package/coverage/src/TaskRunner.ts.html +7 -109
- package/coverage/src/WorkflowExecutor.ts.html +169 -106
- package/coverage/src/contracts/RunnerEvents.ts.html +1 -1
- package/coverage/src/contracts/index.html +1 -1
- package/coverage/src/index.html +13 -13
- package/dist/TaskGraphValidator.d.ts +6 -0
- package/dist/TaskGraphValidator.js +48 -16
- package/dist/TaskGraphValidator.js.map +1 -1
- package/dist/TaskRunner.js +1 -32
- package/dist/TaskRunner.js.map +1 -1
- package/dist/WorkflowExecutor.d.ts +16 -0
- package/dist/WorkflowExecutor.js +67 -54
- package/dist/WorkflowExecutor.js.map +1 -1
- package/dist/contracts/ITaskGraphValidator.d.ts +6 -0
- package/openspec/AGENTS.md +456 -0
- package/openspec/changes/add-external-task-cancellation/proposal.md +14 -0
- package/openspec/changes/add-external-task-cancellation/tasks.md +10 -0
- package/openspec/project.md +31 -0
- package/package.json +1 -1
- package/src/TaskGraphValidator.ts +56 -19
- package/src/TaskRunner.ts +1 -35
- package/src/WorkflowExecutor.ts +84 -63
- package/src/contracts/ITaskGraphValidator.ts +7 -0
- package/test-report.xml +51 -39
|
@@ -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'>
|
|
28
|
+
<span class='fraction'>56/56</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'>
|
|
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'>
|
|
49
|
+
<span class='fraction'>54/54</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -189,7 +189,44 @@
|
|
|
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
|
|
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>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
193
230
|
<span class="cline-any cline-neutral"> </span>
|
|
194
231
|
<span class="cline-any cline-neutral"> </span>
|
|
195
232
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -206,26 +243,26 @@
|
|
|
206
243
|
<span class="cline-any cline-neutral"> </span>
|
|
207
244
|
<span class="cline-any cline-neutral"> </span>
|
|
208
245
|
<span class="cline-any cline-neutral"> </span>
|
|
209
|
-
<span class="cline-any cline-yes">
|
|
246
|
+
<span class="cline-any cline-yes">30x</span>
|
|
210
247
|
<span class="cline-any cline-neutral"> </span>
|
|
211
248
|
<span class="cline-any cline-neutral"> </span>
|
|
212
|
-
<span class="cline-any cline-yes">
|
|
213
|
-
<span class="cline-any cline-yes">
|
|
214
|
-
<span class="cline-any cline-yes">
|
|
249
|
+
<span class="cline-any cline-yes">30x</span>
|
|
250
|
+
<span class="cline-any cline-yes">30x</span>
|
|
251
|
+
<span class="cline-any cline-yes">20061x</span>
|
|
215
252
|
<span class="cline-any cline-yes">3x</span>
|
|
216
253
|
<span class="cline-any cline-neutral"> </span>
|
|
217
254
|
<span class="cline-any cline-neutral"> </span>
|
|
218
255
|
<span class="cline-any cline-neutral"> </span>
|
|
219
256
|
<span class="cline-any cline-neutral"> </span>
|
|
220
257
|
<span class="cline-any cline-neutral"> </span>
|
|
221
|
-
<span class="cline-any cline-yes">
|
|
258
|
+
<span class="cline-any cline-yes">20058x</span>
|
|
222
259
|
<span class="cline-any cline-neutral"> </span>
|
|
223
260
|
<span class="cline-any cline-neutral"> </span>
|
|
224
261
|
<span class="cline-any cline-neutral"> </span>
|
|
225
262
|
<span class="cline-any cline-neutral"> </span>
|
|
226
|
-
<span class="cline-any cline-yes">
|
|
227
|
-
<span class="cline-any cline-yes">
|
|
228
|
-
<span class="cline-any cline-yes">
|
|
263
|
+
<span class="cline-any cline-yes">30x</span>
|
|
264
|
+
<span class="cline-any cline-yes">20061x</span>
|
|
265
|
+
<span class="cline-any cline-yes">20040x</span>
|
|
229
266
|
<span class="cline-any cline-yes">5x</span>
|
|
230
267
|
<span class="cline-any cline-neutral"> </span>
|
|
231
268
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -237,9 +274,9 @@
|
|
|
237
274
|
<span class="cline-any cline-neutral"> </span>
|
|
238
275
|
<span class="cline-any cline-neutral"> </span>
|
|
239
276
|
<span class="cline-any cline-neutral"> </span>
|
|
240
|
-
<span class="cline-any cline-yes">
|
|
277
|
+
<span class="cline-any cline-yes">30x</span>
|
|
241
278
|
<span class="cline-any cline-neutral"> </span>
|
|
242
|
-
<span class="cline-any cline-yes">
|
|
279
|
+
<span class="cline-any cline-yes">30x</span>
|
|
243
280
|
<span class="cline-any cline-yes">4x</span>
|
|
244
281
|
<span class="cline-any cline-neutral"> </span>
|
|
245
282
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -247,21 +284,21 @@
|
|
|
247
284
|
<span class="cline-any cline-neutral"> </span>
|
|
248
285
|
<span class="cline-any cline-neutral"> </span>
|
|
249
286
|
<span class="cline-any cline-neutral"> </span>
|
|
250
|
-
<span class="cline-any cline-yes">
|
|
251
|
-
<span class="cline-any cline-yes">
|
|
252
|
-
<span class="cline-any cline-yes">
|
|
287
|
+
<span class="cline-any cline-yes">26x</span>
|
|
288
|
+
<span class="cline-any cline-yes">26x</span>
|
|
289
|
+
<span class="cline-any cline-yes">20054x</span>
|
|
253
290
|
<span class="cline-any cline-neutral"> </span>
|
|
254
291
|
<span class="cline-any cline-neutral"> </span>
|
|
255
|
-
<span class="cline-any cline-yes">
|
|
256
|
-
<span class="cline-any cline-yes">
|
|
292
|
+
<span class="cline-any cline-yes">26x</span>
|
|
293
|
+
<span class="cline-any cline-yes">26x</span>
|
|
257
294
|
<span class="cline-any cline-neutral"> </span>
|
|
258
|
-
<span class="cline-any cline-yes">
|
|
259
|
-
<span class="cline-any cline-yes">
|
|
295
|
+
<span class="cline-any cline-yes">26x</span>
|
|
296
|
+
<span class="cline-any cline-yes">20049x</span>
|
|
260
297
|
<span class="cline-any cline-yes">3x</span>
|
|
261
298
|
<span class="cline-any cline-neutral"> </span>
|
|
262
299
|
<span class="cline-any cline-neutral"> </span>
|
|
263
|
-
<span class="cline-any cline-yes">
|
|
264
|
-
<span class="cline-any cline-yes">
|
|
300
|
+
<span class="cline-any cline-yes">20046x</span>
|
|
301
|
+
<span class="cline-any cline-yes">20046x</span>
|
|
265
302
|
<span class="cline-any cline-neutral"> </span>
|
|
266
303
|
<span class="cline-any cline-neutral"> </span>
|
|
267
304
|
<span class="cline-any cline-yes">4x</span>
|
|
@@ -278,7 +315,7 @@
|
|
|
278
315
|
<span class="cline-any cline-neutral"> </span>
|
|
279
316
|
<span class="cline-any cline-neutral"> </span>
|
|
280
317
|
<span class="cline-any cline-neutral"> </span>
|
|
281
|
-
<span class="cline-any cline-yes">
|
|
318
|
+
<span class="cline-any cline-yes">26x</span>
|
|
282
319
|
<span class="cline-any cline-neutral"> </span>
|
|
283
320
|
<span class="cline-any cline-neutral"> </span>
|
|
284
321
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -290,29 +327,66 @@
|
|
|
290
327
|
<span class="cline-any cline-neutral"> </span>
|
|
291
328
|
<span class="cline-any cline-neutral"> </span>
|
|
292
329
|
<span class="cline-any cline-neutral"> </span>
|
|
330
|
+
<span class="cline-any cline-yes">6x</span>
|
|
331
|
+
<span class="cline-any cline-yes">6x</span>
|
|
293
332
|
<span class="cline-any cline-neutral"> </span>
|
|
294
|
-
<span class="cline-any cline-yes">51x</span>
|
|
295
|
-
<span class="cline-any cline-yes">51x</span>
|
|
296
|
-
<span class="cline-any cline-yes">51x</span>
|
|
297
333
|
<span class="cline-any cline-neutral"> </span>
|
|
298
|
-
<span class="cline-any cline-yes">51x</span>
|
|
299
|
-
<span class="cline-any cline-yes">51x</span>
|
|
300
|
-
<span class="cline-any cline-yes">33x</span>
|
|
301
334
|
<span class="cline-any cline-neutral"> </span>
|
|
302
335
|
<span class="cline-any cline-neutral"> </span>
|
|
303
336
|
<span class="cline-any cline-neutral"> </span>
|
|
304
|
-
<span class="cline-any cline-yes">5x</span>
|
|
305
|
-
<span class="cline-any cline-yes">28x</span>
|
|
306
337
|
<span class="cline-any cline-neutral"> </span>
|
|
307
338
|
<span class="cline-any cline-neutral"> </span>
|
|
339
|
+
<span class="cline-any cline-neutral"> </span>
|
|
340
|
+
<span class="cline-any cline-neutral"> </span>
|
|
341
|
+
<span class="cline-any cline-neutral"> </span>
|
|
342
|
+
<span class="cline-any cline-yes">20046x</span>
|
|
343
|
+
<span class="cline-any cline-neutral"> </span>
|
|
344
|
+
<span class="cline-any cline-yes">20046x</span>
|
|
345
|
+
<span class="cline-any cline-yes">20046x</span>
|
|
346
|
+
<span class="cline-any cline-yes">20046x</span>
|
|
347
|
+
<span class="cline-any cline-neutral"> </span>
|
|
348
|
+
<span class="cline-any cline-yes">20046x</span>
|
|
349
|
+
<span class="cline-any cline-neutral"> </span>
|
|
350
|
+
<span class="cline-any cline-neutral"> </span>
|
|
351
|
+
<span class="cline-any cline-neutral"> </span>
|
|
352
|
+
<span class="cline-any cline-neutral"> </span>
|
|
353
|
+
<span class="cline-any cline-neutral"> </span>
|
|
354
|
+
<span class="cline-any cline-neutral"> </span>
|
|
355
|
+
<span class="cline-any cline-yes">20046x</span>
|
|
356
|
+
<span class="cline-any cline-yes">40074x</span>
|
|
357
|
+
<span class="cline-any cline-yes">40074x</span>
|
|
358
|
+
<span class="cline-any cline-neutral"> </span>
|
|
359
|
+
<span class="cline-any cline-yes">40074x</span>
|
|
360
|
+
<span class="cline-any cline-yes">20032x</span>
|
|
361
|
+
<span class="cline-any cline-yes">20032x</span>
|
|
362
|
+
<span class="cline-any cline-neutral"> </span>
|
|
363
|
+
<span class="cline-any cline-yes">20032x</span>
|
|
364
|
+
<span class="cline-any cline-neutral"> </span>
|
|
308
365
|
<span class="cline-any cline-yes">4x</span>
|
|
309
366
|
<span class="cline-any cline-yes">4x</span>
|
|
310
367
|
<span class="cline-any cline-neutral"> </span>
|
|
311
368
|
<span class="cline-any cline-neutral"> </span>
|
|
369
|
+
<span class="cline-any cline-yes">20028x</span>
|
|
370
|
+
<span class="cline-any cline-yes">5x</span>
|
|
371
|
+
<span class="cline-any cline-yes">5x</span>
|
|
372
|
+
<span class="cline-any cline-yes">5x</span>
|
|
373
|
+
<span class="cline-any cline-neutral"> </span>
|
|
374
|
+
<span class="cline-any cline-yes">5x</span>
|
|
375
|
+
<span class="cline-any cline-neutral"> </span>
|
|
376
|
+
<span class="cline-any cline-neutral"> </span>
|
|
312
377
|
<span class="cline-any cline-neutral"> </span>
|
|
313
|
-
<span class="cline-any cline-
|
|
314
|
-
<span class="cline-any cline-
|
|
315
|
-
<span class="cline-any cline-
|
|
378
|
+
<span class="cline-any cline-neutral"> </span>
|
|
379
|
+
<span class="cline-any cline-neutral"> </span>
|
|
380
|
+
<span class="cline-any cline-neutral"> </span>
|
|
381
|
+
<span class="cline-any cline-neutral"> </span>
|
|
382
|
+
<span class="cline-any cline-neutral"> </span>
|
|
383
|
+
<span class="cline-any cline-yes">20042x</span>
|
|
384
|
+
<span class="cline-any cline-yes">20042x</span>
|
|
385
|
+
<span class="cline-any cline-yes">20042x</span>
|
|
386
|
+
<span class="cline-any cline-neutral"> </span>
|
|
387
|
+
<span class="cline-any cline-neutral"> </span>
|
|
388
|
+
<span class="cline-any cline-neutral"> </span>
|
|
389
|
+
<span class="cline-any cline-yes">20042x</span>
|
|
316
390
|
<span class="cline-any cline-neutral"> </span>
|
|
317
391
|
<span class="cline-any cline-neutral"> </span>
|
|
318
392
|
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { ITaskGraphValidator } from "./contracts/ITaskGraphValidator.js";
|
|
@@ -409,35 +483,72 @@ export class TaskGraphValidator implements ITaskGraphValidator {
|
|
|
409
483
|
errors
|
|
410
484
|
};
|
|
411
485
|
}
|
|
486
|
+
|
|
487
|
+
/**
|
|
488
|
+
* Creates a human-readable error message from a validation result.
|
|
489
|
+
* @param result The validation result containing errors.
|
|
490
|
+
* @returns A formatted error string.
|
|
491
|
+
*/
|
|
492
|
+
createErrorMessage(result: ValidationResult): string {
|
|
493
|
+
const errorDetails = result.errors.map(e => e.message);
|
|
494
|
+
return `Task graph validation failed: ${errorDetails.join("; ")}`;
|
|
495
|
+
}
|
|
412
496
|
|
|
413
497
|
private detectCycle(
|
|
414
|
-
|
|
498
|
+
startTaskId: string,
|
|
415
499
|
path: string[],
|
|
416
500
|
visited: Set<string>,
|
|
417
501
|
recursionStack: Set<string>,
|
|
418
502
|
adjacencyList: Map<string, string[]>
|
|
419
503
|
): boolean {
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
504
|
+
// Use an explicit stack to avoid maximum call stack size exceeded errors
|
|
505
|
+
const stack: { taskId: string; index: number; dependencies: string[] }[] = [];
|
|
506
|
+
|
|
507
|
+
visited.add(startTaskId);
|
|
508
|
+
recursionStack.add(startTaskId);
|
|
509
|
+
path.push(startTaskId);
|
|
510
|
+
|
|
511
|
+
stack.push({
|
|
512
|
+
taskId: startTaskId,
|
|
513
|
+
index: 0,
|
|
514
|
+
/* v8 ignore next */
|
|
515
|
+
dependencies: adjacencyList.get(startTaskId) ?? []
|
|
516
|
+
});
|
|
423
517
|
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
518
|
+
while (stack.length > 0) {
|
|
519
|
+
const frame = stack[stack.length - 1];
|
|
520
|
+
const { taskId, dependencies } = frame;
|
|
521
|
+
|
|
522
|
+
if (frame.index < dependencies.length) {
|
|
523
|
+
const dependenceId = dependencies[frame.index];
|
|
524
|
+
frame.index++;
|
|
525
|
+
|
|
526
|
+
if (recursionStack.has(dependenceId)) {
|
|
527
|
+
// Cycle detected
|
|
528
|
+
path.push(dependenceId);
|
|
529
|
+
return true;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
if (!visited.has(dependenceId)) {
|
|
533
|
+
visited.add(dependenceId);
|
|
534
|
+
recursionStack.add(dependenceId);
|
|
535
|
+
path.push(dependenceId);
|
|
536
|
+
|
|
537
|
+
stack.push({
|
|
538
|
+
taskId: dependenceId,
|
|
539
|
+
index: 0,
|
|
540
|
+
/* v8 ignore next */
|
|
541
|
+
dependencies: adjacencyList.get(dependenceId) ?? []
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
} else {
|
|
545
|
+
// Finished all dependencies for this node
|
|
546
|
+
recursionStack.delete(taskId);
|
|
547
|
+
path.pop();
|
|
548
|
+
stack.pop();
|
|
436
549
|
}
|
|
437
550
|
}
|
|
438
551
|
|
|
439
|
-
recursionStack.delete(taskId);
|
|
440
|
-
path.pop();
|
|
441
552
|
return false;
|
|
442
553
|
}
|
|
443
554
|
}
|
|
@@ -448,7 +559,7 @@ export class TaskGraphValidator implements ITaskGraphValidator {
|
|
|
448
559
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
449
560
|
Code coverage generated by
|
|
450
561
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
451
|
-
at 2026-01-
|
|
562
|
+
at 2026-01-18T15:13:46.741Z
|
|
452
563
|
</div>
|
|
453
564
|
<script src="../prettify.js"></script>
|
|
454
565
|
<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'>
|
|
28
|
+
<span class='fraction'>12/12</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'>
|
|
35
|
+
<span class='fraction'>4/4</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
|
+
<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'>
|
|
49
|
+
<span class='fraction'>12/12</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -137,41 +137,7 @@
|
|
|
137
137
|
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
138
|
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
139
|
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
-
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
-
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
-
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
-
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
-
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
-
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
-
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
-
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
-
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
-
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
-
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
-
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
-
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
-
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
-
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
-
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
-
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
-
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
-
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
-
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
-
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
-
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
-
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
-
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
-
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
-
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
-
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
-
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
-
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
-
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
-
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
-
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
-
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
-
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
-
<a name='L109'></a><a href='#L109'>109</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
175
141
|
<span class="cline-any cline-neutral"> </span>
|
|
176
142
|
<span class="cline-any cline-neutral"> </span>
|
|
177
143
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -238,40 +204,6 @@
|
|
|
238
204
|
<span class="cline-any cline-neutral"> </span>
|
|
239
205
|
<span class="cline-any cline-yes">21x</span>
|
|
240
206
|
<span class="cline-any cline-yes">21x</span>
|
|
241
|
-
<span class="cline-any cline-neutral"> </span>
|
|
242
|
-
<span class="cline-any cline-yes">6x</span>
|
|
243
|
-
<span class="cline-any cline-yes">6x</span>
|
|
244
|
-
<span class="cline-any cline-neutral"> </span>
|
|
245
|
-
<span class="cline-any cline-yes">6x</span>
|
|
246
|
-
<span class="cline-any cline-yes">6x</span>
|
|
247
|
-
<span class="cline-any cline-yes">6x</span>
|
|
248
|
-
<span class="cline-any cline-neutral"> </span>
|
|
249
|
-
<span class="cline-any cline-neutral"> </span>
|
|
250
|
-
<span class="cline-any cline-yes">2x</span>
|
|
251
|
-
<span class="cline-any cline-neutral"> </span>
|
|
252
|
-
<span class="cline-any cline-yes">6x</span>
|
|
253
|
-
<span class="cline-any cline-yes">2x</span>
|
|
254
|
-
<span class="cline-any cline-neutral"> </span>
|
|
255
|
-
<span class="cline-any cline-neutral"> </span>
|
|
256
|
-
<span class="cline-any cline-neutral"> </span>
|
|
257
|
-
<span class="cline-any cline-yes">2x</span>
|
|
258
|
-
<span class="cline-any cline-yes">2x</span>
|
|
259
|
-
<span class="cline-any cline-yes">2x</span>
|
|
260
|
-
<span class="cline-any cline-neutral"> </span>
|
|
261
|
-
<span class="cline-any cline-neutral"> </span>
|
|
262
|
-
<span class="cline-any cline-yes">2x</span>
|
|
263
|
-
<span class="cline-any cline-yes">2x</span>
|
|
264
|
-
<span class="cline-any cline-yes">2x</span>
|
|
265
|
-
<span class="cline-any cline-neutral"> </span>
|
|
266
|
-
<span class="cline-any cline-neutral"> </span>
|
|
267
|
-
<span class="cline-any cline-neutral"> </span>
|
|
268
|
-
<span class="cline-any cline-neutral"> </span>
|
|
269
|
-
<span class="cline-any cline-neutral"> </span>
|
|
270
|
-
<span class="cline-any cline-yes">6x</span>
|
|
271
|
-
<span class="cline-any cline-yes">6x</span>
|
|
272
|
-
<span class="cline-any cline-yes">6x</span>
|
|
273
|
-
<span class="cline-any cline-neutral"> </span>
|
|
274
|
-
<span class="cline-any cline-neutral"> </span>
|
|
275
207
|
<span class="cline-any cline-yes">6x</span>
|
|
276
208
|
<span class="cline-any cline-neutral"> </span>
|
|
277
209
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -346,41 +278,7 @@ export class TaskRunner<TContext> {
|
|
|
346
278
|
|
|
347
279
|
const validationResult = this.validator.validate(taskGraph);
|
|
348
280
|
if (!validationResult.isValid) {
|
|
349
|
-
|
|
350
|
-
const affectedTasks = new Set<string>();
|
|
351
|
-
const errorDetails: string[] = [];
|
|
352
|
-
|
|
353
|
-
for (const error of validationResult.errors) {
|
|
354
|
-
errorDetails.push(error.message);
|
|
355
|
-
switch (error.type) {
|
|
356
|
-
case "cycle": {
|
|
357
|
-
// details is { cyclePath: string[] }
|
|
358
|
-
const path = (error.details as { cyclePath: string[] }).cyclePath;
|
|
359
|
-
// The last element duplicates the first in the path representation, so valid unique tasks are slice(0, -1) or just all as Set handles uniq
|
|
360
|
-
path.forEach((t) => affectedTasks.add(t));
|
|
361
|
-
break;
|
|
362
|
-
}
|
|
363
|
-
case "missing_dependency": {
|
|
364
|
-
// details is { taskId: string, missingDependencyId: string }
|
|
365
|
-
const d = error.details as { taskId: string };
|
|
366
|
-
affectedTasks.add(d.taskId);
|
|
367
|
-
break;
|
|
368
|
-
}
|
|
369
|
-
case "duplicate_task": {
|
|
370
|
-
const d = error.details as { taskId: string };
|
|
371
|
-
affectedTasks.add(d.taskId);
|
|
372
|
-
break;
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
// Legacy error format: "Circular dependency or missing dependency detected. Unable to run tasks: A, B"
|
|
378
|
-
const taskList = Array.from(affectedTasks).join(", ");
|
|
379
|
-
const legacyMessage = `Circular dependency or missing dependency detected. Unable to run tasks: ${taskList}`;
|
|
380
|
-
const detailedMessage = `Task graph validation failed: ${errorDetails.join("; ")}`;
|
|
381
|
-
|
|
382
|
-
// Combine them to satisfy both legacy tests (checking for legacy message) and new requirements (clear details)
|
|
383
|
-
throw new Error(`${legacyMessage} | ${detailedMessage}`);
|
|
281
|
+
throw new Error(this.validator.createErrorMessage(validationResult));
|
|
384
282
|
}
|
|
385
283
|
|
|
386
284
|
const executor = new WorkflowExecutor(this.context, this.eventBus);
|
|
@@ -394,7 +292,7 @@ export class TaskRunner<TContext> {
|
|
|
394
292
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
395
293
|
Code coverage generated by
|
|
396
294
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
397
|
-
at 2026-01-
|
|
295
|
+
at 2026-01-18T15:13:46.741Z
|
|
398
296
|
</div>
|
|
399
297
|
<script src="../prettify.js"></script>
|
|
400
298
|
<script>
|