@@ -355,7 +355,28 @@ class BatchRunner {
355
355
356
356
for ( const context of executedContexts ) {
357
357
const { file, player, duration } = context ;
358
- const success = player . status !== 'error' ;
358
+ // Determine result type based on player and task statuses
359
+ const hasFailedTasks =
360
+ player . taskStatusList ?. some ( ( task ) => task . status === 'error' ) ?? false ;
361
+ const hasPlayerError = player . status === 'error' ;
362
+
363
+ let success : boolean ;
364
+ let resultType : 'success' | 'failed' | 'partialFailed' ;
365
+
366
+ if ( hasPlayerError ) {
367
+ // Complete failure - player itself failed
368
+ success = false ;
369
+ resultType = 'failed' ;
370
+ } else if ( hasFailedTasks ) {
371
+ // Partial failure - some tasks failed but execution continued (continueOnError)
372
+ success = false ;
373
+ resultType = 'partialFailed' ;
374
+ } else {
375
+ // Success - all tasks completed successfully
376
+ success = true ;
377
+ resultType = 'success' ;
378
+ }
379
+
359
380
let reportFile : string | undefined ;
360
381
361
382
if ( player . reportFile ) {
@@ -375,9 +396,11 @@ class BatchRunner {
375
396
output : outputPath ,
376
397
report : reportFile ,
377
398
duration,
399
+ resultType,
378
400
error :
379
401
player . errorInSetup ?. message ||
380
- ( player . status === 'error' ? 'Execution failed' : undefined ) ,
402
+ ( hasPlayerError ? 'Execution failed' : undefined ) ||
403
+ ( hasFailedTasks ? 'Some tasks failed' : undefined ) ,
381
404
} ) ;
382
405
}
383
406
@@ -389,6 +412,7 @@ class BatchRunner {
389
412
output : undefined ,
390
413
report : undefined ,
391
414
duration : 0 ,
415
+ resultType : 'notExecuted' ,
392
416
error : 'Not executed (previous task failed)' ,
393
417
} ) ;
394
418
}
@@ -435,8 +459,15 @@ class BatchRunner {
435
459
const indexData = {
436
460
summary : {
437
461
total : this . results . length ,
438
- successful : this . results . filter ( ( r ) => r . success ) . length ,
439
- failed : this . results . filter ( ( r ) => ! r . success ) . length ,
462
+ successful : this . results . filter ( ( r ) => r . resultType === 'success' )
463
+ . length ,
464
+ failed : this . results . filter ( ( r ) => r . resultType === 'failed' ) . length ,
465
+ partialFailed : this . results . filter (
466
+ ( r ) => r . resultType === 'partialFailed' ,
467
+ ) . length ,
468
+ notExecuted : this . results . filter (
469
+ ( r ) => r . resultType === 'notExecuted' ,
470
+ ) . length ,
440
471
totalDuration : this . results . reduce (
441
472
( sum , r ) => sum + ( r . duration || 0 ) ,
442
473
0 ,
@@ -446,6 +477,7 @@ class BatchRunner {
446
477
results : this . results . map ( ( result ) => ( {
447
478
script : relative ( outputDir , result . file ) ,
448
479
success : result . success ,
480
+ resultType : result . resultType ,
449
481
output : result . output
450
482
? ( ( ) => {
451
483
const relativePath = relative ( outputDir , result . output ) ;
@@ -473,17 +505,26 @@ class BatchRunner {
473
505
total : number ;
474
506
successful : number ;
475
507
failed : number ;
508
+ partialFailed : number ;
476
509
notExecuted : number ;
477
510
totalDuration : number ;
478
511
} {
479
- const successful = this . results . filter ( ( r ) => r . success ) . length ;
480
- const notExecuted = this . results . filter ( ( r ) => ! r . executed ) . length ;
481
- const failed = this . results . filter ( ( r ) => r . executed && ! r . success ) . length ;
512
+ const successful = this . results . filter (
513
+ ( r ) => r . resultType === 'success' ,
514
+ ) . length ;
515
+ const failed = this . results . filter ( ( r ) => r . resultType === 'failed' ) . length ;
516
+ const partialFailed = this . results . filter (
517
+ ( r ) => r . resultType === 'partialFailed' ,
518
+ ) . length ;
519
+ const notExecuted = this . results . filter (
520
+ ( r ) => r . resultType === 'notExecuted' ,
521
+ ) . length ;
482
522
483
523
return {
484
524
total : this . results . length ,
485
525
successful,
486
526
failed,
527
+ partialFailed,
487
528
notExecuted,
488
529
totalDuration : this . results . reduce (
489
530
( sum , r ) => sum + ( r . duration || 0 ) ,
@@ -494,16 +535,26 @@ class BatchRunner {
494
535
495
536
getFailedFiles ( ) : string [ ] {
496
537
return this . results
497
- . filter ( ( r ) => r . executed && ! r . success )
538
+ . filter ( ( r ) => r . resultType === 'failed' )
539
+ . map ( ( r ) => r . file ) ;
540
+ }
541
+
542
+ getPartialFailedFiles ( ) : string [ ] {
543
+ return this . results
544
+ . filter ( ( r ) => r . resultType === 'partialFailed' )
498
545
. map ( ( r ) => r . file ) ;
499
546
}
500
547
501
548
getNotExecutedFiles ( ) : string [ ] {
502
- return this . results . filter ( ( r ) => ! r . executed ) . map ( ( r ) => r . file ) ;
549
+ return this . results
550
+ . filter ( ( r ) => r . resultType === 'notExecuted' )
551
+ . map ( ( r ) => r . file ) ;
503
552
}
504
553
505
554
getSuccessfulFiles ( ) : string [ ] {
506
- return this . results . filter ( ( r ) => r . success ) . map ( ( r ) => r . file ) ;
555
+ return this . results
556
+ . filter ( ( r ) => r . resultType === 'success' )
557
+ . map ( ( r ) => r . file ) ;
507
558
}
508
559
509
560
getResults ( ) : MidsceneYamlConfigResult [ ] {
@@ -512,12 +563,16 @@ class BatchRunner {
512
563
513
564
printExecutionSummary ( ) : boolean {
514
565
const summary = this . getExecutionSummary ( ) ;
515
- const success = summary . failed === 0 && summary . notExecuted === 0 ;
566
+ const success =
567
+ summary . failed === 0 &&
568
+ summary . partialFailed === 0 &&
569
+ summary . notExecuted === 0 ;
516
570
517
571
console . log ( '\n📊 Execution Summary:' ) ;
518
572
console . log ( ` Total files: ${ summary . total } ` ) ;
519
573
console . log ( ` Successful: ${ summary . successful } ` ) ;
520
574
console . log ( ` Failed: ${ summary . failed } ` ) ;
575
+ console . log ( ` Partial failed: ${ summary . partialFailed } ` ) ;
521
576
console . log ( ` Not executed: ${ summary . notExecuted } ` ) ;
522
577
console . log ( ` Duration: ${ ( summary . totalDuration / 1000 ) . toFixed ( 2 ) } s` ) ;
523
578
console . log ( ` Summary: ${ this . getSummaryAbsolutePath ( ) } ` ) ;
@@ -536,6 +591,15 @@ class BatchRunner {
536
591
} ) ;
537
592
}
538
593
594
+ if ( summary . partialFailed > 0 ) {
595
+ console . log (
596
+ '\n⚠️ Partial failed files (some tasks failed with continueOnError)' ,
597
+ ) ;
598
+ this . getPartialFailedFiles ( ) . forEach ( ( file ) => {
599
+ console . log ( ` ${ file } ` ) ;
600
+ } ) ;
601
+ }
602
+
539
603
if ( summary . notExecuted > 0 ) {
540
604
console . log ( '\n⏸️ Not executed files' ) ;
541
605
this . getNotExecutedFiles ( ) . forEach ( ( file ) => {
0 commit comments