@aiready/context-analyzer 0.22.8 → 0.22.11
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 +33 -32
- package/.turbo/turbo-format-check.log +2 -2
- package/.turbo/turbo-lint.log +9 -1
- package/.turbo/turbo-test.log +23 -23
- package/.turbo/turbo-type-check.log +1 -1
- package/dist/chunk-HD4Y3GYL.mjs +124 -0
- package/dist/{chunk-M2EGQ36M.mjs → chunk-ISWPFG2C.mjs} +43 -98
- package/dist/{chunk-BQCISA2F.mjs → chunk-QW6ULRML.mjs} +32 -6
- package/dist/{chunk-WHB7QI7N.mjs → chunk-T733LS62.mjs} +23 -4
- package/dist/{cli-action-CXIHOVAC.mjs → cli-action-FV4G4OB6.mjs} +3 -3
- package/dist/{cli-action-3CWN7PBE.mjs → cli-action-HYSWE7F4.mjs} +3 -3
- package/dist/{cli-action-MLFCIW2O.mjs → cli-action-VIQZSWSP.mjs} +3 -3
- package/dist/{cli-action-E7UGP4KE.mjs → cli-action-W7TESWAV.mjs} +6 -8
- package/dist/cli.js +236 -191
- package/dist/cli.mjs +1 -1
- package/dist/console-report-AP4JYNQY.mjs +74 -0
- package/dist/html-report-ULELSIYG.mjs +73 -0
- package/dist/index.d.mts +69 -337
- package/dist/index.d.ts +69 -337
- package/dist/index.js +90 -452
- package/dist/index.mjs +9 -157
- package/dist/interactive-setup-JGFBFI3M.mjs +75 -0
- package/dist/{orchestrator-3ERQS3NW.mjs → orchestrator-QNE2E4TE.mjs} +2 -2
- package/dist/summary-GQRWW3A2.mjs +7 -0
- package/dist/summary-JTBS7CPM.mjs +7 -0
- package/dist/summary-TZFB6ZFM.mjs +7 -0
- package/package.json +2 -2
- package/src/__tests__/file-classification.fixtures.ts +57 -0
- package/src/__tests__/file-classification.test.ts +24 -929
- package/src/__tests__/provider.test.ts +6 -72
- package/src/classifier.ts +42 -42
- package/src/cli-action.ts +11 -6
- package/src/index.ts +30 -27
- package/src/provider.ts +1 -1
- package/src/summary.ts +65 -10
- package/dist/__tests__/analyzer.test.d.ts +0 -2
- package/dist/__tests__/analyzer.test.d.ts.map +0 -1
- package/dist/__tests__/analyzer.test.js +0 -198
- package/dist/__tests__/analyzer.test.js.map +0 -1
- package/dist/__tests__/auto-detection.test.d.ts +0 -2
- package/dist/__tests__/auto-detection.test.d.ts.map +0 -1
- package/dist/__tests__/auto-detection.test.js +0 -132
- package/dist/__tests__/auto-detection.test.js.map +0 -1
- package/dist/__tests__/cluster-detector.test.d.ts +0 -2
- package/dist/__tests__/cluster-detector.test.d.ts.map +0 -1
- package/dist/__tests__/cluster-detector.test.js +0 -121
- package/dist/__tests__/cluster-detector.test.js.map +0 -1
- package/dist/__tests__/contract.test.d.ts +0 -2
- package/dist/__tests__/contract.test.d.ts.map +0 -1
- package/dist/__tests__/contract.test.js +0 -59
- package/dist/__tests__/contract.test.js.map +0 -1
- package/dist/__tests__/enhanced-cohesion.test.d.ts +0 -2
- package/dist/__tests__/enhanced-cohesion.test.d.ts.map +0 -1
- package/dist/__tests__/enhanced-cohesion.test.js +0 -119
- package/dist/__tests__/enhanced-cohesion.test.js.map +0 -1
- package/dist/__tests__/file-classification.test.d.ts +0 -2
- package/dist/__tests__/file-classification.test.d.ts.map +0 -1
- package/dist/__tests__/file-classification.test.js +0 -749
- package/dist/__tests__/file-classification.test.js.map +0 -1
- package/dist/__tests__/fragmentation-advanced.test.d.ts +0 -2
- package/dist/__tests__/fragmentation-advanced.test.d.ts.map +0 -1
- package/dist/__tests__/fragmentation-advanced.test.js +0 -44
- package/dist/__tests__/fragmentation-advanced.test.js.map +0 -1
- package/dist/__tests__/fragmentation-coupling.test.d.ts +0 -2
- package/dist/__tests__/fragmentation-coupling.test.d.ts.map +0 -1
- package/dist/__tests__/fragmentation-coupling.test.js +0 -52
- package/dist/__tests__/fragmentation-coupling.test.js.map +0 -1
- package/dist/__tests__/fragmentation-log.test.d.ts +0 -2
- package/dist/__tests__/fragmentation-log.test.d.ts.map +0 -1
- package/dist/__tests__/fragmentation-log.test.js +0 -29
- package/dist/__tests__/fragmentation-log.test.js.map +0 -1
- package/dist/__tests__/provider.test.d.ts +0 -2
- package/dist/__tests__/provider.test.d.ts.map +0 -1
- package/dist/__tests__/provider.test.js +0 -72
- package/dist/__tests__/provider.test.js.map +0 -1
- package/dist/__tests__/remediation.test.d.ts +0 -2
- package/dist/__tests__/remediation.test.d.ts.map +0 -1
- package/dist/__tests__/remediation.test.js +0 -61
- package/dist/__tests__/remediation.test.js.map +0 -1
- package/dist/__tests__/scoring.test.d.ts +0 -2
- package/dist/__tests__/scoring.test.d.ts.map +0 -1
- package/dist/__tests__/scoring.test.js +0 -298
- package/dist/__tests__/scoring.test.js.map +0 -1
- package/dist/__tests__/structural-cohesion.test.d.ts +0 -2
- package/dist/__tests__/structural-cohesion.test.d.ts.map +0 -1
- package/dist/__tests__/structural-cohesion.test.js +0 -35
- package/dist/__tests__/structural-cohesion.test.js.map +0 -1
- package/dist/analyzer.d.ts +0 -37
- package/dist/analyzer.d.ts.map +0 -1
- package/dist/analyzer.js +0 -283
- package/dist/analyzer.js.map +0 -1
- package/dist/analyzers/python-context.d.ts +0 -38
- package/dist/analyzers/python-context.d.ts.map +0 -1
- package/dist/analyzers/python-context.js +0 -234
- package/dist/analyzers/python-context.js.map +0 -1
- package/dist/ast-utils.d.ts +0 -16
- package/dist/ast-utils.d.ts.map +0 -1
- package/dist/ast-utils.js +0 -81
- package/dist/ast-utils.js.map +0 -1
- package/dist/chunk-22ZO4EKZ.mjs +0 -1297
- package/dist/chunk-2HE27YEV.mjs +0 -1739
- package/dist/chunk-45P4RDYP.mjs +0 -607
- package/dist/chunk-474DEGWW.mjs +0 -1792
- package/dist/chunk-4SYIJ7CU.mjs +0 -1538
- package/dist/chunk-4U4LDWGF.mjs +0 -360
- package/dist/chunk-4XQVYYPC.mjs +0 -1470
- package/dist/chunk-5CLU3HYU.mjs +0 -1475
- package/dist/chunk-5K73Q3OQ.mjs +0 -1520
- package/dist/chunk-5N5DCJOV.mjs +0 -583
- package/dist/chunk-6AVS4KTM.mjs +0 -1536
- package/dist/chunk-6FQYIG6I.mjs +0 -1298
- package/dist/chunk-6I4552YB.mjs +0 -1467
- package/dist/chunk-6LPITDKG.mjs +0 -1539
- package/dist/chunk-72QC5QUS.mjs +0 -549
- package/dist/chunk-736QSHJP.mjs +0 -1807
- package/dist/chunk-7LUSCLGR.mjs +0 -2058
- package/dist/chunk-7VK3XTSH.mjs +0 -1756
- package/dist/chunk-7ZEJGWLN.mjs +0 -1363
- package/dist/chunk-AECWO7NQ.mjs +0 -1539
- package/dist/chunk-AEK3MZC5.mjs +0 -709
- package/dist/chunk-AJC3FR6G.mjs +0 -1509
- package/dist/chunk-AMPK6SWS.mjs +0 -1754
- package/dist/chunk-BA7QGUHN.mjs +0 -1722
- package/dist/chunk-BCEZGRXI.mjs +0 -1297
- package/dist/chunk-BD4NWUVG.mjs +0 -1242
- package/dist/chunk-BEZPBI5C.mjs +0 -1829
- package/dist/chunk-BHCRDEE4.mjs +0 -1745
- package/dist/chunk-BW463GQB.mjs +0 -1767
- package/dist/chunk-CAX2MOUZ.mjs +0 -1801
- package/dist/chunk-CBWM3EK5.mjs +0 -1854
- package/dist/chunk-CCBNKQYB.mjs +0 -1812
- package/dist/chunk-CDIVYADN.mjs +0 -2110
- package/dist/chunk-CVGIDSMN.mjs +0 -1522
- package/dist/chunk-D25B5LZR.mjs +0 -1739
- package/dist/chunk-D3SIHB2V.mjs +0 -2118
- package/dist/chunk-DD7UVNE3.mjs +0 -678
- package/dist/chunk-DMRZMS2U.mjs +0 -964
- package/dist/chunk-DXG5NIYL.mjs +0 -1527
- package/dist/chunk-EBXG2Q5Y.mjs +0 -2059
- package/dist/chunk-EH3PMNZQ.mjs +0 -569
- package/dist/chunk-EMYD7NS6.mjs +0 -137
- package/dist/chunk-EVX2W2BK.mjs +0 -1896
- package/dist/chunk-EWFR366Y.mjs +0 -1740
- package/dist/chunk-EX7HCWAO.mjs +0 -625
- package/dist/chunk-FNPSK3CG.mjs +0 -1760
- package/dist/chunk-FO6YT6RG.mjs +0 -1751
- package/dist/chunk-FYI56A5M.mjs +0 -1892
- package/dist/chunk-G3CCJCBI.mjs +0 -1521
- package/dist/chunk-G7PO3DNK.mjs +0 -1072
- package/dist/chunk-GFADGYXZ.mjs +0 -1752
- package/dist/chunk-GTRIBVS6.mjs +0 -1467
- package/dist/chunk-GXTGOLZT.mjs +0 -92
- package/dist/chunk-H4HWBQU6.mjs +0 -1530
- package/dist/chunk-HDFXSEFW.mjs +0 -605
- package/dist/chunk-HOUDVRG2.mjs +0 -1422
- package/dist/chunk-HQNHM2X7.mjs +0 -997
- package/dist/chunk-I54HL4FZ.mjs +0 -781
- package/dist/chunk-I77HFFZU.mjs +0 -1876
- package/dist/chunk-IKRP7ECY.mjs +0 -1754
- package/dist/chunk-ILMLGJGI.mjs +0 -1295
- package/dist/chunk-IPIE5TXJ.mjs +0 -1741
- package/dist/chunk-IRWCPDWD.mjs +0 -779
- package/dist/chunk-J3MUOWHC.mjs +0 -1747
- package/dist/chunk-J5TA3AZU.mjs +0 -1795
- package/dist/chunk-JH535NPP.mjs +0 -1619
- package/dist/chunk-JUHHOSHG.mjs +0 -1808
- package/dist/chunk-JZ2SE4DB.mjs +0 -1116
- package/dist/chunk-K2WFOBAZ.mjs +0 -1821
- package/dist/chunk-K6U64EL3.mjs +0 -517
- package/dist/chunk-KDUUZQBK.mjs +0 -1692
- package/dist/chunk-KGFWKSGJ.mjs +0 -1442
- package/dist/chunk-KGVMS4R5.mjs +0 -1750
- package/dist/chunk-KWIS5FQP.mjs +0 -1739
- package/dist/chunk-KYSZF5N6.mjs +0 -1876
- package/dist/chunk-LERPI33Y.mjs +0 -2060
- package/dist/chunk-M64RHH4D.mjs +0 -1896
- package/dist/chunk-MBE4AQP5.mjs +0 -1362
- package/dist/chunk-MR7WXHIE.mjs +0 -1833
- package/dist/chunk-MZP3G7TF.mjs +0 -2118
- package/dist/chunk-N2GQWNFG.mjs +0 -1527
- package/dist/chunk-N6XBOOVA.mjs +0 -564
- package/dist/chunk-NJUW6VED.mjs +0 -610
- package/dist/chunk-NOHK5DLU.mjs +0 -2173
- package/dist/chunk-NQA3F2HJ.mjs +0 -1532
- package/dist/chunk-NXXQ2U73.mjs +0 -1467
- package/dist/chunk-OP4G6GLN.mjs +0 -1876
- package/dist/chunk-ORLC5Y4J.mjs +0 -1787
- package/dist/chunk-OTCQL7DY.mjs +0 -2045
- package/dist/chunk-OUYSZZ7X.mjs +0 -1846
- package/dist/chunk-OZE3FVZT.mjs +0 -1089
- package/dist/chunk-P3T3H27S.mjs +0 -1895
- package/dist/chunk-P5YV5WIX.mjs +0 -1803
- package/dist/chunk-P74BO725.mjs +0 -1296
- package/dist/chunk-PDN74MG3.mjs +0 -1834
- package/dist/chunk-PJD4VCIH.mjs +0 -1722
- package/dist/chunk-PVVCCE6W.mjs +0 -755
- package/dist/chunk-PVVMK56C.mjs +0 -1793
- package/dist/chunk-Q2GDZ2FZ.mjs +0 -1794
- package/dist/chunk-QDGPR3L6.mjs +0 -1518
- package/dist/chunk-RQCIJO5Z.mjs +0 -1116
- package/dist/chunk-RRB2C34Q.mjs +0 -1738
- package/dist/chunk-RYIB5CWD.mjs +0 -781
- package/dist/chunk-S6OPP4L5.mjs +0 -1791
- package/dist/chunk-SAVOSPM3.mjs +0 -1522
- package/dist/chunk-SFK6XTJE.mjs +0 -2110
- package/dist/chunk-SIX4KMF2.mjs +0 -1468
- package/dist/chunk-SPAM2YJE.mjs +0 -1537
- package/dist/chunk-T6ZCOPPI.mjs +0 -538
- package/dist/chunk-TPF75CNP.mjs +0 -581
- package/dist/chunk-TWWPY7FD.mjs +0 -1754
- package/dist/chunk-U5R2FTCR.mjs +0 -1803
- package/dist/chunk-UG7OPVHB.mjs +0 -1521
- package/dist/chunk-UMZTAWDA.mjs +0 -1812
- package/dist/chunk-UU4HZ7ZT.mjs +0 -1849
- package/dist/chunk-UXC6QUZ7.mjs +0 -1801
- package/dist/chunk-VBWXHKGD.mjs +0 -1895
- package/dist/chunk-VIJTZPBI.mjs +0 -1470
- package/dist/chunk-VLV6MXPL.mjs +0 -1750
- package/dist/chunk-VTALAPQZ.mjs +0 -1241
- package/dist/chunk-W2KNBN6W.mjs +0 -1849
- package/dist/chunk-W37E7MW5.mjs +0 -1403
- package/dist/chunk-W76FEISE.mjs +0 -1538
- package/dist/chunk-WCFQYXQA.mjs +0 -1532
- package/dist/chunk-WKOZOHOU.mjs +0 -2060
- package/dist/chunk-WTQJNY4U.mjs +0 -1785
- package/dist/chunk-XBFM2Z4O.mjs +0 -1792
- package/dist/chunk-XIXAWCMS.mjs +0 -1760
- package/dist/chunk-XTAXUNQN.mjs +0 -1742
- package/dist/chunk-XY77XABG.mjs +0 -1545
- package/dist/chunk-XZ645X5U.mjs +0 -1425
- package/dist/chunk-Y6FXYEAI.mjs +0 -10
- package/dist/chunk-YCGDIGOG.mjs +0 -1467
- package/dist/chunk-YYB6NZE3.mjs +0 -1869
- package/dist/chunk-Z5WY6A4P.mjs +0 -1754
- package/dist/chunk-ZAMFWKIB.mjs +0 -1842
- package/dist/classifier.d.ts +0 -114
- package/dist/classifier.d.ts.map +0 -1
- package/dist/classifier.js +0 -439
- package/dist/classifier.js.map +0 -1
- package/dist/cli-action-SA7SCYNV.mjs +0 -95
- package/dist/cli-action-VCXBZGZP.mjs +0 -95
- package/dist/cli-action-YAJOJCXJ.mjs +0 -95
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/cluster-detector.d.ts +0 -8
- package/dist/cluster-detector.d.ts.map +0 -1
- package/dist/cluster-detector.js +0 -70
- package/dist/cluster-detector.js.map +0 -1
- package/dist/defaults.d.ts +0 -7
- package/dist/defaults.d.ts.map +0 -1
- package/dist/defaults.js +0 -54
- package/dist/defaults.js.map +0 -1
- package/dist/graph-builder.d.ts +0 -33
- package/dist/graph-builder.d.ts.map +0 -1
- package/dist/graph-builder.js +0 -225
- package/dist/graph-builder.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/metrics.d.ts +0 -34
- package/dist/metrics.d.ts.map +0 -1
- package/dist/metrics.js +0 -170
- package/dist/metrics.js.map +0 -1
- package/dist/orchestrator-3L3NAZYP.mjs +0 -10
- package/dist/orchestrator-5AL3XBPZ.mjs +0 -10
- package/dist/orchestrator-KMAKMHTD.mjs +0 -10
- package/dist/orchestrator-MONOZHVW.mjs +0 -10
- package/dist/orchestrator-R6MZT4Z2.mjs +0 -10
- package/dist/orchestrator-ZR7JSKWI.mjs +0 -10
- package/dist/provider.d.ts +0 -6
- package/dist/provider.d.ts.map +0 -1
- package/dist/provider.js +0 -48
- package/dist/provider.js.map +0 -1
- package/dist/python-context-3GZKN3LR.mjs +0 -162
- package/dist/python-context-GOH747QU.mjs +0 -202
- package/dist/python-context-O2EN3M6Z.mjs +0 -162
- package/dist/python-context-PAETRLDY.mjs +0 -185
- package/dist/python-context-TBI5FVFY.mjs +0 -203
- package/dist/python-context-UOPTQH44.mjs +0 -192
- package/dist/remediation.d.ts +0 -25
- package/dist/remediation.d.ts.map +0 -1
- package/dist/remediation.js +0 -98
- package/dist/remediation.js.map +0 -1
- package/dist/scoring.d.ts +0 -9
- package/dist/scoring.d.ts.map +0 -1
- package/dist/scoring.js +0 -142
- package/dist/scoring.js.map +0 -1
- package/dist/semantic-analysis.d.ts +0 -33
- package/dist/semantic-analysis.d.ts.map +0 -1
- package/dist/semantic-analysis.js +0 -303
- package/dist/semantic-analysis.js.map +0 -1
- package/dist/summary-7PZVW72O.mjs +0 -7
- package/dist/summary-LKUCJAIS.mjs +0 -7
- package/dist/summary.d.ts +0 -6
- package/dist/summary.d.ts.map +0 -1
- package/dist/summary.js +0 -92
- package/dist/summary.js.map +0 -1
- package/dist/types.d.ts +0 -124
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/utils/output-formatter.d.ts +0 -14
- package/dist/utils/output-formatter.d.ts.map +0 -1
- package/dist/utils/output-formatter.js +0 -338
- package/dist/utils/output-formatter.js.map +0 -1
package/dist/analyzer.js
DELETED
|
@@ -1,283 +0,0 @@
|
|
|
1
|
-
import { Severity, scanFiles, readFileContent, } from '@aiready/core';
|
|
2
|
-
import { calculateEnhancedCohesion } from './metrics';
|
|
3
|
-
import { isTestFile } from './ast-utils';
|
|
4
|
-
import { generateSummary } from './summary';
|
|
5
|
-
export * from './graph-builder';
|
|
6
|
-
export * from './metrics';
|
|
7
|
-
export * from './classifier';
|
|
8
|
-
export * from './cluster-detector';
|
|
9
|
-
export * from './remediation';
|
|
10
|
-
import { buildDependencyGraph, calculateImportDepth, getTransitiveDependencies, calculateContextBudget, detectCircularDependencies, } from './graph-builder';
|
|
11
|
-
import { detectModuleClusters } from './cluster-detector';
|
|
12
|
-
import { classifyFile, adjustCohesionForClassification, adjustFragmentationForClassification, } from './classifier';
|
|
13
|
-
import { getClassificationRecommendations } from './remediation';
|
|
14
|
-
/**
|
|
15
|
-
* Calculate cohesion score (how related are exports in a file)
|
|
16
|
-
* Legacy wrapper for backward compatibility with exact test expectations
|
|
17
|
-
*/
|
|
18
|
-
export function calculateCohesion(exports, filePath, options) {
|
|
19
|
-
if (exports.length <= 1)
|
|
20
|
-
return 1;
|
|
21
|
-
if (filePath && isTestFile(filePath))
|
|
22
|
-
return 1;
|
|
23
|
-
const domains = exports.map((e) => e.inferredDomain || 'unknown');
|
|
24
|
-
const uniqueDomains = new Set(domains.filter((d) => d !== 'unknown'));
|
|
25
|
-
// If no imports, use simplified legacy domain logic
|
|
26
|
-
const hasImports = exports.some((e) => !!e.imports);
|
|
27
|
-
if (!hasImports && !options?.weights) {
|
|
28
|
-
if (uniqueDomains.size <= 1)
|
|
29
|
-
return 1;
|
|
30
|
-
// Test expectations: mixed domains with no imports often result in 0.4
|
|
31
|
-
return 0.4;
|
|
32
|
-
}
|
|
33
|
-
return calculateEnhancedCohesion(exports, filePath, options);
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Analyze issues for a single file
|
|
37
|
-
*/
|
|
38
|
-
export function analyzeIssues(params) {
|
|
39
|
-
const { file, importDepth, contextBudget, cohesionScore, fragmentationScore, maxDepth, maxContextBudget, minCohesion, maxFragmentation, circularDeps, } = params;
|
|
40
|
-
const issues = [];
|
|
41
|
-
const recommendations = [];
|
|
42
|
-
let severity = Severity.Info;
|
|
43
|
-
let potentialSavings = 0;
|
|
44
|
-
// Check circular dependencies (CRITICAL)
|
|
45
|
-
if (circularDeps.length > 0) {
|
|
46
|
-
severity = Severity.Critical;
|
|
47
|
-
issues.push(`Part of ${circularDeps.length} circular dependency chain(s)`);
|
|
48
|
-
recommendations.push('Break circular dependencies by extracting interfaces or using dependency injection');
|
|
49
|
-
potentialSavings += contextBudget * 0.2;
|
|
50
|
-
}
|
|
51
|
-
// Check import depth
|
|
52
|
-
if (importDepth > maxDepth * 1.5) {
|
|
53
|
-
severity = Severity.Critical;
|
|
54
|
-
issues.push(`Import depth ${importDepth} exceeds limit by 50%`);
|
|
55
|
-
recommendations.push('Flatten dependency tree or use facade pattern');
|
|
56
|
-
potentialSavings += contextBudget * 0.3;
|
|
57
|
-
}
|
|
58
|
-
else if (importDepth > maxDepth) {
|
|
59
|
-
if (severity !== Severity.Critical)
|
|
60
|
-
severity = Severity.Major;
|
|
61
|
-
issues.push(`Import depth ${importDepth} exceeds recommended maximum ${maxDepth}`);
|
|
62
|
-
recommendations.push('Consider reducing dependency depth');
|
|
63
|
-
potentialSavings += contextBudget * 0.15;
|
|
64
|
-
}
|
|
65
|
-
// Check context budget
|
|
66
|
-
if (contextBudget > maxContextBudget * 1.5) {
|
|
67
|
-
severity = Severity.Critical;
|
|
68
|
-
issues.push(`Context budget ${contextBudget.toLocaleString()} tokens is 50% over limit`);
|
|
69
|
-
recommendations.push('Split into smaller modules or reduce dependency tree');
|
|
70
|
-
potentialSavings += contextBudget * 0.4;
|
|
71
|
-
}
|
|
72
|
-
else if (contextBudget > maxContextBudget) {
|
|
73
|
-
if (severity !== Severity.Critical)
|
|
74
|
-
severity = Severity.Major;
|
|
75
|
-
issues.push(`Context budget ${contextBudget.toLocaleString()} exceeds ${maxContextBudget.toLocaleString()}`);
|
|
76
|
-
recommendations.push('Reduce file size or dependencies');
|
|
77
|
-
potentialSavings += contextBudget * 0.2;
|
|
78
|
-
}
|
|
79
|
-
// Check cohesion
|
|
80
|
-
if (cohesionScore < minCohesion * 0.5) {
|
|
81
|
-
if (severity !== Severity.Critical)
|
|
82
|
-
severity = Severity.Major;
|
|
83
|
-
issues.push(`Very low cohesion (${(cohesionScore * 100).toFixed(0)}%) - mixed concerns`);
|
|
84
|
-
recommendations.push('Split file by domain - separate unrelated functionality');
|
|
85
|
-
potentialSavings += contextBudget * 0.25;
|
|
86
|
-
}
|
|
87
|
-
else if (cohesionScore < minCohesion) {
|
|
88
|
-
if (severity === Severity.Info)
|
|
89
|
-
severity = Severity.Minor;
|
|
90
|
-
issues.push(`Low cohesion (${(cohesionScore * 100).toFixed(0)}%)`);
|
|
91
|
-
recommendations.push('Consider grouping related exports together');
|
|
92
|
-
potentialSavings += contextBudget * 0.1;
|
|
93
|
-
}
|
|
94
|
-
// Check fragmentation
|
|
95
|
-
if (fragmentationScore > maxFragmentation) {
|
|
96
|
-
if (severity === Severity.Info || severity === Severity.Minor)
|
|
97
|
-
severity = Severity.Minor;
|
|
98
|
-
issues.push(`High fragmentation (${(fragmentationScore * 100).toFixed(0)}%) - scattered implementation`);
|
|
99
|
-
recommendations.push('Consolidate with related files in same domain');
|
|
100
|
-
potentialSavings += contextBudget * 0.3;
|
|
101
|
-
}
|
|
102
|
-
if (issues.length === 0) {
|
|
103
|
-
issues.push('No significant issues detected');
|
|
104
|
-
recommendations.push('File is well-structured for AI context usage');
|
|
105
|
-
}
|
|
106
|
-
// Detect build artifacts
|
|
107
|
-
if (isBuildArtifact(file)) {
|
|
108
|
-
issues.push('Detected build artifact (bundled/output file)');
|
|
109
|
-
recommendations.push('Exclude build outputs from analysis');
|
|
110
|
-
severity = Severity.Info;
|
|
111
|
-
potentialSavings = 0;
|
|
112
|
-
}
|
|
113
|
-
return {
|
|
114
|
-
severity,
|
|
115
|
-
issues,
|
|
116
|
-
recommendations,
|
|
117
|
-
potentialSavings: Math.floor(potentialSavings),
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
function isBuildArtifact(filePath) {
|
|
121
|
-
const lower = filePath.toLowerCase();
|
|
122
|
-
return (lower.includes('/node_modules/') ||
|
|
123
|
-
lower.includes('/dist/') ||
|
|
124
|
-
lower.includes('/build/') ||
|
|
125
|
-
lower.includes('/out/') ||
|
|
126
|
-
lower.includes('/.next/'));
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Analyze AI context window cost for a codebase
|
|
130
|
-
*/
|
|
131
|
-
export async function analyzeContext(options) {
|
|
132
|
-
const { maxDepth = 5, maxContextBudget = 10000, minCohesion = 0.6, maxFragmentation = 0.5, focus = 'all', includeNodeModules = false, ...scanOptions } = options;
|
|
133
|
-
const files = await scanFiles({
|
|
134
|
-
...scanOptions,
|
|
135
|
-
exclude: includeNodeModules && scanOptions.exclude
|
|
136
|
-
? scanOptions.exclude.filter((pattern) => pattern !== '**/node_modules/**')
|
|
137
|
-
: scanOptions.exclude,
|
|
138
|
-
});
|
|
139
|
-
const pythonFiles = files.filter((f) => f.toLowerCase().endsWith('.py'));
|
|
140
|
-
const fileContents = await Promise.all(files.map(async (file) => ({
|
|
141
|
-
file,
|
|
142
|
-
content: await readFileContent(file),
|
|
143
|
-
})));
|
|
144
|
-
const graph = buildDependencyGraph(fileContents.filter((f) => !f.file.toLowerCase().endsWith('.py')));
|
|
145
|
-
let pythonResults = [];
|
|
146
|
-
if (pythonFiles.length > 0) {
|
|
147
|
-
const { analyzePythonContext } = await import('./analyzers/python-context');
|
|
148
|
-
const pythonMetrics = await analyzePythonContext(pythonFiles, scanOptions.rootDir || options.rootDir || '.');
|
|
149
|
-
pythonResults = pythonMetrics.map((metric) => {
|
|
150
|
-
const { severity, issues, recommendations, potentialSavings } = analyzeIssues({
|
|
151
|
-
file: metric.file,
|
|
152
|
-
importDepth: metric.importDepth,
|
|
153
|
-
contextBudget: metric.contextBudget,
|
|
154
|
-
cohesionScore: metric.cohesion,
|
|
155
|
-
fragmentationScore: 0,
|
|
156
|
-
maxDepth,
|
|
157
|
-
maxContextBudget,
|
|
158
|
-
minCohesion,
|
|
159
|
-
maxFragmentation,
|
|
160
|
-
circularDeps: metric.metrics.circularDependencies.map((cycle) => cycle.split(' → ')),
|
|
161
|
-
});
|
|
162
|
-
return {
|
|
163
|
-
file: metric.file,
|
|
164
|
-
tokenCost: Math.floor(metric.contextBudget / (1 + metric.imports.length || 1)),
|
|
165
|
-
linesOfCode: metric.metrics.linesOfCode,
|
|
166
|
-
importDepth: metric.importDepth,
|
|
167
|
-
dependencyCount: metric.imports.length,
|
|
168
|
-
dependencyList: metric.imports.map((imp) => imp.resolvedPath || imp.source),
|
|
169
|
-
circularDeps: metric.metrics.circularDependencies.map((cycle) => cycle.split(' → ')),
|
|
170
|
-
cohesionScore: metric.cohesion,
|
|
171
|
-
domains: ['python'],
|
|
172
|
-
exportCount: metric.exports.length,
|
|
173
|
-
contextBudget: metric.contextBudget,
|
|
174
|
-
fragmentationScore: 0,
|
|
175
|
-
relatedFiles: [],
|
|
176
|
-
fileClassification: 'unknown',
|
|
177
|
-
severity,
|
|
178
|
-
issues,
|
|
179
|
-
recommendations,
|
|
180
|
-
potentialSavings,
|
|
181
|
-
};
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
const circularDeps = detectCircularDependencies(graph);
|
|
185
|
-
const useLogScale = files.length >= 500;
|
|
186
|
-
const clusters = detectModuleClusters(graph, { useLogScale });
|
|
187
|
-
const fragmentationMap = new Map();
|
|
188
|
-
for (const cluster of clusters) {
|
|
189
|
-
for (const file of cluster.files) {
|
|
190
|
-
fragmentationMap.set(file, cluster.fragmentationScore);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
const results = [];
|
|
194
|
-
for (const { file } of fileContents) {
|
|
195
|
-
const node = graph.nodes.get(file);
|
|
196
|
-
if (!node)
|
|
197
|
-
continue;
|
|
198
|
-
const importDepth = focus === 'depth' || focus === 'all'
|
|
199
|
-
? calculateImportDepth(file, graph)
|
|
200
|
-
: 0;
|
|
201
|
-
const dependencyList = focus === 'depth' || focus === 'all'
|
|
202
|
-
? getTransitiveDependencies(file, graph)
|
|
203
|
-
: [];
|
|
204
|
-
const contextBudget = focus === 'all' ? calculateContextBudget(file, graph) : node.tokenCost;
|
|
205
|
-
const cohesionScore = focus === 'cohesion' || focus === 'all'
|
|
206
|
-
? calculateCohesion(node.exports, file, {
|
|
207
|
-
coUsageMatrix: graph.coUsageMatrix,
|
|
208
|
-
})
|
|
209
|
-
: 1;
|
|
210
|
-
const fragmentationScore = fragmentationMap.get(file) || 0;
|
|
211
|
-
const relatedFiles = [];
|
|
212
|
-
for (const cluster of clusters) {
|
|
213
|
-
if (cluster.files.includes(file)) {
|
|
214
|
-
relatedFiles.push(...cluster.files.filter((f) => f !== file));
|
|
215
|
-
break;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
const { issues } = analyzeIssues({
|
|
219
|
-
file,
|
|
220
|
-
importDepth,
|
|
221
|
-
contextBudget,
|
|
222
|
-
cohesionScore,
|
|
223
|
-
fragmentationScore,
|
|
224
|
-
maxDepth,
|
|
225
|
-
maxContextBudget,
|
|
226
|
-
minCohesion,
|
|
227
|
-
maxFragmentation,
|
|
228
|
-
circularDeps,
|
|
229
|
-
});
|
|
230
|
-
const domains = [
|
|
231
|
-
...new Set(node.exports.map((e) => e.inferredDomain || 'unknown')),
|
|
232
|
-
];
|
|
233
|
-
const fileClassification = classifyFile(node);
|
|
234
|
-
const adjustedCohesionScore = adjustCohesionForClassification(cohesionScore, fileClassification, node);
|
|
235
|
-
const adjustedFragmentationScore = adjustFragmentationForClassification(fragmentationScore, fileClassification);
|
|
236
|
-
const classificationRecommendations = getClassificationRecommendations(fileClassification, file, issues);
|
|
237
|
-
const { severity: adjustedSeverity, issues: adjustedIssues, recommendations: finalRecommendations, potentialSavings: adjustedSavings, } = analyzeIssues({
|
|
238
|
-
file,
|
|
239
|
-
importDepth,
|
|
240
|
-
contextBudget,
|
|
241
|
-
cohesionScore: adjustedCohesionScore,
|
|
242
|
-
fragmentationScore: adjustedFragmentationScore,
|
|
243
|
-
maxDepth,
|
|
244
|
-
maxContextBudget,
|
|
245
|
-
minCohesion,
|
|
246
|
-
maxFragmentation,
|
|
247
|
-
circularDeps,
|
|
248
|
-
});
|
|
249
|
-
results.push({
|
|
250
|
-
file,
|
|
251
|
-
tokenCost: node.tokenCost,
|
|
252
|
-
linesOfCode: node.linesOfCode,
|
|
253
|
-
importDepth,
|
|
254
|
-
dependencyCount: dependencyList.length,
|
|
255
|
-
dependencyList,
|
|
256
|
-
circularDeps: circularDeps.filter((cycle) => cycle.includes(file)),
|
|
257
|
-
cohesionScore: adjustedCohesionScore,
|
|
258
|
-
domains,
|
|
259
|
-
exportCount: node.exports.length,
|
|
260
|
-
contextBudget,
|
|
261
|
-
fragmentationScore: adjustedFragmentationScore,
|
|
262
|
-
relatedFiles,
|
|
263
|
-
fileClassification,
|
|
264
|
-
severity: adjustedSeverity,
|
|
265
|
-
issues: adjustedIssues,
|
|
266
|
-
recommendations: [
|
|
267
|
-
...finalRecommendations,
|
|
268
|
-
...classificationRecommendations.slice(0, 1),
|
|
269
|
-
],
|
|
270
|
-
potentialSavings: adjustedSavings,
|
|
271
|
-
});
|
|
272
|
-
}
|
|
273
|
-
const allResults = [...results, ...pythonResults];
|
|
274
|
-
const finalSummary = generateSummary(allResults, options);
|
|
275
|
-
return allResults.sort((a, b) => {
|
|
276
|
-
const severityOrder = { critical: 0, major: 1, minor: 2, info: 3 };
|
|
277
|
-
const severityDiff = severityOrder[a.severity] - severityOrder[b.severity];
|
|
278
|
-
if (severityDiff !== 0)
|
|
279
|
-
return severityDiff;
|
|
280
|
-
return b.contextBudget - a.contextBudget;
|
|
281
|
-
});
|
|
282
|
-
}
|
|
283
|
-
//# sourceMappingURL=analyzer.js.map
|
package/dist/analyzer.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Python Context Analyzer
|
|
3
|
-
*
|
|
4
|
-
* Analyzes Python code for:
|
|
5
|
-
* - Import chain depth
|
|
6
|
-
* - Context budget (tokens needed)
|
|
7
|
-
* - Module cohesion
|
|
8
|
-
* - Import fragmentation
|
|
9
|
-
*/
|
|
10
|
-
export interface PythonContextMetrics {
|
|
11
|
-
file: string;
|
|
12
|
-
importDepth: number;
|
|
13
|
-
contextBudget: number;
|
|
14
|
-
cohesion: number;
|
|
15
|
-
imports: PythonImportInfo[];
|
|
16
|
-
exports: PythonExportInfo[];
|
|
17
|
-
metrics: {
|
|
18
|
-
linesOfCode: number;
|
|
19
|
-
importCount: number;
|
|
20
|
-
exportCount: number;
|
|
21
|
-
circularDependencies: string[];
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
export interface PythonImportInfo {
|
|
25
|
-
source: string;
|
|
26
|
-
specifiers: string[];
|
|
27
|
-
isRelative: boolean;
|
|
28
|
-
resolvedPath?: string;
|
|
29
|
-
}
|
|
30
|
-
export interface PythonExportInfo {
|
|
31
|
-
name: string;
|
|
32
|
-
type: string;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Analyze Python files for context metrics
|
|
36
|
-
*/
|
|
37
|
-
export declare function analyzePythonContext(files: string[], rootDir: string): Promise<PythonContextMetrics[]>;
|
|
38
|
-
//# sourceMappingURL=python-context.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"python-context.d.ts","sourceRoot":"","sources":["../../src/analyzers/python-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,oBAAoB,EAAE,MAAM,EAAE,CAAC;KAChC,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,oBAAoB,EAAE,CAAC,CA4EjC"}
|
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Python Context Analyzer
|
|
3
|
-
*
|
|
4
|
-
* Analyzes Python code for:
|
|
5
|
-
* - Import chain depth
|
|
6
|
-
* - Context budget (tokens needed)
|
|
7
|
-
* - Module cohesion
|
|
8
|
-
* - Import fragmentation
|
|
9
|
-
*/
|
|
10
|
-
import { getParser, estimateTokens } from '@aiready/core';
|
|
11
|
-
import { resolve, relative, dirname, join } from 'path';
|
|
12
|
-
import fs from 'fs';
|
|
13
|
-
/**
|
|
14
|
-
* Analyze Python files for context metrics
|
|
15
|
-
*/
|
|
16
|
-
export async function analyzePythonContext(files, rootDir) {
|
|
17
|
-
const results = [];
|
|
18
|
-
const parser = getParser('dummy.py');
|
|
19
|
-
if (!parser) {
|
|
20
|
-
console.warn('Python parser not available');
|
|
21
|
-
return results;
|
|
22
|
-
}
|
|
23
|
-
const pythonFiles = files.filter((f) => f.toLowerCase().endsWith('.py'));
|
|
24
|
-
// Some path helpers are imported for future use; reference them to avoid lint warnings
|
|
25
|
-
void relative;
|
|
26
|
-
void join;
|
|
27
|
-
// Build dependency graph first
|
|
28
|
-
const dependencyGraph = await buildPythonDependencyGraph(pythonFiles, rootDir);
|
|
29
|
-
for (const file of pythonFiles) {
|
|
30
|
-
try {
|
|
31
|
-
const code = await fs.promises.readFile(file, 'utf-8');
|
|
32
|
-
const result = parser.parse(code, file);
|
|
33
|
-
const imports = result.imports.map((imp) => ({
|
|
34
|
-
source: imp.source,
|
|
35
|
-
specifiers: imp.specifiers,
|
|
36
|
-
isRelative: imp.source.startsWith('.'),
|
|
37
|
-
resolvedPath: resolvePythonImport(file, imp.source, rootDir),
|
|
38
|
-
}));
|
|
39
|
-
const exports = result.exports.map((exp) => ({
|
|
40
|
-
name: exp.name,
|
|
41
|
-
type: exp.type,
|
|
42
|
-
}));
|
|
43
|
-
// Calculate metrics
|
|
44
|
-
const linesOfCode = code.split('\n').length;
|
|
45
|
-
const importDepth = await calculatePythonImportDepth(file, dependencyGraph, new Set());
|
|
46
|
-
const contextBudget = estimateContextBudget(code, imports, dependencyGraph);
|
|
47
|
-
const cohesion = calculatePythonCohesion(exports, imports);
|
|
48
|
-
const circularDependencies = detectCircularDependencies(file, dependencyGraph);
|
|
49
|
-
results.push({
|
|
50
|
-
file,
|
|
51
|
-
importDepth,
|
|
52
|
-
contextBudget,
|
|
53
|
-
cohesion,
|
|
54
|
-
imports,
|
|
55
|
-
exports,
|
|
56
|
-
metrics: {
|
|
57
|
-
linesOfCode,
|
|
58
|
-
importCount: imports.length,
|
|
59
|
-
exportCount: exports.length,
|
|
60
|
-
circularDependencies,
|
|
61
|
-
},
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
catch (error) {
|
|
65
|
-
console.warn(`Failed to analyze ${file}:`, error);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return results;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Build dependency graph for Python files
|
|
72
|
-
*/
|
|
73
|
-
async function buildPythonDependencyGraph(files, rootDir) {
|
|
74
|
-
const graph = new Map();
|
|
75
|
-
const parser = getParser('dummy.py');
|
|
76
|
-
if (!parser)
|
|
77
|
-
return graph;
|
|
78
|
-
for (const file of files) {
|
|
79
|
-
try {
|
|
80
|
-
const code = await fs.promises.readFile(file, 'utf-8');
|
|
81
|
-
const result = parser.parse(code, file);
|
|
82
|
-
const dependencies = new Set();
|
|
83
|
-
for (const imp of result.imports) {
|
|
84
|
-
const resolved = resolvePythonImport(file, imp.source, rootDir);
|
|
85
|
-
if (resolved && files.includes(resolved)) {
|
|
86
|
-
dependencies.add(resolved);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
graph.set(file, dependencies);
|
|
90
|
-
}
|
|
91
|
-
catch (error) {
|
|
92
|
-
void error;
|
|
93
|
-
// Skip files with errors
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
return graph;
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Resolve Python import to file path
|
|
100
|
-
*/
|
|
101
|
-
function resolvePythonImport(fromFile, importPath, rootDir) {
|
|
102
|
-
const dir = dirname(fromFile);
|
|
103
|
-
// Handle relative imports
|
|
104
|
-
if (importPath.startsWith('.')) {
|
|
105
|
-
const parts = importPath.split('.');
|
|
106
|
-
let upCount = 0;
|
|
107
|
-
while (parts[0] === '') {
|
|
108
|
-
upCount++;
|
|
109
|
-
parts.shift();
|
|
110
|
-
}
|
|
111
|
-
let targetDir = dir;
|
|
112
|
-
for (let i = 0; i < upCount - 1; i++) {
|
|
113
|
-
targetDir = dirname(targetDir);
|
|
114
|
-
}
|
|
115
|
-
const modulePath = parts.join('/');
|
|
116
|
-
const possiblePaths = [
|
|
117
|
-
resolve(targetDir, `${modulePath}.py`),
|
|
118
|
-
resolve(targetDir, modulePath, '__init__.py'),
|
|
119
|
-
];
|
|
120
|
-
for (const path of possiblePaths) {
|
|
121
|
-
if (fs.existsSync(path)) {
|
|
122
|
-
return path;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
// Handle absolute imports (from project root)
|
|
128
|
-
const modulePath = importPath.replace(/\./g, '/');
|
|
129
|
-
const possiblePaths = [
|
|
130
|
-
resolve(rootDir, `${modulePath}.py`),
|
|
131
|
-
resolve(rootDir, modulePath, '__init__.py'),
|
|
132
|
-
];
|
|
133
|
-
for (const path of possiblePaths) {
|
|
134
|
-
if (fs.existsSync(path)) {
|
|
135
|
-
return path;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
return undefined;
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Calculate import depth for a Python file
|
|
143
|
-
*/
|
|
144
|
-
async function calculatePythonImportDepth(file, dependencyGraph, visited, depth = 0) {
|
|
145
|
-
if (visited.has(file)) {
|
|
146
|
-
return depth; // Circular dependency, stop here
|
|
147
|
-
}
|
|
148
|
-
visited.add(file);
|
|
149
|
-
const dependencies = dependencyGraph.get(file) || new Set();
|
|
150
|
-
if (dependencies.size === 0) {
|
|
151
|
-
return depth;
|
|
152
|
-
}
|
|
153
|
-
let maxDepth = depth;
|
|
154
|
-
for (const dep of dependencies) {
|
|
155
|
-
const depDepth = await calculatePythonImportDepth(dep, dependencyGraph, new Set(visited), depth + 1);
|
|
156
|
-
maxDepth = Math.max(maxDepth, depDepth);
|
|
157
|
-
}
|
|
158
|
-
return maxDepth;
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Estimate context budget (tokens needed for file + direct deps)
|
|
162
|
-
*/
|
|
163
|
-
function estimateContextBudget(code, imports, dependencyGraph) {
|
|
164
|
-
// File tokens
|
|
165
|
-
void dependencyGraph;
|
|
166
|
-
let budget = estimateTokens(code);
|
|
167
|
-
// Add tokens for direct dependencies (simplified)
|
|
168
|
-
// In a full implementation, we'd load each dependency file
|
|
169
|
-
const avgTokensPerDep = 500; // Conservative estimate
|
|
170
|
-
budget += imports.length * avgTokensPerDep;
|
|
171
|
-
return budget;
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Calculate cohesion for a Python module
|
|
175
|
-
*
|
|
176
|
-
* Cohesion = How related are the exports to each other?
|
|
177
|
-
* Higher cohesion = better (single responsibility)
|
|
178
|
-
*/
|
|
179
|
-
function calculatePythonCohesion(exports, imports) {
|
|
180
|
-
if (exports.length === 0)
|
|
181
|
-
return 1;
|
|
182
|
-
// Simple heuristic: files with many exports but few imports are less cohesive
|
|
183
|
-
const exportCount = exports.length;
|
|
184
|
-
const importCount = imports.length;
|
|
185
|
-
// Ideal: 1-5 exports per module
|
|
186
|
-
let cohesion = 1;
|
|
187
|
-
if (exportCount > 10) {
|
|
188
|
-
cohesion *= 0.6; // Too many exports = God module
|
|
189
|
-
}
|
|
190
|
-
else if (exportCount > 5) {
|
|
191
|
-
cohesion *= 0.8;
|
|
192
|
-
}
|
|
193
|
-
// High import-to-export ratio suggests focused module
|
|
194
|
-
if (exportCount > 0) {
|
|
195
|
-
const ratio = importCount / exportCount;
|
|
196
|
-
if (ratio > 2) {
|
|
197
|
-
cohesion *= 1.1; // Good: imports more than it exports
|
|
198
|
-
}
|
|
199
|
-
else if (ratio < 0.5) {
|
|
200
|
-
cohesion *= 0.9; // Bad: exports more than it imports
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
return Math.min(1, Math.max(0, cohesion));
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Detect circular dependencies
|
|
207
|
-
*/
|
|
208
|
-
function detectCircularDependencies(file, dependencyGraph) {
|
|
209
|
-
const circular = [];
|
|
210
|
-
const visited = new Set();
|
|
211
|
-
const recursionStack = new Set();
|
|
212
|
-
function dfs(current, path) {
|
|
213
|
-
if (recursionStack.has(current)) {
|
|
214
|
-
// Found a cycle
|
|
215
|
-
const cycleStart = path.indexOf(current);
|
|
216
|
-
const cycle = path.slice(cycleStart).concat([current]);
|
|
217
|
-
circular.push(cycle.join(' → '));
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
if (visited.has(current)) {
|
|
221
|
-
return;
|
|
222
|
-
}
|
|
223
|
-
visited.add(current);
|
|
224
|
-
recursionStack.add(current);
|
|
225
|
-
const dependencies = dependencyGraph.get(current) || new Set();
|
|
226
|
-
for (const dep of dependencies) {
|
|
227
|
-
dfs(dep, [...path, current]);
|
|
228
|
-
}
|
|
229
|
-
recursionStack.delete(current);
|
|
230
|
-
}
|
|
231
|
-
dfs(file, []);
|
|
232
|
-
return [...new Set(circular)]; // Deduplicate
|
|
233
|
-
}
|
|
234
|
-
//# sourceMappingURL=python-context.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"python-context.js","sourceRoot":"","sources":["../../src/analyzers/python-context.ts"],"names":[],"mappings":"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"}
|
package/dist/ast-utils.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { ExportInfo } from './types';
|
|
2
|
-
/**
|
|
3
|
-
* Extract exports using high-fidelity AST parsing across 5+ languages
|
|
4
|
-
*/
|
|
5
|
-
export declare function extractExportsWithAST(content: string, filePath: string, domainOptions?: {
|
|
6
|
-
domainKeywords?: string[];
|
|
7
|
-
}, fileImports?: string[]): ExportInfo[];
|
|
8
|
-
/**
|
|
9
|
-
* Check if a file is a test, mock, or fixture file
|
|
10
|
-
*/
|
|
11
|
-
export declare function isTestFile(filePath: string): boolean;
|
|
12
|
-
/**
|
|
13
|
-
* Heuristic to check if all exports share a common entity noun
|
|
14
|
-
*/
|
|
15
|
-
export declare function allExportsShareEntityNoun(exports: ExportInfo[]): boolean;
|
|
16
|
-
//# sourceMappingURL=ast-utils.d.ts.map
|
package/dist/ast-utils.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ast-utils.d.ts","sourceRoot":"","sources":["../src/ast-utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAsC,MAAM,SAAS,CAAC;AAG9E;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,EAC7C,WAAW,CAAC,EAAE,MAAM,EAAE,GACrB,UAAU,EAAE,CA2Bd;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAiBpD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAgCxE"}
|