@aiready/context-analyzer 0.21.5 → 0.21.7
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/.aiready/aiready-report-20260314-222254.json +39216 -0
- package/.aiready/aiready-report-20260314-223947.json +3413 -0
- package/.aiready/aiready-report-20260314-224112.json +3413 -0
- package/.aiready/aiready-report-20260314-224302.json +2973 -0
- package/.aiready/aiready-report-20260314-224939.json +3092 -0
- package/.aiready/aiready-report-20260314-225154.json +3092 -0
- package/.turbo/turbo-build.log +26 -24
- package/.turbo/turbo-lint.log +5 -6
- package/.turbo/turbo-test.log +41 -119
- package/dist/__tests__/analyzer.test.js +55 -14
- package/dist/__tests__/analyzer.test.js.map +1 -1
- package/dist/__tests__/cluster-detector.test.d.ts +2 -0
- package/dist/__tests__/cluster-detector.test.d.ts.map +1 -0
- package/dist/__tests__/cluster-detector.test.js +121 -0
- package/dist/__tests__/cluster-detector.test.js.map +1 -0
- package/dist/__tests__/contract.test.d.ts +2 -0
- package/dist/__tests__/contract.test.d.ts.map +1 -0
- package/dist/__tests__/contract.test.js +59 -0
- package/dist/__tests__/contract.test.js.map +1 -0
- package/dist/__tests__/enhanced-cohesion.test.js +12 -2
- package/dist/__tests__/enhanced-cohesion.test.js.map +1 -1
- package/dist/__tests__/file-classification.test.d.ts +2 -0
- package/dist/__tests__/file-classification.test.d.ts.map +1 -0
- package/dist/__tests__/file-classification.test.js +749 -0
- package/dist/__tests__/file-classification.test.js.map +1 -0
- package/dist/__tests__/fragmentation-advanced.test.js +2 -8
- package/dist/__tests__/fragmentation-advanced.test.js.map +1 -1
- package/dist/__tests__/fragmentation-coupling.test.js +2 -2
- package/dist/__tests__/fragmentation-coupling.test.js.map +1 -1
- package/dist/__tests__/fragmentation-log.test.js +3 -7
- package/dist/__tests__/fragmentation-log.test.js.map +1 -1
- package/dist/__tests__/provider.test.d.ts +2 -0
- package/dist/__tests__/provider.test.d.ts.map +1 -0
- package/dist/__tests__/provider.test.js +72 -0
- package/dist/__tests__/provider.test.js.map +1 -0
- package/dist/__tests__/remediation.test.d.ts +2 -0
- package/dist/__tests__/remediation.test.d.ts.map +1 -0
- package/dist/__tests__/remediation.test.js +61 -0
- package/dist/__tests__/remediation.test.js.map +1 -0
- package/dist/__tests__/scoring.test.js +196 -16
- package/dist/__tests__/scoring.test.js.map +1 -1
- package/dist/__tests__/structural-cohesion.test.js +8 -2
- package/dist/__tests__/structural-cohesion.test.js.map +1 -1
- package/dist/analyzer.d.ts +31 -94
- package/dist/analyzer.d.ts.map +1 -1
- package/dist/analyzer.js +260 -678
- package/dist/analyzer.js.map +1 -1
- package/dist/analyzers/python-context.d.ts.map +1 -1
- package/dist/analyzers/python-context.js +10 -8
- package/dist/analyzers/python-context.js.map +1 -1
- package/dist/ast-utils.d.ts +16 -0
- package/dist/ast-utils.d.ts.map +1 -0
- package/dist/ast-utils.js +81 -0
- package/dist/ast-utils.js.map +1 -0
- package/dist/chunk-2HE27YEV.mjs +1739 -0
- package/dist/chunk-64U3PNO3.mjs +94 -0
- package/dist/chunk-CDIVYADN.mjs +2110 -0
- package/dist/chunk-D25B5LZR.mjs +1739 -0
- package/dist/chunk-D3SIHB2V.mjs +2118 -0
- package/dist/chunk-FNPSK3CG.mjs +1760 -0
- package/dist/chunk-GXTGOLZT.mjs +92 -0
- package/dist/chunk-KDUUZQBK.mjs +1692 -0
- package/dist/chunk-KWIS5FQP.mjs +1739 -0
- package/dist/chunk-LERPI33Y.mjs +2060 -0
- package/dist/chunk-MZP3G7TF.mjs +2118 -0
- package/dist/chunk-NOHK5DLU.mjs +2173 -0
- package/dist/chunk-ORLC5Y4J.mjs +1787 -0
- package/dist/chunk-OTCQL7DY.mjs +2045 -0
- package/dist/chunk-RRB2C34Q.mjs +1738 -0
- package/dist/chunk-SFK6XTJE.mjs +2110 -0
- package/dist/chunk-U5R2FTCR.mjs +1803 -0
- package/dist/chunk-UU4HZ7ZT.mjs +1849 -0
- package/dist/chunk-WKOZOHOU.mjs +2060 -0
- package/dist/chunk-XIXAWCMS.mjs +1760 -0
- package/dist/chunk-XTAXUNQN.mjs +1742 -0
- package/dist/classifier.d.ts +114 -0
- package/dist/classifier.d.ts.map +1 -0
- package/dist/classifier.js +439 -0
- package/dist/classifier.js.map +1 -0
- package/dist/cli.js +681 -1170
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +63 -533
- package/dist/cluster-detector.d.ts +8 -0
- package/dist/cluster-detector.d.ts.map +1 -0
- package/dist/cluster-detector.js +70 -0
- package/dist/cluster-detector.js.map +1 -0
- package/dist/defaults.d.ts +7 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/defaults.js +54 -0
- package/dist/defaults.js.map +1 -0
- package/dist/graph-builder.d.ts +33 -0
- package/dist/graph-builder.d.ts.map +1 -0
- package/dist/graph-builder.js +225 -0
- package/dist/graph-builder.js.map +1 -0
- package/dist/index.d.mts +93 -106
- package/dist/index.d.ts +93 -106
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +932 -745
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +262 -28
- package/dist/metrics.d.ts +34 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +170 -0
- package/dist/metrics.js.map +1 -0
- package/dist/provider.d.ts +6 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +48 -0
- package/dist/provider.js.map +1 -0
- package/dist/python-context-3GZKN3LR.mjs +162 -0
- package/dist/python-context-O2EN3M6Z.mjs +162 -0
- package/dist/remediation.d.ts +25 -0
- package/dist/remediation.d.ts.map +1 -0
- package/dist/remediation.js +98 -0
- package/dist/remediation.js.map +1 -0
- package/dist/scoring.d.ts +3 -7
- package/dist/scoring.d.ts.map +1 -1
- package/dist/scoring.js +57 -48
- package/dist/scoring.js.map +1 -1
- package/dist/semantic-analysis.d.ts +12 -23
- package/dist/semantic-analysis.d.ts.map +1 -1
- package/dist/semantic-analysis.js +172 -110
- package/dist/semantic-analysis.js.map +1 -1
- package/dist/summary.d.ts +6 -0
- package/dist/summary.d.ts.map +1 -0
- package/dist/summary.js +92 -0
- package/dist/summary.js.map +1 -0
- package/dist/types.d.ts +9 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/output-formatter.d.ts +14 -0
- package/dist/utils/output-formatter.d.ts.map +1 -0
- package/dist/utils/output-formatter.js +338 -0
- package/dist/utils/output-formatter.js.map +1 -0
- package/package.json +2 -2
- package/src/__tests__/analyzer.test.ts +1 -1
- package/src/__tests__/auto-detection.test.ts +1 -1
- package/src/__tests__/contract.test.ts +1 -1
- package/src/__tests__/enhanced-cohesion.test.ts +1 -1
- package/src/__tests__/file-classification.test.ts +1 -1
- package/src/__tests__/fragmentation-advanced.test.ts +1 -1
- package/src/__tests__/fragmentation-coupling.test.ts +1 -1
- package/src/__tests__/fragmentation-log.test.ts +1 -1
- package/src/__tests__/provider.test.ts +1 -1
- package/src/__tests__/structural-cohesion.test.ts +1 -1
- package/src/analyzer.ts +112 -317
- package/src/analyzers/python-context.ts +7 -76
- package/src/ast-utils.ts +2 -2
- package/src/classifier.ts +13 -328
- package/src/cli-action.ts +110 -0
- package/src/cli.ts +3 -701
- package/src/cluster-detector.ts +28 -1
- package/src/defaults.ts +3 -0
- package/src/graph-builder.ts +10 -91
- package/src/heuristics.ts +216 -0
- package/src/index.ts +6 -0
- package/src/issue-analyzer.ts +158 -0
- package/src/metrics.ts +9 -0
- package/src/scoring.ts +3 -5
- package/src/semantic-analysis.ts +8 -14
- package/src/summary.ts +62 -106
- package/src/types.ts +52 -20
- package/src/utils/dependency-graph-utils.ts +126 -0
- package/src/utils/output-formatter.ts +411 -0
- package/src/utils/string-utils.ts +21 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster-detector.d.ts","sourceRoot":"","sources":["../src/cluster-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAG9D;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,eAAe,EACtB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GAClC,aAAa,EAAE,CAmEjB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { calculateFragmentation, calculateEnhancedCohesion } from './metrics';
|
|
2
|
+
/**
|
|
3
|
+
* Group files by domain to detect module clusters
|
|
4
|
+
*/
|
|
5
|
+
export function detectModuleClusters(graph, options) {
|
|
6
|
+
const domainMap = new Map();
|
|
7
|
+
for (const [file, node] of graph.nodes.entries()) {
|
|
8
|
+
const primaryDomain = node.exports[0]?.inferredDomain || 'unknown';
|
|
9
|
+
if (!domainMap.has(primaryDomain)) {
|
|
10
|
+
domainMap.set(primaryDomain, []);
|
|
11
|
+
}
|
|
12
|
+
domainMap.get(primaryDomain).push(file);
|
|
13
|
+
}
|
|
14
|
+
const clusters = [];
|
|
15
|
+
for (const [domain, files] of domainMap.entries()) {
|
|
16
|
+
if (files.length < 2 || domain === 'unknown')
|
|
17
|
+
continue;
|
|
18
|
+
const totalTokens = files.reduce((sum, file) => {
|
|
19
|
+
const node = graph.nodes.get(file);
|
|
20
|
+
return sum + (node?.tokenCost || 0);
|
|
21
|
+
}, 0);
|
|
22
|
+
// Calculate shared import ratio for coupling discount
|
|
23
|
+
let sharedImportRatio = 0;
|
|
24
|
+
if (files.length >= 2) {
|
|
25
|
+
const allImportSets = files.map((f) => new Set(graph.nodes.get(f)?.imports || []));
|
|
26
|
+
let intersection = new Set(allImportSets[0]);
|
|
27
|
+
const union = new Set(allImportSets[0]);
|
|
28
|
+
for (let i = 1; i < allImportSets.length; i++) {
|
|
29
|
+
const nextSet = allImportSets[i];
|
|
30
|
+
intersection = new Set([...intersection].filter((x) => nextSet.has(x)));
|
|
31
|
+
for (const x of nextSet)
|
|
32
|
+
union.add(x);
|
|
33
|
+
}
|
|
34
|
+
sharedImportRatio = union.size > 0 ? intersection.size / union.size : 0;
|
|
35
|
+
}
|
|
36
|
+
const fragmentation = calculateFragmentation(files, domain, {
|
|
37
|
+
...options,
|
|
38
|
+
sharedImportRatio,
|
|
39
|
+
});
|
|
40
|
+
// Average cohesion for the cluster
|
|
41
|
+
let totalCohesion = 0;
|
|
42
|
+
files.forEach((f) => {
|
|
43
|
+
const node = graph.nodes.get(f);
|
|
44
|
+
if (node)
|
|
45
|
+
totalCohesion += calculateEnhancedCohesion(node.exports);
|
|
46
|
+
});
|
|
47
|
+
const avgCohesion = totalCohesion / files.length;
|
|
48
|
+
clusters.push({
|
|
49
|
+
domain,
|
|
50
|
+
files,
|
|
51
|
+
totalTokens,
|
|
52
|
+
fragmentationScore: fragmentation,
|
|
53
|
+
avgCohesion,
|
|
54
|
+
suggestedStructure: generateSuggestedStructure(files, totalTokens, fragmentation),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return clusters;
|
|
58
|
+
}
|
|
59
|
+
function generateSuggestedStructure(files, tokens, fragmentation) {
|
|
60
|
+
const targetFiles = Math.max(1, Math.ceil(tokens / 10000));
|
|
61
|
+
const plan = [];
|
|
62
|
+
if (fragmentation > 0.5) {
|
|
63
|
+
plan.push(`Consolidate ${files.length} files scattered across multiple directories into ${targetFiles} core module(s)`);
|
|
64
|
+
}
|
|
65
|
+
if (tokens > 20000) {
|
|
66
|
+
plan.push(`Domain logic is very large (${Math.round(tokens / 1000)}k tokens). Ensure clear sub-domain boundaries.`);
|
|
67
|
+
}
|
|
68
|
+
return { targetFiles, consolidationPlan: plan };
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=cluster-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster-detector.js","sourceRoot":"","sources":["../src/cluster-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ContextAnalyzerOptions } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Generate smart defaults for context analysis based on repository size
|
|
4
|
+
* Automatically tunes thresholds to target ~10 most serious issues
|
|
5
|
+
*/
|
|
6
|
+
export declare function getSmartDefaults(directory: string, userOptions: Partial<ContextAnalyzerOptions>): Promise<ContextAnalyzerOptions>;
|
|
7
|
+
//# sourceMappingURL=defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEtD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,OAAO,CAAC,sBAAsB,CAAC,GAC3C,OAAO,CAAC,sBAAsB,CAAC,CAgDjC"}
|
package/dist/defaults.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { scanFiles } from '@aiready/core';
|
|
2
|
+
/**
|
|
3
|
+
* Generate smart defaults for context analysis based on repository size
|
|
4
|
+
* Automatically tunes thresholds to target ~10 most serious issues
|
|
5
|
+
*/
|
|
6
|
+
export async function getSmartDefaults(directory, userOptions) {
|
|
7
|
+
// Estimate repository size by scanning files
|
|
8
|
+
const files = await scanFiles({
|
|
9
|
+
rootDir: directory,
|
|
10
|
+
include: userOptions.include,
|
|
11
|
+
exclude: userOptions.exclude,
|
|
12
|
+
});
|
|
13
|
+
const estimatedBlocks = files.length;
|
|
14
|
+
let maxDepth;
|
|
15
|
+
let maxContextBudget;
|
|
16
|
+
let minCohesion;
|
|
17
|
+
let maxFragmentation;
|
|
18
|
+
if (estimatedBlocks < 100) {
|
|
19
|
+
maxDepth = 4;
|
|
20
|
+
maxContextBudget = 8000;
|
|
21
|
+
minCohesion = 0.5;
|
|
22
|
+
maxFragmentation = 0.5;
|
|
23
|
+
}
|
|
24
|
+
else if (estimatedBlocks < 500) {
|
|
25
|
+
maxDepth = 5;
|
|
26
|
+
maxContextBudget = 15000;
|
|
27
|
+
minCohesion = 0.45;
|
|
28
|
+
maxFragmentation = 0.6;
|
|
29
|
+
}
|
|
30
|
+
else if (estimatedBlocks < 2000) {
|
|
31
|
+
maxDepth = 7;
|
|
32
|
+
maxContextBudget = 25000;
|
|
33
|
+
minCohesion = 0.4;
|
|
34
|
+
maxFragmentation = 0.7;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
maxDepth = 10;
|
|
38
|
+
maxContextBudget = 40000;
|
|
39
|
+
minCohesion = 0.35;
|
|
40
|
+
maxFragmentation = 0.8;
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
maxDepth,
|
|
44
|
+
maxContextBudget,
|
|
45
|
+
minCohesion,
|
|
46
|
+
maxFragmentation,
|
|
47
|
+
focus: 'all',
|
|
48
|
+
includeNodeModules: false,
|
|
49
|
+
rootDir: userOptions.rootDir || directory,
|
|
50
|
+
include: userOptions.include,
|
|
51
|
+
exclude: userOptions.exclude,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG1C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAAiB,EACjB,WAA4C;IAE5C,6CAA6C;IAC7C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC;QAC5B,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,OAAO,EAAE,WAAW,CAAC,OAAO;KAC7B,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC;IAErC,IAAI,QAAgB,CAAC;IACrB,IAAI,gBAAwB,CAAC;IAC7B,IAAI,WAAmB,CAAC;IACxB,IAAI,gBAAwB,CAAC;IAE7B,IAAI,eAAe,GAAG,GAAG,EAAE,CAAC;QAC1B,QAAQ,GAAG,CAAC,CAAC;QACb,gBAAgB,GAAG,IAAI,CAAC;QACxB,WAAW,GAAG,GAAG,CAAC;QAClB,gBAAgB,GAAG,GAAG,CAAC;IACzB,CAAC;SAAM,IAAI,eAAe,GAAG,GAAG,EAAE,CAAC;QACjC,QAAQ,GAAG,CAAC,CAAC;QACb,gBAAgB,GAAG,KAAK,CAAC;QACzB,WAAW,GAAG,IAAI,CAAC;QACnB,gBAAgB,GAAG,GAAG,CAAC;IACzB,CAAC;SAAM,IAAI,eAAe,GAAG,IAAI,EAAE,CAAC;QAClC,QAAQ,GAAG,CAAC,CAAC;QACb,gBAAgB,GAAG,KAAK,CAAC;QACzB,WAAW,GAAG,GAAG,CAAC;QAClB,gBAAgB,GAAG,GAAG,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,EAAE,CAAC;QACd,gBAAgB,GAAG,KAAK,CAAC;QACzB,WAAW,GAAG,IAAI,CAAC;QACnB,gBAAgB,GAAG,GAAG,CAAC;IACzB,CAAC;IAED,OAAO;QACL,QAAQ;QACR,gBAAgB;QAChB,WAAW;QACX,gBAAgB;QAChB,KAAK,EAAE,KAAK;QACZ,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,WAAW,CAAC,OAAO,IAAI,SAAS;QACzC,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,OAAO,EAAE,WAAW,CAAC,OAAO;KAC7B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { DependencyGraph } from './types';
|
|
2
|
+
interface FileContent {
|
|
3
|
+
file: string;
|
|
4
|
+
content: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Auto-detect domain keywords from workspace folder structure
|
|
8
|
+
*/
|
|
9
|
+
export declare function extractDomainKeywordsFromPaths(files: FileContent[]): string[];
|
|
10
|
+
/**
|
|
11
|
+
* Build a dependency graph from file contents
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildDependencyGraph(files: FileContent[], options?: {
|
|
14
|
+
domainKeywords?: string[];
|
|
15
|
+
}): DependencyGraph;
|
|
16
|
+
/**
|
|
17
|
+
* Calculate the maximum depth of import tree for a file
|
|
18
|
+
*/
|
|
19
|
+
export declare function calculateImportDepth(file: string, graph: DependencyGraph, visited?: Set<string>, depth?: number): number;
|
|
20
|
+
/**
|
|
21
|
+
* Get all transitive dependencies for a file
|
|
22
|
+
*/
|
|
23
|
+
export declare function getTransitiveDependencies(file: string, graph: DependencyGraph, visited?: Set<string>): string[];
|
|
24
|
+
/**
|
|
25
|
+
* Calculate total context budget (tokens needed to understand this file)
|
|
26
|
+
*/
|
|
27
|
+
export declare function calculateContextBudget(file: string, graph: DependencyGraph): number;
|
|
28
|
+
/**
|
|
29
|
+
* Detect circular dependencies
|
|
30
|
+
*/
|
|
31
|
+
export declare function detectCircularDependencies(graph: DependencyGraph): string[][];
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=graph-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-builder.d.ts","sourceRoot":"","sources":["../src/graph-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAS/D,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAuCD;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,CAuC7E;AAqBD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,WAAW,EAAE,EACpB,OAAO,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACtC,eAAe,CAkEjB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,eAAe,EACtB,OAAO,cAAoB,EAC3B,KAAK,SAAI,GACR,MAAM,CAkBR;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,eAAe,EACtB,OAAO,cAAoB,GAC1B,MAAM,EAAE,CAcV;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,eAAe,GACrB,MAAM,CAeR;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,EAAE,EAAE,CAqC7E"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { estimateTokens, parseFileExports } from '@aiready/core';
|
|
2
|
+
import { buildCoUsageMatrix, buildTypeGraph, inferDomainFromSemantics, } from './semantic-analysis';
|
|
3
|
+
import { extractExportsWithAST } from './ast-utils';
|
|
4
|
+
import { join, dirname, normalize } from 'path';
|
|
5
|
+
/**
|
|
6
|
+
* Resolve an import source to its absolute path considering the importing file's location
|
|
7
|
+
*/
|
|
8
|
+
function resolveImport(source, importingFile, allFiles) {
|
|
9
|
+
// If it's not a relative import, we treat it as an external dependency for now
|
|
10
|
+
// (unless it's an absolute path that exists in our set)
|
|
11
|
+
if (!source.startsWith('.') && !source.startsWith('/')) {
|
|
12
|
+
if (allFiles.has(source))
|
|
13
|
+
return source;
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
const dir = dirname(importingFile);
|
|
17
|
+
const absolutePath = normalize(join(dir, source));
|
|
18
|
+
// Try exact match
|
|
19
|
+
if (allFiles.has(absolutePath))
|
|
20
|
+
return absolutePath;
|
|
21
|
+
// Try common extensions
|
|
22
|
+
const extensions = ['.ts', '.tsx', '.js', '.jsx'];
|
|
23
|
+
for (const ext of extensions) {
|
|
24
|
+
const withExt = absolutePath + ext;
|
|
25
|
+
if (allFiles.has(withExt))
|
|
26
|
+
return withExt;
|
|
27
|
+
}
|
|
28
|
+
// Try directory index
|
|
29
|
+
for (const ext of extensions) {
|
|
30
|
+
const indexFile = normalize(join(absolutePath, `index${ext}`));
|
|
31
|
+
if (allFiles.has(indexFile))
|
|
32
|
+
return indexFile;
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Auto-detect domain keywords from workspace folder structure
|
|
38
|
+
*/
|
|
39
|
+
export function extractDomainKeywordsFromPaths(files) {
|
|
40
|
+
const folderNames = new Set();
|
|
41
|
+
for (const { file } of files) {
|
|
42
|
+
const segments = file.split('/');
|
|
43
|
+
const skipFolders = new Set([
|
|
44
|
+
'src',
|
|
45
|
+
'lib',
|
|
46
|
+
'dist',
|
|
47
|
+
'build',
|
|
48
|
+
'node_modules',
|
|
49
|
+
'test',
|
|
50
|
+
'tests',
|
|
51
|
+
'__tests__',
|
|
52
|
+
'spec',
|
|
53
|
+
'e2e',
|
|
54
|
+
'scripts',
|
|
55
|
+
'components',
|
|
56
|
+
'utils',
|
|
57
|
+
'helpers',
|
|
58
|
+
'util',
|
|
59
|
+
'helper',
|
|
60
|
+
'api',
|
|
61
|
+
'apis',
|
|
62
|
+
]);
|
|
63
|
+
for (const segment of segments) {
|
|
64
|
+
const normalized = segment.toLowerCase();
|
|
65
|
+
if (normalized &&
|
|
66
|
+
!skipFolders.has(normalized) &&
|
|
67
|
+
!normalized.includes('.')) {
|
|
68
|
+
folderNames.add(singularize(normalized));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return Array.from(folderNames);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Simple singularization for common English plurals
|
|
76
|
+
*/
|
|
77
|
+
function singularize(word) {
|
|
78
|
+
const irregulars = {
|
|
79
|
+
people: 'person',
|
|
80
|
+
children: 'child',
|
|
81
|
+
men: 'man',
|
|
82
|
+
women: 'woman',
|
|
83
|
+
};
|
|
84
|
+
if (irregulars[word])
|
|
85
|
+
return irregulars[word];
|
|
86
|
+
if (word.endsWith('ies'))
|
|
87
|
+
return word.slice(0, -3) + 'y';
|
|
88
|
+
if (word.endsWith('ses'))
|
|
89
|
+
return word.slice(0, -2);
|
|
90
|
+
if (word.endsWith('s') && word.length > 3)
|
|
91
|
+
return word.slice(0, -1);
|
|
92
|
+
return word;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Build a dependency graph from file contents
|
|
96
|
+
*/
|
|
97
|
+
export function buildDependencyGraph(files, options) {
|
|
98
|
+
const nodes = new Map();
|
|
99
|
+
const edges = new Map();
|
|
100
|
+
const autoDetectedKeywords = options?.domainKeywords ?? extractDomainKeywordsFromPaths(files);
|
|
101
|
+
const allFilePaths = new Set(files.map((f) => f.file));
|
|
102
|
+
for (const { file, content } of files) {
|
|
103
|
+
// 1. Get high-fidelity AST-based imports & exports
|
|
104
|
+
const { imports: astImports } = parseFileExports(content, file);
|
|
105
|
+
// 2. Resolve imports to absolute paths in the graph
|
|
106
|
+
const resolvedImports = astImports
|
|
107
|
+
.map((i) => resolveImport(i.source, file, allFilePaths))
|
|
108
|
+
.filter((path) => path !== null);
|
|
109
|
+
const importSources = astImports.map((i) => i.source);
|
|
110
|
+
// 3. Wrap with platform-specific metadata (v0.11+)
|
|
111
|
+
const exports = extractExportsWithAST(content, file, { domainKeywords: autoDetectedKeywords }, importSources);
|
|
112
|
+
const tokenCost = estimateTokens(content);
|
|
113
|
+
const linesOfCode = content.split('\n').length;
|
|
114
|
+
nodes.set(file, {
|
|
115
|
+
file,
|
|
116
|
+
imports: importSources,
|
|
117
|
+
exports,
|
|
118
|
+
tokenCost,
|
|
119
|
+
linesOfCode,
|
|
120
|
+
});
|
|
121
|
+
edges.set(file, new Set(resolvedImports));
|
|
122
|
+
}
|
|
123
|
+
const graph = { nodes, edges };
|
|
124
|
+
const coUsageMatrix = buildCoUsageMatrix(graph);
|
|
125
|
+
const typeGraph = buildTypeGraph(graph);
|
|
126
|
+
graph.coUsageMatrix = coUsageMatrix;
|
|
127
|
+
graph.typeGraph = typeGraph;
|
|
128
|
+
for (const [file, node] of nodes) {
|
|
129
|
+
for (const exp of node.exports) {
|
|
130
|
+
const semanticAssignments = inferDomainFromSemantics(file, exp.name, graph, coUsageMatrix, typeGraph, exp.typeReferences);
|
|
131
|
+
exp.domains = semanticAssignments;
|
|
132
|
+
if (semanticAssignments.length > 0) {
|
|
133
|
+
exp.inferredDomain = semanticAssignments[0].domain;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return graph;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Calculate the maximum depth of import tree for a file
|
|
141
|
+
*/
|
|
142
|
+
export function calculateImportDepth(file, graph, visited = new Set(), depth = 0) {
|
|
143
|
+
if (visited.has(file))
|
|
144
|
+
return depth;
|
|
145
|
+
const dependencies = graph.edges.get(file);
|
|
146
|
+
if (!dependencies || dependencies.size === 0)
|
|
147
|
+
return depth;
|
|
148
|
+
visited.add(file);
|
|
149
|
+
let maxDepth = depth;
|
|
150
|
+
for (const dep of dependencies) {
|
|
151
|
+
maxDepth = Math.max(maxDepth, calculateImportDepth(dep, graph, visited, depth + 1));
|
|
152
|
+
}
|
|
153
|
+
visited.delete(file);
|
|
154
|
+
return maxDepth;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get all transitive dependencies for a file
|
|
158
|
+
*/
|
|
159
|
+
export function getTransitiveDependencies(file, graph, visited = new Set()) {
|
|
160
|
+
if (visited.has(file))
|
|
161
|
+
return [];
|
|
162
|
+
visited.add(file);
|
|
163
|
+
const dependencies = graph.edges.get(file);
|
|
164
|
+
if (!dependencies || dependencies.size === 0)
|
|
165
|
+
return [];
|
|
166
|
+
const allDeps = [];
|
|
167
|
+
for (const dep of dependencies) {
|
|
168
|
+
allDeps.push(dep);
|
|
169
|
+
allDeps.push(...getTransitiveDependencies(dep, graph, visited));
|
|
170
|
+
}
|
|
171
|
+
return [...new Set(allDeps)];
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Calculate total context budget (tokens needed to understand this file)
|
|
175
|
+
*/
|
|
176
|
+
export function calculateContextBudget(file, graph) {
|
|
177
|
+
const node = graph.nodes.get(file);
|
|
178
|
+
if (!node)
|
|
179
|
+
return 0;
|
|
180
|
+
let totalTokens = node.tokenCost;
|
|
181
|
+
const deps = getTransitiveDependencies(file, graph);
|
|
182
|
+
for (const dep of deps) {
|
|
183
|
+
const depNode = graph.nodes.get(dep);
|
|
184
|
+
if (depNode) {
|
|
185
|
+
totalTokens += depNode.tokenCost;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return totalTokens;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Detect circular dependencies
|
|
192
|
+
*/
|
|
193
|
+
export function detectCircularDependencies(graph) {
|
|
194
|
+
const cycles = [];
|
|
195
|
+
const visited = new Set();
|
|
196
|
+
const recursionStack = new Set();
|
|
197
|
+
function dfs(file, path) {
|
|
198
|
+
if (recursionStack.has(file)) {
|
|
199
|
+
const cycleStart = path.indexOf(file);
|
|
200
|
+
if (cycleStart !== -1) {
|
|
201
|
+
cycles.push([...path.slice(cycleStart), file]);
|
|
202
|
+
}
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (visited.has(file))
|
|
206
|
+
return;
|
|
207
|
+
visited.add(file);
|
|
208
|
+
recursionStack.add(file);
|
|
209
|
+
path.push(file);
|
|
210
|
+
const dependencies = graph.edges.get(file);
|
|
211
|
+
if (dependencies) {
|
|
212
|
+
for (const dep of dependencies) {
|
|
213
|
+
dfs(dep, [...path]);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
recursionStack.delete(file);
|
|
217
|
+
}
|
|
218
|
+
for (const file of graph.nodes.keys()) {
|
|
219
|
+
if (!visited.has(file)) {
|
|
220
|
+
dfs(file, []);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return cycles;
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=graph-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-builder.js","sourceRoot":"","sources":["../src/graph-builder.ts"],"names":[],"mappings":"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"}
|