@calmo/task-runner 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/.jules/nexus.md +5 -0
  2. package/CHANGELOG.md +12 -0
  3. package/coverage/coverage-final.json +6 -5
  4. package/coverage/index.html +12 -12
  5. package/coverage/lcov-report/index.html +12 -12
  6. package/coverage/lcov-report/src/EventBus.ts.html +4 -4
  7. package/coverage/lcov-report/src/TaskGraphValidator.ts.html +38 -38
  8. package/coverage/lcov-report/src/TaskRunner.ts.html +184 -19
  9. package/coverage/lcov-report/src/TaskRunnerBuilder.ts.html +1 -1
  10. package/coverage/lcov-report/src/TaskRunnerExecutionConfig.ts.html +17 -2
  11. package/coverage/lcov-report/src/TaskStateManager.ts.html +34 -34
  12. package/coverage/lcov-report/src/WorkflowExecutor.ts.html +30 -30
  13. package/coverage/lcov-report/src/contracts/RunnerEvents.ts.html +1 -1
  14. package/coverage/lcov-report/src/contracts/index.html +1 -1
  15. package/coverage/lcov-report/src/index.html +9 -9
  16. package/coverage/lcov-report/src/strategies/DryRunExecutionStrategy.ts.html +178 -0
  17. package/coverage/lcov-report/src/strategies/StandardExecutionStrategy.ts.html +1 -1
  18. package/coverage/lcov-report/src/strategies/index.html +19 -4
  19. package/coverage/lcov.info +247 -209
  20. package/coverage/src/EventBus.ts.html +4 -4
  21. package/coverage/src/TaskGraphValidator.ts.html +38 -38
  22. package/coverage/src/TaskRunner.ts.html +184 -19
  23. package/coverage/src/TaskRunnerBuilder.ts.html +1 -1
  24. package/coverage/src/TaskRunnerExecutionConfig.ts.html +17 -2
  25. package/coverage/src/TaskStateManager.ts.html +34 -34
  26. package/coverage/src/WorkflowExecutor.ts.html +30 -30
  27. package/coverage/src/contracts/RunnerEvents.ts.html +1 -1
  28. package/coverage/src/contracts/index.html +1 -1
  29. package/coverage/src/index.html +9 -9
  30. package/coverage/src/strategies/DryRunExecutionStrategy.ts.html +178 -0
  31. package/coverage/src/strategies/StandardExecutionStrategy.ts.html +1 -1
  32. package/coverage/src/strategies/index.html +19 -4
  33. package/dist/TaskRunner.d.ts +12 -0
  34. package/dist/TaskRunner.js +45 -1
  35. package/dist/TaskRunner.js.map +1 -1
  36. package/dist/TaskRunnerExecutionConfig.d.ts +5 -0
  37. package/dist/strategies/DryRunExecutionStrategy.d.ts +16 -0
  38. package/dist/strategies/DryRunExecutionStrategy.js +25 -0
  39. package/dist/strategies/DryRunExecutionStrategy.js.map +1 -0
  40. package/openspec/changes/add-concurrency-control/proposal.md +6 -6
  41. package/openspec/changes/add-task-retry-policy/proposal.md +8 -5
  42. package/openspec/changes/add-workflow-preview/proposal.md +5 -4
  43. package/openspec/changes/feat-per-task-timeout/proposal.md +25 -0
  44. package/openspec/changes/feat-per-task-timeout/tasks.md +27 -0
  45. package/package.json +1 -1
  46. package/src/TaskRunner.ts +56 -1
  47. package/src/TaskRunnerExecutionConfig.ts +5 -0
  48. package/src/strategies/DryRunExecutionStrategy.ts +31 -0
  49. package/test-report.xml +102 -82
@@ -243,26 +243,26 @@
243
243
  <span class="cline-any cline-neutral">&nbsp;</span>
244
244
  <span class="cline-any cline-neutral">&nbsp;</span>
245
245
  <span class="cline-any cline-neutral">&nbsp;</span>
246
- <span class="cline-any cline-yes">54x</span>
246
+ <span class="cline-any cline-yes">56x</span>
247
247
  <span class="cline-any cline-neutral">&nbsp;</span>
248
248
  <span class="cline-any cline-neutral">&nbsp;</span>
249
- <span class="cline-any cline-yes">54x</span>
250
- <span class="cline-any cline-yes">54x</span>
251
- <span class="cline-any cline-yes">20139x</span>
249
+ <span class="cline-any cline-yes">56x</span>
250
+ <span class="cline-any cline-yes">56x</span>
251
+ <span class="cline-any cline-yes">20143x</span>
252
252
  <span class="cline-any cline-yes">3x</span>
253
253
  <span class="cline-any cline-neutral">&nbsp;</span>
254
254
  <span class="cline-any cline-neutral">&nbsp;</span>
255
255
  <span class="cline-any cline-neutral">&nbsp;</span>
256
256
  <span class="cline-any cline-neutral">&nbsp;</span>
257
257
  <span class="cline-any cline-neutral">&nbsp;</span>
258
- <span class="cline-any cline-yes">20136x</span>
258
+ <span class="cline-any cline-yes">20140x</span>
259
259
  <span class="cline-any cline-neutral">&nbsp;</span>
260
260
  <span class="cline-any cline-neutral">&nbsp;</span>
261
261
  <span class="cline-any cline-neutral">&nbsp;</span>
262
262
  <span class="cline-any cline-neutral">&nbsp;</span>
263
- <span class="cline-any cline-yes">54x</span>
264
- <span class="cline-any cline-yes">20139x</span>
265
- <span class="cline-any cline-yes">20166x</span>
263
+ <span class="cline-any cline-yes">56x</span>
264
+ <span class="cline-any cline-yes">20143x</span>
265
+ <span class="cline-any cline-yes">20168x</span>
266
266
  <span class="cline-any cline-yes">6x</span>
267
267
  <span class="cline-any cline-neutral">&nbsp;</span>
268
268
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -274,9 +274,9 @@
274
274
  <span class="cline-any cline-neutral">&nbsp;</span>
275
275
  <span class="cline-any cline-neutral">&nbsp;</span>
276
276
  <span class="cline-any cline-neutral">&nbsp;</span>
277
- <span class="cline-any cline-yes">54x</span>
277
+ <span class="cline-any cline-yes">56x</span>
278
278
  <span class="cline-any cline-neutral">&nbsp;</span>
279
- <span class="cline-any cline-yes">54x</span>
279
+ <span class="cline-any cline-yes">56x</span>
280
280
  <span class="cline-any cline-yes">5x</span>
281
281
  <span class="cline-any cline-neutral">&nbsp;</span>
282
282
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -284,21 +284,21 @@
284
284
  <span class="cline-any cline-neutral">&nbsp;</span>
285
285
  <span class="cline-any cline-neutral">&nbsp;</span>
286
286
  <span class="cline-any cline-neutral">&nbsp;</span>
287
- <span class="cline-any cline-yes">49x</span>
288
- <span class="cline-any cline-yes">49x</span>
289
- <span class="cline-any cline-yes">20131x</span>
287
+ <span class="cline-any cline-yes">51x</span>
288
+ <span class="cline-any cline-yes">51x</span>
289
+ <span class="cline-any cline-yes">20135x</span>
290
290
  <span class="cline-any cline-neutral">&nbsp;</span>
291
291
  <span class="cline-any cline-neutral">&nbsp;</span>
292
- <span class="cline-any cline-yes">49x</span>
293
- <span class="cline-any cline-yes">49x</span>
292
+ <span class="cline-any cline-yes">51x</span>
293
+ <span class="cline-any cline-yes">51x</span>
294
294
  <span class="cline-any cline-neutral">&nbsp;</span>
295
- <span class="cline-any cline-yes">49x</span>
296
- <span class="cline-any cline-yes">20124x</span>
295
+ <span class="cline-any cline-yes">51x</span>
296
+ <span class="cline-any cline-yes">20128x</span>
297
297
  <span class="cline-any cline-yes">3x</span>
298
298
  <span class="cline-any cline-neutral">&nbsp;</span>
299
299
  <span class="cline-any cline-neutral">&nbsp;</span>
300
- <span class="cline-any cline-yes">20121x</span>
301
- <span class="cline-any cline-yes">20121x</span>
300
+ <span class="cline-any cline-yes">20125x</span>
301
+ <span class="cline-any cline-yes">20125x</span>
302
302
  <span class="cline-any cline-neutral">&nbsp;</span>
303
303
  <span class="cline-any cline-neutral">&nbsp;</span>
304
304
  <span class="cline-any cline-yes">5x</span>
@@ -315,7 +315,7 @@
315
315
  <span class="cline-any cline-neutral">&nbsp;</span>
316
316
  <span class="cline-any cline-neutral">&nbsp;</span>
317
317
  <span class="cline-any cline-neutral">&nbsp;</span>
318
- <span class="cline-any cline-yes">49x</span>
318
+ <span class="cline-any cline-yes">51x</span>
319
319
  <span class="cline-any cline-neutral">&nbsp;</span>
320
320
  <span class="cline-any cline-neutral">&nbsp;</span>
321
321
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -339,34 +339,34 @@
339
339
  <span class="cline-any cline-neutral">&nbsp;</span>
340
340
  <span class="cline-any cline-neutral">&nbsp;</span>
341
341
  <span class="cline-any cline-neutral">&nbsp;</span>
342
- <span class="cline-any cline-yes">20121x</span>
342
+ <span class="cline-any cline-yes">20125x</span>
343
343
  <span class="cline-any cline-neutral">&nbsp;</span>
344
- <span class="cline-any cline-yes">20121x</span>
345
- <span class="cline-any cline-yes">20121x</span>
346
- <span class="cline-any cline-yes">20121x</span>
344
+ <span class="cline-any cline-yes">20125x</span>
345
+ <span class="cline-any cline-yes">20125x</span>
346
+ <span class="cline-any cline-yes">20125x</span>
347
347
  <span class="cline-any cline-neutral">&nbsp;</span>
348
- <span class="cline-any cline-yes">20121x</span>
348
+ <span class="cline-any cline-yes">20125x</span>
349
349
  <span class="cline-any cline-neutral">&nbsp;</span>
350
350
  <span class="cline-any cline-neutral">&nbsp;</span>
351
351
  <span class="cline-any cline-neutral">&nbsp;</span>
352
352
  <span class="cline-any cline-neutral">&nbsp;</span>
353
353
  <span class="cline-any cline-neutral">&nbsp;</span>
354
354
  <span class="cline-any cline-neutral">&nbsp;</span>
355
- <span class="cline-any cline-yes">20121x</span>
356
- <span class="cline-any cline-yes">40273x</span>
357
- <span class="cline-any cline-yes">40273x</span>
355
+ <span class="cline-any cline-yes">20125x</span>
356
+ <span class="cline-any cline-yes">40279x</span>
357
+ <span class="cline-any cline-yes">40279x</span>
358
358
  <span class="cline-any cline-neutral">&nbsp;</span>
359
- <span class="cline-any cline-yes">40273x</span>
360
- <span class="cline-any cline-yes">20157x</span>
361
- <span class="cline-any cline-yes">20157x</span>
359
+ <span class="cline-any cline-yes">40279x</span>
360
+ <span class="cline-any cline-yes">20159x</span>
361
+ <span class="cline-any cline-yes">20159x</span>
362
362
  <span class="cline-any cline-neutral">&nbsp;</span>
363
- <span class="cline-any cline-yes">20157x</span>
363
+ <span class="cline-any cline-yes">20159x</span>
364
364
  <span class="cline-any cline-neutral">&nbsp;</span>
365
365
  <span class="cline-any cline-yes">5x</span>
366
366
  <span class="cline-any cline-yes">5x</span>
367
367
  <span class="cline-any cline-neutral">&nbsp;</span>
368
368
  <span class="cline-any cline-neutral">&nbsp;</span>
369
- <span class="cline-any cline-yes">20152x</span>
369
+ <span class="cline-any cline-yes">20154x</span>
370
370
  <span class="cline-any cline-yes">7x</span>
371
371
  <span class="cline-any cline-yes">7x</span>
372
372
  <span class="cline-any cline-yes">7x</span>
@@ -380,13 +380,13 @@
380
380
  <span class="cline-any cline-neutral">&nbsp;</span>
381
381
  <span class="cline-any cline-neutral">&nbsp;</span>
382
382
  <span class="cline-any cline-neutral">&nbsp;</span>
383
- <span class="cline-any cline-yes">20116x</span>
384
- <span class="cline-any cline-yes">20116x</span>
385
- <span class="cline-any cline-yes">20116x</span>
383
+ <span class="cline-any cline-yes">20120x</span>
384
+ <span class="cline-any cline-yes">20120x</span>
385
+ <span class="cline-any cline-yes">20120x</span>
386
386
  <span class="cline-any cline-neutral">&nbsp;</span>
387
387
  <span class="cline-any cline-neutral">&nbsp;</span>
388
388
  <span class="cline-any cline-neutral">&nbsp;</span>
389
- <span class="cline-any cline-yes">20116x</span>
389
+ <span class="cline-any cline-yes">20120x</span>
390
390
  <span class="cline-any cline-neutral">&nbsp;</span>
391
391
  <span class="cline-any cline-neutral">&nbsp;</span>
392
392
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { ITaskGraphValidator } from "./contracts/ITaskGraphValidator.js";
@@ -559,7 +559,7 @@ export class TaskGraphValidator implements ITaskGraphValidator {
559
559
  <div class='footer quiet pad2 space-top1 center small'>
560
560
  Code coverage generated by
561
561
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
562
- at 2026-01-18T16:53:50.059Z
562
+ at 2026-01-18T18:12:39.248Z
563
563
  </div>
564
564
  <script src="../prettify.js"></script>
565
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'>33/33</span>
28
+ <span class='fraction'>49/49</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'>14/14</span>
35
+ <span class='fraction'>18/18</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'>8/8</span>
42
+ <span class='fraction'>12/12</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'>33/33</span>
49
+ <span class='fraction'>47/47</span>
50
50
  </div>
51
51
 
52
52
 
@@ -201,7 +201,62 @@
201
201
  <a name='L136'></a><a href='#L136'>136</a>
202
202
  <a name='L137'></a><a href='#L137'>137</a>
203
203
  <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
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>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
205
260
  <span class="cline-any cline-neutral">&nbsp;</span>
206
261
  <span class="cline-any cline-neutral">&nbsp;</span>
207
262
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -222,14 +277,15 @@
222
277
  <span class="cline-any cline-neutral">&nbsp;</span>
223
278
  <span class="cline-any cline-neutral">&nbsp;</span>
224
279
  <span class="cline-any cline-neutral">&nbsp;</span>
225
- <span class="cline-any cline-yes">50x</span>
226
- <span class="cline-any cline-yes">50x</span>
227
- <span class="cline-any cline-yes">50x</span>
228
280
  <span class="cline-any cline-neutral">&nbsp;</span>
281
+ <span class="cline-any cline-yes">52x</span>
282
+ <span class="cline-any cline-yes">52x</span>
283
+ <span class="cline-any cline-yes">52x</span>
229
284
  <span class="cline-any cline-neutral">&nbsp;</span>
230
285
  <span class="cline-any cline-neutral">&nbsp;</span>
231
286
  <span class="cline-any cline-neutral">&nbsp;</span>
232
- <span class="cline-any cline-yes">50x</span>
287
+ <span class="cline-any cline-neutral">&nbsp;</span>
288
+ <span class="cline-any cline-yes">52x</span>
233
289
  <span class="cline-any cline-neutral">&nbsp;</span>
234
290
  <span class="cline-any cline-neutral">&nbsp;</span>
235
291
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -273,6 +329,46 @@
273
329
  <span class="cline-any cline-neutral">&nbsp;</span>
274
330
  <span class="cline-any cline-neutral">&nbsp;</span>
275
331
  <span class="cline-any cline-neutral">&nbsp;</span>
332
+ <span class="cline-any cline-yes">4x</span>
333
+ <span class="cline-any cline-neutral">&nbsp;</span>
334
+ <span class="cline-any cline-neutral">&nbsp;</span>
335
+ <span class="cline-any cline-neutral">&nbsp;</span>
336
+ <span class="cline-any cline-neutral">&nbsp;</span>
337
+ <span class="cline-any cline-neutral">&nbsp;</span>
338
+ <span class="cline-any cline-neutral">&nbsp;</span>
339
+ <span class="cline-any cline-yes">12x</span>
340
+ <span class="cline-any cline-yes">24x</span>
341
+ <span class="cline-any cline-neutral">&nbsp;</span>
342
+ <span class="cline-any cline-neutral">&nbsp;</span>
343
+ <span class="cline-any cline-neutral">&nbsp;</span>
344
+ <span class="cline-any cline-yes">4x</span>
345
+ <span class="cline-any cline-neutral">&nbsp;</span>
346
+ <span class="cline-any cline-neutral">&nbsp;</span>
347
+ <span class="cline-any cline-neutral">&nbsp;</span>
348
+ <span class="cline-any cline-yes">12x</span>
349
+ <span class="cline-any cline-neutral">&nbsp;</span>
350
+ <span class="cline-any cline-neutral">&nbsp;</span>
351
+ <span class="cline-any cline-neutral">&nbsp;</span>
352
+ <span class="cline-any cline-yes">4x</span>
353
+ <span class="cline-any cline-yes">12x</span>
354
+ <span class="cline-any cline-yes">5x</span>
355
+ <span class="cline-any cline-yes">6x</span>
356
+ <span class="cline-any cline-neutral">&nbsp;</span>
357
+ <span class="cline-any cline-neutral">&nbsp;</span>
358
+ <span class="cline-any cline-neutral">&nbsp;</span>
359
+ <span class="cline-any cline-neutral">&nbsp;</span>
360
+ <span class="cline-any cline-neutral">&nbsp;</span>
361
+ <span class="cline-any cline-neutral">&nbsp;</span>
362
+ <span class="cline-any cline-yes">4x</span>
363
+ <span class="cline-any cline-neutral">&nbsp;</span>
364
+ <span class="cline-any cline-neutral">&nbsp;</span>
365
+ <span class="cline-any cline-neutral">&nbsp;</span>
366
+ <span class="cline-any cline-neutral">&nbsp;</span>
367
+ <span class="cline-any cline-neutral">&nbsp;</span>
368
+ <span class="cline-any cline-neutral">&nbsp;</span>
369
+ <span class="cline-any cline-neutral">&nbsp;</span>
370
+ <span class="cline-any cline-neutral">&nbsp;</span>
371
+ <span class="cline-any cline-yes">24x</span>
276
372
  <span class="cline-any cline-neutral">&nbsp;</span>
277
373
  <span class="cline-any cline-neutral">&nbsp;</span>
278
374
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -280,20 +376,34 @@
280
376
  <span class="cline-any cline-neutral">&nbsp;</span>
281
377
  <span class="cline-any cline-neutral">&nbsp;</span>
282
378
  <span class="cline-any cline-neutral">&nbsp;</span>
283
- <span class="cline-any cline-yes">45x</span>
284
- <span class="cline-any cline-yes">121x</span>
285
379
  <span class="cline-any cline-neutral">&nbsp;</span>
286
380
  <span class="cline-any cline-neutral">&nbsp;</span>
287
381
  <span class="cline-any cline-neutral">&nbsp;</span>
288
382
  <span class="cline-any cline-neutral">&nbsp;</span>
289
383
  <span class="cline-any cline-neutral">&nbsp;</span>
290
- <span class="cline-any cline-yes">45x</span>
291
- <span class="cline-any cline-yes">45x</span>
384
+ <span class="cline-any cline-neutral">&nbsp;</span>
385
+ <span class="cline-any cline-neutral">&nbsp;</span>
386
+ <span class="cline-any cline-neutral">&nbsp;</span>
387
+ <span class="cline-any cline-yes">47x</span>
388
+ <span class="cline-any cline-yes">125x</span>
389
+ <span class="cline-any cline-neutral">&nbsp;</span>
390
+ <span class="cline-any cline-neutral">&nbsp;</span>
391
+ <span class="cline-any cline-neutral">&nbsp;</span>
392
+ <span class="cline-any cline-neutral">&nbsp;</span>
393
+ <span class="cline-any cline-neutral">&nbsp;</span>
394
+ <span class="cline-any cline-yes">47x</span>
395
+ <span class="cline-any cline-yes">47x</span>
292
396
  <span class="cline-any cline-yes">8x</span>
293
397
  <span class="cline-any cline-neutral">&nbsp;</span>
294
398
  <span class="cline-any cline-neutral">&nbsp;</span>
295
- <span class="cline-any cline-yes">37x</span>
296
- <span class="cline-any cline-yes">37x</span>
399
+ <span class="cline-any cline-yes">39x</span>
400
+ <span class="cline-any cline-neutral">&nbsp;</span>
401
+ <span class="cline-any cline-yes">39x</span>
402
+ <span class="cline-any cline-yes">39x</span>
403
+ <span class="cline-any cline-yes">2x</span>
404
+ <span class="cline-any cline-neutral">&nbsp;</span>
405
+ <span class="cline-any cline-neutral">&nbsp;</span>
406
+ <span class="cline-any cline-yes">39x</span>
297
407
  <span class="cline-any cline-neutral">&nbsp;</span>
298
408
  <span class="cline-any cline-neutral">&nbsp;</span>
299
409
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -301,7 +411,7 @@
301
411
  <span class="cline-any cline-neutral">&nbsp;</span>
302
412
  <span class="cline-any cline-neutral">&nbsp;</span>
303
413
  <span class="cline-any cline-neutral">&nbsp;</span>
304
- <span class="cline-any cline-yes">37x</span>
414
+ <span class="cline-any cline-yes">39x</span>
305
415
  <span class="cline-any cline-yes">5x</span>
306
416
  <span class="cline-any cline-yes">5x</span>
307
417
  <span class="cline-any cline-yes">3x</span>
@@ -335,7 +445,7 @@
335
445
  <span class="cline-any cline-neutral">&nbsp;</span>
336
446
  <span class="cline-any cline-neutral">&nbsp;</span>
337
447
  <span class="cline-any cline-neutral">&nbsp;</span>
338
- <span class="cline-any cline-yes">32x</span>
448
+ <span class="cline-any cline-yes">34x</span>
339
449
  <span class="cline-any cline-neutral">&nbsp;</span>
340
450
  <span class="cline-any cline-neutral">&nbsp;</span>
341
451
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -350,6 +460,7 @@ import { TaskRunnerExecutionConfig } from "./TaskRunnerExecutionConfig.js";
350
460
  import { TaskStateManager } from "./TaskStateManager.js";
351
461
  import { IExecutionStrategy } from "./strategies/IExecutionStrategy.js";
352
462
  import { StandardExecutionStrategy } from "./strategies/StandardExecutionStrategy.js";
463
+ import { DryRunExecutionStrategy } from "./strategies/DryRunExecutionStrategy.js";
353
464
  &nbsp;
354
465
  // Re-export types for backward compatibility
355
466
  export { RunnerEventPayloads, RunnerEventListener, TaskRunnerExecutionConfig };
@@ -404,6 +515,54 @@ export class TaskRunner&lt;TContext&gt; {
404
515
  this.executionStrategy = strategy;
405
516
  return this;
406
517
  }
518
+ &nbsp;
519
+ /**
520
+ * Generates a Mermaid.js graph representation of the task workflow.
521
+ * @param steps The list of tasks to visualize.
522
+ * @returns A string containing the Mermaid graph definition.
523
+ */
524
+ public static getMermaidGraph&lt;T&gt;(steps: TaskStep&lt;T&gt;[]): string {
525
+ const graphLines = ["graph TD"];
526
+ &nbsp;
527
+ // Helper to sanitize node names or wrap them if needed
528
+ // For simplicity, we just wrap in quotes and use the name as ID if it's simple
529
+ // or generate an ID if strictly needed. Here we assume names are unique IDs.
530
+ // We will wrap names in quotes for the label, but use the name as the ID.
531
+ // Actually, Mermaid ID cannot have spaces without quotes.
532
+ const safeId = (name: string) =&gt; JSON.stringify(name);
533
+ const sanitize = (name: string) =&gt; this.sanitizeMermaidId(name);
534
+ &nbsp;
535
+ &nbsp;
536
+ // Add all nodes first to ensure they exist
537
+ for (const step of steps) {
538
+ // Using the name as both ID and Label for simplicity
539
+ // Format: ID["Label"]
540
+ // safeId returns a quoted string (e.g. "Task Name"), so we use it directly as the label
541
+ graphLines.push(` ${sanitize(step.name)}[${safeId(step.name)}]`);
542
+ }
543
+ &nbsp;
544
+ // Add edges
545
+ for (const step of steps) {
546
+ if (step.dependencies) {
547
+ for (const dep of step.dependencies) {
548
+ graphLines.push(
549
+ ` ${sanitize(dep)} --&gt; ${sanitize(step.name)}`
550
+ );
551
+ }
552
+ }
553
+ }
554
+ &nbsp;
555
+ return [...new Set(graphLines)].join("\n");
556
+ }
557
+ &nbsp;
558
+ /**
559
+ * Sanitizes a string for use as a Mermaid node ID.
560
+ * @param id The string to sanitize.
561
+ * @returns The sanitized string.
562
+ */
563
+ private static sanitizeMermaidId(id: string): string {
564
+ return id.replaceAll(/ /g, "_").replaceAll(/:/g, "_").replaceAll(/"/g, "_");
565
+ }
407
566
  &nbsp;
408
567
  /**
409
568
  * Executes a list of tasks, respecting their dependencies and running
@@ -431,11 +590,17 @@ export class TaskRunner&lt;TContext&gt; {
431
590
  }
432
591
  &nbsp;
433
592
  const stateManager = new TaskStateManager(this.eventBus);
593
+ &nbsp;
594
+ let strategy = this.executionStrategy;
595
+ if (config?.dryRun) {
596
+ strategy = new DryRunExecutionStrategy&lt;TContext&gt;();
597
+ }
598
+ &nbsp;
434
599
  const executor = new WorkflowExecutor(
435
600
  this.context,
436
601
  this.eventBus,
437
602
  stateManager,
438
- this.executionStrategy
603
+ strategy
439
604
  );
440
605
  &nbsp;
441
606
  // We need to handle the timeout cleanup properly.
@@ -484,7 +649,7 @@ export class TaskRunner&lt;TContext&gt; {
484
649
  <div class='footer quiet pad2 space-top1 center small'>
485
650
  Code coverage generated by
486
651
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
487
- at 2026-01-18T16:53:50.059Z
652
+ at 2026-01-18T18:12:39.248Z
488
653
  </div>
489
654
  <script src="../prettify.js"></script>
490
655
  <script>
@@ -298,7 +298,7 @@ export class TaskRunnerBuilder&lt;TContext&gt; {
298
298
  <div class='footer quiet pad2 space-top1 center small'>
299
299
  Code coverage generated by
300
300
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
301
- at 2026-01-18T16:53:50.059Z
301
+ at 2026-01-18T18:12:39.248Z
302
302
  </div>
303
303
  <script src="../prettify.js"></script>
304
304
  <script>
@@ -76,7 +76,17 @@
76
76
  <a name='L11'></a><a href='#L11'>11</a>
77
77
  <a name='L12'></a><a href='#L12'>12</a>
78
78
  <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
85
+ <span class="cline-any cline-neutral">&nbsp;</span>
86
+ <span class="cline-any cline-neutral">&nbsp;</span>
87
+ <span class="cline-any cline-neutral">&nbsp;</span>
88
+ <span class="cline-any cline-neutral">&nbsp;</span>
89
+ <span class="cline-any cline-neutral">&nbsp;</span>
80
90
  <span class="cline-any cline-neutral">&nbsp;</span>
81
91
  <span class="cline-any cline-neutral">&nbsp;</span>
82
92
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -101,6 +111,11 @@ export interface TaskRunnerExecutionConfig {
101
111
  * A timeout in milliseconds for the entire workflow.
102
112
  */
103
113
  timeout?: number;
114
+ /**
115
+ * If true, the runner will simulate execution without running the actual tasks.
116
+ * Useful for verifying the execution order and graph structure.
117
+ */
118
+ dryRun?: boolean;
104
119
  }
105
120
  &nbsp;</pre></td></tr></table></pre>
106
121
 
@@ -109,7 +124,7 @@ export interface TaskRunnerExecutionConfig {
109
124
  <div class='footer quiet pad2 space-top1 center small'>
110
125
  Code coverage generated by
111
126
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
112
- at 2026-01-18T16:53:50.059Z
127
+ at 2026-01-18T18:12:39.248Z
113
128
  </div>
114
129
  <script src="../prettify.js"></script>
115
130
  <script>