@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
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">100% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>14/14</span>
28
+ <span class='fraction'>11/11</span>
29
29
  </div>
30
30
 
31
31
 
@@ -39,14 +39,14 @@
39
39
  <div class='fl pad1y space-right2'>
40
40
  <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>7/7</span>
42
+ <span class='fraction'>4/4</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'>9/9</span>
49
+ <span class='fraction'>11/11</span>
50
50
  </div>
51
51
 
52
52
 
@@ -146,21 +146,23 @@
146
146
  <span class="cline-any cline-neutral">&nbsp;</span>
147
147
  <span class="cline-any cline-neutral">&nbsp;</span>
148
148
  <span class="cline-any cline-neutral">&nbsp;</span>
149
+ <span class="cline-any cline-yes">11x</span>
149
150
  <span class="cline-any cline-neutral">&nbsp;</span>
150
151
  <span class="cline-any cline-neutral">&nbsp;</span>
151
- <span class="cline-any cline-yes">12x</span>
152
152
  <span class="cline-any cline-neutral">&nbsp;</span>
153
153
  <span class="cline-any cline-neutral">&nbsp;</span>
154
+ <span class="cline-any cline-yes">1x</span>
155
+ <span class="cline-any cline-yes">1x</span>
154
156
  <span class="cline-any cline-neutral">&nbsp;</span>
157
+ <span class="cline-any cline-yes">1x</span>
158
+ <span class="cline-any cline-yes">1x</span>
155
159
  <span class="cline-any cline-neutral">&nbsp;</span>
156
- <span class="cline-any cline-yes">2x</span>
157
- <span class="cline-any cline-yes">2x</span>
158
160
  <span class="cline-any cline-neutral">&nbsp;</span>
161
+ <span class="cline-any cline-yes">1x</span>
162
+ <span class="cline-any cline-yes">1x</span>
159
163
  <span class="cline-any cline-neutral">&nbsp;</span>
160
- <span class="cline-any cline-yes">2x</span>
161
- <span class="cline-any cline-yes">2x</span>
164
+ <span class="cline-any cline-yes">1x</span>
162
165
  <span class="cline-any cline-neutral">&nbsp;</span>
163
- <span class="cline-any cline-yes">2x</span>
164
166
  <span class="cline-any cline-neutral">&nbsp;</span>
165
167
  <span class="cline-any cline-neutral">&nbsp;</span>
166
168
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -173,9 +175,9 @@
173
175
  <span class="cline-any cline-neutral">&nbsp;</span>
174
176
  <span class="cline-any cline-neutral">&nbsp;</span>
175
177
  <span class="cline-any cline-neutral">&nbsp;</span>
178
+ <span class="cline-any cline-yes">1x</span>
176
179
  <span class="cline-any cline-neutral">&nbsp;</span>
177
180
  <span class="cline-any cline-neutral">&nbsp;</span>
178
- <span class="cline-any cline-yes">2x</span>
179
181
  <span class="cline-any cline-neutral">&nbsp;</span>
180
182
  <span class="cline-any cline-neutral">&nbsp;</span>
181
183
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -187,10 +189,8 @@
187
189
  <span class="cline-any cline-neutral">&nbsp;</span>
188
190
  <span class="cline-any cline-neutral">&nbsp;</span>
189
191
  <span class="cline-any cline-neutral">&nbsp;</span>
190
- <span class="cline-any cline-neutral">&nbsp;</span>
191
- <span class="cline-any cline-neutral">&nbsp;</span>
192
- <span class="cline-any cline-yes">2x</span>
193
- <span class="cline-any cline-yes">2x</span>
192
+ <span class="cline-any cline-yes">1x</span>
193
+ <span class="cline-any cline-yes">1x</span>
194
194
  <span class="cline-any cline-neutral">&nbsp;</span>
195
195
  <span class="cline-any cline-neutral">&nbsp;</span>
196
196
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -206,10 +206,8 @@
206
206
  IssueType,
207
207
  SpokeOutputSchema,
208
208
  } from '@aiready/core';
209
- import { analyzeContext } from './analyzer';
210
- import { generateSummary } from './summary';
211
209
  import { calculateContextScore } from './scoring';
212
- import { ContextAnalyzerOptions, ContextAnalysisResult } from './types';
210
+ import type { ContextAnalyzerOptions, ContextAnalysisResult } from './types';
213
211
  &nbsp;
214
212
  /**
215
213
  * Context Analyzer Tool Provider
@@ -219,6 +217,9 @@ export const ContextAnalyzerProvider: ToolProvider = {
219
217
  alias: ['context', 'fragmentation', 'budget'],
220
218
  &nbsp;
221
219
  async analyze(options: ScanOptions): Promise&lt;SpokeOutput&gt; {
220
+ const { analyzeContext } = await import('./orchestrator');
221
+ const { generateSummary } = await import('./summary');
222
+ &nbsp;
222
223
  const results = await analyzeContext(options as ContextAnalyzerOptions);
223
224
  const summary = generateSummary(results, options);
224
225
  &nbsp;
@@ -236,7 +237,6 @@ export const ContextAnalyzerProvider: ToolProvider = {
236
237
  metrics: {
237
238
  tokenCost: r.tokenCost,
238
239
  complexityScore: r.importDepth,
239
- // Map other context-specific metrics if needed
240
240
  },
241
241
  })
242
242
  );
@@ -268,7 +268,7 @@ export const ContextAnalyzerProvider: ToolProvider = {
268
268
  <div class='footer quiet pad2 space-top1 center small'>
269
269
  Code coverage generated by
270
270
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
271
- at 2026-03-21T12:52:37.698Z
271
+ at 2026-03-24T11:20:59.666Z
272
272
  </div>
273
273
  <script src="../prettify.js"></script>
274
274
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">84.61% </span>
26
+ <span class="strong">78.04% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>66/78</span>
28
+ <span class='fraction'>32/41</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">78.57% </span>
33
+ <span class="strong">72.41% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>44/56</span>
35
+ <span class='fraction'>21/29</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'>4/4</span>
42
+ <span class='fraction'>2/2</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">86.56% </span>
47
+ <span class="strong">81.57% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>58/67</span>
49
+ <span class='fraction'>31/38</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 high'></div>
64
+ <div class='status-line medium'></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>
@@ -232,60 +232,60 @@
232
232
  <span class="cline-any cline-neutral">&nbsp;</span>
233
233
  <span class="cline-any cline-neutral">&nbsp;</span>
234
234
  <span class="cline-any cline-neutral">&nbsp;</span>
235
- <span class="cline-any cline-yes">13x</span>
236
235
  <span class="cline-any cline-neutral">&nbsp;</span>
237
- <span class="cline-any cline-yes">2x</span>
236
+ <span class="cline-any cline-neutral">&nbsp;</span>
237
+ <span class="cline-any cline-neutral">&nbsp;</span>
238
238
  <span class="cline-any cline-neutral">&nbsp;</span>
239
239
  <span class="cline-any cline-neutral">&nbsp;</span>
240
240
  <span class="cline-any cline-yes">20x</span>
241
241
  <span class="cline-any cline-neutral">&nbsp;</span>
242
- <span class="cline-any cline-yes">14x</span>
242
+ <span class="cline-any cline-yes">1x</span>
243
+ <span class="cline-any cline-neutral">&nbsp;</span>
244
+ <span class="cline-any cline-neutral">&nbsp;</span>
243
245
  <span class="cline-any cline-neutral">&nbsp;</span>
244
246
  <span class="cline-any cline-neutral">&nbsp;</span>
245
247
  <span class="cline-any cline-neutral">&nbsp;</span>
248
+ <span class="cline-any cline-yes">3x</span>
249
+ <span class="cline-any cline-neutral">&nbsp;</span>
246
250
  <span class="cline-any cline-neutral">&nbsp;</span>
247
- <span class="cline-any cline-yes">21x</span>
248
- <span class="cline-any cline-yes">16x</span>
249
251
  <span class="cline-any cline-neutral">&nbsp;</span>
250
252
  <span class="cline-any cline-neutral">&nbsp;</span>
253
+ <span class="cline-any cline-yes">2x</span>
251
254
  <span class="cline-any cline-neutral">&nbsp;</span>
252
- <span class="cline-any cline-yes">21x</span>
253
- <span class="cline-any cline-yes">15x</span>
254
255
  <span class="cline-any cline-neutral">&nbsp;</span>
255
256
  <span class="cline-any cline-neutral">&nbsp;</span>
256
257
  <span class="cline-any cline-neutral">&nbsp;</span>
257
- <span class="cline-any cline-yes">21x</span>
258
- <span class="cline-any cline-yes">19x</span>
258
+ <span class="cline-any cline-yes">6x</span>
259
259
  <span class="cline-any cline-neutral">&nbsp;</span>
260
260
  <span class="cline-any cline-neutral">&nbsp;</span>
261
261
  <span class="cline-any cline-neutral">&nbsp;</span>
262
- <span class="cline-any cline-yes">21x</span>
263
- <span class="cline-any cline-yes">14x</span>
264
262
  <span class="cline-any cline-neutral">&nbsp;</span>
263
+ <span class="cline-any cline-yes">1x</span>
265
264
  <span class="cline-any cline-neutral">&nbsp;</span>
266
265
  <span class="cline-any cline-neutral">&nbsp;</span>
267
- <span class="cline-any cline-yes">21x</span>
268
- <span class="cline-any cline-yes">14x</span>
269
266
  <span class="cline-any cline-neutral">&nbsp;</span>
270
267
  <span class="cline-any cline-neutral">&nbsp;</span>
268
+ <span class="cline-any cline-yes">1x</span>
271
269
  <span class="cline-any cline-neutral">&nbsp;</span>
272
- <span class="cline-any cline-yes">21x</span>
273
- <span class="cline-any cline-yes">14x</span>
274
270
  <span class="cline-any cline-neutral">&nbsp;</span>
275
271
  <span class="cline-any cline-neutral">&nbsp;</span>
276
272
  <span class="cline-any cline-neutral">&nbsp;</span>
277
- <span class="cline-any cline-yes">21x</span>
278
- <span class="cline-any cline-yes">14x</span>
273
+ <span class="cline-any cline-yes">1x</span>
279
274
  <span class="cline-any cline-neutral">&nbsp;</span>
280
275
  <span class="cline-any cline-neutral">&nbsp;</span>
281
276
  <span class="cline-any cline-neutral">&nbsp;</span>
282
- <span class="cline-any cline-yes">21x</span>
283
- <span class="cline-any cline-yes">2x</span>
284
277
  <span class="cline-any cline-neutral">&nbsp;</span>
278
+ <span class="cline-any cline-yes">1x</span>
285
279
  <span class="cline-any cline-neutral">&nbsp;</span>
286
280
  <span class="cline-any cline-neutral">&nbsp;</span>
287
281
  <span class="cline-any cline-neutral">&nbsp;</span>
288
- <span class="cline-any cline-yes">2x</span>
282
+ <span class="cline-any cline-neutral">&nbsp;</span>
283
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
289
289
  <span class="cline-any cline-neutral">&nbsp;</span>
290
290
  <span class="cline-any cline-neutral">&nbsp;</span>
291
291
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -311,6 +311,26 @@
311
311
  <span class="cline-any cline-neutral">&nbsp;</span>
312
312
  <span class="cline-any cline-neutral">&nbsp;</span>
313
313
  <span class="cline-any cline-neutral">&nbsp;</span>
314
+ <span class="cline-any cline-neutral">&nbsp;</span>
315
+ <span class="cline-any cline-neutral">&nbsp;</span>
316
+ <span class="cline-any cline-neutral">&nbsp;</span>
317
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
322
+ <span class="cline-any cline-neutral">&nbsp;</span>
323
+ <span class="cline-any cline-neutral">&nbsp;</span>
324
+ <span class="cline-any cline-neutral">&nbsp;</span>
325
+ <span class="cline-any cline-neutral">&nbsp;</span>
326
+ <span class="cline-any cline-neutral">&nbsp;</span>
327
+ <span class="cline-any cline-neutral">&nbsp;</span>
328
+ <span class="cline-any cline-neutral">&nbsp;</span>
329
+ <span class="cline-any cline-neutral">&nbsp;</span>
330
+ <span class="cline-any cline-neutral">&nbsp;</span>
331
+ <span class="cline-any cline-neutral">&nbsp;</span>
332
+ <span class="cline-any cline-neutral">&nbsp;</span>
333
+ <span class="cline-any cline-neutral">&nbsp;</span>
314
334
  <span class="cline-any cline-yes">3x</span>
315
335
  <span class="cline-any cline-yes">3x</span>
316
336
  <span class="cline-any cline-yes">3x</span>
@@ -331,35 +351,15 @@
331
351
  <span class="cline-any cline-no">&nbsp;</span>
332
352
  <span class="cline-any cline-neutral">&nbsp;</span>
333
353
  <span class="cline-any cline-neutral">&nbsp;</span>
334
- <span class="cline-any cline-yes">6x</span>
335
- <span class="cline-any cline-yes">4x</span>
336
- <span class="cline-any cline-yes">4x</span>
337
- <span class="cline-any cline-neutral">&nbsp;</span>
338
- <span class="cline-any cline-yes">4x</span>
339
- <span class="cline-any cline-yes">4x</span>
340
- <span class="cline-any cline-neutral">&nbsp;</span>
341
- <span class="cline-any cline-yes">2x</span>
342
- <span class="cline-any cline-yes">1x</span>
343
- <span class="cline-any cline-neutral">&nbsp;</span>
344
354
  <span class="cline-any cline-yes">3x</span>
345
- <span class="cline-any cline-yes">2x</span>
346
355
  <span class="cline-any cline-yes">1x</span>
347
356
  <span class="cline-any cline-neutral">&nbsp;</span>
348
- <span class="cline-any cline-yes">3x</span>
349
- <span class="cline-any cline-yes">1x</span>
350
- <span class="cline-any cline-yes">3x</span>
351
- <span class="cline-any cline-no">&nbsp;</span>
352
- <span class="cline-any cline-yes">3x</span>
353
- <span class="cline-any cline-no">&nbsp;</span>
354
- <span class="cline-any cline-yes">3x</span>
355
- <span class="cline-any cline-yes">4x</span>
356
- <span class="cline-any cline-yes">3x</span>
357
357
  <span class="cline-any cline-neutral">&nbsp;</span>
358
- <span class="cline-any cline-yes">4x</span>
359
358
  <span class="cline-any cline-yes">1x</span>
360
359
  <span class="cline-any cline-neutral">&nbsp;</span>
360
+ <span class="cline-any cline-neutral">&nbsp;</span>
361
361
  <span class="cline-any cline-yes">1x</span>
362
- <span class="cline-any cline-yes">6x</span>
362
+ <span class="cline-any cline-neutral">&nbsp;</span>
363
363
  <span class="cline-any cline-neutral">&nbsp;</span>
364
364
  <span class="cline-any cline-yes">3x</span>
365
365
  <span class="cline-any cline-yes">1x</span>
@@ -484,10 +484,10 @@ export function getGeneralRecommendations(
484
484
  maxDepth: number;
485
485
  minCohesion: number;
486
486
  maxFragmentation: number;
487
- <span class="missing-if-branch" title="if path not taken" >I</span>}
488
- ): {<span class="cstat-no" title="statement not covered" ></span>
489
- re<span class="cstat-no" title="statement not covered" >commendations: string[];</span>
490
- is<span class="cstat-no" title="statement not covered" >sues: string[];<span class="cstat-no" title="statement not covered" ></span></span>
487
+ }
488
+ ): {
489
+ recommendations: string[];
490
+ issues: string[];
491
491
  severity: any;
492
492
  } {
493
493
  const recommendations: string[] = [];
@@ -505,11 +505,11 @@ export function getGeneralRecommendations(
505
505
  }
506
506
  &nbsp;
507
507
  <span class="missing-if-branch" title="if path not taken" >I</span>if (metrics.importDepth &gt; thresholds.maxDepth) {
508
- issues.push(`Deep import chain: ${metrics.importDepth} levels`);
509
- recommendations.push('Flatten the dependency graph by reducing nesting');
508
+ <span class="cstat-no" title="statement not covered" > issues.push(`Deep import chain: ${metrics.importDepth} levels`);</span>
509
+ <span class="cstat-no" title="statement not covered" > recommendations.push('Flatten the dependency graph by reducing nesting');</span>
510
510
  <span class="cstat-no" title="statement not covered" > if (severity !== 'critical') <span class="cstat-no" title="statement not covered" >severity = 'major';</span></span>
511
- <span class="missing-if-branch" title="if path not taken" >I</span>}
512
- <span class="cstat-no" title="statement not covered" ></span>
511
+ }
512
+ &nbsp;
513
513
  if (metrics.circularDeps.length &gt; 0) {
514
514
  issues.push(
515
515
  `Circular dependencies detected: ${metrics.circularDeps.length}`
@@ -547,7 +547,7 @@ export function getGeneralRecommendations(
547
547
  <div class='footer quiet pad2 space-top1 center small'>
548
548
  Code coverage generated by
549
549
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
550
- at 2026-03-21T12:52:37.698Z
550
+ at 2026-03-24T11:20:59.666Z
551
551
  </div>
552
552
  <script src="../prettify.js"></script>
553
553
  <script>
@@ -284,7 +284,7 @@
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></td><td class="text"><pre class="prettyprint lang-js">import chalk from 'chalk';
287
- import { analyzeContext } from '../analyzer';
287
+ import { analyzeContext } from '../orchestrator';
288
288
  import { generateSummary } from '../summary';
289
289
  &nbsp;
290
290
  /**
@@ -400,7 +400,7 @@ export function displayConsoleReport(
400
400
  <div class='footer quiet pad2 space-top1 center small'>
401
401
  Code coverage generated by
402
402
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
403
- at 2026-03-21T12:52:37.698Z
403
+ at 2026-03-24T11:20:59.666Z
404
404
  </div>
405
405
  <script src="../../prettify.js"></script>
406
406
  <script>
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">100% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>17/17</span>
28
+ <span class='fraction'>13/13</span>
29
29
  </div>
30
30
 
31
31
 
@@ -46,7 +46,7 @@
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'>15/15</span>
49
+ <span class='fraction'>13/13</span>
50
50
  </div>
51
51
 
52
52
 
@@ -147,16 +147,7 @@
147
147
  <a name='L82'></a><a href='#L82'>82</a>
148
148
  <a name='L83'></a><a href='#L83'>83</a>
149
149
  <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
159
- <span class="cline-any cline-neutral">&nbsp;</span>
150
+ <a name='L85'></a><a href='#L85'>85</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
160
151
  <span class="cline-any cline-neutral">&nbsp;</span>
161
152
  <span class="cline-any cline-neutral">&nbsp;</span>
162
153
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -173,10 +164,6 @@
173
164
  <span class="cline-any cline-neutral">&nbsp;</span>
174
165
  <span class="cline-any cline-neutral">&nbsp;</span>
175
166
  <span class="cline-any cline-yes">11x</span>
176
- <span class="cline-any cline-neutral">&nbsp;</span>
177
- <span class="cline-any cline-neutral">&nbsp;</span>
178
- <span class="cline-any cline-yes">11x</span>
179
- <span class="cline-any cline-neutral">&nbsp;</span>
180
167
  <span class="cline-any cline-yes">11x</span>
181
168
  <span class="cline-any cline-neutral">&nbsp;</span>
182
169
  <span class="cline-any cline-yes">11x</span>
@@ -191,11 +178,6 @@
191
178
  <span class="cline-any cline-neutral">&nbsp;</span>
192
179
  <span class="cline-any cline-neutral">&nbsp;</span>
193
180
  <span class="cline-any cline-yes">11x</span>
194
- <span class="cline-any cline-neutral">&nbsp;</span>
195
- <span class="cline-any cline-neutral">&nbsp;</span>
196
- <span class="cline-any cline-neutral">&nbsp;</span>
197
- <span class="cline-any cline-neutral">&nbsp;</span>
198
- <span class="cline-any cline-neutral">&nbsp;</span>
199
181
  <span class="cline-any cline-yes">11x</span>
200
182
  <span class="cline-any cline-yes">10x</span>
201
183
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -213,27 +195,24 @@
213
195
  <span class="cline-any cline-neutral">&nbsp;</span>
214
196
  <span class="cline-any cline-neutral">&nbsp;</span>
215
197
  <span class="cline-any cline-neutral">&nbsp;</span>
216
- <span class="cline-any cline-neutral">&nbsp;</span>
217
- <span class="cline-any cline-neutral">&nbsp;</span>
218
198
  <span class="cline-any cline-yes">1x</span>
219
199
  <span class="cline-any cline-neutral">&nbsp;</span>
220
200
  <span class="cline-any cline-neutral">&nbsp;</span>
221
201
  <span class="cline-any cline-neutral">&nbsp;</span>
222
202
  <span class="cline-any cline-neutral">&nbsp;</span>
223
203
  <span class="cline-any cline-neutral">&nbsp;</span>
224
- <span class="cline-any cline-yes">11x</span>
225
- <span class="cline-any cline-yes">2x</span>
226
204
  <span class="cline-any cline-neutral">&nbsp;</span>
227
205
  <span class="cline-any cline-neutral">&nbsp;</span>
228
206
  <span class="cline-any cline-neutral">&nbsp;</span>
229
207
  <span class="cline-any cline-neutral">&nbsp;</span>
208
+ <span class="cline-any cline-yes">11x</span>
230
209
  <span class="cline-any cline-yes">1x</span>
231
210
  <span class="cline-any cline-neutral">&nbsp;</span>
232
211
  <span class="cline-any cline-neutral">&nbsp;</span>
233
212
  <span class="cline-any cline-neutral">&nbsp;</span>
213
+ <span class="cline-any cline-yes">2x</span>
234
214
  <span class="cline-any cline-neutral">&nbsp;</span>
235
215
  <span class="cline-any cline-neutral">&nbsp;</span>
236
- <span class="cline-any cline-yes">11x</span>
237
216
  <span class="cline-any cline-neutral">&nbsp;</span>
238
217
  <span class="cline-any cline-neutral">&nbsp;</span>
239
218
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -247,13 +226,17 @@
247
226
  <span class="cline-any cline-neutral">&nbsp;</span>
248
227
  <span class="cline-any cline-neutral">&nbsp;</span>
249
228
  <span class="cline-any cline-neutral">&nbsp;</span>
250
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { analyzeContext } from '../analyzer';
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></td><td class="text"><pre class="prettyprint lang-js">import { analyzeContext } from '../orchestrator';
251
235
  import { generateSummary } from '../summary';
252
236
  import {
253
- generateReportHead,
254
- generateStatCards,
237
+ generateIssueSummary,
255
238
  generateTable,
256
- generateReportFooter,
239
+ generateStandardHtmlReport,
257
240
  } from '@aiready/core';
258
241
  &nbsp;
259
242
  /**
@@ -265,13 +248,9 @@ export function generateHTMLReport(
265
248
  ): string {
266
249
  const totalIssues =
267
250
  summary.criticalIssues + summary.majorIssues + summary.minorIssues;
268
- &nbsp;
269
- // 'results' may be used in templates later; reference to avoid lint warnings
270
251
  void results;
271
252
  &nbsp;
272
- const head = generateReportHead('AIReady Context Analysis Report');
273
- &nbsp;
274
- const stats = generateStatCards([
253
+ const stats = [
275
254
  { value: summary.totalFiles, label: 'Files Analyzed' },
276
255
  { value: summary.totalTokens.toLocaleString(), label: 'Total Tokens' },
277
256
  { value: summary.avgContextBudget.toFixed(0), label: 'Avg Context Budget' },
@@ -280,64 +259,61 @@ export function generateHTMLReport(
280
259
  label: 'Total Issues',
281
260
  color: totalIssues &gt; 0 ? '#f39c12' : undefined,
282
261
  },
283
- ]);
284
- &nbsp;
285
- let body = `&lt;div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 30px; border-radius: 8px; margin-bottom: 30px;"&gt;
286
- &lt;h1 style="border: none; color: white; margin: 0;"&gt;🔍 AIReady Context Analysis Report&lt;/h1&gt;
287
- &lt;p style="margin: 10px 0 0 0;"&gt;Generated on ${new Date().toLocaleString()}&lt;/p&gt;
288
- &lt;/div&gt;
289
- ${stats}`;
262
+ ];
290
263
  &nbsp;
264
+ const sections: any[] = [];
291
265
  if (totalIssues &gt; 0) {
292
- body += `&lt;div class="card" style="margin-bottom: 30px;"&gt;
293
- &lt;h2&gt;⚠️ Issues Summary&lt;/h2&gt;
294
- &lt;p&gt;
295
- &lt;span class="critical"&gt;🔴 Critical: ${summary.criticalIssues}&lt;/span&gt; &amp;nbsp;
296
- &lt;span class="major"&gt;🟡 Major: ${summary.majorIssues}&lt;/span&gt; &amp;nbsp;
297
- &lt;span class="minor"&gt;🔵 Minor: ${summary.minorIssues}&lt;/span&gt;
298
- &lt;/p&gt;
299
- &lt;p&gt;&lt;strong&gt;Potential Savings:&lt;/strong&gt; ${summary.totalPotentialSavings.toLocaleString()} tokens&lt;/p&gt;
300
- &lt;/div&gt;`;
266
+ sections.push({
267
+ title: '⚠️ Issues Summary',
268
+ content: generateIssueSummary(
269
+ summary.criticalIssues,
270
+ summary.majorIssues,
271
+ summary.minorIssues,
272
+ summary.totalPotentialSavings
273
+ ),
274
+ });
301
275
  }
302
276
  &nbsp;
303
277
  if (summary.fragmentedModules.length &gt; 0) {
304
- const fragmentedRows = summary.fragmentedModules.map((m) =&gt; [
305
- m.domain,
306
- String(m.files.length),
307
- `${(m.fragmentationScore * 100).toFixed(0)}%`,
308
- m.totalTokens.toLocaleString(),
309
- ]);
310
- body += `&lt;div class="card" style="margin-bottom: 30px;"&gt;
311
- &lt;h2&gt;🧩 Fragmented Modules&lt;/h2&gt;
312
- ${generateTable({ headers: ['Domain', 'Files', 'Fragmentation', 'Token Cost'], rows: fragmentedRows })}
313
- &lt;/div&gt;`;
278
+ sections.push({
279
+ title: '🧩 Fragmented Modules',
280
+ content: generateTable({
281
+ headers: ['Domain', 'Files', 'Fragmentation', 'Token Cost'],
282
+ rows: summary.fragmentedModules.map((m) =&gt; [
283
+ m.domain,
284
+ String(m.files.length),
285
+ `${(m.fragmentationScore * 100).toFixed(0)}%`,
286
+ m.totalTokens.toLocaleString(),
287
+ ]),
288
+ }),
289
+ });
314
290
  }
315
291
  &nbsp;
316
292
  if (summary.topExpensiveFiles.length &gt; 0) {
317
- const expensiveRows = summary.topExpensiveFiles.map((f) =&gt; [
318
- f.file,
319
- `${f.contextBudget.toLocaleString()} tokens`,
320
- `&lt;span class="issue-${f.severity}"&gt;${f.severity.toUpperCase()}&lt;/span&gt;`,
321
- ]);
322
- body += `&lt;div class="card" style="margin-bottom: 30px;"&gt;
323
- &lt;h2&gt;💸 Most Expensive Files&lt;/h2&gt;
324
- ${generateTable({ headers: ['File', 'Context Budget', 'Severity'], rows: expensiveRows })}
325
- &lt;/div&gt;`;
293
+ sections.push({
294
+ title: '💸 Most Expensive Files',
295
+ content: generateTable({
296
+ headers: ['File', 'Context Budget', 'Severity'],
297
+ rows: summary.topExpensiveFiles.map((f) =&gt; [
298
+ f.file,
299
+ `${f.contextBudget.toLocaleString()} tokens`,
300
+ `&lt;span class="issue-${f.severity}"&gt;${f.severity.toUpperCase()}&lt;/span&gt;`,
301
+ ]),
302
+ }),
303
+ });
326
304
  }
327
305
  &nbsp;
328
- const footer = generateReportFooter({
329
- title: 'Context Analysis Report',
330
- packageName: 'context-analyzer',
331
- packageUrl: 'https://github.com/caopengau/aiready-context-analyzer',
332
- bugUrl: 'https://github.com/caopengau/aiready-context-analyzer/issues',
333
- });
334
- &nbsp;
335
- return `${head}
336
- &lt;body&gt;
337
- ${body}
338
- ${footer}
339
- &lt;/body&gt;
340
- &lt;/html&gt;`;
306
+ return generateStandardHtmlReport(
307
+ {
308
+ title: 'Context Analysis Report',
309
+ packageName: 'context-analyzer',
310
+ packageUrl: 'https://github.com/caopengau/aiready-context-analyzer',
311
+ bugUrl: 'https://github.com/caopengau/aiready-context-analyzer/issues',
312
+ emoji: '🧠',
313
+ },
314
+ stats,
315
+ sections
316
+ );
341
317
  }
342
318
  &nbsp;</pre></td></tr></table></pre>
343
319
 
@@ -346,7 +322,7 @@ ${stats}`;
346
322
  <div class='footer quiet pad2 space-top1 center small'>
347
323
  Code coverage generated by
348
324
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
349
- at 2026-03-21T12:52:37.698Z
325
+ at 2026-03-24T11:20:59.666Z
350
326
  </div>
351
327
  <script src="../../prettify.js"></script>
352
328
  <script>