@aiready/context-analyzer 0.21.22 → 0.21.24

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 +26 -25
  2. package/.turbo/turbo-lint.log +5 -5
  3. package/.turbo/turbo-test.log +91 -41
  4. package/coverage/clover.xml +2615 -1242
  5. package/coverage/coverage-final.json +30 -13
  6. package/coverage/dist/chunk-64U3PNO3.mjs.html +367 -0
  7. package/coverage/dist/chunk-J3MUOWHC.mjs.html +5326 -0
  8. package/coverage/dist/index.html +146 -0
  9. package/coverage/{classifier.ts.html → dist/index.mjs.html} +537 -912
  10. package/coverage/index.html +84 -189
  11. package/coverage/src/analyzer.ts.html +88 -0
  12. package/coverage/src/analyzers/index.html +116 -0
  13. package/coverage/src/analyzers/python-context.ts.html +910 -0
  14. package/coverage/{ast-utils.ts.html → src/ast-utils.ts.html} +84 -54
  15. package/coverage/src/classifier.ts.html +892 -0
  16. package/coverage/src/classify/classification-patterns.ts.html +307 -0
  17. package/coverage/src/classify/file-classifiers.ts.html +973 -0
  18. package/coverage/src/classify/index.html +131 -0
  19. package/coverage/{cluster-detector.ts.html → src/cluster-detector.ts.html} +154 -91
  20. package/coverage/{defaults.ts.html → src/defaults.ts.html} +74 -65
  21. package/coverage/{graph-builder.ts.html → src/graph-builder.ts.html} +268 -229
  22. package/coverage/src/index.html +341 -0
  23. package/coverage/{index.ts.html → src/index.ts.html} +70 -13
  24. package/coverage/{scoring.ts.html → src/issue-analyzer.ts.html} +201 -261
  25. package/coverage/src/mapper.ts.html +439 -0
  26. package/coverage/{metrics.ts.html → src/metrics.ts.html} +201 -132
  27. package/coverage/src/orchestrator.ts.html +493 -0
  28. package/coverage/{provider.ts.html → src/provider.ts.html} +21 -21
  29. package/coverage/{remediation.ts.html → src/remediation.ts.html} +112 -52
  30. package/coverage/src/report/console-report.ts.html +415 -0
  31. package/coverage/src/report/html-report.ts.html +361 -0
  32. package/coverage/src/report/index.html +146 -0
  33. package/coverage/src/report/interactive-setup.ts.html +373 -0
  34. package/coverage/src/scoring.ts.html +895 -0
  35. package/coverage/src/semantic/co-usage.ts.html +340 -0
  36. package/coverage/src/semantic/consolidation.ts.html +223 -0
  37. package/coverage/src/semantic/domain-inference.ts.html +859 -0
  38. package/coverage/src/semantic/index.html +161 -0
  39. package/coverage/src/semantic/type-graph.ts.html +163 -0
  40. package/coverage/{summary.ts.html → src/summary.ts.html} +155 -275
  41. package/coverage/{types.ts.html → src/types.ts.html} +133 -31
  42. package/coverage/src/utils/dependency-graph-utils.ts.html +463 -0
  43. package/coverage/src/utils/index.html +131 -0
  44. package/coverage/src/utils/string-utils.ts.html +148 -0
  45. package/dist/chunk-AMPK6SWS.mjs +1754 -0
  46. package/dist/chunk-BHCRDEE4.mjs +1745 -0
  47. package/dist/chunk-IKRP7ECY.mjs +1754 -0
  48. package/dist/chunk-J3MUOWHC.mjs +1747 -0
  49. package/dist/chunk-TWWPY7FD.mjs +1754 -0
  50. package/dist/chunk-Z5WY6A4P.mjs +1754 -0
  51. package/dist/cli.js +77 -185
  52. package/dist/cli.mjs +1 -1
  53. package/dist/index.d.mts +1 -1
  54. package/dist/index.d.ts +1 -1
  55. package/dist/index.js +73 -181
  56. package/dist/index.mjs +1 -1
  57. package/dist/python-context-BWDC4E5Z.mjs +162 -0
  58. package/package.json +3 -3
  59. package/src/__tests__/analyzer.test.ts +14 -14
  60. package/src/__tests__/auto-detection.test.ts +16 -16
  61. package/src/__tests__/consolidation.test.ts +247 -0
  62. package/src/__tests__/defaults.test.ts +121 -0
  63. package/src/__tests__/domain-inference.test.ts +420 -0
  64. package/src/__tests__/fragmentation-coupling.test.ts +4 -4
  65. package/src/__tests__/issue-analyzer.test.ts +155 -0
  66. package/src/__tests__/orchestrator.test.ts +143 -0
  67. package/src/__tests__/python-context.test.ts +100 -0
  68. package/src/__tests__/report/console-report.test.ts +292 -0
  69. package/src/__tests__/report/html-report.test.ts +243 -0
  70. package/src/__tests__/scoring.test.ts +17 -11
  71. package/src/analyzers/python-context.ts +2 -2
  72. package/src/ast-utils.ts +3 -3
  73. package/src/graph-builder.ts +4 -4
  74. package/src/mapper.ts +6 -0
  75. package/src/orchestrator.ts +1 -1
  76. package/src/report/html-report.ts +73 -181
  77. package/coverage/analyzer.ts.html +0 -1369
  78. package/coverage/semantic-analysis.ts.html +0 -1201
@@ -3,15 +3,15 @@
3
3
  <html lang="en">
4
4
 
5
5
  <head>
6
- <title>Code coverage report for summary.ts</title>
6
+ <title>Code coverage report for src/summary.ts</title>
7
7
  <meta charset="utf-8" />
8
- <link rel="stylesheet" href="prettify.css" />
9
- <link rel="stylesheet" href="base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="favicon.png" />
8
+ <link rel="stylesheet" href="../prettify.css" />
9
+ <link rel="stylesheet" href="../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
11
11
  <meta name="viewport" content="width=device-width, initial-scale=1" />
12
12
  <style type='text/css'>
13
13
  .coverage-summary .sorter {
14
- background-image: url(sort-arrow-sprite.png);
14
+ background-image: url(../sort-arrow-sprite.png);
15
15
  }
16
16
  </style>
17
17
  </head>
@@ -19,34 +19,34 @@
19
19
  <body>
20
20
  <div class='wrapper'>
21
21
  <div class='pad1'>
22
- <h1><a href="index.html">All files</a> summary.ts</h1>
22
+ <h1><a href="../index.html">All files</a> / <a href="index.html">src</a> summary.ts</h1>
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">54.76% </span>
26
+ <span class="strong">61.32% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>46/84</span>
28
+ <span class='fraction'>65/106</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">25% </span>
33
+ <span class="strong">30.76% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>7/28</span>
35
+ <span class='fraction'>12/39</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">55.17% </span>
40
+ <span class="strong">82.97% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>16/29</span>
42
+ <span class='fraction'>39/47</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">55.38% </span>
47
+ <span class="strong">62.16% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>36/65</span>
49
+ <span class='fraction'>46/74</span>
50
50
  </div>
51
51
 
52
52
 
@@ -203,47 +203,7 @@
203
203
  <a name='L138'></a><a href='#L138'>138</a>
204
204
  <a name='L139'></a><a href='#L139'>139</a>
205
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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
206
+ <a name='L141'></a><a href='#L141'>141</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
247
207
  <span class="cline-any cline-neutral">&nbsp;</span>
248
208
  <span class="cline-any cline-neutral">&nbsp;</span>
249
209
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -258,157 +218,117 @@
258
218
  <span class="cline-any cline-neutral">&nbsp;</span>
259
219
  <span class="cline-any cline-neutral">&nbsp;</span>
260
220
  <span class="cline-any cline-neutral">&nbsp;</span>
261
- <span class="cline-any cline-yes">2x</span>
262
- <span class="cline-any cline-neutral">&nbsp;</span>
263
- <span class="cline-any cline-neutral">&nbsp;</span>
264
- <span class="cline-any cline-yes">1x</span>
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
- <span class="cline-any cline-neutral">&nbsp;</span>
269
- <span class="cline-any cline-yes">2x</span>
270
221
  <span class="cline-any cline-no">&nbsp;</span>
271
222
  <span class="cline-any cline-neutral">&nbsp;</span>
272
223
  <span class="cline-any cline-neutral">&nbsp;</span>
273
- <span class="cline-any cline-neutral">&nbsp;</span>
274
- <span class="cline-any cline-neutral">&nbsp;</span>
275
- <span class="cline-any cline-neutral">&nbsp;</span>
276
- <span class="cline-any cline-neutral">&nbsp;</span>
277
- <span class="cline-any cline-neutral">&nbsp;</span>
278
- <span class="cline-any cline-neutral">&nbsp;</span>
279
- <span class="cline-any cline-neutral">&nbsp;</span>
280
- <span class="cline-any cline-neutral">&nbsp;</span>
281
- <span class="cline-any cline-neutral">&nbsp;</span>
282
- <span class="cline-any cline-neutral">&nbsp;</span>
283
- <span class="cline-any cline-neutral">&nbsp;</span>
284
- <span class="cline-any cline-neutral">&nbsp;</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>
288
- <span class="cline-any cline-neutral">&nbsp;</span>
289
- <span class="cline-any cline-neutral">&nbsp;</span>
290
- <span class="cline-any cline-neutral">&nbsp;</span>
291
- <span class="cline-any cline-yes">2x</span>
292
- <span class="cline-any cline-yes">2x</span>
293
- <span class="cline-any cline-yes">2x</span>
294
- <span class="cline-any cline-yes">2x</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-yes">2x</span>
298
- <span class="cline-any cline-yes">2x</span>
299
- <span class="cline-any cline-neutral">&nbsp;</span>
300
- <span class="cline-any cline-neutral">&nbsp;</span>
301
- <span class="cline-any cline-yes">2x</span>
302
- <span class="cline-any cline-yes">2x</span>
303
- <span class="cline-any cline-neutral">&nbsp;</span>
304
- <span class="cline-any cline-yes">2x</span>
305
- <span class="cline-any cline-yes">2x</span>
306
224
  <span class="cline-any cline-no">&nbsp;</span>
307
- <span class="cline-any cline-no">&nbsp;</span>
308
- <span class="cline-any cline-neutral">&nbsp;</span>
309
- <span class="cline-any cline-neutral">&nbsp;</span>
310
- <span class="cline-any cline-neutral">&nbsp;</span>
311
- <span class="cline-any cline-yes">2x</span>
312
- <span class="cline-any cline-neutral">&nbsp;</span>
313
- <span class="cline-any cline-yes">2x</span>
314
- <span class="cline-any cline-yes">2x</span>
315
- <span class="cline-any cline-yes">2x</span>
316
- <span class="cline-any cline-yes">2x</span>
317
- <span class="cline-any cline-yes">2x</span>
318
- <span class="cline-any cline-neutral">&nbsp;</span>
319
- <span class="cline-any cline-neutral">&nbsp;</span>
320
- <span class="cline-any cline-neutral">&nbsp;</span>
321
- <span class="cline-any cline-yes">2x</span>
322
- <span class="cline-any cline-yes">2x</span>
323
- <span class="cline-any cline-yes">2x</span>
225
+ <span class="cline-any cline-yes">1x</span>
324
226
  <span class="cline-any cline-neutral">&nbsp;</span>
325
- <span class="cline-any cline-no">&nbsp;</span>
326
- <span class="cline-any cline-no">&nbsp;</span>
327
227
  <span class="cline-any cline-neutral">&nbsp;</span>
328
228
  <span class="cline-any cline-no">&nbsp;</span>
229
+ <span class="cline-any cline-yes">1x</span>
230
+ <span class="cline-any cline-yes">1x</span>
329
231
  <span class="cline-any cline-neutral">&nbsp;</span>
330
232
  <span class="cline-any cline-no">&nbsp;</span>
233
+ <span class="cline-any cline-yes">1x</span>
234
+ <span class="cline-any cline-yes">1x</span>
331
235
  <span class="cline-any cline-no">&nbsp;</span>
236
+ <span class="cline-any cline-yes">1x</span>
237
+ <span class="cline-any cline-yes">1x</span>
332
238
  <span class="cline-any cline-neutral">&nbsp;</span>
333
239
  <span class="cline-any cline-no">&nbsp;</span>
334
- <span class="cline-any cline-no">&nbsp;</span>
335
- <span class="cline-any cline-no">&nbsp;</span>
336
240
  <span class="cline-any cline-neutral">&nbsp;</span>
337
- <span class="cline-any cline-yes">2x</span>
338
- <span class="cline-any cline-no">&nbsp;</span>
339
- <span class="cline-any cline-no">&nbsp;</span>
340
- <span class="cline-any cline-no">&nbsp;</span>
341
- <span class="cline-any cline-no">&nbsp;</span>
241
+ <span class="cline-any cline-yes">1x</span>
242
+ <span class="cline-any cline-yes">1x</span>
342
243
  <span class="cline-any cline-no">&nbsp;</span>
343
244
  <span class="cline-any cline-no">&nbsp;</span>
344
- <span class="cline-any cline-neutral">&nbsp;</span>
345
- <span class="cline-any cline-neutral">&nbsp;</span>
346
- <span class="cline-any cline-no">&nbsp;</span>
245
+ <span class="cline-any cline-yes">1x</span>
347
246
  <span class="cline-any cline-no">&nbsp;</span>
348
247
  <span class="cline-any cline-no">&nbsp;</span>
248
+ <span class="cline-any cline-yes">1x</span>
249
+ <span class="cline-any cline-yes">1x</span>
250
+ <span class="cline-any cline-yes">1x</span>
251
+ <span class="cline-any cline-yes">1x</span>
252
+ <span class="cline-any cline-yes">1x</span>
253
+ <span class="cline-any cline-yes">1x</span>
349
254
  <span class="cline-any cline-no">&nbsp;</span>
350
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>
351
259
  <span class="cline-any cline-neutral">&nbsp;</span>
260
+ <span class="cline-any cline-yes">1x</span>
261
+ <span class="cline-any cline-yes">1x</span>
262
+ <span class="cline-any cline-yes">1x</span>
263
+ <span class="cline-any cline-yes">1x</span>
264
+ <span class="cline-any cline-yes">1x</span>
265
+ <span class="cline-any cline-yes">1x</span>
266
+ <span class="cline-any cline-yes">1x</span>
352
267
  <span class="cline-any cline-neutral">&nbsp;</span>
268
+ <span class="cline-any cline-yes">1x</span>
353
269
  <span class="cline-any cline-neutral">&nbsp;</span>
270
+ <span class="cline-any cline-yes">1x</span>
354
271
  <span class="cline-any cline-no">&nbsp;</span>
355
272
  <span class="cline-any cline-neutral">&nbsp;</span>
356
273
  <span class="cline-any cline-neutral">&nbsp;</span>
357
274
  <span class="cline-any cline-neutral">&nbsp;</span>
358
275
  <span class="cline-any cline-no">&nbsp;</span>
359
276
  <span class="cline-any cline-neutral">&nbsp;</span>
360
- <span class="cline-any cline-yes">2x</span>
361
- <span class="cline-any cline-neutral">&nbsp;</span>
362
277
  <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
366
- <span class="cline-any cline-neutral">&nbsp;</span>
278
+ <span class="cline-any cline-no">&nbsp;</span>
279
+ <span class="cline-any cline-no">&nbsp;</span>
367
280
  <span class="cline-any cline-neutral">&nbsp;</span>
368
281
  <span class="cline-any cline-neutral">&nbsp;</span>
369
282
  <span class="cline-any cline-neutral">&nbsp;</span>
370
283
  <span class="cline-any cline-neutral">&nbsp;</span>
371
284
  <span class="cline-any cline-neutral">&nbsp;</span>
372
285
  <span class="cline-any cline-no">&nbsp;</span>
286
+ <span class="cline-any cline-yes">1x</span>
373
287
  <span class="cline-any cline-neutral">&nbsp;</span>
288
+ <span class="cline-any cline-yes">1x</span>
374
289
  <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>
292
+ <span class="cline-any cline-yes">1x</span>
375
293
  <span class="cline-any cline-neutral">&nbsp;</span>
376
294
  <span class="cline-any cline-neutral">&nbsp;</span>
377
- <span class="cline-any cline-neutral">&nbsp;</span>
378
- <span class="cline-any cline-neutral">&nbsp;</span>
379
- <span class="cline-any cline-neutral">&nbsp;</span>
380
- <span class="cline-any cline-yes">2x</span>
381
- <span class="cline-any cline-yes">2x</span>
382
- <span class="cline-any cline-yes">2x</span>
383
295
  <span class="cline-any cline-no">&nbsp;</span>
384
296
  <span class="cline-any cline-no">&nbsp;</span>
297
+ <span class="cline-any cline-no">&nbsp;</span>
298
+ <span class="cline-any cline-yes">1x</span>
299
+ <span class="cline-any cline-no">&nbsp;</span>
300
+ <span class="cline-any cline-yes">1x</span>
301
+ <span class="cline-any cline-yes">1x</span>
302
+ <span class="cline-any cline-no">&nbsp;</span>
385
303
  <span class="cline-any cline-neutral">&nbsp;</span>
304
+ <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-no">&nbsp;</span>
308
+ <span class="cline-any cline-yes">1x</span>
309
+ <span class="cline-any cline-yes">1x</span>
386
310
  <span class="cline-any cline-neutral">&nbsp;</span>
387
- <span class="cline-any cline-yes">2x</span>
388
- <span class="cline-any cline-yes">2x</span>
389
- <span class="cline-any cline-neutral">&nbsp;</span>
390
- <span class="cline-any cline-yes">2x</span>
391
- <span class="cline-any cline-yes">2x</span>
392
- <span class="cline-any cline-yes">2x</span>
393
- <span class="cline-any cline-yes">2x</span>
394
- <span class="cline-any cline-neutral">&nbsp;</span>
311
+ <span class="cline-any cline-yes">1x</span>
312
+ <span class="cline-any cline-yes">1x</span>
313
+ <span class="cline-any cline-no">&nbsp;</span>
395
314
  <span class="cline-any cline-neutral">&nbsp;</span>
396
315
  <span class="cline-any cline-neutral">&nbsp;</span>
397
- <span class="cline-any cline-yes">2x</span>
316
+ <span class="cline-any cline-yes">1x</span>
398
317
  <span class="cline-any cline-no">&nbsp;</span>
399
318
  <span class="cline-any cline-neutral">&nbsp;</span>
400
- <span class="cline-any cline-yes">2x</span>
401
- <span class="cline-any cline-neutral">&nbsp;</span>
319
+ <span class="cline-any cline-yes">1x</span>
402
320
  <span class="cline-any cline-neutral">&nbsp;</span>
403
321
  <span class="cline-any cline-neutral">&nbsp;</span>
404
322
  <span class="cline-any cline-neutral">&nbsp;</span>
405
323
  <span class="cline-any cline-neutral">&nbsp;</span>
406
- <span class="cline-any cline-yes">2x</span>
407
324
  <span class="cline-any cline-neutral">&nbsp;</span>
325
+ <span class="cline-any cline-yes">1x</span>
408
326
  <span class="cline-any cline-neutral">&nbsp;</span>
409
327
  <span class="cline-any cline-neutral">&nbsp;</span>
410
328
  <span class="cline-any cline-neutral">&nbsp;</span>
329
+ <span class="cline-any cline-yes">1x</span>
411
330
  <span class="cline-any cline-neutral">&nbsp;</span>
331
+ <span class="cline-any cline-yes">1x</span>
412
332
  <span class="cline-any cline-neutral">&nbsp;</span>
413
333
  <span class="cline-any cline-neutral">&nbsp;</span>
414
334
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -428,153 +348,112 @@
428
348
  ContextSummary,
429
349
  ModuleCluster,
430
350
  } from './types';
431
- import { calculatePathEntropy, calculateDirectoryDistance } from './analyzer';
432
351
  import { GLOBAL_SCAN_OPTIONS } from '@aiready/core';
352
+ import { calculatePathEntropy } from './metrics';
433
353
  &nbsp;
434
354
  /**
435
355
  * Generate summary of context analysis results
356
+ *
357
+ * @param result<span class="fstat-no" title="function not covered" >s - Array of ind</span>ividual file analysis results.
358
+ * @param options - Optional scan configuration for context extraction.
359
+ * @returns A consolidated summary of the entire context scan.
436
360
  */
437
- export function generateSummary(
361
+ export function g<span class="cstat-no" title="statement not covered" >enerateSummary(</span>
438
362
  results: ContextAnalysisResult[],
439
- options?: any
440
- ): ContextSummary {
363
+ options: any = {}
364
+ ): ContextSummary {<span class="cstat-no" title="statement not covered" ></span>
441
365
  const config = options
442
366
  ? Object.fromEntries(
443
367
  Object.entries(options).filter(
444
- ([key]) =&gt; !GLOBAL_SCAN_OPTIONS.includes(key) || key === 'rootDir'
368
+ <span class="fstat-no" title="function not covered" > ([</span>key]) =&gt; <span class="cstat-no" title="statement not covered" >!GLOBAL_SCAN_OPTIONS.includes(key) || key === 'rootDir'</span>
445
369
  )
446
370
  )
447
- : undefined;
448
- &nbsp;
449
- <span class="missing-if-branch" title="if path not taken" >I</span>if (results.length === 0) {
450
- <span class="cstat-no" title="statement not covered" > return {</span>
451
- totalFiles: 0,
452
- totalTokens: 0,
453
- avgContextBudget: 0,
454
- maxContextBudget: 0,
455
- avgImportDepth: 0,
456
- maxImportDepth: 0,
457
- deepFiles: [],
458
- avgFragmentation: 0,
459
- fragmentedModules: [],
460
- avgCohesion: 0,
461
- lowCohesionFiles: [],
462
- criticalIssues: 0,
463
- majorIssues: 0,
464
- minorIssues: 0,
465
- totalPotentialSavings: 0,
466
- topExpensiveFiles: [],
467
- config,
468
- };
469
- }
470
- &nbsp;
371
+ : <span class="branch-1 cbranch-no" title="branch not covered" >{};</span>
372
+ <span class="cstat-no" title="statement not covered" ></span>
471
373
  const totalFiles = results.length;
472
374
  const totalTokens = results.reduce((sum, r) =&gt; sum + r.tokenCost, 0);
473
- const totalContextBudget = results.reduce(
474
- (sum, r) =&gt; sum + r.contextBudget,
475
- 0
476
- );
477
- const avgContextBudget = totalContextBudget / totalFiles;
478
- const maxContextBudget = Math.max(...results.map((r) =&gt; r.contextBudget));
479
- &nbsp;
480
- const avgImportDepth =
481
- results.reduce((sum, r) =&gt; sum + r.importDepth, 0) / totalFiles;
482
- const maxImportDepth = Math.max(...results.map((r) =&gt; r.importDepth));
483
- &nbsp;
375
+ const avgContextBu<span class="cstat-no" title="statement not covered" >dget =</span>
376
+ totalFiles &gt; 0
377
+ ? results.reduce((sum, r) =&gt; sum + r.contextBudget, 0) / totalFiles
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>
380
+ // Find deep files
484
381
  const deepFiles = results
485
- .filter((r) =&gt; r.importDepth &gt;= 5)
486
- .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>
487
- .sort(<span class="fstat-no" title="function not covered" >(a</span>, b) =&gt; <span class="cstat-no" title="statement not covered" >b.depth - a.depth)</span>
488
- .slice(0, 10);
489
- &nbsp;
490
- const avgFragmentation =
491
- results.reduce((sum, r) =&gt; sum + r.fragmentationScore, 0) / totalFiles;
492
- &nbsp;
493
- const moduleMap = new Map&lt;string, ContextAnalysisResult[]&gt;();
494
- for (const result of results) {
495
- for (const domain of result.domains) {
496
- <span class="missing-if-branch" title="else path not taken" >E</span>if (!moduleMap.has(domain)) moduleMap.set(domain, []);
497
- moduleMap.get(domain)!.push(result);
498
- }
499
- }
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>
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>
389
+ results.forEach((r) =&gt; {
390
+ const parts = r.file.split('/');
391
+ // Try to identify domain/module (e.g., packages/core, src/utils)
392
+ let domain = 'root';
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>
396
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (!moduleMap.has(domain)) moduleMap.set(domain, []);
397
+ moduleMap.get(domain)!.push(r);
398
+ });<span class="cstat-no" title="statement not covered" ></span>
500
399
  &nbsp;
501
400
  const fragmentedModules: ModuleCluster[] = [];
502
- for (const [domain, files] of moduleMap.entries()) {
503
- <span class="missing-if-branch" title="else path not taken" >E</span>if (files.length &lt; 2) continue;
504
- const fragmentationScore =
505
- <span class="cstat-no" title="statement not covered" > 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.fragmentationScore, 0</span>) / files.length;</span>
506
- <span class="cstat-no" title="statement not covered" > if (fragmentationScore &lt; 0.3) <span class="cstat-no" title="statement not covered" >continue;</span></span>
507
- &nbsp;
508
- const totalTokens = <span class="cstat-no" title="statement not covered" >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.tokenCost, 0</span>);</span>
509
- const avgCohesion =
510
- <span class="cstat-no" title="statement not covered" > 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;</span>
511
- const targetFiles = <span class="cstat-no" title="statement not covered" >Math.max(1, Math.ceil(files.length / 3));</span>
401
+ moduleMap.forEach((files, domain) =&gt; {
402
+ const clusterTokens = files.reduce((sum, f) =&gt; sum + f.tokenCost, 0);
403
+ const filePaths = files.map((f) =&gt; f.file);
404
+ const avgEntropy = calculatePathEntropy(filePaths);
512
405
  &nbsp;
513
- const filePaths = <span class="cstat-no" title="statement not covered" >files.map(<span class="fstat-no" title="function not covered" >(f</span>) =&gt; <span class="cstat-no" title="statement not covered" >f.file)</span>;</span>
514
- const <span class="cstat-no" title="statement not covered" >pathEntropy = calculatePathEntropy(filePaths);</span>
515
- const <span class="cstat-no" title="statement not covered" >directoryDistance = calculateDirectoryDistance(filePaths);</span>
406
+ // A module is fragmented if it has many files with high directory distance
407
+ // and relatively low cohesion
408
+ const fragmentationScore = Math.min(1, avgEntropy * (files.length / 10));
516
409
  &nbsp;
517
- <span class="fstat-no" title="function not covered" > function j</span>accard(a: string[], b: string[]) {
518
- const s1 = <span class="cstat-no" title="statement not covered" >new Set(a || []);</span>
519
- const s2 = <span class="cstat-no" title="statement not covered" >new Set(b || []);</span>
520
- <span class="cstat-no" title="statement not covered" > if (s1.size === 0 &amp;&amp; s2.size === 0) <span class="cstat-no" title="statement not covered" >return 0;</span></span>
521
- const inter = <span class="cstat-no" title="statement not covered" >new Set([...s1].filter(<span class="fstat-no" title="function not covered" >(x</span>) =&gt; <span class="cstat-no" title="statement not covered" >s2.has(x))</span>);</span>
522
- const uni = <span class="cstat-no" title="statement not covered" >new Set([...s1, ...s2]);</span>
523
- <span class="cstat-no" title="statement not covered" > return uni.size === 0 ? 0 : inter.size / uni.size;</span>
524
- }
410
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (fragmentationScore &gt; 0.4) {
411
+ <span class="cstat-no" title="statement not covered" > fragmentedModules.push({</span>
412
+ domain,
413
+ files: filePaths,
414
+ fragmentationScore,
415
+ <span class="cstat-no" title="statement not covered" > totalTokens: clusterTokens,<span class="cstat-no" title="statement not covered" ></span></span>
416
+ avgCohesion:
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>
420
+ consolidationPlan: [
421
+ `Consolidate ${files.length} files in ${domain} into fewer modules`,
422
+ ],
423
+ },
424
+ });
425
+ <span class="cstat-no" title="statement not covered" > }</span>
426
+ });
525
427
  &nbsp;
526
- let importSimTotal = <span class="cstat-no" title="statement not covered" >0;</span>
527
- let importPairs = <span class="cstat-no" title="statement not covered" >0;</span>
528
- <span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0; i</span> &lt; files.length; i++) {</span>
529
- <span class="cstat-no" title="statement not covered" > for (let j = <span class="cstat-no" title="statement not covered" >i + 1; j</span> &lt; files.length; j++) {</span>
530
- <span class="cstat-no" title="statement not covered" > importSimTotal += jaccard(</span>
531
- files[i].dependencyList || [],
532
- files[j].dependencyList || []
533
- );
534
- <span class="cstat-no" title="statement not covered" > importPairs++;</span>
535
- }
536
- }
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>;
537
429
  &nbsp;
538
- const importCohesion = <span class="cstat-no" title="statement not covered" >importPairs &gt; 0 ? importSimTotal / importPairs : 0;</span>
539
- &nbsp;
540
- fragmentedModules.push({
541
- domain,
542
- files: files.map(<span class="fstat-no" title="function not covered" >(f</span>) =&gt; <span class="cstat-no" title="statement not covered" >f.file)</span>,
543
- totalTokens,
544
- fragmentationScore,
545
- avgCohesion,
546
- importCohesion,
547
- pathEntropy,
548
- directoryDistance,
549
- suggestedStructure: {
550
- targetFiles,
551
- consolidationPlan: [
552
- `Consolidate ${files.length} files across ${new Set(files.map(<span class="fstat-no" title="function not covered" >(f</span>) =&gt; <span class="cstat-no" title="statement not covered" >f.file.split('/').slice(0, -1).join('/'))</span>).size} directories`,
553
- `Target ~${targetFiles} core modules to reduce context switching`,
554
- ],
555
- },
556
- });
557
- }
558
- &nbsp;
559
- const avgCohesion =
560
- results.reduce((sum, r) =&gt; sum + r.cohesionScore, 0) / totalFiles;
561
- const lowCohesionFiles = results
430
+ const avgFragmentation =<span class="cstat-no" title="statement not covered" ></span>
431
+ fragmentedModules.length &gt; 0
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
+ fragmentedModules.length
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>
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>
562
441
  .filter((r) =&gt; r.cohesionScore &lt; 0.4)
563
- .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>
564
- .sort(<span class="fstat-no" title="function not covered" >(a</span>, b) =&gt; <span class="cstat-no" title="statement not covered" >a.score - b.score)</span>
565
- .slice(0, 10);
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>;
566
443
  &nbsp;
567
- const criticalIssues = results.filter(
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>
568
446
  (r) =&gt; r.severity === 'critical'
569
- ).length;
447
+ ).length;<span class="cstat-no" title="statement not covered" ></span>
570
448
  const majorIssues = results.filter((r) =&gt; r.severity === 'major').length;
571
449
  const minorIssues = results.filter((r) =&gt; r.severity === 'minor').length;
450
+ &nbsp;
572
451
  const totalPotentialSavings = results.reduce(
573
- (sum, r) =&gt; sum + r.potentialSavings,
574
- 0
452
+ (sum, r) =&gt; sum + (r.potentialSavings || 0),
453
+ <span class="cstat-no" title="statement not covered" > 0</span>
575
454
  );
576
455
  &nbsp;
577
- const topExpensiveFiles = results
456
+ const topExpensiveFiles = [...results]
578
457
  .sort(<span class="fstat-no" title="function not covered" >(a</span>, b) =&gt; <span class="cstat-no" title="statement not covered" >b.contextBudget - a.contextBudget)</span>
579
458
  .slice(0, 10)
580
459
  .map((r) =&gt; ({
@@ -587,8 +466,9 @@ export function generateSummary(
587
466
  totalFiles,
588
467
  totalTokens,
589
468
  avgContextBudget,
590
- maxContextBudget,
591
- avgImportDepth,
469
+ maxContextBudget: Math.max(0, ...results.map((r) =&gt; r.contextBudget)),
470
+ avgImportDepth:
471
+ results.reduce((sum, r) =&gt; sum + r.importDepth, 0) / (totalFiles || <span class="branch-1 cbranch-no" title="branch not covered" >1),</span>
592
472
  maxImportDepth,
593
473
  deepFiles,
594
474
  avgFragmentation,
@@ -610,16 +490,16 @@ export function generateSummary(
610
490
  <div class='footer quiet pad2 space-top1 center small'>
611
491
  Code coverage generated by
612
492
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
613
- at 2026-03-09T02:34:18.551Z
493
+ at 2026-03-21T12:52:37.698Z
614
494
  </div>
615
- <script src="prettify.js"></script>
495
+ <script src="../prettify.js"></script>
616
496
  <script>
617
497
  window.onload = function () {
618
498
  prettyPrint();
619
499
  };
620
500
  </script>
621
- <script src="sorter.js"></script>
622
- <script src="block-navigation.js"></script>
501
+ <script src="../sorter.js"></script>
502
+ <script src="../block-navigation.js"></script>
623
503
  </body>
624
504
  </html>
625
505