@aiready/context-analyzer 0.21.22 → 0.21.23

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 (61) hide show
  1. package/.turbo/turbo-build.log +26 -25
  2. package/.turbo/turbo-lint.log +5 -5
  3. package/.turbo/turbo-test.log +104 -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-J3MUOWHC.mjs +1747 -0
  46. package/dist/cli.js +59 -171
  47. package/dist/cli.mjs +1 -1
  48. package/dist/index.js +55 -167
  49. package/dist/index.mjs +1 -1
  50. package/package.json +2 -2
  51. package/src/__tests__/consolidation.test.ts +247 -0
  52. package/src/__tests__/defaults.test.ts +121 -0
  53. package/src/__tests__/domain-inference.test.ts +420 -0
  54. package/src/__tests__/issue-analyzer.test.ts +155 -0
  55. package/src/__tests__/orchestrator.test.ts +143 -0
  56. package/src/__tests__/python-context.test.ts +98 -0
  57. package/src/__tests__/report/console-report.test.ts +292 -0
  58. package/src/__tests__/report/html-report.test.ts +232 -0
  59. package/src/report/html-report.ts +58 -174
  60. package/coverage/analyzer.ts.html +0 -1369
  61. package/coverage/semantic-analysis.ts.html +0 -1201
@@ -0,0 +1,131 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/classify</title>
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" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> src/classify</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">96.42% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>108/112</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">75% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>84/112</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>33/33</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">100% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>105/105</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <div class="pad1">
66
+ <table class="coverage-summary">
67
+ <thead>
68
+ <tr>
69
+ <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
70
+ <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
71
+ <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
72
+ <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
73
+ <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
74
+ <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
75
+ <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
76
+ <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
77
+ <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
78
+ <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
79
+ </tr>
80
+ </thead>
81
+ <tbody><tr>
82
+ <td class="file high" data-value="classification-patterns.ts"><a href="classification-patterns.ts.html">classification-patterns.ts</a></td>
83
+ <td data-value="100" class="pic high">
84
+ <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
85
+ </td>
86
+ <td data-value="100" class="pct high">100%</td>
87
+ <td data-value="9" class="abs high">9/9</td>
88
+ <td data-value="100" class="pct high">100%</td>
89
+ <td data-value="0" class="abs high">0/0</td>
90
+ <td data-value="100" class="pct high">100%</td>
91
+ <td data-value="0" class="abs high">0/0</td>
92
+ <td data-value="100" class="pct high">100%</td>
93
+ <td data-value="9" class="abs high">9/9</td>
94
+ </tr>
95
+
96
+ <tr>
97
+ <td class="file high" data-value="file-classifiers.ts"><a href="file-classifiers.ts.html">file-classifiers.ts</a></td>
98
+ <td data-value="96.11" class="pic high">
99
+ <div class="chart"><div class="cover-fill" style="width: 96%"></div><div class="cover-empty" style="width: 4%"></div></div>
100
+ </td>
101
+ <td data-value="96.11" class="pct high">96.11%</td>
102
+ <td data-value="103" class="abs high">99/103</td>
103
+ <td data-value="75" class="pct medium">75%</td>
104
+ <td data-value="112" class="abs medium">84/112</td>
105
+ <td data-value="100" class="pct high">100%</td>
106
+ <td data-value="33" class="abs high">33/33</td>
107
+ <td data-value="100" class="pct high">100%</td>
108
+ <td data-value="96" class="abs high">96/96</td>
109
+ </tr>
110
+
111
+ </tbody>
112
+ </table>
113
+ </div>
114
+ <div class='push'></div><!-- for sticky footer -->
115
+ </div><!-- /wrapper -->
116
+ <div class='footer quiet pad2 space-top1 center small'>
117
+ Code coverage generated by
118
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
+ at 2026-03-21T12:52:37.698Z
120
+ </div>
121
+ <script src="../../prettify.js"></script>
122
+ <script>
123
+ window.onload = function () {
124
+ prettyPrint();
125
+ };
126
+ </script>
127
+ <script src="../../sorter.js"></script>
128
+ <script src="../../block-navigation.js"></script>
129
+ </body>
130
+ </html>
131
+
@@ -3,15 +3,15 @@
3
3
  <html lang="en">
4
4
 
5
5
  <head>
6
- <title>Code coverage report for cluster-detector.ts</title>
6
+ <title>Code coverage report for src/cluster-detector.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> cluster-detector.ts</h1>
22
+ <h1><a href="../index.html">All files</a> / <a href="index.html">src</a> cluster-detector.ts</h1>
23
23
  <div class='clearfix'>
24
24
 
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'>43/43</span>
28
+ <span class='fraction'>92/92</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
33
  <span class="strong">77.27% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>17/22</span>
35
+ <span class='fraction'>34/44</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
40
  <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>6/6</span>
42
+ <span class='fraction'>12/12</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">100% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>38/38</span>
49
+ <span class='fraction'>71/71</span>
50
50
  </div>
51
51
 
52
52
 
@@ -163,7 +163,28 @@
163
163
  <a name='L98'></a><a href='#L98'>98</a>
164
164
  <a name='L99'></a><a href='#L99'>99</a>
165
165
  <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
167
188
  <span class="cline-any cline-neutral">&nbsp;</span>
168
189
  <span class="cline-any cline-neutral">&nbsp;</span>
169
190
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -173,41 +194,72 @@
173
194
  <span class="cline-any cline-neutral">&nbsp;</span>
174
195
  <span class="cline-any cline-neutral">&nbsp;</span>
175
196
  <span class="cline-any cline-neutral">&nbsp;</span>
176
- <span class="cline-any cline-yes">6x</span>
197
+ <span class="cline-any cline-yes">5x</span>
177
198
  <span class="cline-any cline-neutral">&nbsp;</span>
199
+ <span class="cline-any cline-yes">5x</span>
200
+ <span class="cline-any cline-yes">13x</span>
201
+ <span class="cline-any cline-yes">13x</span>
178
202
  <span class="cline-any cline-yes">6x</span>
179
- <span class="cline-any cline-yes">14x</span>
180
- <span class="cline-any cline-yes">14x</span>
181
- <span class="cline-any cline-yes">7x</span>
182
- <span class="cline-any cline-neutral">&nbsp;</span>
183
- <span class="cline-any cline-yes">14x</span>
184
203
  <span class="cline-any cline-neutral">&nbsp;</span>
204
+ <span class="cline-any cline-yes">13x</span>
205
+ <span class="cline-any cline-yes">16x</span>
185
206
  <span class="cline-any cline-neutral">&nbsp;</span>
186
- <span class="cline-any cline-yes">6x</span>
187
- <span class="cline-any cline-neutral">&nbsp;</span>
188
- <span class="cline-any cline-yes">6x</span>
189
- <span class="cline-any cline-yes">7x</span>
207
+ <span class="cline-any cline-yes">16x</span>
208
+ <span class="cline-any cline-yes">19x</span>
209
+ <span class="cline-any cline-yes">24x</span>
210
+ <span class="cline-any cline-yes">25x</span>
190
211
  <span class="cline-any cline-neutral">&nbsp;</span>
191
- <span class="cline-any cline-yes">5x</span>
212
+ <span class="cline-any cline-yes">24x</span>
213
+ <span class="cline-any cline-yes">23x</span>
192
214
  <span class="cline-any cline-yes">12x</span>
215
+ <span class="cline-any cline-yes">16x</span>
216
+ <span class="cline-any cline-neutral">&nbsp;</span>
217
+ <span class="cline-any cline-yes">16x</span>
218
+ <span class="cline-any cline-yes">16x</span>
219
+ <span class="cline-any cline-yes">16x</span>
220
+ <span class="cline-any cline-yes">16x</span>
221
+ <span class="cline-any cline-yes">23x</span>
222
+ <span class="cline-any cline-yes">10x</span>
223
+ <span class="cline-any cline-yes">16x</span>
224
+ <span class="cline-any cline-yes">16x</span>
225
+ <span class="cline-any cline-yes">10x</span>
226
+ <span class="cline-any cline-yes">16x</span>
227
+ <span class="cline-any cline-yes">7x</span>
228
+ <span class="cline-any cline-yes">7x</span>
193
229
  <span class="cline-any cline-yes">12x</span>
194
230
  <span class="cline-any cline-neutral">&nbsp;</span>
231
+ <span class="cline-any cline-yes">10x</span>
232
+ <span class="cline-any cline-yes">8x</span>
195
233
  <span class="cline-any cline-neutral">&nbsp;</span>
196
234
  <span class="cline-any cline-neutral">&nbsp;</span>
197
- <span class="cline-any cline-yes">5x</span>
198
- <span class="cline-any cline-yes">5x</span>
199
- <span class="cline-any cline-yes">5x</span>
200
- <span class="cline-any cline-yes">12x</span>
235
+ <span class="cline-any cline-yes">16x</span>
201
236
  <span class="cline-any cline-neutral">&nbsp;</span>
202
- <span class="cline-any cline-yes">5x</span>
203
- <span class="cline-any cline-yes">5x</span>
237
+ <span class="cline-any cline-yes">10x</span>
238
+ <span class="cline-any cline-neutral">&nbsp;</span>
239
+ <span class="cline-any cline-neutral">&nbsp;</span>
240
+ <span class="cline-any cline-yes">11x</span>
241
+ <span class="cline-any cline-yes">16x</span>
242
+ <span class="cline-any cline-yes">16x</span>
243
+ <span class="cline-any cline-yes">23x</span>
244
+ <span class="cline-any cline-yes">24x</span>
245
+ <span class="cline-any cline-yes">17x</span>
246
+ <span class="cline-any cline-yes">10x</span>
204
247
  <span class="cline-any cline-neutral">&nbsp;</span>
248
+ <span class="cline-any cline-yes">16x</span>
249
+ <span class="cline-any cline-yes">10x</span>
205
250
  <span class="cline-any cline-yes">5x</span>
206
- <span class="cline-any cline-yes">7x</span>
207
- <span class="cline-any cline-yes">7x</span>
208
- <span class="cline-any cline-yes">7x</span>
251
+ <span class="cline-any cline-yes">10x</span>
252
+ <span class="cline-any cline-yes">17x</span>
253
+ <span class="cline-any cline-neutral">&nbsp;</span>
254
+ <span class="cline-any cline-yes">10x</span>
255
+ <span class="cline-any cline-yes">10x</span>
209
256
  <span class="cline-any cline-neutral">&nbsp;</span>
257
+ <span class="cline-any cline-yes">10x</span>
258
+ <span class="cline-any cline-yes">12x</span>
259
+ <span class="cline-any cline-yes">12x</span>
260
+ <span class="cline-any cline-yes">12x</span>
210
261
  <span class="cline-any cline-neutral">&nbsp;</span>
262
+ <span class="cline-any cline-yes">10x</span>
211
263
  <span class="cline-any cline-yes">7x</span>
212
264
  <span class="cline-any cline-neutral">&nbsp;</span>
213
265
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -215,60 +267,58 @@
215
267
  <span class="cline-any cline-neutral">&nbsp;</span>
216
268
  <span class="cline-any cline-neutral">&nbsp;</span>
217
269
  <span class="cline-any cline-neutral">&nbsp;</span>
218
- <span class="cline-any cline-neutral">&nbsp;</span>
219
- <span class="cline-any cline-neutral">&nbsp;</span>
270
+ <span class="cline-any cline-yes">16x</span>
271
+ <span class="cline-any cline-yes">16x</span>
220
272
  <span class="cline-any cline-yes">5x</span>
273
+ <span class="cline-any cline-yes">16x</span>
274
+ <span class="cline-any cline-yes">14x</span>
221
275
  <span class="cline-any cline-yes">5x</span>
276
+ <span class="cline-any cline-yes">15x</span>
222
277
  <span class="cline-any cline-yes">12x</span>
223
278
  <span class="cline-any cline-yes">12x</span>
224
- <span class="cline-any cline-neutral">&nbsp;</span>
225
- <span class="cline-any cline-yes">5x</span>
226
- <span class="cline-any cline-neutral">&nbsp;</span>
227
- <span class="cline-any cline-yes">5x</span>
228
- <span class="cline-any cline-neutral">&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
- <span class="cline-any cline-neutral">&nbsp;</span>
234
- <span class="cline-any cline-neutral">&nbsp;</span>
235
- <span class="cline-any cline-neutral">&nbsp;</span>
236
- <span class="cline-any cline-neutral">&nbsp;</span>
237
- <span class="cline-any cline-neutral">&nbsp;</span>
279
+ <span class="cline-any cline-yes">17x</span>
280
+ <span class="cline-any cline-yes">13x</span>
281
+ <span class="cline-any cline-yes">13x</span>
282
+ <span class="cline-any cline-yes">12x</span>
238
283
  <span class="cline-any cline-neutral">&nbsp;</span>
239
284
  <span class="cline-any cline-neutral">&nbsp;</span>
285
+ <span class="cline-any cline-yes">17x</span>
240
286
  <span class="cline-any cline-neutral">&nbsp;</span>
241
- <span class="cline-any cline-yes">6x</span>
242
287
  <span class="cline-any cline-neutral">&nbsp;</span>
243
288
  <span class="cline-any cline-neutral">&nbsp;</span>
289
+ <span class="cline-any cline-yes">5x</span>
290
+ <span class="cline-any cline-yes">5x</span>
244
291
  <span class="cline-any cline-neutral">&nbsp;</span>
292
+ <span class="cline-any cline-yes">5x</span>
245
293
  <span class="cline-any cline-neutral">&nbsp;</span>
246
294
  <span class="cline-any cline-neutral">&nbsp;</span>
247
295
  <span class="cline-any cline-neutral">&nbsp;</span>
248
296
  <span class="cline-any cline-neutral">&nbsp;</span>
249
- <span class="cline-any cline-yes">5x</span>
250
- <span class="cline-any cline-yes">5x</span>
251
297
  <span class="cline-any cline-neutral">&nbsp;</span>
252
- <span class="cline-any cline-yes">5x</span>
253
- <span class="cline-any cline-yes">3x</span>
254
298
  <span class="cline-any cline-neutral">&nbsp;</span>
255
299
  <span class="cline-any cline-neutral">&nbsp;</span>
256
300
  <span class="cline-any cline-neutral">&nbsp;</span>
257
301
  <span class="cline-any cline-neutral">&nbsp;</span>
258
- <span class="cline-any cline-yes">5x</span>
259
- <span class="cline-any cline-yes">1x</span>
260
302
  <span class="cline-any cline-neutral">&nbsp;</span>
261
303
  <span class="cline-any cline-neutral">&nbsp;</span>
262
304
  <span class="cline-any cline-neutral">&nbsp;</span>
263
305
  <span class="cline-any cline-neutral">&nbsp;</span>
264
- <span class="cline-any cline-yes">5x</span>
306
+ <span class="cline-any cline-yes">11x</span>
265
307
  <span class="cline-any cline-neutral">&nbsp;</span>
266
308
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { DependencyGraph, ModuleCluster } from './types';
267
309
  import { calculateFragmentation, calculateEnhancedCohesion } from './metrics';
310
+ import {
311
+ classifyFile,
312
+ adjustFragmentationForClassification,
313
+ } from './classifier';
268
314
  &nbsp;
269
315
  /**
270
316
  * Group files by domain to detect module clusters
271
- */
317
+ * @param graph - The dependency graph to analyze
318
+ * @param options - Optional configuration options
319
+ * @param options.useLogScale - Whether to use logarithmic scaling for calculations
320
+ * @returns Array of module clusters
321
+ */<span class="branch-1 cbranch-no" title="branch not covered" ></span>
272
322
  export function detectModuleClusters(
273
323
  graph: DependencyGraph,
274
324
  options?: { useLogScale?: boolean }
@@ -282,14 +332,37 @@ export function detectModuleClusters(
282
332
  }
283
333
  domainMap.get(primaryDomain)!.push(file);
284
334
  }
285
- &nbsp;
335
+ <span class="branch-1 cbranch-no" title="branch not covered" ></span>
286
336
  const clusters: ModuleCluster[] = [];
337
+ &nbsp;
338
+ const generateSuggestedStructure = (
339
+ files: string[],
340
+ <span class="missing-if-branch" title="else path not taken" >E</span>tokens: number,
341
+ fragmentation: number
342
+ ) =&gt; {<span class="branch-1 cbranch-no" title="branch not covered" ></span>
343
+ const targetFiles = Math.max(1, Math.ceil(tokens / 10000));
344
+ const plan: string[] = [];
345
+ &nbsp;
346
+ if (fragmentation &gt; 0.5) {
347
+ plan.push(
348
+ `Consolidate ${files.length} files scattered across multiple directories into ${targetFiles} core module(s)`
349
+ );
350
+ }
351
+ &nbsp;
352
+ if (tokens &gt; 20000) {
353
+ plan.push(
354
+ `Domain logic is very large (${Math.round(tokens / 1000)}k tokens). Ensure clear sub-domain boundaries.`
355
+ );
356
+ }
357
+ &nbsp;
358
+ return { targetFiles, consolidationPlan: plan };
359
+ };
287
360
  &nbsp;
288
361
  for (const [domain, files] of domainMap.entries()) {
289
362
  if (files.length &lt; 2 || domain === 'unknown') continue;
290
363
  &nbsp;
291
364
  const totalTokens = files.reduce((sum, file) =&gt; {
292
- const node = graph.nodes.get(file);
365
+ <span class="missing-if-branch" title="else path not taken" >E</span>const node = graph.nodes.get(file);
293
366
  return sum + (node?.tokenCost || <span class="branch-1 cbranch-no" title="branch not covered" >0);</span>
294
367
  }, 0);
295
368
  &nbsp;
@@ -300,7 +373,7 @@ export function detectModuleClusters(
300
373
  (f) =&gt; new Set(graph.nodes.get(f)?.imports || <span class="branch-1 cbranch-no" title="branch not covered" >[])</span>
301
374
  );
302
375
  let intersection = new Set(allImportSets[0]);
303
- let union = new Set(allImportSets[0]);
376
+ const union = new Set(allImportSets[0]);
304
377
  &nbsp;
305
378
  for (let i = 1; i &lt; allImportSets.length; i++) {
306
379
  const nextSet = allImportSets[i];
@@ -311,58 +384,48 @@ export function detectModuleClusters(
311
384
  sharedImportRatio = union.size &gt; 0 ? intersection.size / union.size : 0;
312
385
  }
313
386
  &nbsp;
314
- const fragmentation = calculateFragmentation(files, domain, {
387
+ const rawFragmentation = calculateFragmentation(files, domain, {
315
388
  ...options,
316
389
  sharedImportRatio,
317
390
  });
318
391
  &nbsp;
319
- // Average cohesion for the cluster
392
+ // Average cohesion and adjusted fragmentation for the cluster
320
393
  let totalCohesion = 0;
394
+ let totalAdjustedFragmentation = 0;
395
+ &nbsp;
321
396
  files.forEach((f) =&gt; {
322
397
  const node = graph.nodes.get(f);
323
- <span class="missing-if-branch" title="else path not taken" >E</span>if (node) totalCohesion += calculateEnhancedCohesion(node.exports);
398
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (node) {
399
+ const cohesion = calculateEnhancedCohesion(node.exports);
400
+ totalCohesion += cohesion;
401
+ &nbsp;
402
+ const classification = classifyFile(node, cohesion);
403
+ totalAdjustedFragmentation += adjustFragmentationForClassification(
404
+ rawFragmentation,
405
+ classification
406
+ );
407
+ }
324
408
  });
409
+ &nbsp;
325
410
  const avgCohesion = totalCohesion / files.length;
411
+ const fragmentationScore = totalAdjustedFragmentation / files.length;
326
412
  &nbsp;
327
413
  clusters.push({
328
414
  domain,
329
415
  files,
330
416
  totalTokens,
331
- fragmentationScore: fragmentation,
417
+ fragmentationScore,
332
418
  avgCohesion,
333
419
  suggestedStructure: generateSuggestedStructure(
334
420
  files,
335
421
  totalTokens,
336
- fragmentation
422
+ fragmentationScore
337
423
  ),
338
424
  });
339
425
  }
340
426
  &nbsp;
341
427
  return clusters;
342
428
  }
343
- &nbsp;
344
- function generateSuggestedStructure(
345
- files: string[],
346
- tokens: number,
347
- fragmentation: number
348
- ) {
349
- const targetFiles = Math.max(1, Math.ceil(tokens / 10000));
350
- const plan: string[] = [];
351
- &nbsp;
352
- if (fragmentation &gt; 0.5) {
353
- plan.push(
354
- `Consolidate ${files.length} files scattered across multiple directories into ${targetFiles} core module(s)`
355
- );
356
- }
357
- &nbsp;
358
- if (tokens &gt; 20000) {
359
- plan.push(
360
- `Domain logic is very large (${Math.round(tokens / 1000)}k tokens). Ensure clear sub-domain boundaries.`
361
- );
362
- }
363
- &nbsp;
364
- return { targetFiles, consolidationPlan: plan };
365
- }
366
429
  &nbsp;</pre></td></tr></table></pre>
367
430
 
368
431
  <div class='push'></div><!-- for sticky footer -->
@@ -370,16 +433,16 @@ function generateSuggestedStructure(
370
433
  <div class='footer quiet pad2 space-top1 center small'>
371
434
  Code coverage generated by
372
435
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
373
- at 2026-03-09T02:34:18.551Z
436
+ at 2026-03-21T12:52:37.698Z
374
437
  </div>
375
- <script src="prettify.js"></script>
438
+ <script src="../prettify.js"></script>
376
439
  <script>
377
440
  window.onload = function () {
378
441
  prettyPrint();
379
442
  };
380
443
  </script>
381
- <script src="sorter.js"></script>
382
- <script src="block-navigation.js"></script>
444
+ <script src="../sorter.js"></script>
445
+ <script src="../block-navigation.js"></script>
383
446
  </body>
384
447
  </html>
385
448