@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.
- package/.turbo/turbo-build.log +26 -25
- package/.turbo/turbo-lint.log +5 -5
- package/.turbo/turbo-test.log +104 -41
- package/coverage/clover.xml +2615 -1242
- package/coverage/coverage-final.json +30 -13
- package/coverage/dist/chunk-64U3PNO3.mjs.html +367 -0
- package/coverage/dist/chunk-J3MUOWHC.mjs.html +5326 -0
- package/coverage/dist/index.html +146 -0
- package/coverage/{classifier.ts.html → dist/index.mjs.html} +537 -912
- package/coverage/index.html +84 -189
- package/coverage/src/analyzer.ts.html +88 -0
- package/coverage/src/analyzers/index.html +116 -0
- package/coverage/src/analyzers/python-context.ts.html +910 -0
- package/coverage/{ast-utils.ts.html → src/ast-utils.ts.html} +84 -54
- package/coverage/src/classifier.ts.html +892 -0
- package/coverage/src/classify/classification-patterns.ts.html +307 -0
- package/coverage/src/classify/file-classifiers.ts.html +973 -0
- package/coverage/src/classify/index.html +131 -0
- package/coverage/{cluster-detector.ts.html → src/cluster-detector.ts.html} +154 -91
- package/coverage/{defaults.ts.html → src/defaults.ts.html} +74 -65
- package/coverage/{graph-builder.ts.html → src/graph-builder.ts.html} +268 -229
- package/coverage/src/index.html +341 -0
- package/coverage/{index.ts.html → src/index.ts.html} +70 -13
- package/coverage/{scoring.ts.html → src/issue-analyzer.ts.html} +201 -261
- package/coverage/src/mapper.ts.html +439 -0
- package/coverage/{metrics.ts.html → src/metrics.ts.html} +201 -132
- package/coverage/src/orchestrator.ts.html +493 -0
- package/coverage/{provider.ts.html → src/provider.ts.html} +21 -21
- package/coverage/{remediation.ts.html → src/remediation.ts.html} +112 -52
- package/coverage/src/report/console-report.ts.html +415 -0
- package/coverage/src/report/html-report.ts.html +361 -0
- package/coverage/src/report/index.html +146 -0
- package/coverage/src/report/interactive-setup.ts.html +373 -0
- package/coverage/src/scoring.ts.html +895 -0
- package/coverage/src/semantic/co-usage.ts.html +340 -0
- package/coverage/src/semantic/consolidation.ts.html +223 -0
- package/coverage/src/semantic/domain-inference.ts.html +859 -0
- package/coverage/src/semantic/index.html +161 -0
- package/coverage/src/semantic/type-graph.ts.html +163 -0
- package/coverage/{summary.ts.html → src/summary.ts.html} +155 -275
- package/coverage/{types.ts.html → src/types.ts.html} +133 -31
- package/coverage/src/utils/dependency-graph-utils.ts.html +463 -0
- package/coverage/src/utils/index.html +131 -0
- package/coverage/src/utils/string-utils.ts.html +148 -0
- package/dist/chunk-J3MUOWHC.mjs +1747 -0
- package/dist/cli.js +59 -171
- package/dist/cli.mjs +1 -1
- package/dist/index.js +55 -167
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
- package/src/__tests__/consolidation.test.ts +247 -0
- package/src/__tests__/defaults.test.ts +121 -0
- package/src/__tests__/domain-inference.test.ts +420 -0
- package/src/__tests__/issue-analyzer.test.ts +155 -0
- package/src/__tests__/orchestrator.test.ts +143 -0
- package/src/__tests__/python-context.test.ts +98 -0
- package/src/__tests__/report/console-report.test.ts +292 -0
- package/src/__tests__/report/html-report.test.ts +232 -0
- package/src/report/html-report.ts +58 -174
- package/coverage/analyzer.ts.html +0 -1369
- 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 graph-builder.ts</title>
|
|
6
|
+
<title>Code coverage report for src/graph-builder.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> graph-builder.ts</h1>
|
|
22
|
+
<h1><a href="../index.html">All files</a> / <a href="index.html">src</a> graph-builder.ts</h1>
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">
|
|
26
|
+
<span class="strong">95.4% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>187/196</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">78.72% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>74/94</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'>
|
|
42
|
+
<span class='fraction'>25/25</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">97.
|
|
47
|
+
<span class="strong">97.29% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>144/148</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -321,7 +321,20 @@
|
|
|
321
321
|
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
322
|
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
323
|
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
-
<a name='L259'></a><a href='#L259'>259</a
|
|
324
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
+
<a name='L272'></a><a href='#L272'>272</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
325
338
|
<span class="cline-any cline-neutral"> </span>
|
|
326
339
|
<span class="cline-any cline-neutral"> </span>
|
|
327
340
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -339,144 +352,190 @@
|
|
|
339
352
|
<span class="cline-any cline-neutral"> </span>
|
|
340
353
|
<span class="cline-any cline-neutral"> </span>
|
|
341
354
|
<span class="cline-any cline-neutral"> </span>
|
|
342
|
-
<span class="cline-any cline-yes">17x</span>
|
|
343
|
-
<span class="cline-any cline-neutral"> </span>
|
|
344
|
-
<span class="cline-any cline-yes">17x</span>
|
|
345
|
-
<span class="cline-any cline-yes">33x</span>
|
|
346
|
-
<span class="cline-any cline-yes">33x</span>
|
|
347
|
-
<span class="cline-any cline-neutral"> </span>
|
|
348
|
-
<span class="cline-any cline-neutral"> </span>
|
|
349
|
-
<span class="cline-any cline-neutral"> </span>
|
|
350
|
-
<span class="cline-any cline-neutral"> </span>
|
|
351
|
-
<span class="cline-any cline-neutral"> </span>
|
|
352
|
-
<span class="cline-any cline-neutral"> </span>
|
|
353
|
-
<span class="cline-any cline-neutral"> </span>
|
|
354
|
-
<span class="cline-any cline-neutral"> </span>
|
|
355
|
-
<span class="cline-any cline-neutral"> </span>
|
|
356
355
|
<span class="cline-any cline-neutral"> </span>
|
|
357
356
|
<span class="cline-any cline-neutral"> </span>
|
|
358
357
|
<span class="cline-any cline-neutral"> </span>
|
|
359
358
|
<span class="cline-any cline-neutral"> </span>
|
|
360
359
|
<span class="cline-any cline-neutral"> </span>
|
|
361
360
|
<span class="cline-any cline-neutral"> </span>
|
|
361
|
+
<span class="cline-any cline-yes">29x</span>
|
|
362
|
+
<span class="cline-any cline-yes">56x</span>
|
|
363
|
+
<span class="cline-any cline-yes">22x</span>
|
|
364
|
+
<span class="cline-any cline-yes">15x</span>
|
|
365
|
+
<span class="cline-any cline-no"> </span>
|
|
362
366
|
<span class="cline-any cline-neutral"> </span>
|
|
367
|
+
<span class="cline-any cline-yes">16x</span>
|
|
368
|
+
<span class="cline-any cline-yes">16x</span>
|
|
363
369
|
<span class="cline-any cline-neutral"> </span>
|
|
364
370
|
<span class="cline-any cline-neutral"> </span>
|
|
371
|
+
<span class="cline-any cline-yes">16x</span>
|
|
365
372
|
<span class="cline-any cline-neutral"> </span>
|
|
366
373
|
<span class="cline-any cline-neutral"> </span>
|
|
374
|
+
<span class="cline-any cline-yes">16x</span>
|
|
375
|
+
<span class="cline-any cline-yes">27x</span>
|
|
376
|
+
<span class="cline-any cline-yes">22x</span>
|
|
367
377
|
<span class="cline-any cline-yes">33x</span>
|
|
368
|
-
<span class="cline-any cline-
|
|
369
|
-
<span class="cline-any cline-yes">69x</span>
|
|
370
|
-
<span class="cline-any cline-neutral"> </span>
|
|
378
|
+
<span class="cline-any cline-no"> </span>
|
|
371
379
|
<span class="cline-any cline-neutral"> </span>
|
|
380
|
+
<span class="cline-any cline-no"> </span>
|
|
381
|
+
<span class="cline-any cline-yes">2x</span>
|
|
382
|
+
<span class="cline-any cline-yes">8x</span>
|
|
383
|
+
<span class="cline-any cline-yes">8x</span>
|
|
372
384
|
<span class="cline-any cline-neutral"> </span>
|
|
373
385
|
<span class="cline-any cline-neutral"> </span>
|
|
386
|
+
<span class="cline-any cline-yes">31x</span>
|
|
374
387
|
<span class="cline-any cline-yes">11x</span>
|
|
388
|
+
<span class="cline-any cline-yes">4x</span>
|
|
375
389
|
<span class="cline-any cline-neutral"> </span>
|
|
376
390
|
<span class="cline-any cline-neutral"> </span>
|
|
391
|
+
<span class="cline-any cline-yes">18x</span>
|
|
392
|
+
<span class="cline-any cline-yes">18x</span>
|
|
393
|
+
<span class="cline-any cline-yes">16x</span>
|
|
377
394
|
<span class="cline-any cline-neutral"> </span>
|
|
395
|
+
<span class="cline-any cline-yes">34x</span>
|
|
396
|
+
<span class="cline-any cline-yes">32x</span>
|
|
397
|
+
<span class="cline-any cline-yes">32x</span>
|
|
398
|
+
<span class="cline-any cline-yes">50x</span>
|
|
399
|
+
<span class="cline-any cline-yes">50x</span>
|
|
400
|
+
<span class="cline-any cline-yes">59x</span>
|
|
401
|
+
<span class="cline-any cline-yes">59x</span>
|
|
378
402
|
<span class="cline-any cline-neutral"> </span>
|
|
379
|
-
<span class="cline-any cline-yes">17x</span>
|
|
380
403
|
<span class="cline-any cline-neutral"> </span>
|
|
381
404
|
<span class="cline-any cline-neutral"> </span>
|
|
405
|
+
<span class="cline-any cline-yes">35x</span>
|
|
406
|
+
<span class="cline-any cline-yes">44x</span>
|
|
407
|
+
<span class="cline-any cline-yes">44x</span>
|
|
382
408
|
<span class="cline-any cline-neutral"> </span>
|
|
383
409
|
<span class="cline-any cline-neutral"> </span>
|
|
410
|
+
<span class="cline-any cline-yes">35x</span>
|
|
384
411
|
<span class="cline-any cline-neutral"> </span>
|
|
385
412
|
<span class="cline-any cline-neutral"> </span>
|
|
386
|
-
<span class="cline-any cline-yes">11x</span>
|
|
387
413
|
<span class="cline-any cline-neutral"> </span>
|
|
388
414
|
<span class="cline-any cline-neutral"> </span>
|
|
389
415
|
<span class="cline-any cline-neutral"> </span>
|
|
390
416
|
<span class="cline-any cline-neutral"> </span>
|
|
391
417
|
<span class="cline-any cline-neutral"> </span>
|
|
418
|
+
<span class="cline-any cline-yes">32x</span>
|
|
419
|
+
<span class="cline-any cline-yes">68x</span>
|
|
420
|
+
<span class="cline-any cline-yes">90x</span>
|
|
392
421
|
<span class="cline-any cline-neutral"> </span>
|
|
393
|
-
<span class="cline-any cline-yes">
|
|
394
|
-
<span class="cline-any cline-yes">
|
|
395
|
-
<span class="cline-any cline-yes">
|
|
396
|
-
<span class="cline-any cline-yes">
|
|
422
|
+
<span class="cline-any cline-yes">22x</span>
|
|
423
|
+
<span class="cline-any cline-yes">106x</span>
|
|
424
|
+
<span class="cline-any cline-yes">38x</span>
|
|
425
|
+
<span class="cline-any cline-yes">49x</span>
|
|
397
426
|
<span class="cline-any cline-neutral"> </span>
|
|
398
|
-
<span class="cline-any cline-yes">6x</span>
|
|
399
427
|
<span class="cline-any cline-neutral"> </span>
|
|
400
428
|
<span class="cline-any cline-neutral"> </span>
|
|
401
429
|
<span class="cline-any cline-neutral"> </span>
|
|
430
|
+
<span class="cline-any cline-yes">54x</span>
|
|
402
431
|
<span class="cline-any cline-neutral"> </span>
|
|
403
432
|
<span class="cline-any cline-neutral"> </span>
|
|
404
433
|
<span class="cline-any cline-neutral"> </span>
|
|
405
434
|
<span class="cline-any cline-neutral"> </span>
|
|
406
435
|
<span class="cline-any cline-neutral"> </span>
|
|
407
436
|
<span class="cline-any cline-neutral"> </span>
|
|
408
|
-
<span class="cline-any cline-yes">
|
|
409
|
-
<span class="cline-any cline-yes">18x</span>
|
|
437
|
+
<span class="cline-any cline-yes">49x</span>
|
|
410
438
|
<span class="cline-any cline-neutral"> </span>
|
|
411
439
|
<span class="cline-any cline-neutral"> </span>
|
|
412
|
-
<span class="cline-any cline-yes">18x</span>
|
|
413
440
|
<span class="cline-any cline-neutral"> </span>
|
|
414
|
-
<span class="cline-any cline-yes">18x</span>
|
|
415
441
|
<span class="cline-any cline-neutral"> </span>
|
|
416
|
-
<span class="cline-any cline-yes">34x</span>
|
|
417
|
-
<span class="cline-any cline-yes">34x</span>
|
|
418
442
|
<span class="cline-any cline-neutral"> </span>
|
|
419
443
|
<span class="cline-any cline-neutral"> </span>
|
|
420
|
-
<span class="cline-any cline-yes">
|
|
444
|
+
<span class="cline-any cline-yes">33x</span>
|
|
445
|
+
<span class="cline-any cline-yes">38x</span>
|
|
446
|
+
<span class="cline-any cline-yes">91x</span>
|
|
447
|
+
<span class="cline-any cline-yes">85x</span>
|
|
421
448
|
<span class="cline-any cline-neutral"> </span>
|
|
449
|
+
<span class="cline-any cline-yes">86x</span>
|
|
422
450
|
<span class="cline-any cline-neutral"> </span>
|
|
423
451
|
<span class="cline-any cline-neutral"> </span>
|
|
452
|
+
<span class="cline-any cline-yes">12x</span>
|
|
424
453
|
<span class="cline-any cline-neutral"> </span>
|
|
425
454
|
<span class="cline-any cline-neutral"> </span>
|
|
426
455
|
<span class="cline-any cline-neutral"> </span>
|
|
427
|
-
<span class="cline-any cline-yes">34x</span>
|
|
428
|
-
<span class="cline-any cline-yes">34x</span>
|
|
429
456
|
<span class="cline-any cline-neutral"> </span>
|
|
430
|
-
<span class="cline-any cline-yes">
|
|
457
|
+
<span class="cline-any cline-yes">22x</span>
|
|
431
458
|
<span class="cline-any cline-neutral"> </span>
|
|
459
|
+
<span class="cline-any cline-yes">17x</span>
|
|
460
|
+
<span class="cline-any cline-yes">17x</span>
|
|
432
461
|
<span class="cline-any cline-neutral"> </span>
|
|
433
462
|
<span class="cline-any cline-neutral"> </span>
|
|
463
|
+
<span class="cline-any cline-yes">17x</span>
|
|
434
464
|
<span class="cline-any cline-neutral"> </span>
|
|
465
|
+
<span class="cline-any cline-yes">33x</span>
|
|
435
466
|
<span class="cline-any cline-neutral"> </span>
|
|
467
|
+
<span class="cline-any cline-yes">17x</span>
|
|
436
468
|
<span class="cline-any cline-neutral"> </span>
|
|
437
|
-
<span class="cline-any cline-yes">
|
|
469
|
+
<span class="cline-any cline-yes">33x</span>
|
|
438
470
|
<span class="cline-any cline-neutral"> </span>
|
|
471
|
+
<span class="cline-any cline-yes">40x</span>
|
|
472
|
+
<span class="cline-any cline-yes">40x</span>
|
|
473
|
+
<span class="cline-any cline-yes">27x</span>
|
|
474
|
+
<span class="cline-any cline-yes">27x</span>
|
|
475
|
+
<span class="cline-any cline-yes">40x</span>
|
|
476
|
+
<span class="cline-any cline-yes">33x</span>
|
|
477
|
+
<span class="cline-any cline-yes">56x</span>
|
|
439
478
|
<span class="cline-any cline-neutral"> </span>
|
|
440
|
-
<span class="cline-any cline-yes">
|
|
441
|
-
<span class="cline-any cline-yes">18x</span>
|
|
442
|
-
<span class="cline-any cline-yes">18x</span>
|
|
479
|
+
<span class="cline-any cline-yes">56x</span>
|
|
443
480
|
<span class="cline-any cline-neutral"> </span>
|
|
444
|
-
<span class="cline-any cline-yes">
|
|
445
|
-
<span class="cline-any cline-yes">18x</span>
|
|
481
|
+
<span class="cline-any cline-yes">72x</span>
|
|
446
482
|
<span class="cline-any cline-neutral"> </span>
|
|
447
|
-
<span class="cline-any cline-yes">18x</span>
|
|
448
|
-
<span class="cline-any cline-yes">34x</span>
|
|
449
|
-
<span class="cline-any cline-yes">52x</span>
|
|
450
483
|
<span class="cline-any cline-neutral"> </span>
|
|
484
|
+
<span class="cline-any cline-yes">56x</span>
|
|
485
|
+
<span class="cline-any cline-yes">46x</span>
|
|
486
|
+
<span class="cline-any cline-yes">72x</span>
|
|
487
|
+
<span class="cline-any cline-yes">56x</span>
|
|
488
|
+
<span class="cline-any cline-yes">56x</span>
|
|
489
|
+
<span class="cline-any cline-yes">56x</span>
|
|
451
490
|
<span class="cline-any cline-neutral"> </span>
|
|
491
|
+
<span class="cline-any cline-yes">56x</span>
|
|
452
492
|
<span class="cline-any cline-neutral"> </span>
|
|
453
493
|
<span class="cline-any cline-neutral"> </span>
|
|
454
494
|
<span class="cline-any cline-neutral"> </span>
|
|
455
495
|
<span class="cline-any cline-neutral"> </span>
|
|
496
|
+
<span class="cline-any cline-yes">72x</span>
|
|
456
497
|
<span class="cline-any cline-neutral"> </span>
|
|
457
|
-
<span class="cline-any cline-yes">
|
|
458
|
-
<span class="cline-any cline-yes">
|
|
459
|
-
<span class="cline-any cline-
|
|
498
|
+
<span class="cline-any cline-yes">39x</span>
|
|
499
|
+
<span class="cline-any cline-yes">56x</span>
|
|
500
|
+
<span class="cline-any cline-yes">40x</span>
|
|
501
|
+
<span class="cline-any cline-yes">56x</span>
|
|
460
502
|
<span class="cline-any cline-neutral"> </span>
|
|
503
|
+
<span class="cline-any cline-yes">56x</span>
|
|
504
|
+
<span class="cline-any cline-yes">56x</span>
|
|
461
505
|
<span class="cline-any cline-neutral"> </span>
|
|
506
|
+
<span class="cline-any cline-yes">17x</span>
|
|
507
|
+
<span class="cline-any cline-yes">33x</span>
|
|
508
|
+
<span class="cline-any cline-yes">72x</span>
|
|
462
509
|
<span class="cline-any cline-neutral"> </span>
|
|
463
510
|
<span class="cline-any cline-neutral"> </span>
|
|
464
|
-
<span class="cline-any cline-yes">
|
|
511
|
+
<span class="cline-any cline-yes">74x</span>
|
|
512
|
+
<span class="cline-any cline-yes">74x</span>
|
|
513
|
+
<span class="cline-any cline-yes">74x</span>
|
|
465
514
|
<span class="cline-any cline-neutral"> </span>
|
|
515
|
+
<span class="cline-any cline-yes">56x</span>
|
|
516
|
+
<span class="cline-any cline-yes">74x</span>
|
|
517
|
+
<span class="cline-any cline-yes">51x</span>
|
|
518
|
+
<span class="cline-any cline-yes">23x</span>
|
|
519
|
+
<span class="cline-any cline-yes">39x</span>
|
|
520
|
+
<span class="cline-any cline-yes">57x</span>
|
|
466
521
|
<span class="cline-any cline-neutral"> </span>
|
|
467
522
|
<span class="cline-any cline-neutral"> </span>
|
|
523
|
+
<span class="cline-any cline-yes">74x</span>
|
|
468
524
|
<span class="cline-any cline-neutral"> </span>
|
|
469
525
|
<span class="cline-any cline-neutral"> </span>
|
|
470
526
|
<span class="cline-any cline-neutral"> </span>
|
|
471
527
|
<span class="cline-any cline-neutral"> </span>
|
|
528
|
+
<span class="cline-any cline-yes">57x</span>
|
|
529
|
+
<span class="cline-any cline-yes">57x</span>
|
|
530
|
+
<span class="cline-any cline-no"> </span>
|
|
472
531
|
<span class="cline-any cline-neutral"> </span>
|
|
473
532
|
<span class="cline-any cline-neutral"> </span>
|
|
474
533
|
<span class="cline-any cline-neutral"> </span>
|
|
475
534
|
<span class="cline-any cline-neutral"> </span>
|
|
476
|
-
<span class="cline-any cline-yes">
|
|
535
|
+
<span class="cline-any cline-yes">32x</span>
|
|
477
536
|
<span class="cline-any cline-neutral"> </span>
|
|
478
|
-
<span class="cline-any cline-yes">
|
|
479
|
-
<span class="cline-any cline-yes">
|
|
537
|
+
<span class="cline-any cline-yes">8x</span>
|
|
538
|
+
<span class="cline-any cline-yes">8x</span>
|
|
480
539
|
<span class="cline-any cline-neutral"> </span>
|
|
481
540
|
<span class="cline-any cline-yes">5x</span>
|
|
482
541
|
<span class="cline-any cline-yes">5x</span>
|
|
@@ -491,6 +550,7 @@
|
|
|
491
550
|
<span class="cline-any cline-yes">5x</span>
|
|
492
551
|
<span class="cline-any cline-yes">5x</span>
|
|
493
552
|
<span class="cline-any cline-neutral"> </span>
|
|
553
|
+
<span class="cline-any cline-yes">10x</span>
|
|
494
554
|
<span class="cline-any cline-neutral"> </span>
|
|
495
555
|
<span class="cline-any cline-neutral"> </span>
|
|
496
556
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -499,102 +559,133 @@
|
|
|
499
559
|
<span class="cline-any cline-neutral"> </span>
|
|
500
560
|
<span class="cline-any cline-neutral"> </span>
|
|
501
561
|
<span class="cline-any cline-neutral"> </span>
|
|
502
|
-
<span class="cline-any cline-neutral"> </span>
|
|
503
|
-
<span class="cline-any cline-yes">9x</span>
|
|
504
|
-
<span class="cline-any cline-neutral"> </span>
|
|
505
|
-
<span class="cline-any cline-yes">9x</span>
|
|
506
|
-
<span class="cline-any cline-yes">9x</span>
|
|
507
|
-
<span class="cline-any cline-yes">9x</span>
|
|
508
|
-
<span class="cline-any cline-neutral"> </span>
|
|
509
562
|
<span class="cline-any cline-yes">5x</span>
|
|
563
|
+
<span class="cline-any cline-neutral"> </span>
|
|
510
564
|
<span class="cline-any cline-yes">5x</span>
|
|
511
565
|
<span class="cline-any cline-yes">5x</span>
|
|
512
566
|
<span class="cline-any cline-yes">5x</span>
|
|
513
567
|
<span class="cline-any cline-neutral"> </span>
|
|
568
|
+
<span class="cline-any cline-yes">3x</span>
|
|
569
|
+
<span class="cline-any cline-yes">17x</span>
|
|
570
|
+
<span class="cline-any cline-yes">3x</span>
|
|
571
|
+
<span class="cline-any cline-yes">3x</span>
|
|
514
572
|
<span class="cline-any cline-neutral"> </span>
|
|
515
|
-
<span class="cline-any cline-yes">5x</span>
|
|
516
|
-
<span class="cline-any cline-neutral"> </span>
|
|
517
|
-
<span class="cline-any cline-neutral"> </span>
|
|
518
|
-
<span class="cline-any cline-neutral"> </span>
|
|
519
|
-
<span class="cline-any cline-neutral"> </span>
|
|
520
|
-
<span class="cline-any cline-neutral"> </span>
|
|
521
|
-
<span class="cline-any cline-neutral"> </span>
|
|
522
|
-
<span class="cline-any cline-neutral"> </span>
|
|
523
|
-
<span class="cline-any cline-neutral"> </span>
|
|
524
|
-
<span class="cline-any cline-neutral"> </span>
|
|
525
|
-
<span class="cline-any cline-yes">2x</span>
|
|
526
|
-
<span class="cline-any cline-yes">2x</span>
|
|
527
|
-
<span class="cline-any cline-neutral"> </span>
|
|
528
|
-
<span class="cline-any cline-yes">2x</span>
|
|
529
|
-
<span class="cline-any cline-yes">2x</span>
|
|
530
|
-
<span class="cline-any cline-neutral"> </span>
|
|
531
|
-
<span class="cline-any cline-yes">2x</span>
|
|
532
|
-
<span class="cline-any cline-yes">2x</span>
|
|
533
|
-
<span class="cline-any cline-yes">2x</span>
|
|
534
|
-
<span class="cline-any cline-no"> </span>
|
|
535
573
|
<span class="cline-any cline-neutral"> </span>
|
|
574
|
+
<span class="cline-any cline-yes">3x</span>
|
|
536
575
|
<span class="cline-any cline-neutral"> </span>
|
|
537
576
|
<span class="cline-any cline-neutral"> </span>
|
|
538
|
-
<span class="cline-any cline-yes">2x</span>
|
|
539
577
|
<span class="cline-any cline-neutral"> </span>
|
|
540
578
|
<span class="cline-any cline-neutral"> </span>
|
|
541
579
|
<span class="cline-any cline-neutral"> </span>
|
|
542
580
|
<span class="cline-any cline-neutral"> </span>
|
|
543
581
|
<span class="cline-any cline-neutral"> </span>
|
|
544
582
|
<span class="cline-any cline-neutral"> </span>
|
|
583
|
+
<span class="cline-any cline-yes">7x</span>
|
|
584
|
+
<span class="cline-any cline-yes">7x</span>
|
|
585
|
+
<span class="cline-any cline-yes">1x</span>
|
|
586
|
+
<span class="cline-any cline-yes">7x</span>
|
|
587
|
+
<span class="cline-any cline-yes">8x</span>
|
|
588
|
+
<span class="cline-any cline-yes">1x</span>
|
|
589
|
+
<span class="cline-any cline-yes">7x</span>
|
|
545
590
|
<span class="cline-any cline-yes">3x</span>
|
|
546
591
|
<span class="cline-any cline-yes">3x</span>
|
|
547
|
-
<span class="cline-any cline-yes">3x</span>
|
|
548
|
-
<span class="cline-any cline-neutral"> </span>
|
|
549
|
-
<span class="cline-any cline-neutral"> </span>
|
|
550
592
|
<span class="cline-any cline-yes">8x</span>
|
|
551
|
-
<span class="cline-any cline-yes">
|
|
552
|
-
<span class="cline-any cline-yes">1x</span>
|
|
553
|
-
<span class="cline-any cline-yes">1x</span>
|
|
554
|
-
<span class="cline-any cline-neutral"> </span>
|
|
555
|
-
<span class="cline-any cline-yes">1x</span>
|
|
593
|
+
<span class="cline-any cline-yes">3x</span>
|
|
556
594
|
<span class="cline-any cline-neutral"> </span>
|
|
557
595
|
<span class="cline-any cline-neutral"> </span>
|
|
558
596
|
<span class="cline-any cline-yes">7x</span>
|
|
597
|
+
<span class="cline-any cline-yes">1x</span>
|
|
559
598
|
<span class="cline-any cline-neutral"> </span>
|
|
560
|
-
<span class="cline-any cline-yes">6x</span>
|
|
561
|
-
<span class="cline-any cline-yes">6x</span>
|
|
562
|
-
<span class="cline-any cline-yes">6x</span>
|
|
563
|
-
<span class="cline-any cline-neutral"> </span>
|
|
564
|
-
<span class="cline-any cline-yes">6x</span>
|
|
565
|
-
<span class="cline-any cline-yes">6x</span>
|
|
566
|
-
<span class="cline-any cline-yes">5x</span>
|
|
567
|
-
<span class="cline-any cline-yes">4x</span>
|
|
568
|
-
<span class="cline-any cline-neutral"> </span>
|
|
569
|
-
<span class="cline-any cline-neutral"> </span>
|
|
570
|
-
<span class="cline-any cline-neutral"> </span>
|
|
571
|
-
<span class="cline-any cline-yes">6x</span>
|
|
572
599
|
<span class="cline-any cline-neutral"> </span>
|
|
573
600
|
<span class="cline-any cline-neutral"> </span>
|
|
574
|
-
<span class="cline-any cline-yes">3x</span>
|
|
575
|
-
<span class="cline-any cline-yes">5x</span>
|
|
576
|
-
<span class="cline-any cline-yes">4x</span>
|
|
577
601
|
<span class="cline-any cline-neutral"> </span>
|
|
578
602
|
<span class="cline-any cline-neutral"> </span>
|
|
579
603
|
<span class="cline-any cline-neutral"> </span>
|
|
580
|
-
<span class="cline-any cline-yes">
|
|
604
|
+
<span class="cline-any cline-yes">2x</span>
|
|
605
|
+
<span class="cline-any cline-yes">2x</span>
|
|
606
|
+
<span class="cline-any cline-yes">10x</span>
|
|
581
607
|
<span class="cline-any cline-neutral"> </span>
|
|
582
|
-
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { estimateTokens, parseFileExports } from '@aiready/core';
|
|
583
|
-
import
|
|
608
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { estimateTokens, parseFileExports, FileContent } from '@aiready/core';
|
|
609
|
+
import { singularize } from './utils/string-utils';
|
|
584
610
|
import {
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
} from './
|
|
611
|
+
calculateImportDepthFromEdges,
|
|
612
|
+
detectGraphCycles,
|
|
613
|
+
getTransitiveDependenciesFromEdges,
|
|
614
|
+
} from './utils/dependency-graph-utils';
|
|
615
|
+
import type { DependencyGraph, DependencyNode } from './types';
|
|
616
|
+
import { buildCoUsageMatrix } from './semantic/co-usage';
|
|
617
|
+
import { buildTypeGraph } from './semantic/type-graph';
|
|
618
|
+
import { inferDomainFromSemantics } from './semantic/domain-inference';
|
|
589
619
|
import { extractExportsWithAST } from './ast-utils';
|
|
620
|
+
import { join, dirname, normalize } from 'path';
|
|
621
|
+
|
|
622
|
+
/**
|
|
623
|
+
* Resolve an import source to its absolute path considering the importing file's location
|
|
624
|
+
*/
|
|
625
|
+
function resolveImport(
|
|
626
|
+
source: string,
|
|
627
|
+
importingFile: string,
|
|
628
|
+
allFiles: Set<string>
|
|
629
|
+
): string | null {
|
|
630
|
+
// If it's not a relative import, we treat it as an external dependency for now
|
|
631
|
+
// (unless it's an absolute path that exists in our set)
|
|
632
|
+
if (!source.startsWith('.') && !source.startsWith('/')) {
|
|
633
|
+
// Handle monorepo package imports (@aiready/*)
|
|
634
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (source.startsWith('@aiready/')) {
|
|
635
|
+
const pkgName = source.split('/')[1];
|
|
636
|
+
const possiblePaths = <span class="cstat-no" title="statement not covered" >[</span>
|
|
637
|
+
// Standard src/index.ts entry point for our packages
|
|
638
|
+
join('packages', pkgName, 'src', 'index.ts'),
|
|
639
|
+
join('packages', pkgName, 'src', 'index.tsx'),
|
|
640
|
+
// Support for sub-exports if needed (e.g. @aiready/core/client)
|
|
641
|
+
join(
|
|
642
|
+
<span class="missing-if-branch" title="if path not taken" >I</span> 'packages',<span class="cstat-no" title="statement not covered" ></span>
|
|
643
|
+
pkgName,
|
|
644
|
+
'src',
|
|
645
|
+
`${source.split('/').slice(2).join('/') || 'index'}.ts`
|
|
646
|
+
),
|
|
647
|
+
];
|
|
648
|
+
|
|
649
|
+
<span class="cstat-no" title="statement not covered" > for (const p of possiblePaths) {</span>
|
|
650
|
+
// Find the absolute path that ends with this relative path
|
|
651
|
+
const absolutePkgPath = <span class="cstat-no" title="statement not covered" >Array.from(allFiles).find((f) =></span>
|
|
652
|
+
f.endsWith(normalize(p))
|
|
653
|
+
);
|
|
654
|
+
<span class="missing-if-branch" title="if path not taken" >I</span> <span class="missing-if-branch" title="if path not taken" >I</span>if (absolutePkgPath) retu<span class="cstat-no" title="statement not covered" >rn absolutePkgPath;</span>
|
|
655
|
+
}
|
|
656
|
+
}
|
|
590
657
|
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
658
|
+
if (allFiles.has(source)) return source;
|
|
659
|
+
return null;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
const dir = dirname(importingFile);
|
|
663
|
+
const absolutePath = normalize(join(dir, source));
|
|
664
|
+
|
|
665
|
+
// Try exact match
|
|
666
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (allFiles.has(absolutePath)) return absolutePath;
|
|
667
|
+
|
|
668
|
+
// Try common extensions
|
|
669
|
+
const extensions = ['.ts', '.tsx', '.js', '.jsx'];
|
|
670
|
+
for (const ext of extensions) {
|
|
671
|
+
const withExt = absolutePath + ext;
|
|
672
|
+
if (allFiles.has(withExt)) return withExt;
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
// Try directory index
|
|
676
|
+
for (const ext of extensions) {
|
|
677
|
+
const indexFile = normalize(join(absolutePath, `index${ext}`));
|
|
678
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (allFiles.has(indexFile)) return indexFile;
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
return null;
|
|
594
682
|
}
|
|
595
683
|
|
|
596
684
|
/**
|
|
597
|
-
* Auto-detect domain keywords from workspace folder structure
|
|
685
|
+
* Auto-detect domain keywords from workspace folder structure.
|
|
686
|
+
*
|
|
687
|
+
* @param files - Array of file contents to analyze for folder patterns.
|
|
688
|
+
* @returns Array of singularized domain keywords.
|
|
598
689
|
*/
|
|
599
690
|
export function extractDomainKeywordsFromPaths(files: FileContent[]): string[] {
|
|
600
691
|
const folderNames = new Set<string>();
|
|
@@ -621,9 +712,9 @@ export function extractDomainKeywordsFromPaths(files: FileContent[]): string[] {
|
|
|
621
712
|
'api',
|
|
622
713
|
'apis',
|
|
623
714
|
]);
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
715
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>
|
|
716
|
+
<span class="missing-if-branch" title="if path not taken" >I</span> for (const segment of segments) {
|
|
717
|
+
<span class="missing-if-branch" title="if path not taken" >I</span> const normalized = segment.toLowerCase();
|
|
627
718
|
if (
|
|
628
719
|
normalized &&
|
|
629
720
|
!skipFolders.has(normalized) &&
|
|
@@ -638,26 +729,11 @@ export function extractDomainKeywordsFromPaths(files: FileContent[]): string[] {
|
|
|
638
729
|
}
|
|
639
730
|
|
|
640
731
|
/**
|
|
641
|
-
*
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
children: 'child',
|
|
647
|
-
men: 'man',
|
|
648
|
-
women: 'woman',
|
|
649
|
-
};
|
|
650
|
-
|
|
651
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (irregulars[word]) <span class="cstat-no" title="statement not covered" >return irregulars[word];</span>
|
|
652
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (word.endsWith('ies')) <span class="cstat-no" title="statement not covered" >return word.slice(0, -3) + 'y';</span>
|
|
653
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (word.endsWith('ses')) <span class="cstat-no" title="statement not covered" >return word.slice(0, -2);</span>
|
|
654
|
-
if (word.endsWith('s') && word.length > 3) return word.slice(0, -1);
|
|
655
|
-
|
|
656
|
-
return word;
|
|
657
|
-
}
|
|
658
|
-
|
|
659
|
-
/**
|
|
660
|
-
* Build a dependency graph from file contents
|
|
732
|
+
* Build a dependency graph from file contents, resolving imports and extracting metadata.
|
|
733
|
+
*
|
|
734
|
+
* @param files - Array of file contents to process.
|
|
735
|
+
* @param options - Optional configuration for domain detection.
|
|
736
|
+
* @returns Complete dependency graph with nodes, edges, and semantic matrices.
|
|
661
737
|
*/
|
|
662
738
|
export function buildDependencyGraph(
|
|
663
739
|
files: FileContent[],
|
|
@@ -668,13 +744,21 @@ export function buildDependencyGraph(
|
|
|
668
744
|
|
|
669
745
|
const autoDetectedKeywords =
|
|
670
746
|
options?.domainKeywords ?? extractDomainKeywordsFromPaths(files);
|
|
747
|
+
|
|
748
|
+
const allFilePaths = new Set(files.map((f) => f.file));
|
|
671
749
|
|
|
672
750
|
for (const { file, content } of files) {
|
|
673
751
|
// 1. Get high-fidelity AST-based imports & exports
|
|
674
752
|
const { imports: astImports } = parseFileExports(content, file);
|
|
753
|
+
|
|
754
|
+
// 2. Resolve imports to absolute paths in the graph
|
|
755
|
+
const resolvedImports = astImports
|
|
756
|
+
.map((i) => resolveImport(i.source, file, allFilePaths))
|
|
757
|
+
.filter((path): path is string => path !== null);
|
|
758
|
+
|
|
675
759
|
const importSources = astImports.map((i) => i.source);
|
|
676
760
|
|
|
677
|
-
//
|
|
761
|
+
// 3. Wrap with platform-specific metadata (v0.11+)
|
|
678
762
|
const exports = extractExportsWithAST(
|
|
679
763
|
content,
|
|
680
764
|
file,
|
|
@@ -692,7 +776,7 @@ export function buildDependencyGraph(
|
|
|
692
776
|
tokenCost,
|
|
693
777
|
linesOfCode,
|
|
694
778
|
});
|
|
695
|
-
edges.set(file, new Set(
|
|
779
|
+
edges.set(file, new Set(resolvedImports));
|
|
696
780
|
}
|
|
697
781
|
|
|
698
782
|
const graph: DependencyGraph = { nodes, edges };
|
|
@@ -701,7 +785,7 @@ export function buildDependencyGraph(
|
|
|
701
785
|
|
|
702
786
|
graph.coUsageMatrix = coUsageMatrix;
|
|
703
787
|
graph.typeGraph = typeGraph;
|
|
704
|
-
|
|
788
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>
|
|
705
789
|
for (const [file, node] of nodes) {
|
|
706
790
|
for (const exp of node.exports) {
|
|
707
791
|
const semanticAssignments = inferDomainFromSemantics(
|
|
@@ -723,7 +807,13 @@ export function buildDependencyGraph(
|
|
|
723
807
|
}
|
|
724
808
|
|
|
725
809
|
/**
|
|
726
|
-
* Calculate the maximum depth of import tree for a file
|
|
810
|
+
* Calculate the maximum depth of the import tree for a specific file.
|
|
811
|
+
*
|
|
812
|
+
* @param file - File path to start depth calculation from.
|
|
813
|
+
* @param graph - The dependency graph.
|
|
814
|
+
* @param visited - Optional set to track visited nodes during traversal.
|
|
815
|
+
* @param depth - Current recursion depth.
|
|
816
|
+
* @returns Maximum depth of the import chain.
|
|
727
817
|
*/
|
|
728
818
|
export function calculateImportDepth(
|
|
729
819
|
file: string,
|
|
@@ -731,50 +821,31 @@ export function calculateImportDepth(
|
|
|
731
821
|
visited = new Set<string>(),
|
|
732
822
|
depth = 0
|
|
733
823
|
): number {
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
const dependencies = graph.edges.get(file);
|
|
737
|
-
if (!dependencies || dependencies.size === 0) return depth;
|
|
738
|
-
|
|
739
|
-
visited.add(file);
|
|
740
|
-
let maxDepth = depth;
|
|
741
|
-
|
|
742
|
-
for (const dep of dependencies) {
|
|
743
|
-
maxDepth = Math.max(
|
|
744
|
-
maxDepth,
|
|
745
|
-
calculateImportDepth(dep, graph, visited, depth + 1)
|
|
746
|
-
);
|
|
747
|
-
}
|
|
748
|
-
|
|
749
|
-
visited.delete(file);
|
|
750
|
-
return maxDepth;
|
|
824
|
+
return calculateImportDepthFromEdges(file, graph.edges, visited, depth);
|
|
751
825
|
}
|
|
752
826
|
|
|
753
827
|
/**
|
|
754
|
-
*
|
|
828
|
+
* Retrieve all transitive dependencies for a specific file.
|
|
829
|
+
*
|
|
830
|
+
* @param file - File path to analyze.
|
|
831
|
+
* @param graph - The dependency graph.
|
|
832
|
+
* @param visited - Optional set to track visited nodes.
|
|
833
|
+
*<span class="missing-if-branch" title="if path not taken" >I</span> @returns Array of all <span class="cstat-no" title="statement not covered" >reachable file paths.</span>
|
|
755
834
|
*/
|
|
756
835
|
export function getTransitiveDependencies(
|
|
757
836
|
file: string,
|
|
758
837
|
graph: DependencyGraph,
|
|
759
838
|
visited = new Set<string>()
|
|
760
839
|
): string[] {
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
visited.add(file);
|
|
764
|
-
const dependencies = graph.edges.get(file);
|
|
765
|
-
if (!dependencies || dependencies.size === 0) return [];
|
|
766
|
-
|
|
767
|
-
const allDeps: string[] = [];
|
|
768
|
-
for (const dep of dependencies) {
|
|
769
|
-
allDeps.push(dep);
|
|
770
|
-
allDeps.push(...getTransitiveDependencies(dep, graph, visited));
|
|
771
|
-
}
|
|
772
|
-
|
|
773
|
-
return [...new Set(allDeps)];
|
|
840
|
+
return getTransitiveDependenciesFromEdges(file, graph.edges, visited);
|
|
774
841
|
}
|
|
775
842
|
|
|
776
843
|
/**
|
|
777
|
-
* Calculate total context budget (tokens needed to understand this file)
|
|
844
|
+
* Calculate total context budget (tokens needed to understand this file and its dependencies).
|
|
845
|
+
*
|
|
846
|
+
* @param file - File path to calculate budget for.
|
|
847
|
+
* @param graph - The dependency graph.
|
|
848
|
+
* @returns Total token count including recursive dependencies.
|
|
778
849
|
*/
|
|
779
850
|
export function calculateContextBudget(
|
|
780
851
|
file: string,
|
|
@@ -782,14 +853,14 @@ export function calculateContextBudget(
|
|
|
782
853
|
): number {
|
|
783
854
|
const node = graph.nodes.get(file);
|
|
784
855
|
<span class="missing-if-branch" title="if path not taken" >I</span>if (!node) <span class="cstat-no" title="statement not covered" >return 0;</span>
|
|
785
|
-
|
|
856
|
+
<span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span></span>
|
|
786
857
|
let totalTokens = node.tokenCost;
|
|
787
858
|
const deps = getTransitiveDependencies(file, graph);
|
|
788
859
|
|
|
789
860
|
for (const dep of deps) {
|
|
790
861
|
const depNode = graph.nodes.get(dep);
|
|
791
|
-
<span class="missing-if-branch" title="
|
|
792
|
-
<span class="
|
|
862
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (depNode) {
|
|
863
|
+
<span class="missing-if-branch" title="else path not taken" >E</span> totalTokens += depNode.tokenCost;
|
|
793
864
|
}
|
|
794
865
|
}
|
|
795
866
|
|
|
@@ -797,45 +868,13 @@ export function calculateContextBudget(
|
|
|
797
868
|
}
|
|
798
869
|
|
|
799
870
|
/**
|
|
800
|
-
* Detect circular dependencies
|
|
871
|
+
* Detect circular dependencies (cycles) within the dependency graph.
|
|
872
|
+
*
|
|
873
|
+
* @param graph - The dependency graph to scan.
|
|
874
|
+
* @returns Array of dependency cycles (each cycle is an array of file paths).
|
|
801
875
|
*/
|
|
802
876
|
export function detectCircularDependencies(graph: DependencyGraph): string[][] {
|
|
803
|
-
|
|
804
|
-
const visited = new Set<string>();
|
|
805
|
-
const recursionStack = new Set<string>();
|
|
806
|
-
|
|
807
|
-
function dfs(file: string, path: string[]): void {
|
|
808
|
-
if (recursionStack.has(file)) {
|
|
809
|
-
const cycleStart = path.indexOf(file);
|
|
810
|
-
<span class="missing-if-branch" title="else path not taken" >E</span>if (cycleStart !== -1) {
|
|
811
|
-
cycles.push([...path.slice(cycleStart), file]);
|
|
812
|
-
}
|
|
813
|
-
return;
|
|
814
|
-
}
|
|
815
|
-
|
|
816
|
-
if (visited.has(file)) return;
|
|
817
|
-
|
|
818
|
-
visited.add(file);
|
|
819
|
-
recursionStack.add(file);
|
|
820
|
-
path.push(file);
|
|
821
|
-
|
|
822
|
-
const dependencies = graph.edges.get(file);
|
|
823
|
-
if (dependencies) {
|
|
824
|
-
for (const dep of dependencies) {
|
|
825
|
-
dfs(dep, [...path]);
|
|
826
|
-
}
|
|
827
|
-
}
|
|
828
|
-
|
|
829
|
-
recursionStack.delete(file);
|
|
830
|
-
}
|
|
831
|
-
|
|
832
|
-
for (const file of graph.nodes.keys()) {
|
|
833
|
-
if (!visited.has(file)) {
|
|
834
|
-
dfs(file, []);
|
|
835
|
-
}
|
|
836
|
-
}
|
|
837
|
-
|
|
838
|
-
return cycles;
|
|
877
|
+
return detectGraphCycles(graph.edges);
|
|
839
878
|
}
|
|
840
879
|
</pre></td></tr></table></pre>
|
|
841
880
|
|
|
@@ -844,16 +883,16 @@ export function detectCircularDependencies(graph: DependencyGraph): string[][] {
|
|
|
844
883
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
845
884
|
Code coverage generated by
|
|
846
885
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
847
|
-
at 2026-03-
|
|
886
|
+
at 2026-03-21T12:52:37.698Z
|
|
848
887
|
</div>
|
|
849
|
-
<script src="prettify.js"></script>
|
|
888
|
+
<script src="../prettify.js"></script>
|
|
850
889
|
<script>
|
|
851
890
|
window.onload = function () {
|
|
852
891
|
prettyPrint();
|
|
853
892
|
};
|
|
854
893
|
</script>
|
|
855
|
-
<script src="sorter.js"></script>
|
|
856
|
-
<script src="block-navigation.js"></script>
|
|
894
|
+
<script src="../sorter.js"></script>
|
|
895
|
+
<script src="../block-navigation.js"></script>
|
|
857
896
|
</body>
|
|
858
897
|
</html>
|
|
859
898
|
|