@calmo/task-runner 3.7.0 → 3.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +3 -0
- package/.jules/nexus.md +5 -0
- package/.jules/sentinel.md +6 -0
- package/AGENTS.md +1 -0
- package/CHANGELOG.md +16 -0
- package/README.md +2 -0
- package/coverage/coverage-final.json +8 -7
- package/coverage/index.html +20 -20
- package/coverage/lcov-report/index.html +20 -20
- package/coverage/lcov-report/src/EventBus.ts.html +4 -4
- package/coverage/lcov-report/src/TaskGraphValidationError.ts.html +1 -1
- package/coverage/lcov-report/src/TaskGraphValidator.ts.html +142 -82
- package/coverage/lcov-report/src/TaskRunner.ts.html +94 -79
- package/coverage/lcov-report/src/TaskRunnerBuilder.ts.html +1 -1
- package/coverage/lcov-report/src/TaskRunnerExecutionConfig.ts.html +1 -1
- package/coverage/lcov-report/src/TaskStateManager.ts.html +42 -54
- package/coverage/lcov-report/src/WorkflowExecutor.ts.html +56 -47
- package/coverage/lcov-report/src/contracts/ErrorTypes.ts.html +103 -0
- package/coverage/lcov-report/src/contracts/RunnerEvents.ts.html +1 -1
- package/coverage/lcov-report/src/contracts/index.html +23 -8
- package/coverage/lcov-report/src/index.html +15 -15
- package/coverage/lcov-report/src/strategies/DryRunExecutionStrategy.ts.html +1 -1
- package/coverage/lcov-report/src/strategies/RetryingExecutionStrategy.ts.html +5 -5
- package/coverage/lcov-report/src/strategies/StandardExecutionStrategy.ts.html +3 -3
- package/coverage/lcov-report/src/strategies/index.html +1 -1
- package/coverage/lcov.info +361 -332
- package/coverage/src/EventBus.ts.html +4 -4
- package/coverage/src/TaskGraphValidationError.ts.html +1 -1
- package/coverage/src/TaskGraphValidator.ts.html +142 -82
- package/coverage/src/TaskRunner.ts.html +94 -79
- package/coverage/src/TaskRunnerBuilder.ts.html +1 -1
- package/coverage/src/TaskRunnerExecutionConfig.ts.html +1 -1
- package/coverage/src/TaskStateManager.ts.html +42 -54
- package/coverage/src/WorkflowExecutor.ts.html +56 -47
- package/coverage/src/contracts/ErrorTypes.ts.html +103 -0
- package/coverage/src/contracts/RunnerEvents.ts.html +1 -1
- package/coverage/src/contracts/index.html +23 -8
- package/coverage/src/index.html +15 -15
- package/coverage/src/strategies/DryRunExecutionStrategy.ts.html +1 -1
- package/coverage/src/strategies/RetryingExecutionStrategy.ts.html +5 -5
- package/coverage/src/strategies/StandardExecutionStrategy.ts.html +3 -3
- package/coverage/src/strategies/index.html +1 -1
- package/dist/TaskGraphValidator.d.ts +3 -0
- package/dist/TaskGraphValidator.js +33 -26
- package/dist/TaskGraphValidator.js.map +1 -1
- package/dist/TaskRunner.d.ts +4 -0
- package/dist/TaskRunner.js +39 -45
- package/dist/TaskRunner.js.map +1 -1
- package/dist/TaskStateManager.js +1 -5
- package/dist/TaskStateManager.js.map +1 -1
- package/dist/TaskStep.d.ts +6 -0
- package/dist/WorkflowExecutor.js +2 -0
- package/dist/WorkflowExecutor.js.map +1 -1
- package/dist/contracts/ErrorTypes.d.ts +6 -0
- package/dist/contracts/ErrorTypes.js +7 -0
- package/dist/contracts/ErrorTypes.js.map +1 -0
- package/dist/contracts/ValidationError.d.ts +2 -1
- package/openspec/changes/feat-task-metrics/proposal.md +17 -0
- package/openspec/changes/feat-task-metrics/tasks.md +6 -0
- package/package.json +14 -3
- package/src/TaskGraphValidator.ts +52 -32
- package/src/TaskRunner.ts +52 -47
- package/src/TaskStateManager.ts +1 -5
- package/src/TaskStep.ts +7 -0
- package/src/WorkflowExecutor.ts +3 -0
- package/src/contracts/ErrorTypes.ts +6 -0
- package/src/contracts/ValidationError.ts +10 -1
- package/test-report.xml +145 -123
|
@@ -160,7 +160,7 @@
|
|
|
160
160
|
<span class="cline-any cline-neutral"> </span>
|
|
161
161
|
<span class="cline-any cline-neutral"> </span>
|
|
162
162
|
<span class="cline-any cline-neutral"> </span>
|
|
163
|
-
<span class="cline-any cline-yes">
|
|
163
|
+
<span class="cline-any cline-yes">81x</span>
|
|
164
164
|
<span class="cline-any cline-neutral"> </span>
|
|
165
165
|
<span class="cline-any cline-neutral"> </span>
|
|
166
166
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -207,10 +207,10 @@
|
|
|
207
207
|
<span class="cline-any cline-neutral"> </span>
|
|
208
208
|
<span class="cline-any cline-neutral"> </span>
|
|
209
209
|
<span class="cline-any cline-neutral"> </span>
|
|
210
|
-
<span class="cline-any cline-yes">
|
|
210
|
+
<span class="cline-any cline-yes">437x</span>
|
|
211
211
|
<span class="cline-any cline-neutral"> </span>
|
|
212
212
|
<span class="cline-any cline-neutral"> </span>
|
|
213
|
-
<span class="cline-any cline-yes">
|
|
213
|
+
<span class="cline-any cline-yes">437x</span>
|
|
214
214
|
<span class="cline-any cline-yes">14x</span>
|
|
215
215
|
<span class="cline-any cline-yes">14x</span>
|
|
216
216
|
<span class="cline-any cline-yes">14x</span>
|
|
@@ -328,7 +328,7 @@ export class EventBus<TContext> {
|
|
|
328
328
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
329
329
|
Code coverage generated by
|
|
330
330
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
331
|
-
at 2026-01-
|
|
331
|
+
at 2026-01-21T01:05:21.392Z
|
|
332
332
|
</div>
|
|
333
333
|
<script src="../prettify.js"></script>
|
|
334
334
|
<script>
|
|
@@ -115,7 +115,7 @@ export class TaskGraphValidationError extends Error {
|
|
|
115
115
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
116
116
|
Code coverage generated by
|
|
117
117
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
118
|
-
at 2026-01-
|
|
118
|
+
at 2026-01-21T01:05:21.392Z
|
|
119
119
|
</div>
|
|
120
120
|
<script src="../prettify.js"></script>
|
|
121
121
|
<script>
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
26
|
<span class="strong">100% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>59/59</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
@@ -39,14 +39,14 @@
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
40
|
<span class="strong">100% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>8/8</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
47
|
<span class="strong">100% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>58/58</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -231,7 +231,27 @@
|
|
|
231
231
|
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
232
|
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
233
|
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
-
<a name='L169'></a><a href='#L169'>169</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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
235
255
|
<span class="cline-any cline-neutral"> </span>
|
|
236
256
|
<span class="cline-any cline-neutral"> </span>
|
|
237
257
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -248,83 +268,74 @@
|
|
|
248
268
|
<span class="cline-any cline-neutral"> </span>
|
|
249
269
|
<span class="cline-any cline-neutral"> </span>
|
|
250
270
|
<span class="cline-any cline-neutral"> </span>
|
|
251
|
-
<span class="cline-any cline-yes">61x</span>
|
|
252
271
|
<span class="cline-any cline-neutral"> </span>
|
|
253
272
|
<span class="cline-any cline-neutral"> </span>
|
|
254
|
-
<span class="cline-any cline-yes">61x</span>
|
|
255
|
-
<span class="cline-any cline-yes">61x</span>
|
|
256
|
-
<span class="cline-any cline-yes">20158x</span>
|
|
257
|
-
<span class="cline-any cline-yes">3x</span>
|
|
258
273
|
<span class="cline-any cline-neutral"> </span>
|
|
259
274
|
<span class="cline-any cline-neutral"> </span>
|
|
260
275
|
<span class="cline-any cline-neutral"> </span>
|
|
276
|
+
<span class="cline-any cline-yes">67x</span>
|
|
261
277
|
<span class="cline-any cline-neutral"> </span>
|
|
262
278
|
<span class="cline-any cline-neutral"> </span>
|
|
263
|
-
<span class="cline-any cline-yes">
|
|
279
|
+
<span class="cline-any cline-yes">67x</span>
|
|
264
280
|
<span class="cline-any cline-neutral"> </span>
|
|
265
281
|
<span class="cline-any cline-neutral"> </span>
|
|
282
|
+
<span class="cline-any cline-yes">67x</span>
|
|
266
283
|
<span class="cline-any cline-neutral"> </span>
|
|
267
284
|
<span class="cline-any cline-neutral"> </span>
|
|
268
|
-
<span class="cline-any cline-yes">61x</span>
|
|
269
|
-
<span class="cline-any cline-yes">20158x</span>
|
|
270
|
-
<span class="cline-any cline-yes">20169x</span>
|
|
271
|
-
<span class="cline-any cline-yes">7x</span>
|
|
272
285
|
<span class="cline-any cline-neutral"> </span>
|
|
286
|
+
<span class="cline-any cline-yes">67x</span>
|
|
287
|
+
<span class="cline-any cline-yes">9x</span>
|
|
273
288
|
<span class="cline-any cline-neutral"> </span>
|
|
274
289
|
<span class="cline-any cline-neutral"> </span>
|
|
290
|
+
<span class="cline-any cline-yes">67x</span>
|
|
291
|
+
<span class="cline-any cline-yes">61x</span>
|
|
275
292
|
<span class="cline-any cline-neutral"> </span>
|
|
276
293
|
<span class="cline-any cline-neutral"> </span>
|
|
294
|
+
<span class="cline-any cline-yes">67x</span>
|
|
295
|
+
<span class="cline-any cline-neutral"> </span>
|
|
277
296
|
<span class="cline-any cline-neutral"> </span>
|
|
278
297
|
<span class="cline-any cline-neutral"> </span>
|
|
279
298
|
<span class="cline-any cline-neutral"> </span>
|
|
280
299
|
<span class="cline-any cline-neutral"> </span>
|
|
281
300
|
<span class="cline-any cline-neutral"> </span>
|
|
282
|
-
<span class="cline-any cline-yes">61x</span>
|
|
283
|
-
<span class="cline-any cline-yes">9x</span>
|
|
284
301
|
<span class="cline-any cline-neutral"> </span>
|
|
285
302
|
<span class="cline-any cline-neutral"> </span>
|
|
286
|
-
<span class="cline-any cline-yes">61x</span>
|
|
287
|
-
<span class="cline-any cline-yes">6x</span>
|
|
288
303
|
<span class="cline-any cline-neutral"> </span>
|
|
289
304
|
<span class="cline-any cline-neutral"> </span>
|
|
290
305
|
<span class="cline-any cline-neutral"> </span>
|
|
306
|
+
<span class="cline-any cline-yes">11x</span>
|
|
307
|
+
<span class="cline-any cline-yes">10x</span>
|
|
291
308
|
<span class="cline-any cline-neutral"> </span>
|
|
292
309
|
<span class="cline-any cline-neutral"> </span>
|
|
293
310
|
<span class="cline-any cline-neutral"> </span>
|
|
294
|
-
<span class="cline-any cline-yes">55x</span>
|
|
295
|
-
<span class="cline-any cline-yes">55x</span>
|
|
296
|
-
<span class="cline-any cline-yes">20149x</span>
|
|
297
311
|
<span class="cline-any cline-neutral"> </span>
|
|
298
312
|
<span class="cline-any cline-neutral"> </span>
|
|
299
|
-
<span class="cline-any cline-yes">55x</span>
|
|
300
|
-
<span class="cline-any cline-yes">55x</span>
|
|
301
313
|
<span class="cline-any cline-neutral"> </span>
|
|
302
|
-
<span class="cline-any cline-yes">
|
|
303
|
-
<span class="cline-any cline-yes">
|
|
314
|
+
<span class="cline-any cline-yes">67x</span>
|
|
315
|
+
<span class="cline-any cline-yes">67x</span>
|
|
316
|
+
<span class="cline-any cline-yes">20178x</span>
|
|
304
317
|
<span class="cline-any cline-yes">3x</span>
|
|
305
318
|
<span class="cline-any cline-neutral"> </span>
|
|
306
319
|
<span class="cline-any cline-neutral"> </span>
|
|
307
|
-
<span class="cline-any cline-yes">20139x</span>
|
|
308
|
-
<span class="cline-any cline-yes">20139x</span>
|
|
309
320
|
<span class="cline-any cline-neutral"> </span>
|
|
310
321
|
<span class="cline-any cline-neutral"> </span>
|
|
311
322
|
<span class="cline-any cline-neutral"> </span>
|
|
323
|
+
<span class="cline-any cline-yes">20175x</span>
|
|
312
324
|
<span class="cline-any cline-neutral"> </span>
|
|
313
|
-
<span class="cline-any cline-yes">5x</span>
|
|
314
|
-
<span class="cline-any cline-yes">5x</span>
|
|
315
|
-
<span class="cline-any cline-yes">5x</span>
|
|
316
325
|
<span class="cline-any cline-neutral"> </span>
|
|
317
|
-
<span class="cline-any cline-yes">
|
|
326
|
+
<span class="cline-any cline-yes">67x</span>
|
|
318
327
|
<span class="cline-any cline-neutral"> </span>
|
|
319
328
|
<span class="cline-any cline-neutral"> </span>
|
|
320
329
|
<span class="cline-any cline-neutral"> </span>
|
|
321
330
|
<span class="cline-any cline-neutral"> </span>
|
|
322
331
|
<span class="cline-any cline-neutral"> </span>
|
|
323
|
-
<span class="cline-any cline-yes">5x</span>
|
|
324
332
|
<span class="cline-any cline-neutral"> </span>
|
|
325
333
|
<span class="cline-any cline-neutral"> </span>
|
|
334
|
+
<span class="cline-any cline-yes">67x</span>
|
|
335
|
+
<span class="cline-any cline-yes">20178x</span>
|
|
336
|
+
<span class="cline-any cline-yes">20172x</span>
|
|
337
|
+
<span class="cline-any cline-yes">7x</span>
|
|
326
338
|
<span class="cline-any cline-neutral"> </span>
|
|
327
|
-
<span class="cline-any cline-yes">55x</span>
|
|
328
339
|
<span class="cline-any cline-neutral"> </span>
|
|
329
340
|
<span class="cline-any cline-neutral"> </span>
|
|
330
341
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -335,48 +346,77 @@
|
|
|
335
346
|
<span class="cline-any cline-neutral"> </span>
|
|
336
347
|
<span class="cline-any cline-neutral"> </span>
|
|
337
348
|
<span class="cline-any cline-neutral"> </span>
|
|
349
|
+
<span class="cline-any cline-yes">61x</span>
|
|
350
|
+
<span class="cline-any cline-yes">61x</span>
|
|
351
|
+
<span class="cline-any cline-yes">20169x</span>
|
|
338
352
|
<span class="cline-any cline-neutral"> </span>
|
|
339
|
-
<span class="cline-any cline-yes">9x</span>
|
|
340
|
-
<span class="cline-any cline-yes">9x</span>
|
|
341
353
|
<span class="cline-any cline-neutral"> </span>
|
|
354
|
+
<span class="cline-any cline-yes">61x</span>
|
|
355
|
+
<span class="cline-any cline-yes">61x</span>
|
|
342
356
|
<span class="cline-any cline-neutral"> </span>
|
|
357
|
+
<span class="cline-any cline-yes">61x</span>
|
|
358
|
+
<span class="cline-any cline-yes">20162x</span>
|
|
359
|
+
<span class="cline-any cline-yes">3x</span>
|
|
343
360
|
<span class="cline-any cline-neutral"> </span>
|
|
344
361
|
<span class="cline-any cline-neutral"> </span>
|
|
362
|
+
<span class="cline-any cline-yes">20159x</span>
|
|
363
|
+
<span class="cline-any cline-yes">20159x</span>
|
|
364
|
+
<span class="cline-any cline-neutral"> </span>
|
|
365
|
+
<span class="cline-any cline-neutral"> </span>
|
|
366
|
+
<span class="cline-any cline-neutral"> </span>
|
|
367
|
+
<span class="cline-any cline-neutral"> </span>
|
|
368
|
+
<span class="cline-any cline-yes">5x</span>
|
|
369
|
+
<span class="cline-any cline-yes">5x</span>
|
|
370
|
+
<span class="cline-any cline-yes">5x</span>
|
|
371
|
+
<span class="cline-any cline-neutral"> </span>
|
|
372
|
+
<span class="cline-any cline-yes">5x</span>
|
|
345
373
|
<span class="cline-any cline-neutral"> </span>
|
|
346
374
|
<span class="cline-any cline-neutral"> </span>
|
|
347
375
|
<span class="cline-any cline-neutral"> </span>
|
|
348
376
|
<span class="cline-any cline-neutral"> </span>
|
|
349
377
|
<span class="cline-any cline-neutral"> </span>
|
|
378
|
+
<span class="cline-any cline-yes">5x</span>
|
|
379
|
+
<span class="cline-any cline-neutral"> </span>
|
|
380
|
+
<span class="cline-any cline-neutral"> </span>
|
|
350
381
|
<span class="cline-any cline-neutral"> </span>
|
|
351
382
|
<span class="cline-any cline-neutral"> </span>
|
|
352
|
-
<span class="cline-any cline-yes">20139x</span>
|
|
353
383
|
<span class="cline-any cline-neutral"> </span>
|
|
354
|
-
<span class="cline-any cline-yes">20139x</span>
|
|
355
|
-
<span class="cline-any cline-yes">20139x</span>
|
|
356
|
-
<span class="cline-any cline-yes">20139x</span>
|
|
357
384
|
<span class="cline-any cline-neutral"> </span>
|
|
358
|
-
<span class="cline-any cline-yes">20139x</span>
|
|
359
385
|
<span class="cline-any cline-neutral"> </span>
|
|
360
386
|
<span class="cline-any cline-neutral"> </span>
|
|
361
387
|
<span class="cline-any cline-neutral"> </span>
|
|
362
388
|
<span class="cline-any cline-neutral"> </span>
|
|
363
389
|
<span class="cline-any cline-neutral"> </span>
|
|
364
390
|
<span class="cline-any cline-neutral"> </span>
|
|
365
|
-
<span class="cline-any cline-yes">20139x</span>
|
|
366
|
-
<span class="cline-any cline-yes">40293x</span>
|
|
367
|
-
<span class="cline-any cline-yes">40293x</span>
|
|
368
391
|
<span class="cline-any cline-neutral"> </span>
|
|
369
|
-
<span class="cline-any cline-yes">
|
|
392
|
+
<span class="cline-any cline-yes">20159x</span>
|
|
393
|
+
<span class="cline-any cline-neutral"> </span>
|
|
394
|
+
<span class="cline-any cline-yes">20159x</span>
|
|
370
395
|
<span class="cline-any cline-yes">20159x</span>
|
|
371
396
|
<span class="cline-any cline-yes">20159x</span>
|
|
372
397
|
<span class="cline-any cline-neutral"> </span>
|
|
373
398
|
<span class="cline-any cline-yes">20159x</span>
|
|
374
399
|
<span class="cline-any cline-neutral"> </span>
|
|
400
|
+
<span class="cline-any cline-neutral"> </span>
|
|
401
|
+
<span class="cline-any cline-neutral"> </span>
|
|
402
|
+
<span class="cline-any cline-neutral"> </span>
|
|
403
|
+
<span class="cline-any cline-neutral"> </span>
|
|
404
|
+
<span class="cline-any cline-neutral"> </span>
|
|
405
|
+
<span class="cline-any cline-yes">20159x</span>
|
|
406
|
+
<span class="cline-any cline-yes">40316x</span>
|
|
407
|
+
<span class="cline-any cline-yes">40316x</span>
|
|
408
|
+
<span class="cline-any cline-neutral"> </span>
|
|
409
|
+
<span class="cline-any cline-yes">40316x</span>
|
|
410
|
+
<span class="cline-any cline-yes">20162x</span>
|
|
411
|
+
<span class="cline-any cline-yes">20162x</span>
|
|
412
|
+
<span class="cline-any cline-neutral"> </span>
|
|
413
|
+
<span class="cline-any cline-yes">20162x</span>
|
|
414
|
+
<span class="cline-any cline-neutral"> </span>
|
|
375
415
|
<span class="cline-any cline-yes">5x</span>
|
|
376
416
|
<span class="cline-any cline-yes">5x</span>
|
|
377
417
|
<span class="cline-any cline-neutral"> </span>
|
|
378
418
|
<span class="cline-any cline-neutral"> </span>
|
|
379
|
-
<span class="cline-any cline-yes">
|
|
419
|
+
<span class="cline-any cline-yes">20157x</span>
|
|
380
420
|
<span class="cline-any cline-yes">7x</span>
|
|
381
421
|
<span class="cline-any cline-yes">7x</span>
|
|
382
422
|
<span class="cline-any cline-yes">7x</span>
|
|
@@ -390,19 +430,24 @@
|
|
|
390
430
|
<span class="cline-any cline-neutral"> </span>
|
|
391
431
|
<span class="cline-any cline-neutral"> </span>
|
|
392
432
|
<span class="cline-any cline-neutral"> </span>
|
|
393
|
-
<span class="cline-any cline-yes">
|
|
394
|
-
<span class="cline-any cline-yes">
|
|
395
|
-
<span class="cline-any cline-yes">
|
|
433
|
+
<span class="cline-any cline-yes">20154x</span>
|
|
434
|
+
<span class="cline-any cline-yes">20154x</span>
|
|
435
|
+
<span class="cline-any cline-yes">20154x</span>
|
|
396
436
|
<span class="cline-any cline-neutral"> </span>
|
|
397
437
|
<span class="cline-any cline-neutral"> </span>
|
|
398
438
|
<span class="cline-any cline-neutral"> </span>
|
|
399
|
-
<span class="cline-any cline-yes">
|
|
439
|
+
<span class="cline-any cline-yes">20154x</span>
|
|
400
440
|
<span class="cline-any cline-neutral"> </span>
|
|
401
441
|
<span class="cline-any cline-neutral"> </span>
|
|
402
442
|
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { ITaskGraphValidator } from "./contracts/ITaskGraphValidator.js";
|
|
403
443
|
import { ValidationResult } from "./contracts/ValidationResult.js";
|
|
404
444
|
import { ValidationError } from "./contracts/ValidationError.js";
|
|
405
445
|
import { TaskGraph } from "./TaskGraph.js";
|
|
446
|
+
import {
|
|
447
|
+
ERROR_CYCLE,
|
|
448
|
+
ERROR_DUPLICATE_TASK,
|
|
449
|
+
ERROR_MISSING_DEPENDENCY,
|
|
450
|
+
} from "./contracts/ErrorTypes.js";
|
|
406
451
|
|
|
407
452
|
export class TaskGraphValidator implements ITaskGraphValidator {
|
|
408
453
|
/**
|
|
@@ -419,11 +464,46 @@ export class TaskGraphValidator implements ITaskGraphValidator {
|
|
|
419
464
|
const errors: ValidationError[] = [];
|
|
420
465
|
|
|
421
466
|
// 1. Check for duplicate tasks
|
|
467
|
+
const taskIds = this.checkDuplicateTasks(taskGraph, errors);
|
|
468
|
+
|
|
469
|
+
// 2. Check for missing dependencies
|
|
470
|
+
this.checkMissingDependencies(taskGraph, taskIds, errors);
|
|
471
|
+
|
|
472
|
+
// 3. Check for cycles
|
|
473
|
+
// Only run cycle detection if there are no missing dependencies, otherwise we might chase non-existent nodes.
|
|
474
|
+
const hasMissingDependencies = errors.some(
|
|
475
|
+
(e) => e.type === ERROR_MISSING_DEPENDENCY
|
|
476
|
+
);
|
|
477
|
+
|
|
478
|
+
if (!hasMissingDependencies) {
|
|
479
|
+
this.checkCycles(taskGraph, errors);
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
return {
|
|
483
|
+
isValid: errors.length === 0,
|
|
484
|
+
errors,
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
/**
|
|
489
|
+
* Creates a human-readable error message from a validation result.
|
|
490
|
+
* @param result The validation result containing errors.
|
|
491
|
+
* @returns A formatted error string.
|
|
492
|
+
*/
|
|
493
|
+
createErrorMessage(result: ValidationResult): string {
|
|
494
|
+
const errorDetails = result.errors.map((e) => e.message);
|
|
495
|
+
return `Task graph validation failed: ${errorDetails.join("; ")}`;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
private checkDuplicateTasks(
|
|
499
|
+
taskGraph: TaskGraph,
|
|
500
|
+
errors: ValidationError[]
|
|
501
|
+
): Set<string> {
|
|
422
502
|
const taskIds = new Set<string>();
|
|
423
503
|
for (const task of taskGraph.tasks) {
|
|
424
504
|
if (taskIds.has(task.id)) {
|
|
425
505
|
errors.push({
|
|
426
|
-
type:
|
|
506
|
+
type: ERROR_DUPLICATE_TASK,
|
|
427
507
|
message: `Duplicate task detected with ID: ${task.id}`,
|
|
428
508
|
details: { taskId: task.id },
|
|
429
509
|
});
|
|
@@ -431,33 +511,28 @@ export class TaskGraphValidator implements ITaskGraphValidator {
|
|
|
431
511
|
taskIds.add(task.id);
|
|
432
512
|
}
|
|
433
513
|
}
|
|
514
|
+
return taskIds;
|
|
515
|
+
}
|
|
434
516
|
|
|
435
|
-
|
|
517
|
+
private checkMissingDependencies(
|
|
518
|
+
taskGraph: TaskGraph,
|
|
519
|
+
taskIds: Set<string>,
|
|
520
|
+
errors: ValidationError[]
|
|
521
|
+
): void {
|
|
436
522
|
for (const task of taskGraph.tasks) {
|
|
437
523
|
for (const dependenceId of task.dependencies) {
|
|
438
524
|
if (!taskIds.has(dependenceId)) {
|
|
439
525
|
errors.push({
|
|
440
|
-
type:
|
|
526
|
+
type: ERROR_MISSING_DEPENDENCY,
|
|
441
527
|
message: `Task '${task.id}' depends on missing task '${dependenceId}'`,
|
|
442
528
|
details: { taskId: task.id, missingDependencyId: dependenceId },
|
|
443
529
|
});
|
|
444
530
|
}
|
|
445
531
|
}
|
|
446
532
|
}
|
|
533
|
+
}
|
|
447
534
|
|
|
448
|
-
|
|
449
|
-
// Only run cycle detection if there are no missing dependencies, otherwise we might chase non-existent nodes.
|
|
450
|
-
const hasMissingDependencies = errors.some(
|
|
451
|
-
(e) => e.type === "missing_dependency"
|
|
452
|
-
);
|
|
453
|
-
|
|
454
|
-
if (hasMissingDependencies) {
|
|
455
|
-
return {
|
|
456
|
-
isValid: errors.length === 0,
|
|
457
|
-
errors,
|
|
458
|
-
};
|
|
459
|
-
}
|
|
460
|
-
|
|
535
|
+
private checkCycles(taskGraph: TaskGraph, errors: ValidationError[]): void {
|
|
461
536
|
// Build adjacency list
|
|
462
537
|
const adjacencyList = new Map<string, string[]>();
|
|
463
538
|
for (const task of taskGraph.tasks) {
|
|
@@ -483,7 +558,7 @@ export class TaskGraphValidator implements ITaskGraphValidator {
|
|
|
483
558
|
const cyclePath = path.slice(cycleStartIndex);
|
|
484
559
|
|
|
485
560
|
errors.push({
|
|
486
|
-
type:
|
|
561
|
+
type: ERROR_CYCLE,
|
|
487
562
|
message: `Cycle detected: ${cyclePath.join(" -> ")}`,
|
|
488
563
|
details: { cyclePath },
|
|
489
564
|
});
|
|
@@ -491,21 +566,6 @@ export class TaskGraphValidator implements ITaskGraphValidator {
|
|
|
491
566
|
break;
|
|
492
567
|
}
|
|
493
568
|
}
|
|
494
|
-
|
|
495
|
-
return {
|
|
496
|
-
isValid: errors.length === 0,
|
|
497
|
-
errors,
|
|
498
|
-
};
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
/**
|
|
502
|
-
* Creates a human-readable error message from a validation result.
|
|
503
|
-
* @param result The validation result containing errors.
|
|
504
|
-
* @returns A formatted error string.
|
|
505
|
-
*/
|
|
506
|
-
createErrorMessage(result: ValidationResult): string {
|
|
507
|
-
const errorDetails = result.errors.map((e) => e.message);
|
|
508
|
-
return `Task graph validation failed: ${errorDetails.join("; ")}`;
|
|
509
569
|
}
|
|
510
570
|
|
|
511
571
|
private detectCycle(
|
|
@@ -574,7 +634,7 @@ export class TaskGraphValidator implements ITaskGraphValidator {
|
|
|
574
634
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
575
635
|
Code coverage generated by
|
|
576
636
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
577
|
-
at 2026-01-
|
|
637
|
+
at 2026-01-21T01:05:21.392Z
|
|
578
638
|
</div>
|
|
579
639
|
<script src="../prettify.js"></script>
|
|
580
640
|
<script>
|