@calmo/task-runner 3.8.3 → 4.0.4

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 (94) hide show
  1. package/.agent/workflows/openspec-apply.md +20 -0
  2. package/.agent/workflows/openspec-archive.md +24 -0
  3. package/.agent/workflows/openspec-proposal.md +25 -0
  4. package/.github/workflows/release-please.yml +46 -0
  5. package/.husky/commit-msg +0 -0
  6. package/.husky/pre-commit +0 -0
  7. package/.release-please-manifest.json +3 -0
  8. package/AGENTS.md +2 -4
  9. package/CHANGELOG.md +109 -0
  10. package/README.md +1 -1
  11. package/dist/TaskGraphValidator.js +2 -4
  12. package/dist/TaskGraphValidator.js.map +1 -1
  13. package/openspec/changes/adopt-release-pr/design.md +40 -0
  14. package/openspec/changes/adopt-release-pr/proposal.md +47 -0
  15. package/openspec/changes/adopt-release-pr/specs/release-pr/spec.md +34 -0
  16. package/openspec/changes/adopt-release-pr/tasks.md +14 -0
  17. package/openspec/changes/archive/2026-01-18-add-concurrency-control/specs/task-runner/spec.md +26 -0
  18. package/openspec/changes/archive/2026-01-18-add-external-task-cancellation/specs/task-runner/spec.md +63 -0
  19. package/openspec/changes/archive/2026-01-18-add-integration-tests/specs/task-runner/spec.md +22 -0
  20. package/openspec/changes/archive/2026-01-18-add-task-retry-policy/specs/task-runner/spec.md +40 -0
  21. package/openspec/changes/archive/2026-01-18-add-workflow-preview/specs/task-runner/spec.md +25 -0
  22. package/openspec/changes/archive/2026-01-18-refactor-core-architecture/specs/task-runner/spec.md +31 -0
  23. package/openspec/changes/feat-continue-on-error/proposal.md +20 -0
  24. package/openspec/changes/feat-continue-on-error/tasks.md +17 -0
  25. package/openspec/changes/feat-per-task-timeout/specs/task-runner/spec.md +34 -0
  26. package/openspec/changes/feat-task-metrics/specs/001-generic-task-runner/spec.md +13 -0
  27. package/openspec/specs/task-runner/spec.md +162 -0
  28. package/package.json +11 -20
  29. package/release-please-config.json +9 -0
  30. package/src/TaskGraphValidator.ts +2 -4
  31. package/.gemini/commands/speckit.analyze.toml +0 -188
  32. package/.gemini/commands/speckit.checklist.toml +0 -298
  33. package/.gemini/commands/speckit.clarify.toml +0 -185
  34. package/.gemini/commands/speckit.constitution.toml +0 -86
  35. package/.gemini/commands/speckit.implement.toml +0 -139
  36. package/.gemini/commands/speckit.plan.toml +0 -93
  37. package/.gemini/commands/speckit.specify.toml +0 -262
  38. package/.gemini/commands/speckit.tasks.toml +0 -141
  39. package/.gemini/commands/speckit.taskstoissues.toml +0 -34
  40. package/.github/workflows/release.yml +0 -46
  41. package/.releaserc.json +0 -27
  42. package/coverage/base.css +0 -224
  43. package/coverage/block-navigation.js +0 -87
  44. package/coverage/coverage-final.json +0 -15
  45. package/coverage/favicon.png +0 -0
  46. package/coverage/index.html +0 -146
  47. package/coverage/lcov-report/base.css +0 -224
  48. package/coverage/lcov-report/block-navigation.js +0 -87
  49. package/coverage/lcov-report/favicon.png +0 -0
  50. package/coverage/lcov-report/index.html +0 -146
  51. package/coverage/lcov-report/prettify.css +0 -1
  52. package/coverage/lcov-report/prettify.js +0 -2
  53. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  54. package/coverage/lcov-report/sorter.js +0 -210
  55. package/coverage/lcov-report/src/EventBus.ts.html +0 -379
  56. package/coverage/lcov-report/src/ExecutionConstants.ts.html +0 -121
  57. package/coverage/lcov-report/src/TaskGraphValidationError.ts.html +0 -130
  58. package/coverage/lcov-report/src/TaskGraphValidator.ts.html +0 -649
  59. package/coverage/lcov-report/src/TaskRunner.ts.html +0 -706
  60. package/coverage/lcov-report/src/TaskRunnerBuilder.ts.html +0 -337
  61. package/coverage/lcov-report/src/TaskRunnerExecutionConfig.ts.html +0 -154
  62. package/coverage/lcov-report/src/TaskStateManager.ts.html +0 -529
  63. package/coverage/lcov-report/src/WorkflowExecutor.ts.html +0 -712
  64. package/coverage/lcov-report/src/contracts/ErrorTypes.ts.html +0 -103
  65. package/coverage/lcov-report/src/contracts/RunnerEvents.ts.html +0 -217
  66. package/coverage/lcov-report/src/contracts/index.html +0 -131
  67. package/coverage/lcov-report/src/index.html +0 -236
  68. package/coverage/lcov-report/src/strategies/DryRunExecutionStrategy.ts.html +0 -178
  69. package/coverage/lcov-report/src/strategies/RetryingExecutionStrategy.ts.html +0 -373
  70. package/coverage/lcov-report/src/strategies/StandardExecutionStrategy.ts.html +0 -190
  71. package/coverage/lcov-report/src/strategies/index.html +0 -146
  72. package/coverage/lcov.info +0 -671
  73. package/coverage/prettify.css +0 -1
  74. package/coverage/prettify.js +0 -2
  75. package/coverage/sort-arrow-sprite.png +0 -0
  76. package/coverage/sorter.js +0 -210
  77. package/coverage/src/EventBus.ts.html +0 -379
  78. package/coverage/src/ExecutionConstants.ts.html +0 -121
  79. package/coverage/src/TaskGraphValidationError.ts.html +0 -130
  80. package/coverage/src/TaskGraphValidator.ts.html +0 -649
  81. package/coverage/src/TaskRunner.ts.html +0 -706
  82. package/coverage/src/TaskRunnerBuilder.ts.html +0 -337
  83. package/coverage/src/TaskRunnerExecutionConfig.ts.html +0 -154
  84. package/coverage/src/TaskStateManager.ts.html +0 -529
  85. package/coverage/src/WorkflowExecutor.ts.html +0 -712
  86. package/coverage/src/contracts/ErrorTypes.ts.html +0 -103
  87. package/coverage/src/contracts/RunnerEvents.ts.html +0 -217
  88. package/coverage/src/contracts/index.html +0 -131
  89. package/coverage/src/index.html +0 -236
  90. package/coverage/src/strategies/DryRunExecutionStrategy.ts.html +0 -178
  91. package/coverage/src/strategies/RetryingExecutionStrategy.ts.html +0 -373
  92. package/coverage/src/strategies/StandardExecutionStrategy.ts.html +0 -190
  93. package/coverage/src/strategies/index.html +0 -146
  94. package/test-report.xml +0 -299
@@ -1,146 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/strategies</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> src/strategies</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'>42/42</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'>25/25</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'>9/9</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'>42/42</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
- <div class="pad1">
66
- <table class="coverage-summary">
67
- <thead>
68
- <tr>
69
- <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
70
- <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
71
- <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
72
- <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
73
- <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
74
- <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
75
- <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
76
- <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
77
- <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
78
- <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
79
- </tr>
80
- </thead>
81
- <tbody><tr>
82
- <td class="file high" data-value="DryRunExecutionStrategy.ts"><a href="DryRunExecutionStrategy.ts.html">DryRunExecutionStrategy.ts</a></td>
83
- <td data-value="100" class="pic high">
84
- <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
85
- </td>
86
- <td data-value="100" class="pct high">100%</td>
87
- <td data-value="1" class="abs high">1/1</td>
88
- <td data-value="100" class="pct high">100%</td>
89
- <td data-value="0" class="abs high">0/0</td>
90
- <td data-value="100" class="pct high">100%</td>
91
- <td data-value="1" class="abs high">1/1</td>
92
- <td data-value="100" class="pct high">100%</td>
93
- <td data-value="1" class="abs high">1/1</td>
94
- </tr>
95
-
96
- <tr>
97
- <td class="file high" data-value="RetryingExecutionStrategy.ts"><a href="RetryingExecutionStrategy.ts.html">RetryingExecutionStrategy.ts</a></td>
98
- <td data-value="100" class="pic high">
99
- <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
100
- </td>
101
- <td data-value="100" class="pct high">100%</td>
102
- <td data-value="36" class="abs high">36/36</td>
103
- <td data-value="100" class="pct high">100%</td>
104
- <td data-value="17" class="abs high">17/17</td>
105
- <td data-value="100" class="pct high">100%</td>
106
- <td data-value="7" class="abs high">7/7</td>
107
- <td data-value="100" class="pct high">100%</td>
108
- <td data-value="36" class="abs high">36/36</td>
109
- </tr>
110
-
111
- <tr>
112
- <td class="file high" data-value="StandardExecutionStrategy.ts"><a href="StandardExecutionStrategy.ts.html">StandardExecutionStrategy.ts</a></td>
113
- <td data-value="100" class="pic high">
114
- <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
115
- </td>
116
- <td data-value="100" class="pct high">100%</td>
117
- <td data-value="5" class="abs high">5/5</td>
118
- <td data-value="100" class="pct high">100%</td>
119
- <td data-value="8" class="abs high">8/8</td>
120
- <td data-value="100" class="pct high">100%</td>
121
- <td data-value="1" class="abs high">1/1</td>
122
- <td data-value="100" class="pct high">100%</td>
123
- <td data-value="5" class="abs high">5/5</td>
124
- </tr>
125
-
126
- </tbody>
127
- </table>
128
- </div>
129
- <div class='push'></div><!-- for sticky footer -->
130
- </div><!-- /wrapper -->
131
- <div class='footer quiet pad2 space-top1 center small'>
132
- Code coverage generated by
133
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
134
- at 2026-01-21T01:20:30.153Z
135
- </div>
136
- <script src="../../prettify.js"></script>
137
- <script>
138
- window.onload = function () {
139
- prettyPrint();
140
- };
141
- </script>
142
- <script src="../../sorter.js"></script>
143
- <script src="../../block-navigation.js"></script>
144
- </body>
145
- </html>
146
-
package/test-report.xml DELETED
@@ -1,299 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8" ?>
2
- <testsuites name="vitest tests" tests="118" failures="0" errors="0" time="1.451867156">
3
- <testsuite name="tests/ComplexScenario.test.ts" timestamp="2026-01-21T01:20:30.119Z" hostname="runnervmmtnos" tests="2" failures="0" errors="0" skipped="0" time="0.012737825">
4
- <testcase classname="tests/ComplexScenario.test.ts" name="Complex Scenario Integration Tests &gt; 1. All steps execute when all succeed and context is hydrated" time="0.008044038">
5
- <system-out>
6
- Running StepA
7
- Running StepB
8
- Running StepC
9
-
10
- Running StepD
11
- Running StepF
12
-
13
- Running StepE
14
- Running StepG
15
-
16
- </system-out>
17
- </testcase>
18
- <testcase classname="tests/ComplexScenario.test.ts" name="Complex Scenario Integration Tests &gt; 2. The &apos;skip&apos; propagation works as intended if something breaks up in the tree" time="0.002254931">
19
- </testcase>
20
- </testsuite>
21
- <testsuite name="tests/DryRunExecutionStrategy.test.ts" timestamp="2026-01-21T01:20:30.121Z" hostname="runnervmmtnos" tests="1" failures="0" errors="0" skipped="0" time="0.003457702">
22
- <testcase classname="tests/DryRunExecutionStrategy.test.ts" name="DryRunExecutionStrategy &gt; should return success without running the task" time="0.001924673">
23
- </testcase>
24
- </testsuite>
25
- <testsuite name="tests/EventBus.test.ts" timestamp="2026-01-21T01:20:30.121Z" hostname="runnervmmtnos" tests="10" failures="0" errors="0" skipped="0" time="0.0215066">
26
- <testcase classname="tests/EventBus.test.ts" name="EventBus &gt; should subscribe to and emit events" time="0.00579612">
27
- </testcase>
28
- <testcase classname="tests/EventBus.test.ts" name="EventBus &gt; should unsubscribe from events" time="0.001731922">
29
- </testcase>
30
- <testcase classname="tests/EventBus.test.ts" name="EventBus &gt; should handle sync listener errors" time="0.00471681">
31
- </testcase>
32
- <testcase classname="tests/EventBus.test.ts" name="EventBus &gt; should handle async listener rejections" time="0.001729828">
33
- </testcase>
34
- <testcase classname="tests/EventBus.test.ts" name="EventBus &gt; should handle emit with no listeners" time="0.001122962">
35
- </testcase>
36
- <testcase classname="tests/EventBus.test.ts" name="EventBus &gt; should handle off for non-existent event" time="0.000349795">
37
- </testcase>
38
- <testcase classname="tests/EventBus.test.ts" name="EventBus &gt; should handle off for event with no listeners" time="0.000271178">
39
- </testcase>
40
- <testcase classname="tests/EventBus.test.ts" name="EventBus &gt; should handle off when listener set exists but empty" time="0.000138059">
41
- </testcase>
42
- <testcase classname="tests/EventBus.test.ts" name="EventBus &gt; should trigger outer catch block when inner catch fails" time="0.00200441">
43
- </testcase>
44
- <testcase classname="tests/EventBus.test.ts" name="EventBus &gt; should handle multiple listeners for the same event" time="0.001634813">
45
- </testcase>
46
- </testsuite>
47
- <testsuite name="tests/ExecutionStrategyFailure.test.ts" timestamp="2026-01-21T01:20:30.123Z" hostname="runnervmmtnos" tests="2" failures="0" errors="0" skipped="0" time="0.00456238">
48
- <testcase classname="tests/ExecutionStrategyFailure.test.ts" name="WorkflowExecutor Strategy Failure Handling &gt; should handle execution strategy throwing an Error object" time="0.002344078">
49
- </testcase>
50
- <testcase classname="tests/ExecutionStrategyFailure.test.ts" name="WorkflowExecutor Strategy Failure Handling &gt; should handle execution strategy throwing a non-Error object" time="0.000419446">
51
- </testcase>
52
- </testsuite>
53
- <testsuite name="tests/TaskGraphValidator.test.ts" timestamp="2026-01-21T01:20:30.124Z" hostname="runnervmmtnos" tests="10" failures="0" errors="0" skipped="0" time="0.01167254">
54
- <testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator &gt; should be instantiated" time="0.002123365">
55
- </testcase>
56
- <testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator &gt; should return valid result for empty graph" time="0.001425949">
57
- </testcase>
58
- <testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator &gt; should detect duplicate tasks" time="0.001953517">
59
- </testcase>
60
- <testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator &gt; should detect missing dependencies" time="0.000890076">
61
- </testcase>
62
- <testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator &gt; should detect cycles" time="0.000536234">
63
- </testcase>
64
- <testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator &gt; should return valid for a correct graph" time="0.000721">
65
- </testcase>
66
- <testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator &gt; should not detect cycles if missing dependencies are present" time="0.00032606">
67
- </testcase>
68
- <testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator &gt; should detect more complex cycles" time="0.000313958">
69
- </testcase>
70
- <testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator &gt; should handle cycle detection with no cycles but shared dependencies" time="0.00048077">
71
- </testcase>
72
- <testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator &gt; should create a formatted error message" time="0.000260567">
73
- </testcase>
74
- </testsuite>
75
- <testsuite name="tests/TaskGraphValidatorDoS.test.ts" timestamp="2026-01-21T01:20:30.126Z" hostname="runnervmmtnos" tests="1" failures="0" errors="0" skipped="0" time="0.057797736">
76
- <testcase classname="tests/TaskGraphValidatorDoS.test.ts" name="TaskGraphValidator - Deep Recursion &gt; should handle deep graphs without stack overflow" time="0.055440804">
77
- </testcase>
78
- </testsuite>
79
- <testsuite name="tests/TaskRunner.test.ts" timestamp="2026-01-21T01:20:30.126Z" hostname="runnervmmtnos" tests="11" failures="0" errors="0" skipped="0" time="0.113709163">
80
- <testcase classname="tests/TaskRunner.test.ts" name="TaskRunner &gt; should run tasks in the correct sequential order" time="0.003838526">
81
- </testcase>
82
- <testcase classname="tests/TaskRunner.test.ts" name="TaskRunner &gt; should handle an empty list of tasks gracefully" time="0.000433502">
83
- </testcase>
84
- <testcase classname="tests/TaskRunner.test.ts" name="TaskRunner &gt; should run independent tasks in parallel" time="0.100641952">
85
- </testcase>
86
- <testcase classname="tests/TaskRunner.test.ts" name="TaskRunner &gt; should skip dependent tasks if a root task fails" time="0.000594493">
87
- </testcase>
88
- <testcase classname="tests/TaskRunner.test.ts" name="TaskRunner &gt; should throw an error for &apos;circular dependency&apos;" time="0.002735611">
89
- </testcase>
90
- <testcase classname="tests/TaskRunner.test.ts" name="TaskRunner &gt; should throw an error for &apos;missing dependency&apos;" time="0.00039027">
91
- </testcase>
92
- <testcase classname="tests/TaskRunner.test.ts" name="TaskRunner &gt; should handle tasks that throw an error during execution" time="0.000416489">
93
- </testcase>
94
- <testcase classname="tests/TaskRunner.test.ts" name="TaskRunner &gt; should skip tasks whose dependencies are skipped" time="0.000473877">
95
- </testcase>
96
- <testcase classname="tests/TaskRunner.test.ts" name="TaskRunner &gt; should handle tasks that throw a non-Error object during execution" time="0.000440614">
97
- </testcase>
98
- <testcase classname="tests/TaskRunner.test.ts" name="TaskRunner &gt; should handle duplicate steps where one gets skipped due to failed dependency" time="0.000508001">
99
- </testcase>
100
- <testcase classname="tests/TaskRunner.test.ts" name="TaskRunner &gt; should throw TaskGraphValidationError with detailed result" time="0.000922647">
101
- </testcase>
102
- </testsuite>
103
- <testsuite name="tests/TaskRunnerEvents.test.ts" timestamp="2026-01-21T01:20:30.128Z" hostname="runnervmmtnos" tests="7" failures="0" errors="0" skipped="0" time="0.016915515">
104
- <testcase classname="tests/TaskRunnerEvents.test.ts" name="TaskRunner Events &gt; should fire all lifecycle events in a successful run" time="0.006673963">
105
- </testcase>
106
- <testcase classname="tests/TaskRunnerEvents.test.ts" name="TaskRunner Events &gt; should fire taskSkipped event when dependency fails" time="0.004710548">
107
- </testcase>
108
- <testcase classname="tests/TaskRunnerEvents.test.ts" name="TaskRunner Events &gt; should not crash if a listener throws an error" time="0.001160453">
109
- </testcase>
110
- <testcase classname="tests/TaskRunnerEvents.test.ts" name="TaskRunner Events &gt; should fire workflow events even for empty step list" time="0.000469869">
111
- </testcase>
112
- <testcase classname="tests/TaskRunnerEvents.test.ts" name="TaskRunner Events &gt; should handle unsubscribe correctly" time="0.000663872">
113
- </testcase>
114
- <testcase classname="tests/TaskRunnerEvents.test.ts" name="TaskRunner Events &gt; should safely handle off() when no listeners exist" time="0.000393377">
115
- </testcase>
116
- <testcase classname="tests/TaskRunnerEvents.test.ts" name="TaskRunner Events &gt; should support multiple listeners for the same event" time="0.000553416">
117
- </testcase>
118
- </testsuite>
119
- <testsuite name="tests/TaskRunnerMermaid.test.ts" timestamp="2026-01-21T01:20:30.130Z" hostname="runnervmmtnos" tests="5" failures="0" errors="0" skipped="0" time="0.006086844">
120
- <testcase classname="tests/TaskRunnerMermaid.test.ts" name="TaskRunner Mermaid Graph &gt; should generate a simple graph with no dependencies" time="0.002468951">
121
- </testcase>
122
- <testcase classname="tests/TaskRunnerMermaid.test.ts" name="TaskRunner Mermaid Graph &gt; should generate a graph with dependencies" time="0.000527397">
123
- </testcase>
124
- <testcase classname="tests/TaskRunnerMermaid.test.ts" name="TaskRunner Mermaid Graph &gt; should handle mixed independent and dependent tasks" time="0.00039519">
125
- </testcase>
126
- <testcase classname="tests/TaskRunnerMermaid.test.ts" name="TaskRunner Mermaid Graph &gt; should handle special characters in task names" time="0.000418583">
127
- </testcase>
128
- <testcase classname="tests/TaskRunnerMermaid.test.ts" name="TaskRunner Mermaid Graph &gt; should sanitize brackets and parentheses" time="0.000488033">
129
- </testcase>
130
- </testsuite>
131
- <testsuite name="tests/TaskRunnerRefactor.test.ts" timestamp="2026-01-21T01:20:30.131Z" hostname="runnervmmtnos" tests="6" failures="0" errors="0" skipped="0" time="0.009688336">
132
- <testcase classname="tests/TaskRunnerRefactor.test.ts" name="TaskRunner Refactor Coverage &gt; should allow setting execution strategy" time="0.002360348">
133
- </testcase>
134
- <testcase classname="tests/TaskRunnerRefactor.test.ts" name="TaskRunner Refactor Coverage &gt; should allow unsubscribing from events" time="0.001268374">
135
- </testcase>
136
- <testcase classname="tests/TaskRunnerRefactor.test.ts" name="TaskRunner Refactor Coverage &gt; TaskStateManager.cancelAllPending should handle non-existing tasks gracefully" time="0.000540292">
137
- </testcase>
138
- <testcase classname="tests/TaskRunnerRefactor.test.ts" name="TaskRunner Refactor Coverage &gt; TaskRunnerBuilder should build a TaskRunner" time="0.000648945">
139
- </testcase>
140
- <testcase classname="tests/TaskRunnerRefactor.test.ts" name="TaskRunner Refactor Coverage &gt; TaskRunnerBuilder should build a TaskRunner with no listeners" time="0.000233287">
141
- </testcase>
142
- <testcase classname="tests/TaskRunnerRefactor.test.ts" name="TaskRunner Refactor Coverage &gt; WorkflowExecutor should break infinite loop if no progress can be made" time="0.002114228">
143
- </testcase>
144
- </testsuite>
145
- <testsuite name="tests/TaskStateManager.repro.test.ts" timestamp="2026-01-21T01:20:30.132Z" hostname="runnervmmtnos" tests="1" failures="0" errors="0" skipped="0" time="0.007050739">
146
- <testcase classname="tests/TaskStateManager.repro.test.ts" name="TaskStateManager Repro &gt; should emit taskEnd event when cancelling pending tasks" time="0.005372628">
147
- </testcase>
148
- </testsuite>
149
- <testsuite name="tests/WorkflowExecutor.test.ts" timestamp="2026-01-21T01:20:30.132Z" hostname="runnervmmtnos" tests="3" failures="0" errors="0" skipped="0" time="0.055871908">
150
- <testcase classname="tests/WorkflowExecutor.test.ts" name="WorkflowExecutor &gt; should execute steps sequentially when dependencies exist" time="0.002950523">
151
- </testcase>
152
- <testcase classname="tests/WorkflowExecutor.test.ts" name="WorkflowExecutor &gt; should skip dependent steps if dependency fails" time="0.000355636">
153
- </testcase>
154
- <testcase classname="tests/WorkflowExecutor.test.ts" name="WorkflowExecutor &gt; should run independent steps in parallel" time="0.050883701">
155
- </testcase>
156
- </testsuite>
157
- <testsuite name="tests/cancellation.test.ts" timestamp="2026-01-21T01:20:30.133Z" hostname="runnervmmtnos" tests="10" failures="0" errors="0" skipped="0" time="0.160400266">
158
- <testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation &gt; should execute tasks normally without cancellation" time="0.002667363">
159
- </testcase>
160
- <testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation &gt; should cancel workflow via AbortSignal" time="0.011579177">
161
- </testcase>
162
- <testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation &gt; should cancel workflow via global timeout" time="0.049785618">
163
- </testcase>
164
- <testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation &gt; should handle pre-aborted signal" time="0.000514863">
165
- </testcase>
166
- <testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation &gt; should propagate cancellation to running task" time="0.010511417">
167
- </testcase>
168
- <testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation &gt; should respect timeout over signal if timeout happens first" time="0.050385231">
169
- </testcase>
170
- <testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation &gt; should handle case where timeout is set AND signal is already aborted" time="0.000421228">
171
- </testcase>
172
- <testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation &gt; should cancel workflow via AbortSignal when timeout is also set" time="0.010702835">
173
- </testcase>
174
- <testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation &gt; should fail task if it throws non-abort error during cancellation" time="0.010803995">
175
- </testcase>
176
- <testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation &gt; should cancel task if it rejects with signal.reason" time="0.010747078">
177
- </testcase>
178
- </testsuite>
179
- <testsuite name="tests/concurrency.test.ts" timestamp="2026-01-21T01:20:30.134Z" hostname="runnervmmtnos" tests="4" failures="0" errors="0" skipped="0" time="0.351021936">
180
- <testcase classname="tests/concurrency.test.ts" name="Concurrency Control &gt; should limit concurrency to 1" time="0.154676602">
181
- </testcase>
182
- <testcase classname="tests/concurrency.test.ts" name="Concurrency Control &gt; should limit concurrency to 2" time="0.101359834">
183
- </testcase>
184
- <testcase classname="tests/concurrency.test.ts" name="Concurrency Control &gt; should handle unlimited concurrency (default)" time="0.050988922">
185
- </testcase>
186
- <testcase classname="tests/concurrency.test.ts" name="Concurrency Control &gt; should run each task exactly once even when queued" time="0.041463015">
187
- </testcase>
188
- </testsuite>
189
- <testsuite name="tests/conditional.test.ts" timestamp="2026-01-21T01:20:30.135Z" hostname="runnervmmtnos" tests="11" failures="0" errors="0" skipped="0" time="0.052299957">
190
- <testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution &gt; should execute task when condition is undefined" time="0.003083642">
191
- </testcase>
192
- <testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution &gt; should execute task when condition returns true" time="0.000426649">
193
- </testcase>
194
- <testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution &gt; should skip task when condition returns false" time="0.001586871">
195
- </testcase>
196
- <testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution &gt; should handle async condition" time="0.000432499">
197
- </testcase>
198
- <testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution &gt; should skip dependent tasks if parent is skipped due to condition" time="0.000703848">
199
- </testcase>
200
- <testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution &gt; should handle condition throwing error" time="0.000404638">
201
- </testcase>
202
- <testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution &gt; should handle condition throwing non-Error object" time="0.000385482">
203
- </testcase>
204
- <testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution &gt; should handle cancellation during async condition evaluation" time="0.021667042">
205
- </testcase>
206
- <testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution &gt; should handle cancellation between condition and execution (or before execution if no condition)" time="0.02009117">
207
- </testcase>
208
- <testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution &gt; should handle immediate cancellation" time="0.000682247">
209
- </testcase>
210
- <testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution &gt; should break loop if stuck (e.g. cycle)" time="0.000337602">
211
- </testcase>
212
- </testsuite>
213
- <testsuite name="tests/integration.test.ts" timestamp="2026-01-21T01:20:30.137Z" hostname="runnervmmtnos" tests="3" failures="0" errors="0" skipped="0" time="0.008836872">
214
- <testcase classname="tests/integration.test.ts" name="TaskRunner Validation Integration &gt; should throw validation error with clear message for duplicate tasks" time="0.005145402">
215
- </testcase>
216
- <testcase classname="tests/integration.test.ts" name="TaskRunner Validation Integration &gt; should throw validation error with clear message for missing dependencies" time="0.00056086">
217
- </testcase>
218
- <testcase classname="tests/integration.test.ts" name="TaskRunner Validation Integration &gt; should throw validation error with clear message for cycles" time="0.000498103">
219
- </testcase>
220
- </testsuite>
221
- <testsuite name="tests/priority.test.ts" timestamp="2026-01-21T01:20:30.138Z" hostname="runnervmmtnos" tests="6" failures="0" errors="0" skipped="0" time="0.231923273">
222
- <testcase classname="tests/priority.test.ts" name="Task Priority Scheduling &gt; should execute higher priority tasks first when concurrency is limited" time="0.04541155">
223
- </testcase>
224
- <testcase classname="tests/priority.test.ts" name="Task Priority Scheduling &gt; should maintain FIFO order for tasks with equal priority" time="0.030813242">
225
- </testcase>
226
- <testcase classname="tests/priority.test.ts" name="Task Priority Scheduling &gt; should treat undefined priority as 0" time="0.041419416">
227
- </testcase>
228
- <testcase classname="tests/priority.test.ts" name="Task Priority Scheduling &gt; should respect priority when tasks become ready at different times" time="0.030705692">
229
- </testcase>
230
- <testcase classname="tests/priority.test.ts" name="Task Priority Scheduling &gt; should not affect execution when concurrency is unlimited" time="0.050797832">
231
- </testcase>
232
- <testcase classname="tests/priority.test.ts" name="Task Priority Scheduling &gt; should handle mixed priority and dependency scenarios" time="0.030509631">
233
- </testcase>
234
- </testsuite>
235
- <testsuite name="tests/integration-tests/basic-structure.test.ts" timestamp="2026-01-21T01:20:30.139Z" hostname="runnervmmtnos" tests="4" failures="0" errors="0" skipped="0" time="0.131125602">
236
- <testcase classname="tests/integration-tests/basic-structure.test.ts" name="Integration: Basic Structure &gt; Scenario 1: Basic linear workflow (A -&gt; B -&gt; C)" time="0.034074086">
237
- </testcase>
238
- <testcase classname="tests/integration-tests/basic-structure.test.ts" name="Integration: Basic Structure &gt; Scenario 2: Branching workflow (A -&gt; [B, C] -&gt; D)" time="0.03319469">
239
- </testcase>
240
- <testcase classname="tests/integration-tests/basic-structure.test.ts" name="Integration: Basic Structure &gt; Scenario 12: Complex &apos;Diamond&apos; dependency graph (A -&gt; B -&gt; D, A -&gt; C -&gt; D)" time="0.040868793">
241
- </testcase>
242
- <testcase classname="tests/integration-tests/basic-structure.test.ts" name="Integration: Basic Structure &gt; Scenario 14: Zero-dependency parallel burst" time="0.02116468">
243
- </testcase>
244
- </testsuite>
245
- <testsuite name="tests/integration-tests/concurrency-timing.test.ts" timestamp="2026-01-21T01:20:30.139Z" hostname="runnervmmtnos" tests="3" failures="0" errors="0" skipped="0" time="0.127939009">
246
- <testcase classname="tests/integration-tests/concurrency-timing.test.ts" name="Integration: Concurrency and Timing &gt; Scenario 6: Mixed duration tasks (verifying parallel efficiency)" time="0.053707181">
247
- </testcase>
248
- <testcase classname="tests/integration-tests/concurrency-timing.test.ts" name="Integration: Concurrency and Timing &gt; Scenario 7: Cancellation via AbortSignal" time="0.021665094">
249
- </testcase>
250
- <testcase classname="tests/integration-tests/concurrency-timing.test.ts" name="Integration: Concurrency and Timing &gt; Scenario 8: Global timeout interrupting long tasks" time="0.050469928">
251
- </testcase>
252
- </testsuite>
253
- <testsuite name="tests/integration-tests/context-state.test.ts" timestamp="2026-01-21T01:20:30.140Z" hostname="runnervmmtnos" tests="3" failures="0" errors="0" skipped="0" time="0.019309647">
254
- <testcase classname="tests/integration-tests/context-state.test.ts" name="Integration: Context and State &gt; Scenario 4: Shared context mutation (A writes, B reads)" time="0.005355205">
255
- </testcase>
256
- <testcase classname="tests/integration-tests/context-state.test.ts" name="Integration: Context and State &gt; Scenario 9: Dynamic context validation" time="0.000666748">
257
- </testcase>
258
- <testcase classname="tests/integration-tests/context-state.test.ts" name="Integration: Context and State &gt; Scenario 13: Tasks with side-effects" time="0.011028756">
259
- </testcase>
260
- </testsuite>
261
- <testsuite name="tests/integration-tests/dryRun.test.ts" timestamp="2026-01-21T01:20:30.140Z" hostname="runnervmmtnos" tests="2" failures="0" errors="0" skipped="0" time="0.00813554">
262
- <testcase classname="tests/integration-tests/dryRun.test.ts" name="Integration: Dry Run &gt; should execute successfully without side effects" time="0.00536859">
263
- </testcase>
264
- <testcase classname="tests/integration-tests/dryRun.test.ts" name="Integration: Dry Run &gt; should respect dependencies (topological order is maintained even in dry run)" time="0.000453529">
265
- </testcase>
266
- </testsuite>
267
- <testsuite name="tests/integration-tests/error-handling.test.ts" timestamp="2026-01-21T01:20:30.141Z" hostname="runnervmmtnos" tests="3" failures="0" errors="0" skipped="0" time="0.009601724">
268
- <testcase classname="tests/integration-tests/error-handling.test.ts" name="Integration: Error Handling &gt; Scenario 3: Task failure and downstream skipping" time="0.004281945">
269
- </testcase>
270
- <testcase classname="tests/integration-tests/error-handling.test.ts" name="Integration: Error Handling &gt; Scenario 10: Circular dependency detection" time="0.002729309">
271
- </testcase>
272
- <testcase classname="tests/integration-tests/error-handling.test.ts" name="Integration: Error Handling &gt; Scenario 11: Missing dependency handling" time="0.000504624">
273
- </testcase>
274
- </testsuite>
275
- <testsuite name="tests/integration-tests/stress.test.ts" timestamp="2026-01-21T01:20:30.142Z" hostname="runnervmmtnos" tests="1" failures="0" errors="0" skipped="0" time="0.009169935">
276
- <testcase classname="tests/integration-tests/stress.test.ts" name="Integration: Stress Tests &gt; Scenario 5: Large graph execution (e.g., 20+ nodes)" time="0.006800711">
277
- </testcase>
278
- </testsuite>
279
- <testsuite name="tests/strategies/RetryingExecutionStrategy.test.ts" timestamp="2026-01-21T01:20:30.142Z" hostname="runnervmmtnos" tests="9" failures="0" errors="0" skipped="0" time="0.021046107">
280
- <testcase classname="tests/strategies/RetryingExecutionStrategy.test.ts" name="RetryingExecutionStrategy &gt; should execute successfully without retry if task succeeds" time="0.005404016">
281
- </testcase>
282
- <testcase classname="tests/strategies/RetryingExecutionStrategy.test.ts" name="RetryingExecutionStrategy &gt; should execute successfully without retry if task has no retry config" time="0.000650929">
283
- </testcase>
284
- <testcase classname="tests/strategies/RetryingExecutionStrategy.test.ts" name="RetryingExecutionStrategy &gt; should retry task if it fails and has retry config (fixed backoff)" time="0.00243581">
285
- </testcase>
286
- <testcase classname="tests/strategies/RetryingExecutionStrategy.test.ts" name="RetryingExecutionStrategy &gt; should fail after max attempts reached" time="0.001285096">
287
- </testcase>
288
- <testcase classname="tests/strategies/RetryingExecutionStrategy.test.ts" name="RetryingExecutionStrategy &gt; should use exponential backoff" time="0.001000172">
289
- </testcase>
290
- <testcase classname="tests/strategies/RetryingExecutionStrategy.test.ts" name="RetryingExecutionStrategy &gt; should handle cancellation during delay" time="0.002167227">
291
- </testcase>
292
- <testcase classname="tests/strategies/RetryingExecutionStrategy.test.ts" name="RetryingExecutionStrategy &gt; should handle cancellation before execution" time="0.000959445">
293
- </testcase>
294
- <testcase classname="tests/strategies/RetryingExecutionStrategy.test.ts" name="RetryingExecutionStrategy &gt; should propagate error if sleep throws non-abort error" time="0.003848645">
295
- </testcase>
296
- <testcase classname="tests/strategies/RetryingExecutionStrategy.test.ts" name="RetryingExecutionStrategy &gt; should handle cancellation if signal is aborted right before sleep (covering fast-fail in sleep)" time="0.00106279">
297
- </testcase>
298
- </testsuite>
299
- </testsuites>