@aiready/context-analyzer 0.21.26 → 0.21.27

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 (78) hide show
  1. package/.turbo/turbo-build.log +32 -25
  2. package/.turbo/turbo-test.log +51 -87
  3. package/coverage/clover.xml +392 -1878
  4. package/coverage/coverage-final.json +15 -19
  5. package/coverage/index.html +48 -63
  6. package/coverage/src/analyzers/index.html +21 -21
  7. package/coverage/src/analyzers/python-context.ts.html +96 -96
  8. package/coverage/src/ast-utils.ts.html +34 -109
  9. package/coverage/src/classifier.ts.html +104 -104
  10. package/coverage/src/classify/classification-patterns.ts.html +1 -1
  11. package/coverage/src/classify/file-classifiers.ts.html +1 -1
  12. package/coverage/src/classify/index.html +1 -1
  13. package/coverage/src/cluster-detector.ts.html +72 -72
  14. package/coverage/src/defaults.ts.html +1 -1
  15. package/coverage/src/graph-builder.ts.html +131 -131
  16. package/coverage/src/index.html +101 -116
  17. package/coverage/src/index.ts.html +2 -2
  18. package/coverage/src/issue-analyzer.ts.html +32 -83
  19. package/coverage/src/mapper.ts.html +20 -2
  20. package/coverage/src/metrics.ts.html +127 -130
  21. package/coverage/src/orchestrator.ts.html +13 -13
  22. package/coverage/src/provider.ts.html +19 -19
  23. package/coverage/src/remediation.ts.html +59 -59
  24. package/coverage/src/report/console-report.ts.html +2 -2
  25. package/coverage/src/report/html-report.ts.html +60 -84
  26. package/coverage/src/report/index.html +7 -7
  27. package/coverage/src/report/interactive-setup.ts.html +1 -1
  28. package/coverage/src/scoring.ts.html +62 -62
  29. package/coverage/src/semantic/co-usage.ts.html +1 -1
  30. package/coverage/src/semantic/consolidation.ts.html +1 -1
  31. package/coverage/src/semantic/domain-inference.ts.html +1 -1
  32. package/coverage/src/semantic/index.html +1 -1
  33. package/coverage/src/semantic/type-graph.ts.html +1 -1
  34. package/coverage/src/summary.ts.html +67 -67
  35. package/coverage/src/types.ts.html +1 -1
  36. package/coverage/src/utils/dependency-graph-utils.ts.html +41 -41
  37. package/coverage/src/utils/index.html +21 -21
  38. package/coverage/src/utils/string-utils.ts.html +1 -1
  39. package/dist/chunk-22ZO4EKZ.mjs +1297 -0
  40. package/dist/chunk-4U4LDWGF.mjs +360 -0
  41. package/dist/chunk-BA7QGUHN.mjs +1722 -0
  42. package/dist/chunk-BCEZGRXI.mjs +1297 -0
  43. package/dist/chunk-BQCISA2F.mjs +91 -0
  44. package/dist/chunk-EMYD7NS6.mjs +137 -0
  45. package/dist/chunk-EWFR366Y.mjs +1740 -0
  46. package/dist/chunk-FO6YT6RG.mjs +1751 -0
  47. package/dist/chunk-J3SZQZNU.mjs +221 -0
  48. package/dist/chunk-OZE3FVZT.mjs +1089 -0
  49. package/dist/chunk-WHB7QI7N.mjs +91 -0
  50. package/dist/cli-action-CXIHOVAC.mjs +95 -0
  51. package/dist/cli-action-SA7SCYNV.mjs +95 -0
  52. package/dist/cli-action-YAJOJCXJ.mjs +95 -0
  53. package/dist/cli.js +688 -566
  54. package/dist/cli.mjs +4 -88
  55. package/dist/index.js +889 -773
  56. package/dist/index.mjs +21 -14
  57. package/dist/orchestrator-3L3NAZYP.mjs +10 -0
  58. package/dist/orchestrator-MONOZHVW.mjs +10 -0
  59. package/dist/orchestrator-ZR7JSKWI.mjs +10 -0
  60. package/dist/summary-7PZVW72O.mjs +7 -0
  61. package/dist/summary-LKUCJAIS.mjs +7 -0
  62. package/package.json +2 -2
  63. package/src/__tests__/analyzer.test.ts +1 -1
  64. package/src/__tests__/enhanced-cohesion.test.ts +4 -1
  65. package/src/__tests__/orchestrator.test.ts +19 -4
  66. package/src/__tests__/python-context.test.ts +6 -0
  67. package/src/__tests__/report/html-report.test.ts +8 -2
  68. package/src/ast-utils.ts +1 -26
  69. package/src/cli-definition.ts +4 -2
  70. package/src/issue-analyzer.ts +4 -19
  71. package/src/metrics.ts +1 -2
  72. package/src/provider.ts +4 -4
  73. package/src/report/html-report.ts +43 -59
  74. package/coverage/dist/chunk-64U3PNO3.mjs.html +0 -367
  75. package/coverage/dist/chunk-J3MUOWHC.mjs.html +0 -5326
  76. package/coverage/dist/index.html +0 -146
  77. package/coverage/dist/index.mjs.html +0 -1396
  78. package/coverage/src/analyzer.ts.html +0 -88
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">61.32% </span>
26
+ <span class="strong">83.63% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>65/106</span>
28
+ <span class='fraction'>46/55</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">30.76% </span>
33
+ <span class="strong">52.38% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>12/39</span>
35
+ <span class='fraction'>11/21</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">82.97% </span>
40
+ <span class="strong">72% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>39/47</span>
42
+ <span class='fraction'>18/25</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">62.16% </span>
47
+ <span class="strong">82.6% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>46/74</span>
49
+ <span class='fraction'>38/46</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line medium'></div>
64
+ <div class='status-line high'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -218,53 +218,53 @@
218
218
  <span class="cline-any cline-neutral">&nbsp;</span>
219
219
  <span class="cline-any cline-neutral">&nbsp;</span>
220
220
  <span class="cline-any cline-neutral">&nbsp;</span>
221
- <span class="cline-any cline-no">&nbsp;</span>
222
221
  <span class="cline-any cline-neutral">&nbsp;</span>
223
222
  <span class="cline-any cline-neutral">&nbsp;</span>
224
- <span class="cline-any cline-no">&nbsp;</span>
225
- <span class="cline-any cline-yes">1x</span>
226
223
  <span class="cline-any cline-neutral">&nbsp;</span>
227
224
  <span class="cline-any cline-neutral">&nbsp;</span>
228
- <span class="cline-any cline-no">&nbsp;</span>
229
- <span class="cline-any cline-yes">1x</span>
230
225
  <span class="cline-any cline-yes">1x</span>
231
226
  <span class="cline-any cline-neutral">&nbsp;</span>
227
+ <span class="cline-any cline-neutral">&nbsp;</span>
232
228
  <span class="cline-any cline-no">&nbsp;</span>
229
+ <span class="cline-any cline-neutral">&nbsp;</span>
230
+ <span class="cline-any cline-neutral">&nbsp;</span>
231
+ <span class="cline-any cline-neutral">&nbsp;</span>
232
+ <span class="cline-any cline-neutral">&nbsp;</span>
233
233
  <span class="cline-any cline-yes">1x</span>
234
234
  <span class="cline-any cline-yes">1x</span>
235
- <span class="cline-any cline-no">&nbsp;</span>
235
+ <span class="cline-any cline-neutral">&nbsp;</span>
236
236
  <span class="cline-any cline-yes">1x</span>
237
237
  <span class="cline-any cline-yes">1x</span>
238
238
  <span class="cline-any cline-neutral">&nbsp;</span>
239
- <span class="cline-any cline-no">&nbsp;</span>
239
+ <span class="cline-any cline-neutral">&nbsp;</span>
240
240
  <span class="cline-any cline-neutral">&nbsp;</span>
241
241
  <span class="cline-any cline-yes">1x</span>
242
242
  <span class="cline-any cline-yes">1x</span>
243
243
  <span class="cline-any cline-no">&nbsp;</span>
244
- <span class="cline-any cline-no">&nbsp;</span>
245
- <span class="cline-any cline-yes">1x</span>
246
- <span class="cline-any cline-no">&nbsp;</span>
247
- <span class="cline-any cline-no">&nbsp;</span>
244
+ <span class="cline-any cline-neutral">&nbsp;</span>
248
245
  <span class="cline-any cline-yes">1x</span>
246
+ <span class="cline-any cline-neutral">&nbsp;</span>
247
+ <span class="cline-any cline-neutral">&nbsp;</span>
249
248
  <span class="cline-any cline-yes">1x</span>
250
249
  <span class="cline-any cline-yes">1x</span>
251
250
  <span class="cline-any cline-yes">1x</span>
251
+ <span class="cline-any cline-neutral">&nbsp;</span>
252
252
  <span class="cline-any cline-yes">1x</span>
253
253
  <span class="cline-any cline-yes">1x</span>
254
254
  <span class="cline-any cline-no">&nbsp;</span>
255
- <span class="cline-any cline-no">&nbsp;</span>
256
- <span class="cline-any cline-yes">1x</span>
257
- <span class="cline-any cline-yes">1x</span>
258
- <span class="cline-any cline-yes">1x</span>
259
255
  <span class="cline-any cline-neutral">&nbsp;</span>
260
256
  <span class="cline-any cline-yes">1x</span>
261
257
  <span class="cline-any cline-yes">1x</span>
258
+ <span class="cline-any cline-neutral">&nbsp;</span>
259
+ <span class="cline-any cline-neutral">&nbsp;</span>
262
260
  <span class="cline-any cline-yes">1x</span>
263
261
  <span class="cline-any cline-yes">1x</span>
264
262
  <span class="cline-any cline-yes">1x</span>
265
263
  <span class="cline-any cline-yes">1x</span>
266
264
  <span class="cline-any cline-yes">1x</span>
267
265
  <span class="cline-any cline-neutral">&nbsp;</span>
266
+ <span class="cline-any cline-neutral">&nbsp;</span>
267
+ <span class="cline-any cline-neutral">&nbsp;</span>
268
268
  <span class="cline-any cline-yes">1x</span>
269
269
  <span class="cline-any cline-neutral">&nbsp;</span>
270
270
  <span class="cline-any cline-yes">1x</span>
@@ -272,45 +272,45 @@
272
272
  <span class="cline-any cline-neutral">&nbsp;</span>
273
273
  <span class="cline-any cline-neutral">&nbsp;</span>
274
274
  <span class="cline-any cline-neutral">&nbsp;</span>
275
- <span class="cline-any cline-no">&nbsp;</span>
276
275
  <span class="cline-any cline-neutral">&nbsp;</span>
277
- <span class="cline-any cline-no">&nbsp;</span>
278
- <span class="cline-any cline-no">&nbsp;</span>
276
+ <span class="cline-any cline-neutral">&nbsp;</span>
279
277
  <span class="cline-any cline-no">&nbsp;</span>
280
278
  <span class="cline-any cline-neutral">&nbsp;</span>
281
279
  <span class="cline-any cline-neutral">&nbsp;</span>
282
280
  <span class="cline-any cline-neutral">&nbsp;</span>
283
281
  <span class="cline-any cline-neutral">&nbsp;</span>
284
282
  <span class="cline-any cline-neutral">&nbsp;</span>
285
- <span class="cline-any cline-no">&nbsp;</span>
286
- <span class="cline-any cline-yes">1x</span>
287
283
  <span class="cline-any cline-neutral">&nbsp;</span>
288
- <span class="cline-any cline-yes">1x</span>
289
284
  <span class="cline-any cline-neutral">&nbsp;</span>
290
- <span class="cline-any cline-no">&nbsp;</span>
291
- <span class="cline-any cline-yes">1x</span>
285
+ <span class="cline-any cline-neutral">&nbsp;</span>
286
+ <span class="cline-any cline-neutral">&nbsp;</span>
287
+ <span class="cline-any cline-neutral">&nbsp;</span>
292
288
  <span class="cline-any cline-yes">1x</span>
293
289
  <span class="cline-any cline-neutral">&nbsp;</span>
294
290
  <span class="cline-any cline-neutral">&nbsp;</span>
295
- <span class="cline-any cline-no">&nbsp;</span>
296
- <span class="cline-any cline-no">&nbsp;</span>
297
- <span class="cline-any cline-no">&nbsp;</span>
298
291
  <span class="cline-any cline-yes">1x</span>
299
292
  <span class="cline-any cline-no">&nbsp;</span>
293
+ <span class="cline-any cline-neutral">&nbsp;</span>
294
+ <span class="cline-any cline-neutral">&nbsp;</span>
295
+ <span class="cline-any cline-neutral">&nbsp;</span>
296
+ <span class="cline-any cline-neutral">&nbsp;</span>
297
+ <span class="cline-any cline-neutral">&nbsp;</span>
298
+ <span class="cline-any cline-yes">1x</span>
299
+ <span class="cline-any cline-neutral">&nbsp;</span>
300
300
  <span class="cline-any cline-yes">1x</span>
301
301
  <span class="cline-any cline-yes">1x</span>
302
302
  <span class="cline-any cline-no">&nbsp;</span>
303
303
  <span class="cline-any cline-neutral">&nbsp;</span>
304
- <span class="cline-any cline-no">&nbsp;</span>
304
+ <span class="cline-any cline-neutral">&nbsp;</span>
305
305
  <span class="cline-any cline-yes">1x</span>
306
306
  <span class="cline-any cline-yes">1x</span>
307
- <span class="cline-any cline-no">&nbsp;</span>
307
+ <span class="cline-any cline-neutral">&nbsp;</span>
308
308
  <span class="cline-any cline-yes">1x</span>
309
309
  <span class="cline-any cline-yes">1x</span>
310
310
  <span class="cline-any cline-neutral">&nbsp;</span>
311
311
  <span class="cline-any cline-yes">1x</span>
312
312
  <span class="cline-any cline-yes">1x</span>
313
- <span class="cline-any cline-no">&nbsp;</span>
313
+ <span class="cline-any cline-neutral">&nbsp;</span>
314
314
  <span class="cline-any cline-neutral">&nbsp;</span>
315
315
  <span class="cline-any cline-neutral">&nbsp;</span>
316
316
  <span class="cline-any cline-yes">1x</span>
@@ -354,14 +354,14 @@ import { calculatePathEntropy } from './metrics';
354
354
  /**
355
355
  * Generate summary of context analysis results
356
356
  *
357
- * @param result<span class="fstat-no" title="function not covered" >s - Array of ind</span>ividual file analysis results.
357
+ * @param results - Array of individual file analysis results.
358
358
  * @param options - Optional scan configuration for context extraction.
359
359
  * @returns A consolidated summary of the entire context scan.
360
360
  */
361
- export function g<span class="cstat-no" title="statement not covered" >enerateSummary(</span>
361
+ export function generateSummary(
362
362
  results: ContextAnalysisResult[],
363
363
  options: any = {}
364
- ): ContextSummary {<span class="cstat-no" title="statement not covered" ></span>
364
+ ): ContextSummary {
365
365
  const config = options
366
366
  ? Object.fromEntries(
367
367
  Object.entries(options).filter(
@@ -369,33 +369,33 @@ export function g<span class="cstat-no" title="statement not covered" >enerateSu
369
369
  )
370
370
  )
371
371
  : <span class="branch-1 cbranch-no" title="branch not covered" >{};</span>
372
- <span class="cstat-no" title="statement not covered" ></span>
372
+ &nbsp;
373
373
  const totalFiles = results.length;
374
374
  const totalTokens = results.reduce((sum, r) =&gt; sum + r.tokenCost, 0);
375
- const avgContextBu<span class="cstat-no" title="statement not covered" >dget =</span>
375
+ const avgContextBudget =
376
376
  totalFiles &gt; 0
377
377
  ? results.reduce((sum, r) =&gt; sum + r.contextBudget, 0) / totalFiles
378
378
  : <span class="branch-1 cbranch-no" title="branch not covered" >0;</span>
379
- <span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" ></span></span>
379
+ &nbsp;
380
380
  // Find deep files
381
381
  const deepFiles = results
382
382
  .filter((r) =&gt; r.importDepth &gt; 5)
383
- <span class="cstat-no" title="statement not covered" > .map(<span class="fstat-no" title="function not covered" >(r</span>) =&gt; (<span class="cstat-no" title="statement not covered" >{ file: r.file, depth: r.importDepth }))</span>;</span>
384
- <span class="cstat-no" title="statement not covered" ></span>
383
+ .map(<span class="fstat-no" title="function not covered" >(r</span>) =&gt; (<span class="cstat-no" title="statement not covered" >{ file: r.file, depth: r.importDepth }))</span>;
384
+ &nbsp;
385
385
  const maxImportDepth = Math.max(0, ...results.map((r) =&gt; r.importDepth));
386
- <span class="cstat-no" title="statement not covered" ></span>
387
- //<span class="cstat-no" title="statement not covered" > Find fragmented modules (clusters)</span>
388
- cons<span class="cstat-no" title="statement not covered" >t moduleMap = new Map&lt;string, ContextAnalysisResult[]&gt;();</span>
386
+ &nbsp;
387
+ // Find fragmented modules (clusters)
388
+ const moduleMap = new Map&lt;string, ContextAnalysisResult[]&gt;();
389
389
  results.forEach((r) =&gt; {
390
390
  const parts = r.file.split('/');
391
391
  // Try to identify domain/module (e.g., packages/core, src/utils)
392
392
  let domain = 'root';
393
393
  <span class="missing-if-branch" title="if path not taken" >I</span>if (parts.length &gt; 2) {
394
- <span class="cstat-no" title="statement not covered" > domain = parts.slice(0, 2).join('/');<span class="cstat-no" title="statement not covered" ></span></span>
395
- <span class="cstat-no" title="statement not covered" > }</span>
394
+ <span class="cstat-no" title="statement not covered" > domain = parts.slice(0, 2).join('/');</span>
395
+ }
396
396
  <span class="missing-if-branch" title="else path not taken" >E</span>if (!moduleMap.has(domain)) moduleMap.set(domain, []);
397
397
  moduleMap.get(domain)!.push(r);
398
- });<span class="cstat-no" title="statement not covered" ></span>
398
+ });
399
399
  &nbsp;
400
400
  const fragmentedModules: ModuleCluster[] = [];
401
401
  moduleMap.forEach((files, domain) =&gt; {
@@ -412,45 +412,45 @@ export function g<span class="cstat-no" title="statement not covered" >enerateSu
412
412
  domain,
413
413
  files: filePaths,
414
414
  fragmentationScore,
415
- <span class="cstat-no" title="statement not covered" > totalTokens: clusterTokens,<span class="cstat-no" title="statement not covered" ></span></span>
415
+ totalTokens: clusterTokens,
416
416
  avgCohesion:
417
417
  files.reduce(<span class="fstat-no" title="function not covered" >(s</span>um, f) =&gt; <span class="cstat-no" title="statement not covered" >sum + f.cohesionScore, 0</span>) / files.length,
418
- <span class="cstat-no" title="statement not covered" > suggestedStructure: {</span>
419
- <span class="branch-0 cbranch-no" title="branch not covered" > targetFiles: Math.ceil(files.length<span class="cstat-no" title="statement not covered" > / 2),</span></span>
418
+ suggestedStructure: {
419
+ targetFiles: Math.ceil(files.length / 2),
420
420
  consolidationPlan: [
421
421
  `Consolidate ${files.length} files in ${domain} into fewer modules`,
422
422
  ],
423
423
  },
424
424
  });
425
- <span class="cstat-no" title="statement not covered" > }</span>
425
+ }
426
426
  });
427
427
  &nbsp;
428
428
  fragmentedModules.sort(<span class="fstat-no" title="function not covered" >(a</span>, b) =&gt; <span class="cstat-no" title="statement not covered" >b.fragmentationScore - a.fragmentationScore)</span>;
429
429
  &nbsp;
430
- const avgFragmentation =<span class="cstat-no" title="statement not covered" ></span>
430
+ const avgFragmentation =
431
431
  fragmentedModules.length &gt; 0
432
432
  ? <span class="branch-0 cbranch-no" title="branch not covered" >fragmentedModules.reduce(<span class="fstat-no" title="function not covered" >(s</span>um, m) =&gt; <span class="cstat-no" title="statement not covered" >sum + m.fragmentationScore, 0</span>) /</span>
433
433
  fragmentedModules.length
434
434
  : 0;
435
- <span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" ></span></span>
436
- // Cohesion<span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" ></span></span>
437
- const avgCohesion =<span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" ></span></span>
435
+ &nbsp;
436
+ // Cohesion
437
+ const avgCohesion =
438
438
  results.reduce((sum, r) =&gt; sum + r.cohesionScore, 0) / (totalFiles || <span class="branch-1 cbranch-no" title="branch not covered" >1);</span>
439
- <span class="cstat-no" title="statement not covered" ></span>
440
- const lowCohes<span class="cstat-no" title="statement not covered" >ionFiles = results</span>
439
+ &nbsp;
440
+ const lowCohesionFiles = results
441
441
  .filter((r) =&gt; r.cohesionScore &lt; 0.4)
442
442
  .map(<span class="fstat-no" title="function not covered" >(r</span>) =&gt; (<span class="cstat-no" title="statement not covered" >{ file: r.file, score: r.cohesionScore }))</span>;
443
443
  &nbsp;
444
- // Issues<span class="cstat-no" title="statement not covered" ></span>
445
- const criticalIssu<span class="cstat-no" title="statement not covered" >es = results.filter(</span>
444
+ // Issues
445
+ const criticalIssues = results.filter(
446
446
  (r) =&gt; r.severity === 'critical'
447
- ).length;<span class="cstat-no" title="statement not covered" ></span>
447
+ ).length;
448
448
  const majorIssues = results.filter((r) =&gt; r.severity === 'major').length;
449
449
  const minorIssues = results.filter((r) =&gt; r.severity === 'minor').length;
450
450
  &nbsp;
451
451
  const totalPotentialSavings = results.reduce(
452
452
  (sum, r) =&gt; sum + (r.potentialSavings || 0),
453
- <span class="cstat-no" title="statement not covered" > 0</span>
453
+ 0
454
454
  );
455
455
  &nbsp;
456
456
  const topExpensiveFiles = [...results]
@@ -490,7 +490,7 @@ export function g<span class="cstat-no" title="statement not covered" >enerateSu
490
490
  <div class='footer quiet pad2 space-top1 center small'>
491
491
  Code coverage generated by
492
492
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
493
- at 2026-03-21T12:52:37.698Z
493
+ at 2026-03-24T11:20:59.666Z
494
494
  </div>
495
495
  <script src="../prettify.js"></script>
496
496
  <script>
@@ -658,7 +658,7 @@ export interface TypeDependency {
658
658
  <div class='footer quiet pad2 space-top1 center small'>
659
659
  Code coverage generated by
660
660
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
661
- at 2026-03-21T12:52:37.698Z
661
+ at 2026-03-24T11:20:59.666Z
662
662
  </div>
663
663
  <script src="../prettify.js"></script>
664
664
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">68.25% </span>
26
+ <span class="strong">88.88% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>43/63</span>
28
+ <span class='fraction'>56/63</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">66.66% </span>
33
+ <span class="strong">75.75% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>22/33</span>
35
+ <span class='fraction'>25/33</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">66.66% </span>
40
+ <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>4/6</span>
42
+ <span class='fraction'>6/6</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">68.42% </span>
47
+ <span class="strong">91.22% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>39/57</span>
49
+ <span class='fraction'>52/57</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line medium'></div>
64
+ <div class='status-line high'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -199,10 +199,10 @@
199
199
  <span class="cline-any cline-neutral">&nbsp;</span>
200
200
  <span class="cline-any cline-neutral">&nbsp;</span>
201
201
  <span class="cline-any cline-neutral">&nbsp;</span>
202
- <span class="cline-any cline-yes">16x</span>
202
+ <span class="cline-any cline-yes">17x</span>
203
203
  <span class="cline-any cline-neutral">&nbsp;</span>
204
- <span class="cline-any cline-yes">15x</span>
205
- <span class="cline-any cline-yes">15x</span>
204
+ <span class="cline-any cline-yes">16x</span>
205
+ <span class="cline-any cline-yes">16x</span>
206
206
  <span class="cline-any cline-neutral">&nbsp;</span>
207
207
  <span class="cline-any cline-yes">6x</span>
208
208
  <span class="cline-any cline-yes">6x</span>
@@ -284,12 +284,12 @@
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-no">&nbsp;</span>
288
- <span class="cline-any cline-no">&nbsp;</span>
289
- <span class="cline-any cline-no">&nbsp;</span>
287
+ <span class="cline-any cline-yes">1x</span>
288
+ <span class="cline-any cline-yes">1x</span>
289
+ <span class="cline-any cline-yes">1x</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-no">&nbsp;</span>
292
+ <span class="cline-any cline-yes">1x</span>
293
293
  <span class="cline-any cline-no">&nbsp;</span>
294
294
  <span class="cline-any cline-no">&nbsp;</span>
295
295
  <span class="cline-any cline-no">&nbsp;</span>
@@ -297,23 +297,23 @@
297
297
  <span class="cline-any cline-no">&nbsp;</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-no">&nbsp;</span>
300
+ <span class="cline-any cline-yes">1x</span>
301
301
  <span class="cline-any cline-neutral">&nbsp;</span>
302
- <span class="cline-any cline-no">&nbsp;</span>
303
- <span class="cline-any cline-no">&nbsp;</span>
302
+ <span class="cline-any cline-yes">1x</span>
303
+ <span class="cline-any cline-yes">1x</span>
304
304
  <span class="cline-any cline-neutral">&nbsp;</span>
305
- <span class="cline-any cline-no">&nbsp;</span>
306
- <span class="cline-any cline-no">&nbsp;</span>
307
- <span class="cline-any cline-no">&nbsp;</span>
305
+ <span class="cline-any cline-yes">1x</span>
306
+ <span class="cline-any cline-yes">1x</span>
307
+ <span class="cline-any cline-yes">1x</span>
308
308
  <span class="cline-any cline-no">&nbsp;</span>
309
309
  <span class="cline-any cline-neutral">&nbsp;</span>
310
310
  <span class="cline-any cline-neutral">&nbsp;</span>
311
311
  <span class="cline-any cline-neutral">&nbsp;</span>
312
- <span class="cline-any cline-no">&nbsp;</span>
312
+ <span class="cline-any cline-yes">1x</span>
313
313
  <span class="cline-any cline-neutral">&nbsp;</span>
314
314
  <span class="cline-any cline-neutral">&nbsp;</span>
315
- <span class="cline-any cline-no">&nbsp;</span>
316
- <span class="cline-any cline-no">&nbsp;</span>
315
+ <span class="cline-any cline-yes">1x</span>
316
+ <span class="cline-any cline-yes">1x</span>
317
317
  <span class="cline-any cline-neutral">&nbsp;</span>
318
318
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
319
319
  * Shared dependency graph utilities used by context analyzers.
@@ -406,16 +406,16 @@ export function detectGraphCycles(edges: Map&lt;string, Set&lt;string&gt;&gt;):
406
406
  return cycles;
407
407
  }
408
408
  &nbsp;
409
- export function <span class="fstat-no" title="function not covered" >detectGraphCyclesFromFile(</span>
409
+ export function detectGraphCyclesFromFile(
410
410
  file: string,
411
411
  edges: Map&lt;string, Set&lt;string&gt;&gt;
412
412
  ): string[][] {
413
- const cycles: string[][] = <span class="cstat-no" title="statement not covered" >[];</span>
414
- const visited = <span class="cstat-no" title="statement not covered" >new Set&lt;string&gt;();</span>
415
- const recursionStack = <span class="cstat-no" title="statement not covered" >new Set&lt;string&gt;();</span>
413
+ const cycles: string[][] = [];
414
+ const visited = new Set&lt;string&gt;();
415
+ const recursionStack = new Set&lt;string&gt;();
416
416
  &nbsp;
417
- function <span class="fstat-no" title="function not covered" >dfs(c</span>urrent: string, path: string[]): void {
418
- <span class="cstat-no" title="statement not covered" > if (recursionStack.has(current)) {</span>
417
+ function dfs(current: string, path: string[]): void {
418
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (recursionStack.has(current)) {
419
419
  const cycleStart = <span class="cstat-no" title="statement not covered" >path.indexOf(current);</span>
420
420
  <span class="cstat-no" title="statement not covered" > if (cycleStart !== -1) {</span>
421
421
  <span class="cstat-no" title="statement not covered" > cycles.push([...path.slice(cycleStart), current]);</span>
@@ -423,23 +423,23 @@ export function <span class="fstat-no" title="function not covered" >detectGraph
423
423
  <span class="cstat-no" title="statement not covered" > return;</span>
424
424
  }
425
425
  &nbsp;
426
- <span class="cstat-no" title="statement not covered" > if (visited.has(current)) <span class="cstat-no" title="statement not covered" >return;</span></span>
426
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (visited.has(current)) <span class="cstat-no" title="statement not covered" >return;</span>
427
427
  &nbsp;
428
- <span class="cstat-no" title="statement not covered" > visited.add(current);</span>
429
- <span class="cstat-no" title="statement not covered" > recursionStack.add(current);</span>
428
+ visited.add(current);
429
+ recursionStack.add(current);
430
430
  &nbsp;
431
- const dependencies = <span class="cstat-no" title="statement not covered" >edges.get(current);</span>
432
- <span class="cstat-no" title="statement not covered" > if (dependencies) {</span>
433
- <span class="cstat-no" title="statement not covered" > for (const dep of dependencies) {</span>
431
+ const dependencies = edges.get(current);
432
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (dependencies) {
433
+ for (const dep of dependencies) {
434
434
  <span class="cstat-no" title="statement not covered" > dfs(dep, [...path, current]);</span>
435
435
  }
436
436
  }
437
437
  &nbsp;
438
- <span class="cstat-no" title="statement not covered" > recursionStack.delete(current);</span>
438
+ recursionStack.delete(current);
439
439
  }
440
440
  &nbsp;
441
- <span class="cstat-no" title="statement not covered" > dfs(file, []);</span>
442
- <span class="cstat-no" title="statement not covered" > return cycles;</span>
441
+ dfs(file, []);
442
+ return cycles;
443
443
  }
444
444
  &nbsp;</pre></td></tr></table></pre>
445
445
 
@@ -448,7 +448,7 @@ export function <span class="fstat-no" title="function not covered" >detectGraph
448
448
  <div class='footer quiet pad2 space-top1 center small'>
449
449
  Code coverage generated by
450
450
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
451
- at 2026-03-21T12:52:37.698Z
451
+ at 2026-03-24T11:20:59.666Z
452
452
  </div>
453
453
  <script src="../../prettify.js"></script>
454
454
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">68.49% </span>
26
+ <span class="strong">86.3% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>50/73</span>
28
+ <span class='fraction'>63/73</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">67.44% </span>
33
+ <span class="strong">74.41% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>29/43</span>
35
+ <span class='fraction'>32/43</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">71.42% </span>
40
+ <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>5/7</span>
42
+ <span class='fraction'>7/7</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">71.42% </span>
47
+ <span class="strong">92.06% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>45/63</span>
49
+ <span class='fraction'>58/63</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line medium'></div>
64
+ <div class='status-line high'></div>
65
65
  <div class="pad1">
66
66
  <table class="coverage-summary">
67
67
  <thead>
@@ -79,18 +79,18 @@
79
79
  </tr>
80
80
  </thead>
81
81
  <tbody><tr>
82
- <td class="file medium" data-value="dependency-graph-utils.ts"><a href="dependency-graph-utils.ts.html">dependency-graph-utils.ts</a></td>
83
- <td data-value="68.25" class="pic medium">
84
- <div class="chart"><div class="cover-fill" style="width: 68%"></div><div class="cover-empty" style="width: 32%"></div></div>
82
+ <td class="file high" data-value="dependency-graph-utils.ts"><a href="dependency-graph-utils.ts.html">dependency-graph-utils.ts</a></td>
83
+ <td data-value="88.88" class="pic high">
84
+ <div class="chart"><div class="cover-fill" style="width: 88%"></div><div class="cover-empty" style="width: 12%"></div></div>
85
85
  </td>
86
- <td data-value="68.25" class="pct medium">68.25%</td>
87
- <td data-value="63" class="abs medium">43/63</td>
88
- <td data-value="66.66" class="pct medium">66.66%</td>
89
- <td data-value="33" class="abs medium">22/33</td>
90
- <td data-value="66.66" class="pct medium">66.66%</td>
91
- <td data-value="6" class="abs medium">4/6</td>
92
- <td data-value="68.42" class="pct medium">68.42%</td>
93
- <td data-value="57" class="abs medium">39/57</td>
86
+ <td data-value="88.88" class="pct high">88.88%</td>
87
+ <td data-value="63" class="abs high">56/63</td>
88
+ <td data-value="75.75" class="pct medium">75.75%</td>
89
+ <td data-value="33" class="abs medium">25/33</td>
90
+ <td data-value="100" class="pct high">100%</td>
91
+ <td data-value="6" class="abs high">6/6</td>
92
+ <td data-value="91.22" class="pct high">91.22%</td>
93
+ <td data-value="57" class="abs high">52/57</td>
94
94
  </tr>
95
95
 
96
96
  <tr>
@@ -116,7 +116,7 @@
116
116
  <div class='footer quiet pad2 space-top1 center small'>
117
117
  Code coverage generated by
118
118
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2026-03-21T12:52:37.698Z
119
+ at 2026-03-24T11:20:59.666Z
120
120
  </div>
121
121
  <script src="../../prettify.js"></script>
122
122
  <script>
@@ -133,7 +133,7 @@ export function singularize(word: string): string {
133
133
  <div class='footer quiet pad2 space-top1 center small'>
134
134
  Code coverage generated by
135
135
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
136
- at 2026-03-21T12:52:37.698Z
136
+ at 2026-03-24T11:20:59.666Z
137
137
  </div>
138
138
  <script src="../../prettify.js"></script>
139
139
  <script>