@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.
Files changed (163) hide show
  1. package/.aiready/aiready-report-20260314-222254.json +39216 -0
  2. package/.aiready/aiready-report-20260314-223947.json +3413 -0
  3. package/.aiready/aiready-report-20260314-224112.json +3413 -0
  4. package/.aiready/aiready-report-20260314-224302.json +2973 -0
  5. package/.aiready/aiready-report-20260314-224939.json +3092 -0
  6. package/.aiready/aiready-report-20260314-225154.json +3092 -0
  7. package/.turbo/turbo-build.log +26 -24
  8. package/.turbo/turbo-lint.log +5 -6
  9. package/.turbo/turbo-test.log +41 -119
  10. package/dist/__tests__/analyzer.test.js +55 -14
  11. package/dist/__tests__/analyzer.test.js.map +1 -1
  12. package/dist/__tests__/cluster-detector.test.d.ts +2 -0
  13. package/dist/__tests__/cluster-detector.test.d.ts.map +1 -0
  14. package/dist/__tests__/cluster-detector.test.js +121 -0
  15. package/dist/__tests__/cluster-detector.test.js.map +1 -0
  16. package/dist/__tests__/contract.test.d.ts +2 -0
  17. package/dist/__tests__/contract.test.d.ts.map +1 -0
  18. package/dist/__tests__/contract.test.js +59 -0
  19. package/dist/__tests__/contract.test.js.map +1 -0
  20. package/dist/__tests__/enhanced-cohesion.test.js +12 -2
  21. package/dist/__tests__/enhanced-cohesion.test.js.map +1 -1
  22. package/dist/__tests__/file-classification.test.d.ts +2 -0
  23. package/dist/__tests__/file-classification.test.d.ts.map +1 -0
  24. package/dist/__tests__/file-classification.test.js +749 -0
  25. package/dist/__tests__/file-classification.test.js.map +1 -0
  26. package/dist/__tests__/fragmentation-advanced.test.js +2 -8
  27. package/dist/__tests__/fragmentation-advanced.test.js.map +1 -1
  28. package/dist/__tests__/fragmentation-coupling.test.js +2 -2
  29. package/dist/__tests__/fragmentation-coupling.test.js.map +1 -1
  30. package/dist/__tests__/fragmentation-log.test.js +3 -7
  31. package/dist/__tests__/fragmentation-log.test.js.map +1 -1
  32. package/dist/__tests__/provider.test.d.ts +2 -0
  33. package/dist/__tests__/provider.test.d.ts.map +1 -0
  34. package/dist/__tests__/provider.test.js +72 -0
  35. package/dist/__tests__/provider.test.js.map +1 -0
  36. package/dist/__tests__/remediation.test.d.ts +2 -0
  37. package/dist/__tests__/remediation.test.d.ts.map +1 -0
  38. package/dist/__tests__/remediation.test.js +61 -0
  39. package/dist/__tests__/remediation.test.js.map +1 -0
  40. package/dist/__tests__/scoring.test.js +196 -16
  41. package/dist/__tests__/scoring.test.js.map +1 -1
  42. package/dist/__tests__/structural-cohesion.test.js +8 -2
  43. package/dist/__tests__/structural-cohesion.test.js.map +1 -1
  44. package/dist/analyzer.d.ts +31 -94
  45. package/dist/analyzer.d.ts.map +1 -1
  46. package/dist/analyzer.js +260 -678
  47. package/dist/analyzer.js.map +1 -1
  48. package/dist/analyzers/python-context.d.ts.map +1 -1
  49. package/dist/analyzers/python-context.js +10 -8
  50. package/dist/analyzers/python-context.js.map +1 -1
  51. package/dist/ast-utils.d.ts +16 -0
  52. package/dist/ast-utils.d.ts.map +1 -0
  53. package/dist/ast-utils.js +81 -0
  54. package/dist/ast-utils.js.map +1 -0
  55. package/dist/chunk-2HE27YEV.mjs +1739 -0
  56. package/dist/chunk-64U3PNO3.mjs +94 -0
  57. package/dist/chunk-CDIVYADN.mjs +2110 -0
  58. package/dist/chunk-D25B5LZR.mjs +1739 -0
  59. package/dist/chunk-D3SIHB2V.mjs +2118 -0
  60. package/dist/chunk-FNPSK3CG.mjs +1760 -0
  61. package/dist/chunk-GXTGOLZT.mjs +92 -0
  62. package/dist/chunk-KDUUZQBK.mjs +1692 -0
  63. package/dist/chunk-KWIS5FQP.mjs +1739 -0
  64. package/dist/chunk-LERPI33Y.mjs +2060 -0
  65. package/dist/chunk-MZP3G7TF.mjs +2118 -0
  66. package/dist/chunk-NOHK5DLU.mjs +2173 -0
  67. package/dist/chunk-ORLC5Y4J.mjs +1787 -0
  68. package/dist/chunk-OTCQL7DY.mjs +2045 -0
  69. package/dist/chunk-RRB2C34Q.mjs +1738 -0
  70. package/dist/chunk-SFK6XTJE.mjs +2110 -0
  71. package/dist/chunk-U5R2FTCR.mjs +1803 -0
  72. package/dist/chunk-UU4HZ7ZT.mjs +1849 -0
  73. package/dist/chunk-WKOZOHOU.mjs +2060 -0
  74. package/dist/chunk-XIXAWCMS.mjs +1760 -0
  75. package/dist/chunk-XTAXUNQN.mjs +1742 -0
  76. package/dist/classifier.d.ts +114 -0
  77. package/dist/classifier.d.ts.map +1 -0
  78. package/dist/classifier.js +439 -0
  79. package/dist/classifier.js.map +1 -0
  80. package/dist/cli.js +681 -1170
  81. package/dist/cli.js.map +1 -1
  82. package/dist/cli.mjs +63 -533
  83. package/dist/cluster-detector.d.ts +8 -0
  84. package/dist/cluster-detector.d.ts.map +1 -0
  85. package/dist/cluster-detector.js +70 -0
  86. package/dist/cluster-detector.js.map +1 -0
  87. package/dist/defaults.d.ts +7 -0
  88. package/dist/defaults.d.ts.map +1 -0
  89. package/dist/defaults.js +54 -0
  90. package/dist/defaults.js.map +1 -0
  91. package/dist/graph-builder.d.ts +33 -0
  92. package/dist/graph-builder.d.ts.map +1 -0
  93. package/dist/graph-builder.js +225 -0
  94. package/dist/graph-builder.js.map +1 -0
  95. package/dist/index.d.mts +93 -106
  96. package/dist/index.d.ts +93 -106
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +932 -745
  99. package/dist/index.js.map +1 -1
  100. package/dist/index.mjs +262 -28
  101. package/dist/metrics.d.ts +34 -0
  102. package/dist/metrics.d.ts.map +1 -0
  103. package/dist/metrics.js +170 -0
  104. package/dist/metrics.js.map +1 -0
  105. package/dist/provider.d.ts +6 -0
  106. package/dist/provider.d.ts.map +1 -0
  107. package/dist/provider.js +48 -0
  108. package/dist/provider.js.map +1 -0
  109. package/dist/python-context-3GZKN3LR.mjs +162 -0
  110. package/dist/python-context-O2EN3M6Z.mjs +162 -0
  111. package/dist/remediation.d.ts +25 -0
  112. package/dist/remediation.d.ts.map +1 -0
  113. package/dist/remediation.js +98 -0
  114. package/dist/remediation.js.map +1 -0
  115. package/dist/scoring.d.ts +3 -7
  116. package/dist/scoring.d.ts.map +1 -1
  117. package/dist/scoring.js +57 -48
  118. package/dist/scoring.js.map +1 -1
  119. package/dist/semantic-analysis.d.ts +12 -23
  120. package/dist/semantic-analysis.d.ts.map +1 -1
  121. package/dist/semantic-analysis.js +172 -110
  122. package/dist/semantic-analysis.js.map +1 -1
  123. package/dist/summary.d.ts +6 -0
  124. package/dist/summary.d.ts.map +1 -0
  125. package/dist/summary.js +92 -0
  126. package/dist/summary.js.map +1 -0
  127. package/dist/types.d.ts +9 -2
  128. package/dist/types.d.ts.map +1 -1
  129. package/dist/utils/output-formatter.d.ts +14 -0
  130. package/dist/utils/output-formatter.d.ts.map +1 -0
  131. package/dist/utils/output-formatter.js +338 -0
  132. package/dist/utils/output-formatter.js.map +1 -0
  133. package/package.json +2 -2
  134. package/src/__tests__/analyzer.test.ts +1 -1
  135. package/src/__tests__/auto-detection.test.ts +1 -1
  136. package/src/__tests__/contract.test.ts +1 -1
  137. package/src/__tests__/enhanced-cohesion.test.ts +1 -1
  138. package/src/__tests__/file-classification.test.ts +1 -1
  139. package/src/__tests__/fragmentation-advanced.test.ts +1 -1
  140. package/src/__tests__/fragmentation-coupling.test.ts +1 -1
  141. package/src/__tests__/fragmentation-log.test.ts +1 -1
  142. package/src/__tests__/provider.test.ts +1 -1
  143. package/src/__tests__/structural-cohesion.test.ts +1 -1
  144. package/src/analyzer.ts +112 -317
  145. package/src/analyzers/python-context.ts +7 -76
  146. package/src/ast-utils.ts +2 -2
  147. package/src/classifier.ts +13 -328
  148. package/src/cli-action.ts +110 -0
  149. package/src/cli.ts +3 -701
  150. package/src/cluster-detector.ts +28 -1
  151. package/src/defaults.ts +3 -0
  152. package/src/graph-builder.ts +10 -91
  153. package/src/heuristics.ts +216 -0
  154. package/src/index.ts +6 -0
  155. package/src/issue-analyzer.ts +158 -0
  156. package/src/metrics.ts +9 -0
  157. package/src/scoring.ts +3 -5
  158. package/src/semantic-analysis.ts +8 -14
  159. package/src/summary.ts +62 -106
  160. package/src/types.ts +52 -20
  161. package/src/utils/dependency-graph-utils.ts +126 -0
  162. package/src/utils/output-formatter.ts +411 -0
  163. 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"}
@@ -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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"}