@calmo/task-runner 3.4.1 → 3.5.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 (50) hide show
  1. package/AGENTS.md +15 -16
  2. package/CHANGELOG.md +14 -0
  3. package/README.md +89 -82
  4. package/coverage/coverage-final.json +4 -4
  5. package/coverage/index.html +9 -9
  6. package/coverage/lcov-report/index.html +9 -9
  7. package/coverage/lcov-report/src/EventBus.ts.html +4 -4
  8. package/coverage/lcov-report/src/TaskGraphValidationError.ts.html +1 -1
  9. package/coverage/lcov-report/src/TaskGraphValidator.ts.html +1 -1
  10. package/coverage/lcov-report/src/TaskRunner.ts.html +1 -1
  11. package/coverage/lcov-report/src/TaskRunnerBuilder.ts.html +1 -1
  12. package/coverage/lcov-report/src/TaskRunnerExecutionConfig.ts.html +1 -1
  13. package/coverage/lcov-report/src/TaskStateManager.ts.html +82 -52
  14. package/coverage/lcov-report/src/WorkflowExecutor.ts.html +197 -62
  15. package/coverage/lcov-report/src/contracts/RunnerEvents.ts.html +1 -1
  16. package/coverage/lcov-report/src/contracts/index.html +1 -1
  17. package/coverage/lcov-report/src/index.html +12 -12
  18. package/coverage/lcov-report/src/strategies/DryRunExecutionStrategy.ts.html +1 -1
  19. package/coverage/lcov-report/src/strategies/RetryingExecutionStrategy.ts.html +1 -1
  20. package/coverage/lcov-report/src/strategies/StandardExecutionStrategy.ts.html +3 -3
  21. package/coverage/lcov-report/src/strategies/index.html +1 -1
  22. package/coverage/lcov.info +202 -163
  23. package/coverage/src/EventBus.ts.html +4 -4
  24. package/coverage/src/TaskGraphValidationError.ts.html +1 -1
  25. package/coverage/src/TaskGraphValidator.ts.html +1 -1
  26. package/coverage/src/TaskRunner.ts.html +1 -1
  27. package/coverage/src/TaskRunnerBuilder.ts.html +1 -1
  28. package/coverage/src/TaskRunnerExecutionConfig.ts.html +1 -1
  29. package/coverage/src/TaskStateManager.ts.html +82 -52
  30. package/coverage/src/WorkflowExecutor.ts.html +197 -62
  31. package/coverage/src/contracts/RunnerEvents.ts.html +1 -1
  32. package/coverage/src/contracts/index.html +1 -1
  33. package/coverage/src/index.html +12 -12
  34. package/coverage/src/strategies/DryRunExecutionStrategy.ts.html +1 -1
  35. package/coverage/src/strategies/RetryingExecutionStrategy.ts.html +1 -1
  36. package/coverage/src/strategies/StandardExecutionStrategy.ts.html +3 -3
  37. package/coverage/src/strategies/index.html +1 -1
  38. package/dist/TaskStateManager.d.ts +6 -0
  39. package/dist/TaskStateManager.js +11 -2
  40. package/dist/TaskStateManager.js.map +1 -1
  41. package/dist/TaskStep.d.ts +5 -0
  42. package/dist/WorkflowExecutor.js +49 -8
  43. package/dist/WorkflowExecutor.js.map +1 -1
  44. package/openspec/changes/archive/2026-01-18-feat-conditional-execution/proposal.md +35 -0
  45. package/openspec/changes/archive/2026-01-18-feat-conditional-execution/tasks.md +32 -0
  46. package/package.json +2 -1
  47. package/src/TaskStateManager.ts +12 -2
  48. package/src/TaskStep.ts +6 -0
  49. package/src/WorkflowExecutor.ts +57 -12
  50. package/test-report.xml +132 -108
@@ -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'>45/45</span>
28
+ <span class='fraction'>47/47</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'>9/9</span>
42
+ <span class='fraction'>10/10</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'>45/45</span>
49
+ <span class='fraction'>47/47</span>
50
50
  </div>
51
51
 
52
52
 
@@ -205,7 +205,17 @@
205
205
  <a name='L140'></a><a href='#L140'>140</a>
206
206
  <a name='L141'></a><a href='#L141'>141</a>
207
207
  <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
209
219
  <span class="cline-any cline-neutral">&nbsp;</span>
210
220
  <span class="cline-any cline-neutral">&nbsp;</span>
211
221
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -214,20 +224,20 @@
214
224
  <span class="cline-any cline-neutral">&nbsp;</span>
215
225
  <span class="cline-any cline-neutral">&nbsp;</span>
216
226
  <span class="cline-any cline-neutral">&nbsp;</span>
217
- <span class="cline-any cline-yes">48x</span>
218
- <span class="cline-any cline-yes">48x</span>
219
- <span class="cline-any cline-yes">48x</span>
227
+ <span class="cline-any cline-yes">59x</span>
228
+ <span class="cline-any cline-yes">59x</span>
229
+ <span class="cline-any cline-yes">59x</span>
220
230
  <span class="cline-any cline-neutral">&nbsp;</span>
221
- <span class="cline-any cline-yes">48x</span>
231
+ <span class="cline-any cline-yes">59x</span>
222
232
  <span class="cline-any cline-neutral">&nbsp;</span>
223
233
  <span class="cline-any cline-neutral">&nbsp;</span>
224
234
  <span class="cline-any cline-neutral">&nbsp;</span>
225
235
  <span class="cline-any cline-neutral">&nbsp;</span>
226
236
  <span class="cline-any cline-neutral">&nbsp;</span>
227
237
  <span class="cline-any cline-neutral">&nbsp;</span>
228
- <span class="cline-any cline-yes">47x</span>
229
- <span class="cline-any cline-yes">47x</span>
230
- <span class="cline-any cline-yes">47x</span>
238
+ <span class="cline-any cline-yes">58x</span>
239
+ <span class="cline-any cline-yes">58x</span>
240
+ <span class="cline-any cline-yes">58x</span>
231
241
  <span class="cline-any cline-neutral">&nbsp;</span>
232
242
  <span class="cline-any cline-neutral">&nbsp;</span>
233
243
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -236,47 +246,46 @@
236
246
  <span class="cline-any cline-neutral">&nbsp;</span>
237
247
  <span class="cline-any cline-neutral">&nbsp;</span>
238
248
  <span class="cline-any cline-neutral">&nbsp;</span>
239
- <span class="cline-any cline-yes">232x</span>
240
- <span class="cline-any cline-yes">232x</span>
249
+ <span class="cline-any cline-yes">272x</span>
250
+ <span class="cline-any cline-yes">272x</span>
241
251
  <span class="cline-any cline-neutral">&nbsp;</span>
242
- <span class="cline-any cline-yes">232x</span>
243
- <span class="cline-any cline-yes">374x</span>
244
- <span class="cline-any cline-yes">374x</span>
252
+ <span class="cline-any cline-yes">272x</span>
253
+ <span class="cline-any cline-yes">393x</span>
254
+ <span class="cline-any cline-yes">393x</span>
245
255
  <span class="cline-any cline-neutral">&nbsp;</span>
246
256
  <span class="cline-any cline-neutral">&nbsp;</span>
247
- <span class="cline-any cline-yes">374x</span>
248
- <span class="cline-any cline-yes">1133x</span>
249
- <span class="cline-any cline-yes">1133x</span>
257
+ <span class="cline-any cline-yes">393x</span>
258
+ <span class="cline-any cline-yes">1162x</span>
259
+ <span class="cline-any cline-yes">1162x</span>
250
260
  <span class="cline-any cline-neutral">&nbsp;</span>
251
- <span class="cline-any cline-yes">980x</span>
252
- <span class="cline-any cline-yes">153x</span>
253
- <span class="cline-any cline-yes">8x</span>
254
- <span class="cline-any cline-yes">8x</span>
261
+ <span class="cline-any cline-yes">1008x</span>
262
+ <span class="cline-any cline-yes">154x</span>
263
+ <span class="cline-any cline-yes">9x</span>
264
+ <span class="cline-any cline-yes">9x</span>
255
265
  <span class="cline-any cline-neutral">&nbsp;</span>
256
266
  <span class="cline-any cline-neutral">&nbsp;</span>
257
267
  <span class="cline-any cline-neutral">&nbsp;</span>
258
- <span class="cline-any cline-yes">374x</span>
259
- <span class="cline-any cline-yes">8x</span>
260
- <span class="cline-any cline-yes">8x</span>
261
- <span class="cline-any cline-yes">8x</span>
268
+ <span class="cline-any cline-yes">393x</span>
269
+ <span class="cline-any cline-yes">9x</span>
270
+ <span class="cline-any cline-yes">9x</span>
271
+ <span class="cline-any cline-yes">9x</span>
262
272
  <span class="cline-any cline-neutral">&nbsp;</span>
263
273
  <span class="cline-any cline-neutral">&nbsp;</span>
264
274
  <span class="cline-any cline-neutral">&nbsp;</span>
265
- <span class="cline-any cline-yes">8x</span>
266
- <span class="cline-any cline-yes">8x</span>
267
- <span class="cline-any cline-yes">8x</span>
268
- <span class="cline-any cline-yes">366x</span>
269
- <span class="cline-any cline-yes">119x</span>
270
- <span class="cline-any cline-yes">119x</span>
275
+ <span class="cline-any cline-yes">9x</span>
276
+ <span class="cline-any cline-yes">9x</span>
277
+ <span class="cline-any cline-yes">384x</span>
278
+ <span class="cline-any cline-yes">129x</span>
279
+ <span class="cline-any cline-yes">129x</span>
271
280
  <span class="cline-any cline-neutral">&nbsp;</span>
272
281
  <span class="cline-any cline-neutral">&nbsp;</span>
273
282
  <span class="cline-any cline-neutral">&nbsp;</span>
274
283
  <span class="cline-any cline-neutral">&nbsp;</span>
275
- <span class="cline-any cline-yes">232x</span>
276
- <span class="cline-any cline-yes">127x</span>
284
+ <span class="cline-any cline-yes">272x</span>
285
+ <span class="cline-any cline-yes">138x</span>
277
286
  <span class="cline-any cline-neutral">&nbsp;</span>
278
287
  <span class="cline-any cline-neutral">&nbsp;</span>
279
- <span class="cline-any cline-yes">232x</span>
288
+ <span class="cline-any cline-yes">272x</span>
280
289
  <span class="cline-any cline-neutral">&nbsp;</span>
281
290
  <span class="cline-any cline-neutral">&nbsp;</span>
282
291
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -284,8 +293,8 @@
284
293
  <span class="cline-any cline-neutral">&nbsp;</span>
285
294
  <span class="cline-any cline-neutral">&nbsp;</span>
286
295
  <span class="cline-any cline-neutral">&nbsp;</span>
287
- <span class="cline-any cline-yes">119x</span>
288
- <span class="cline-any cline-yes">119x</span>
296
+ <span class="cline-any cline-yes">122x</span>
297
+ <span class="cline-any cline-yes">122x</span>
289
298
  <span class="cline-any cline-neutral">&nbsp;</span>
290
299
  <span class="cline-any cline-neutral">&nbsp;</span>
291
300
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -295,9 +304,9 @@
295
304
  <span class="cline-any cline-neutral">&nbsp;</span>
296
305
  <span class="cline-any cline-neutral">&nbsp;</span>
297
306
  <span class="cline-any cline-neutral">&nbsp;</span>
298
- <span class="cline-any cline-yes">120x</span>
299
- <span class="cline-any cline-yes">120x</span>
300
- <span class="cline-any cline-yes">120x</span>
307
+ <span class="cline-any cline-yes">127x</span>
308
+ <span class="cline-any cline-yes">127x</span>
309
+ <span class="cline-any cline-yes">127x</span>
301
310
  <span class="cline-any cline-neutral">&nbsp;</span>
302
311
  <span class="cline-any cline-neutral">&nbsp;</span>
303
312
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -306,16 +315,16 @@
306
315
  <span class="cline-any cline-neutral">&nbsp;</span>
307
316
  <span class="cline-any cline-neutral">&nbsp;</span>
308
317
  <span class="cline-any cline-neutral">&nbsp;</span>
309
- <span class="cline-any cline-yes">66x</span>
318
+ <span class="cline-any cline-yes">81x</span>
310
319
  <span class="cline-any cline-neutral">&nbsp;</span>
311
320
  <span class="cline-any cline-neutral">&nbsp;</span>
312
321
  <span class="cline-any cline-neutral">&nbsp;</span>
313
- <span class="cline-any cline-yes">4x</span>
314
- <span class="cline-any cline-yes">3x</span>
322
+ <span class="cline-any cline-yes">7x</span>
323
+ <span class="cline-any cline-yes">6x</span>
315
324
  <span class="cline-any cline-neutral">&nbsp;</span>
316
325
  <span class="cline-any cline-neutral">&nbsp;</span>
317
326
  <span class="cline-any cline-neutral">&nbsp;</span>
318
- <span class="cline-any cline-yes">3x</span>
327
+ <span class="cline-any cline-yes">6x</span>
319
328
  <span class="cline-any cline-neutral">&nbsp;</span>
320
329
  <span class="cline-any cline-neutral">&nbsp;</span>
321
330
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -323,28 +332,39 @@
323
332
  <span class="cline-any cline-neutral">&nbsp;</span>
324
333
  <span class="cline-any cline-neutral">&nbsp;</span>
325
334
  <span class="cline-any cline-neutral">&nbsp;</span>
326
- <span class="cline-any cline-yes">66x</span>
335
+ <span class="cline-any cline-yes">81x</span>
327
336
  <span class="cline-any cline-neutral">&nbsp;</span>
328
337
  <span class="cline-any cline-neutral">&nbsp;</span>
329
338
  <span class="cline-any cline-neutral">&nbsp;</span>
330
339
  <span class="cline-any cline-neutral">&nbsp;</span>
331
340
  <span class="cline-any cline-neutral">&nbsp;</span>
332
341
  <span class="cline-any cline-neutral">&nbsp;</span>
333
- <span class="cline-any cline-yes">48x</span>
342
+ <span class="cline-any cline-yes">59x</span>
334
343
  <span class="cline-any cline-neutral">&nbsp;</span>
335
344
  <span class="cline-any cline-neutral">&nbsp;</span>
336
345
  <span class="cline-any cline-neutral">&nbsp;</span>
337
346
  <span class="cline-any cline-neutral">&nbsp;</span>
338
347
  <span class="cline-any cline-neutral">&nbsp;</span>
339
348
  <span class="cline-any cline-neutral">&nbsp;</span>
340
- <span class="cline-any cline-yes">92x</span>
349
+ <span class="cline-any cline-yes">121x</span>
341
350
  <span class="cline-any cline-neutral">&nbsp;</span>
342
351
  <span class="cline-any cline-neutral">&nbsp;</span>
343
352
  <span class="cline-any cline-neutral">&nbsp;</span>
344
353
  <span class="cline-any cline-neutral">&nbsp;</span>
345
354
  <span class="cline-any cline-neutral">&nbsp;</span>
346
355
  <span class="cline-any cline-neutral">&nbsp;</span>
347
- <span class="cline-any cline-yes">122x</span>
356
+ <span class="cline-any cline-yes">154x</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-neutral">&nbsp;</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-yes">12x</span>
366
+ <span class="cline-any cline-yes">12x</span>
367
+ <span class="cline-any cline-yes">12x</span>
348
368
  <span class="cline-any cline-neutral">&nbsp;</span>
349
369
  <span class="cline-any cline-neutral">&nbsp;</span>
350
370
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { TaskStep } from "./TaskStep.js";
@@ -404,8 +424,7 @@ export class TaskStateManager&lt;TContext&gt; {
404
424
  status: "skipped",
405
425
  message: `Skipped because dependency '${failedDep}' failed${depError}`,
406
426
  };
407
- this.results.set(step.name, result);
408
- this.eventBus.emit("taskSkipped", { step, result });
427
+ this.markSkipped(step, result);
409
428
  toRemove.push(step);
410
429
  } else if (!blocked) {
411
430
  toRun.push(step);
@@ -488,6 +507,17 @@ export class TaskStateManager&lt;TContext&gt; {
488
507
  hasPendingTasks(): boolean {
489
508
  return this.pendingSteps.size &gt; 0;
490
509
  }
510
+ &nbsp;
511
+ /**
512
+ * Marks a task as skipped and emits `taskSkipped`.
513
+ * @param step The task that was skipped.
514
+ * @param result The result object (status: skipped).
515
+ */
516
+ markSkipped(step: TaskStep&lt;TContext&gt;, result: TaskResult): void {
517
+ this.running.delete(step.name);
518
+ this.results.set(step.name, result);
519
+ this.eventBus.emit("taskSkipped", { step, result });
520
+ }
491
521
  }
492
522
  &nbsp;</pre></td></tr></table></pre>
493
523
 
@@ -496,7 +526,7 @@ export class TaskStateManager&lt;TContext&gt; {
496
526
  <div class='footer quiet pad2 space-top1 center small'>
497
527
  Code coverage generated by
498
528
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
499
- at 2026-01-18T21:02:31.377Z
529
+ at 2026-01-18T23:00:28.563Z
500
530
  </div>
501
531
  <script src="../prettify.js"></script>
502
532
  <script>