@defai.digital/ax-cli 3.15.21 → 3.15.24

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 (261) hide show
  1. package/README.md +22 -2
  2. package/dist/agent/agent-executor.d.ts +1 -1
  3. package/dist/agent/agent-executor.js +15 -17
  4. package/dist/agent/agent-executor.js.map +1 -1
  5. package/dist/agent/execution/tool-executor.d.ts +6 -0
  6. package/dist/agent/execution/tool-executor.js +16 -1
  7. package/dist/agent/execution/tool-executor.js.map +1 -1
  8. package/dist/agent/llm-agent.js +91 -22
  9. package/dist/agent/llm-agent.js.map +1 -1
  10. package/dist/agent/parallel-tools.d.ts +65 -0
  11. package/dist/agent/parallel-tools.js +146 -0
  12. package/dist/agent/parallel-tools.js.map +1 -0
  13. package/dist/llm/tools.js +1 -1
  14. package/dist/llm/tools.js.map +1 -1
  15. package/dist/ui/components/chat-interface.js +14 -0
  16. package/dist/ui/components/chat-interface.js.map +1 -1
  17. package/dist/ui/hooks/use-input-handler.js +2 -2
  18. package/dist/ui/hooks/use-input-handler.js.map +1 -1
  19. package/dist/ui/utils/image-handler.js +8 -5
  20. package/dist/ui/utils/image-handler.js.map +1 -1
  21. package/package.json +1 -1
  22. package/dist/analyzers/architecture/anti-pattern-detectors/god-object-detector.d.ts +0 -29
  23. package/dist/analyzers/architecture/anti-pattern-detectors/god-object-detector.js +0 -103
  24. package/dist/analyzers/architecture/anti-pattern-detectors/god-object-detector.js.map +0 -1
  25. package/dist/analyzers/architecture/architecture-analyzer.d.ts +0 -58
  26. package/dist/analyzers/architecture/architecture-analyzer.js +0 -276
  27. package/dist/analyzers/architecture/architecture-analyzer.js.map +0 -1
  28. package/dist/analyzers/architecture/index.d.ts +0 -12
  29. package/dist/analyzers/architecture/index.js +0 -14
  30. package/dist/analyzers/architecture/index.js.map +0 -1
  31. package/dist/analyzers/architecture/pattern-detectors/base-detector.d.ts +0 -27
  32. package/dist/analyzers/architecture/pattern-detectors/base-detector.js +0 -31
  33. package/dist/analyzers/architecture/pattern-detectors/base-detector.js.map +0 -1
  34. package/dist/analyzers/architecture/pattern-detectors/clean-architecture-detector.d.ts +0 -11
  35. package/dist/analyzers/architecture/pattern-detectors/clean-architecture-detector.js +0 -57
  36. package/dist/analyzers/architecture/pattern-detectors/clean-architecture-detector.js.map +0 -1
  37. package/dist/analyzers/architecture/pattern-detectors/mvc-detector.d.ts +0 -11
  38. package/dist/analyzers/architecture/pattern-detectors/mvc-detector.js +0 -43
  39. package/dist/analyzers/architecture/pattern-detectors/mvc-detector.js.map +0 -1
  40. package/dist/analyzers/architecture/pattern-detectors/repository-detector.d.ts +0 -11
  41. package/dist/analyzers/architecture/pattern-detectors/repository-detector.js +0 -49
  42. package/dist/analyzers/architecture/pattern-detectors/repository-detector.js.map +0 -1
  43. package/dist/analyzers/architecture/project-structure-scanner.d.ts +0 -54
  44. package/dist/analyzers/architecture/project-structure-scanner.js +0 -204
  45. package/dist/analyzers/architecture/project-structure-scanner.js.map +0 -1
  46. package/dist/analyzers/ast/index.d.ts +0 -13
  47. package/dist/analyzers/ast/index.js +0 -16
  48. package/dist/analyzers/ast/index.js.map +0 -1
  49. package/dist/analyzers/ast/language-parser.d.ts +0 -59
  50. package/dist/analyzers/ast/language-parser.js +0 -107
  51. package/dist/analyzers/ast/language-parser.js.map +0 -1
  52. package/dist/analyzers/ast/multi-language-parser.d.ts +0 -79
  53. package/dist/analyzers/ast/multi-language-parser.js +0 -157
  54. package/dist/analyzers/ast/multi-language-parser.js.map +0 -1
  55. package/dist/analyzers/ast/node-helpers.d.ts +0 -81
  56. package/dist/analyzers/ast/node-helpers.js +0 -128
  57. package/dist/analyzers/ast/node-helpers.js.map +0 -1
  58. package/dist/analyzers/ast/parser.d.ts +0 -60
  59. package/dist/analyzers/ast/parser.js +0 -305
  60. package/dist/analyzers/ast/parser.js.map +0 -1
  61. package/dist/analyzers/ast/traverser.d.ts +0 -67
  62. package/dist/analyzers/ast/traverser.js +0 -156
  63. package/dist/analyzers/ast/traverser.js.map +0 -1
  64. package/dist/analyzers/ast/types.d.ts +0 -107
  65. package/dist/analyzers/ast/types.js +0 -7
  66. package/dist/analyzers/ast/types.js.map +0 -1
  67. package/dist/analyzers/best-practices/base-rule.d.ts +0 -45
  68. package/dist/analyzers/best-practices/base-rule.js +0 -45
  69. package/dist/analyzers/best-practices/base-rule.js.map +0 -1
  70. package/dist/analyzers/best-practices/best-practice-validator.d.ts +0 -35
  71. package/dist/analyzers/best-practices/best-practice-validator.js +0 -181
  72. package/dist/analyzers/best-practices/best-practice-validator.js.map +0 -1
  73. package/dist/analyzers/best-practices/index.d.ts +0 -10
  74. package/dist/analyzers/best-practices/index.js +0 -11
  75. package/dist/analyzers/best-practices/index.js.map +0 -1
  76. package/dist/analyzers/best-practices/rules/index.d.ts +0 -7
  77. package/dist/analyzers/best-practices/rules/index.js +0 -56
  78. package/dist/analyzers/best-practices/rules/index.js.map +0 -1
  79. package/dist/analyzers/best-practices/rules/typescript/consistent-naming.d.ts +0 -17
  80. package/dist/analyzers/best-practices/rules/typescript/consistent-naming.js +0 -41
  81. package/dist/analyzers/best-practices/rules/typescript/consistent-naming.js.map +0 -1
  82. package/dist/analyzers/best-practices/rules/typescript/function-complexity.d.ts +0 -27
  83. package/dist/analyzers/best-practices/rules/typescript/function-complexity.js +0 -76
  84. package/dist/analyzers/best-practices/rules/typescript/function-complexity.js.map +0 -1
  85. package/dist/analyzers/best-practices/rules/typescript/index.d.ts +0 -15
  86. package/dist/analyzers/best-practices/rules/typescript/index.js +0 -16
  87. package/dist/analyzers/best-practices/rules/typescript/index.js.map +0 -1
  88. package/dist/analyzers/best-practices/rules/typescript/max-file-length.d.ts +0 -18
  89. package/dist/analyzers/best-practices/rules/typescript/max-file-length.js +0 -25
  90. package/dist/analyzers/best-practices/rules/typescript/max-file-length.js.map +0 -1
  91. package/dist/analyzers/best-practices/rules/typescript/no-any-type.d.ts +0 -17
  92. package/dist/analyzers/best-practices/rules/typescript/no-any-type.js +0 -27
  93. package/dist/analyzers/best-practices/rules/typescript/no-any-type.js.map +0 -1
  94. package/dist/analyzers/best-practices/rules/typescript/no-implicit-any.d.ts +0 -18
  95. package/dist/analyzers/best-practices/rules/typescript/no-implicit-any.js +0 -39
  96. package/dist/analyzers/best-practices/rules/typescript/no-implicit-any.js.map +0 -1
  97. package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.d.ts +0 -17
  98. package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js +0 -38
  99. package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js.map +0 -1
  100. package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.d.ts +0 -17
  101. package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js +0 -38
  102. package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js.map +0 -1
  103. package/dist/analyzers/best-practices/rules/typescript/prefer-const.d.ts +0 -17
  104. package/dist/analyzers/best-practices/rules/typescript/prefer-const.js +0 -35
  105. package/dist/analyzers/best-practices/rules/typescript/prefer-const.js.map +0 -1
  106. package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.d.ts +0 -17
  107. package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js +0 -36
  108. package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js.map +0 -1
  109. package/dist/analyzers/best-practices/rules/typescript/proper-error-handling.d.ts +0 -17
  110. package/dist/analyzers/best-practices/rules/typescript/proper-error-handling.js +0 -27
  111. package/dist/analyzers/best-practices/rules/typescript/proper-error-handling.js.map +0 -1
  112. package/dist/analyzers/best-practices/types.d.ts +0 -86
  113. package/dist/analyzers/best-practices/types.js +0 -7
  114. package/dist/analyzers/best-practices/types.js.map +0 -1
  115. package/dist/analyzers/cache/analysis-cache.d.ts +0 -41
  116. package/dist/analyzers/cache/analysis-cache.js +0 -84
  117. package/dist/analyzers/cache/analysis-cache.js.map +0 -1
  118. package/dist/analyzers/code-smells/base-smell-detector.d.ts +0 -30
  119. package/dist/analyzers/code-smells/base-smell-detector.js +0 -44
  120. package/dist/analyzers/code-smells/base-smell-detector.js.map +0 -1
  121. package/dist/analyzers/code-smells/code-smell-analyzer.d.ts +0 -30
  122. package/dist/analyzers/code-smells/code-smell-analyzer.js +0 -167
  123. package/dist/analyzers/code-smells/code-smell-analyzer.js.map +0 -1
  124. package/dist/analyzers/code-smells/detectors/data-clumps-detector.d.ts +0 -11
  125. package/dist/analyzers/code-smells/detectors/data-clumps-detector.js +0 -64
  126. package/dist/analyzers/code-smells/detectors/data-clumps-detector.js.map +0 -1
  127. package/dist/analyzers/code-smells/detectors/dead-code-detector.d.ts +0 -11
  128. package/dist/analyzers/code-smells/detectors/dead-code-detector.js +0 -58
  129. package/dist/analyzers/code-smells/detectors/dead-code-detector.js.map +0 -1
  130. package/dist/analyzers/code-smells/detectors/duplicate-code-detector.d.ts +0 -11
  131. package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js +0 -69
  132. package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js.map +0 -1
  133. package/dist/analyzers/code-smells/detectors/feature-envy-detector.d.ts +0 -11
  134. package/dist/analyzers/code-smells/detectors/feature-envy-detector.js +0 -70
  135. package/dist/analyzers/code-smells/detectors/feature-envy-detector.js.map +0 -1
  136. package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.d.ts +0 -11
  137. package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js +0 -59
  138. package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js.map +0 -1
  139. package/dist/analyzers/code-smells/detectors/large-class-detector.d.ts +0 -13
  140. package/dist/analyzers/code-smells/detectors/large-class-detector.js +0 -61
  141. package/dist/analyzers/code-smells/detectors/large-class-detector.js.map +0 -1
  142. package/dist/analyzers/code-smells/detectors/long-method-detector.d.ts +0 -12
  143. package/dist/analyzers/code-smells/detectors/long-method-detector.js +0 -55
  144. package/dist/analyzers/code-smells/detectors/long-method-detector.js.map +0 -1
  145. package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.d.ts +0 -12
  146. package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js +0 -53
  147. package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js.map +0 -1
  148. package/dist/analyzers/code-smells/detectors/magic-numbers-detector.d.ts +0 -12
  149. package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js +0 -56
  150. package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js.map +0 -1
  151. package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.d.ts +0 -13
  152. package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js +0 -77
  153. package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js.map +0 -1
  154. package/dist/analyzers/code-smells/index.d.ts +0 -16
  155. package/dist/analyzers/code-smells/index.js +0 -19
  156. package/dist/analyzers/code-smells/index.js.map +0 -1
  157. package/dist/analyzers/code-smells/types.d.ts +0 -82
  158. package/dist/analyzers/code-smells/types.js +0 -30
  159. package/dist/analyzers/code-smells/types.js.map +0 -1
  160. package/dist/analyzers/dependency/circular-detector.d.ts +0 -17
  161. package/dist/analyzers/dependency/circular-detector.js +0 -73
  162. package/dist/analyzers/dependency/circular-detector.js.map +0 -1
  163. package/dist/analyzers/dependency/coupling-calculator.d.ts +0 -24
  164. package/dist/analyzers/dependency/coupling-calculator.js +0 -86
  165. package/dist/analyzers/dependency/coupling-calculator.js.map +0 -1
  166. package/dist/analyzers/dependency/dependency-analyzer.d.ts +0 -44
  167. package/dist/analyzers/dependency/dependency-analyzer.js +0 -218
  168. package/dist/analyzers/dependency/dependency-analyzer.js.map +0 -1
  169. package/dist/analyzers/dependency/dependency-graph.d.ts +0 -57
  170. package/dist/analyzers/dependency/dependency-graph.js +0 -198
  171. package/dist/analyzers/dependency/dependency-graph.js.map +0 -1
  172. package/dist/analyzers/dependency/index.d.ts +0 -8
  173. package/dist/analyzers/dependency/index.js +0 -8
  174. package/dist/analyzers/dependency/index.js.map +0 -1
  175. package/dist/analyzers/dependency/types.d.ts +0 -105
  176. package/dist/analyzers/dependency/types.js +0 -5
  177. package/dist/analyzers/dependency/types.js.map +0 -1
  178. package/dist/analyzers/errors.d.ts +0 -51
  179. package/dist/analyzers/errors.js +0 -79
  180. package/dist/analyzers/errors.js.map +0 -1
  181. package/dist/analyzers/git/churn-calculator.d.ts +0 -36
  182. package/dist/analyzers/git/churn-calculator.js +0 -257
  183. package/dist/analyzers/git/churn-calculator.js.map +0 -1
  184. package/dist/analyzers/git/git-analyzer.d.ts +0 -19
  185. package/dist/analyzers/git/git-analyzer.js +0 -79
  186. package/dist/analyzers/git/git-analyzer.js.map +0 -1
  187. package/dist/analyzers/git/hotspot-detector.d.ts +0 -34
  188. package/dist/analyzers/git/hotspot-detector.js +0 -173
  189. package/dist/analyzers/git/hotspot-detector.js.map +0 -1
  190. package/dist/analyzers/git/index.d.ts +0 -7
  191. package/dist/analyzers/git/index.js +0 -7
  192. package/dist/analyzers/git/index.js.map +0 -1
  193. package/dist/analyzers/git/types.d.ts +0 -88
  194. package/dist/analyzers/git/types.js +0 -5
  195. package/dist/analyzers/git/types.js.map +0 -1
  196. package/dist/analyzers/metrics/halstead-calculator.d.ts +0 -30
  197. package/dist/analyzers/metrics/halstead-calculator.js +0 -150
  198. package/dist/analyzers/metrics/halstead-calculator.js.map +0 -1
  199. package/dist/analyzers/metrics/index.d.ts +0 -9
  200. package/dist/analyzers/metrics/index.js +0 -9
  201. package/dist/analyzers/metrics/index.js.map +0 -1
  202. package/dist/analyzers/metrics/maintainability-calculator.d.ts +0 -17
  203. package/dist/analyzers/metrics/maintainability-calculator.js +0 -46
  204. package/dist/analyzers/metrics/maintainability-calculator.js.map +0 -1
  205. package/dist/analyzers/metrics/metrics-analyzer.d.ts +0 -32
  206. package/dist/analyzers/metrics/metrics-analyzer.js +0 -144
  207. package/dist/analyzers/metrics/metrics-analyzer.js.map +0 -1
  208. package/dist/analyzers/metrics/types.d.ts +0 -67
  209. package/dist/analyzers/metrics/types.js +0 -5
  210. package/dist/analyzers/metrics/types.js.map +0 -1
  211. package/dist/analyzers/security/base-detector.d.ts +0 -58
  212. package/dist/analyzers/security/base-detector.js +0 -104
  213. package/dist/analyzers/security/base-detector.js.map +0 -1
  214. package/dist/analyzers/security/detectors/command-injection-detector.d.ts +0 -12
  215. package/dist/analyzers/security/detectors/command-injection-detector.js +0 -84
  216. package/dist/analyzers/security/detectors/command-injection-detector.js.map +0 -1
  217. package/dist/analyzers/security/detectors/hardcoded-secrets-detector.d.ts +0 -16
  218. package/dist/analyzers/security/detectors/hardcoded-secrets-detector.js +0 -140
  219. package/dist/analyzers/security/detectors/hardcoded-secrets-detector.js.map +0 -1
  220. package/dist/analyzers/security/detectors/insecure-deserialization-detector.d.ts +0 -12
  221. package/dist/analyzers/security/detectors/insecure-deserialization-detector.js +0 -109
  222. package/dist/analyzers/security/detectors/insecure-deserialization-detector.js.map +0 -1
  223. package/dist/analyzers/security/detectors/insecure-random-detector.d.ts +0 -12
  224. package/dist/analyzers/security/detectors/insecure-random-detector.js +0 -61
  225. package/dist/analyzers/security/detectors/insecure-random-detector.js.map +0 -1
  226. package/dist/analyzers/security/detectors/path-traversal-detector.d.ts +0 -12
  227. package/dist/analyzers/security/detectors/path-traversal-detector.js +0 -82
  228. package/dist/analyzers/security/detectors/path-traversal-detector.js.map +0 -1
  229. package/dist/analyzers/security/detectors/sql-injection-detector.d.ts +0 -12
  230. package/dist/analyzers/security/detectors/sql-injection-detector.js +0 -88
  231. package/dist/analyzers/security/detectors/sql-injection-detector.js.map +0 -1
  232. package/dist/analyzers/security/detectors/weak-crypto-detector.d.ts +0 -12
  233. package/dist/analyzers/security/detectors/weak-crypto-detector.js +0 -104
  234. package/dist/analyzers/security/detectors/weak-crypto-detector.js.map +0 -1
  235. package/dist/analyzers/security/detectors/xss-detector.d.ts +0 -12
  236. package/dist/analyzers/security/detectors/xss-detector.js +0 -90
  237. package/dist/analyzers/security/detectors/xss-detector.js.map +0 -1
  238. package/dist/analyzers/security/index.d.ts +0 -16
  239. package/dist/analyzers/security/index.js +0 -18
  240. package/dist/analyzers/security/index.js.map +0 -1
  241. package/dist/analyzers/security/security-analyzer.d.ts +0 -38
  242. package/dist/analyzers/security/security-analyzer.js +0 -215
  243. package/dist/analyzers/security/security-analyzer.js.map +0 -1
  244. package/dist/analyzers/security/types.d.ts +0 -95
  245. package/dist/analyzers/security/types.js +0 -7
  246. package/dist/analyzers/security/types.js.map +0 -1
  247. package/dist/tools/analysis-tools/architecture-tool.d.ts +0 -46
  248. package/dist/tools/analysis-tools/architecture-tool.js +0 -124
  249. package/dist/tools/analysis-tools/architecture-tool.js.map +0 -1
  250. package/dist/tools/analysis-tools/validation-tool.d.ts +0 -51
  251. package/dist/tools/analysis-tools/validation-tool.js +0 -121
  252. package/dist/tools/analysis-tools/validation-tool.js.map +0 -1
  253. package/dist/tools/analysis-tools.d.ts +0 -73
  254. package/dist/tools/analysis-tools.js +0 -422
  255. package/dist/tools/analysis-tools.js.map +0 -1
  256. package/dist/types/analysis.d.ts +0 -177
  257. package/dist/types/analysis.js +0 -8
  258. package/dist/types/analysis.js.map +0 -1
  259. package/dist/utils/analysis-logger.d.ts +0 -50
  260. package/dist/utils/analysis-logger.js +0 -73
  261. package/dist/utils/analysis-logger.js.map +0 -1
@@ -1,82 +0,0 @@
1
- /**
2
- * Code Smell Detector Types
3
- */
4
- /**
5
- * Type of code smell
6
- */
7
- export declare enum SmellType {
8
- LONG_METHOD = "LONG_METHOD",
9
- LARGE_CLASS = "LARGE_CLASS",
10
- LONG_PARAMETER_LIST = "LONG_PARAMETER_LIST",
11
- DUPLICATE_CODE = "DUPLICATE_CODE",
12
- DEAD_CODE = "DEAD_CODE",
13
- MAGIC_NUMBERS = "MAGIC_NUMBERS",
14
- NESTED_CONDITIONALS = "NESTED_CONDITIONALS",
15
- FEATURE_ENVY = "FEATURE_ENVY",
16
- DATA_CLUMPS = "DATA_CLUMPS",
17
- INAPPROPRIATE_INTIMACY = "INAPPROPRIATE_INTIMACY"
18
- }
19
- /**
20
- * Severity of code smell
21
- */
22
- export declare enum SmellSeverity {
23
- LOW = "LOW",
24
- MEDIUM = "MEDIUM",
25
- HIGH = "HIGH",
26
- CRITICAL = "CRITICAL"
27
- }
28
- /**
29
- * Code smell detection result
30
- */
31
- export interface CodeSmell {
32
- readonly type: SmellType;
33
- readonly severity: SmellSeverity;
34
- readonly filePath: string;
35
- readonly startLine: number;
36
- readonly endLine: number;
37
- readonly message: string;
38
- readonly suggestion: string;
39
- readonly metadata: Readonly<Record<string, unknown>>;
40
- }
41
- /**
42
- * Detector configuration
43
- */
44
- export interface DetectorConfig {
45
- readonly enabled: boolean;
46
- readonly thresholds?: Readonly<Record<string, number>>;
47
- }
48
- /**
49
- * Analysis options
50
- */
51
- export interface CodeSmellAnalysisOptions {
52
- readonly detectorConfigs?: Readonly<Record<SmellType, DetectorConfig>>;
53
- readonly ignorePatterns?: readonly string[];
54
- }
55
- /**
56
- * Analysis result
57
- */
58
- export interface CodeSmellAnalysisResult {
59
- readonly smells: ReadonlyArray<CodeSmell>;
60
- readonly summary: CodeSmellSummary;
61
- readonly timestamp: Date;
62
- }
63
- /**
64
- * Summary statistics
65
- */
66
- export interface CodeSmellSummary {
67
- readonly totalSmells: number;
68
- readonly smellsByType: Readonly<Record<SmellType, number>>;
69
- readonly smellsBySeverity: Readonly<Record<SmellSeverity, number>>;
70
- readonly filesAnalyzed: number;
71
- readonly filesWithSmells: number;
72
- readonly averageSmellsPerFile: number;
73
- readonly codeHealthScore: number;
74
- }
75
- /**
76
- * Base detector interface
77
- */
78
- export interface SmellDetector {
79
- readonly type: SmellType;
80
- readonly config: DetectorConfig;
81
- detect(filePath: string): Promise<CodeSmell[]>;
82
- }
@@ -1,30 +0,0 @@
1
- /**
2
- * Code Smell Detector Types
3
- */
4
- /**
5
- * Type of code smell
6
- */
7
- export var SmellType;
8
- (function (SmellType) {
9
- SmellType["LONG_METHOD"] = "LONG_METHOD";
10
- SmellType["LARGE_CLASS"] = "LARGE_CLASS";
11
- SmellType["LONG_PARAMETER_LIST"] = "LONG_PARAMETER_LIST";
12
- SmellType["DUPLICATE_CODE"] = "DUPLICATE_CODE";
13
- SmellType["DEAD_CODE"] = "DEAD_CODE";
14
- SmellType["MAGIC_NUMBERS"] = "MAGIC_NUMBERS";
15
- SmellType["NESTED_CONDITIONALS"] = "NESTED_CONDITIONALS";
16
- SmellType["FEATURE_ENVY"] = "FEATURE_ENVY";
17
- SmellType["DATA_CLUMPS"] = "DATA_CLUMPS";
18
- SmellType["INAPPROPRIATE_INTIMACY"] = "INAPPROPRIATE_INTIMACY";
19
- })(SmellType || (SmellType = {}));
20
- /**
21
- * Severity of code smell
22
- */
23
- export var SmellSeverity;
24
- (function (SmellSeverity) {
25
- SmellSeverity["LOW"] = "LOW";
26
- SmellSeverity["MEDIUM"] = "MEDIUM";
27
- SmellSeverity["HIGH"] = "HIGH";
28
- SmellSeverity["CRITICAL"] = "CRITICAL";
29
- })(SmellSeverity || (SmellSeverity = {}));
30
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/analyzers/code-smells/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,CAAN,IAAY,SAWX;AAXD,WAAY,SAAS;IACnB,wCAA2B,CAAA;IAC3B,wCAA2B,CAAA;IAC3B,wDAA2C,CAAA;IAC3C,8CAAiC,CAAA;IACjC,oCAAuB,CAAA;IACvB,4CAA+B,CAAA;IAC/B,wDAA2C,CAAA;IAC3C,0CAA6B,CAAA;IAC7B,wCAA2B,CAAA;IAC3B,8DAAiD,CAAA;AACnD,CAAC,EAXW,SAAS,KAAT,SAAS,QAWpB;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,4BAAW,CAAA;IACX,kCAAiB,CAAA;IACjB,8BAAa,CAAA;IACb,sCAAqB,CAAA;AACvB,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB"}
@@ -1,17 +0,0 @@
1
- /**
2
- * Circular Dependency Detector
3
- *
4
- * Uses Tarjan's Strongly Connected Components algorithm
5
- */
6
- import type { DependencyGraph } from './dependency-graph.js';
7
- import type { CircularDependency } from './types.js';
8
- export declare class CircularDependencyDetector {
9
- /**
10
- * Detect all circular dependencies
11
- */
12
- detectCycles(graph: DependencyGraph): CircularDependency[];
13
- /**
14
- * Create circular dependency object from SCC
15
- */
16
- private createCircularDependency;
17
- }
@@ -1,73 +0,0 @@
1
- /**
2
- * Circular Dependency Detector
3
- *
4
- * Uses Tarjan's Strongly Connected Components algorithm
5
- */
6
- export class CircularDependencyDetector {
7
- /**
8
- * Detect all circular dependencies
9
- */
10
- detectCycles(graph) {
11
- const sccs = graph.getStronglyConnectedComponents();
12
- const cycles = [];
13
- for (const scc of sccs) {
14
- if (scc.length > 1) {
15
- cycles.push(this.createCircularDependency(scc, graph));
16
- }
17
- }
18
- // Sort by severity and impact
19
- return cycles.sort((a, b) => {
20
- const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
21
- const severityDiff = severityOrder[a.severity] - severityOrder[b.severity];
22
- return severityDiff !== 0 ? severityDiff : b.impact - a.impact;
23
- });
24
- }
25
- /**
26
- * Create circular dependency object from SCC
27
- */
28
- createCircularDependency(cycle, graph) {
29
- const length = cycle.length;
30
- // Determine severity based on cycle length
31
- let severity;
32
- if (length === 2) {
33
- severity = 'medium'; // Simple A->B->A cycle
34
- }
35
- else if (length <= 4) {
36
- severity = 'high'; // Complex but manageable
37
- }
38
- else {
39
- severity = 'critical'; // Very complex, hard to refactor
40
- }
41
- // Calculate impact based on:
42
- // 1. Number of files in cycle
43
- // 2. Total LOC in cycle
44
- // 3. Coupling of files in cycle
45
- let totalLOC = 0;
46
- let totalCoupling = 0;
47
- for (const file of cycle) {
48
- const node = graph.getNode(file);
49
- if (node) {
50
- totalLOC += node.loc;
51
- totalCoupling += node.imports.length + node.exports.length;
52
- }
53
- }
54
- // BUG FIX: Safe impact formula with individual component capping to prevent overflow
55
- // Each component is capped individually before summing to prevent precision loss
56
- // with very large codebases (1M+ LOC)
57
- const lengthFactor = Math.min(30, (length / 10) * 30);
58
- const locFactor = Math.min(40, (totalLOC / 500) * 40);
59
- const couplingFactor = Math.min(30, (totalCoupling / 20) * 30);
60
- const impact = Math.min(100, Math.round(lengthFactor + locFactor + couplingFactor));
61
- // Generate description
62
- const fileNames = cycle.map(f => f.split('/').pop() || f);
63
- const description = `Circular dependency detected: ${fileNames.join(' → ')} → ${fileNames[0]}`;
64
- return Object.freeze({
65
- cycle: Object.freeze(cycle),
66
- length,
67
- severity,
68
- impact,
69
- description,
70
- });
71
- }
72
- }
73
- //# sourceMappingURL=circular-detector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"circular-detector.js","sourceRoot":"","sources":["../../../src/analyzers/dependency/circular-detector.ts"],"names":[],"mappings":"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"}
@@ -1,24 +0,0 @@
1
- /**
2
- * Coupling Metrics Calculator
3
- *
4
- * Calculates:
5
- * - Afferent Coupling (Ca): How many files depend on this
6
- * - Efferent Coupling (Ce): How many files this depends on
7
- * - Instability (I): Ce / (Ce + Ca)
8
- * - Abstractness (A): Abstract elements / Total elements
9
- * - Distance from Main Sequence (D): |A + I - 1|
10
- */
11
- import type { DependencyGraph } from './dependency-graph.js';
12
- import type { CouplingMetrics } from './types.js';
13
- import type { FileASTInfo } from '../ast/types.js';
14
- export declare class CouplingCalculator {
15
- /**
16
- * Calculate coupling metrics for all files
17
- */
18
- calculateMetrics(graph: DependencyGraph, astMap: Map<string, FileASTInfo>): CouplingMetrics[];
19
- /**
20
- * Calculate abstractness of a file
21
- * A = abstract classes + interfaces / total classes + functions
22
- */
23
- private calculateAbstractness;
24
- }
@@ -1,86 +0,0 @@
1
- /**
2
- * Coupling Metrics Calculator
3
- *
4
- * Calculates:
5
- * - Afferent Coupling (Ca): How many files depend on this
6
- * - Efferent Coupling (Ce): How many files this depends on
7
- * - Instability (I): Ce / (Ce + Ca)
8
- * - Abstractness (A): Abstract elements / Total elements
9
- * - Distance from Main Sequence (D): |A + I - 1|
10
- */
11
- export class CouplingCalculator {
12
- /**
13
- * Calculate coupling metrics for all files
14
- */
15
- calculateMetrics(graph, astMap) {
16
- const metrics = [];
17
- for (const node of graph.getNodes()) {
18
- const file = node.filePath;
19
- const ca = graph.getAfferentDependencies(file).length;
20
- const ce = graph.getEfferentDependencies(file).length;
21
- // Instability: I = Ce / (Ce + Ca)
22
- // I = 0: Maximally stable (many dependents, few dependencies)
23
- // I = 1: Maximally unstable (few dependents, many dependencies)
24
- const instability = (ce + ca) === 0 ? 0 : ce / (ce + ca);
25
- // Abstractness: A = abstract elements / total elements
26
- const ast = astMap.get(file);
27
- const abstractness = ast ? this.calculateAbstractness(ast) : 0;
28
- // Distance from Main Sequence: D = |A + I - 1|
29
- // D = 0: On the main sequence (ideal)
30
- // D > 0.5: In "zone of pain" (concrete + unstable) or "zone of uselessness" (abstract + stable)
31
- const distance = Math.abs(abstractness + instability - 1);
32
- // Determine zone
33
- let zone;
34
- if (abstractness > 0.7 && instability < 0.3) {
35
- zone = 'useless'; // Abstract but no dependents
36
- }
37
- else if (abstractness < 0.3 && instability > 0.7) {
38
- zone = 'painful'; // Concrete and many dependencies
39
- }
40
- else {
41
- zone = 'balanced';
42
- }
43
- metrics.push(Object.freeze({
44
- file,
45
- afferentCoupling: ca,
46
- efferentCoupling: ce,
47
- instability,
48
- abstractness,
49
- distanceFromMainSequence: distance,
50
- zone,
51
- }));
52
- }
53
- return metrics;
54
- }
55
- /**
56
- * Calculate abstractness of a file
57
- * A = abstract classes + interfaces / total classes + functions
58
- */
59
- calculateAbstractness(ast) {
60
- let abstractCount = 0;
61
- let totalCount = 0;
62
- // Count classes
63
- for (const cls of ast.classes) {
64
- totalCount++;
65
- // Heuristic: Consider class abstract if:
66
- // 1. Name starts with 'Abstract' or 'Base' or 'I'
67
- // 2. Implements interfaces (likely an abstraction)
68
- const isAbstract = cls.name.startsWith('Abstract') ||
69
- cls.name.startsWith('Base') ||
70
- cls.name.startsWith('I') ||
71
- cls.implementsInterfaces.length > 0;
72
- if (isAbstract) {
73
- abstractCount++;
74
- }
75
- }
76
- // Count type exports as abstract
77
- // (interfaces, type aliases)
78
- const typeExports = ast.exports.filter(exp => exp.type === 'type');
79
- abstractCount += typeExports.length;
80
- totalCount += typeExports.length;
81
- // Functions are always concrete
82
- totalCount += ast.functions.length;
83
- return totalCount === 0 ? 0 : abstractCount / totalCount;
84
- }
85
- }
86
- //# sourceMappingURL=coupling-calculator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"coupling-calculator.js","sourceRoot":"","sources":["../../../src/analyzers/dependency/coupling-calculator.ts"],"names":[],"mappings":"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"}
@@ -1,44 +0,0 @@
1
- /**
2
- * Dependency Analyzer
3
- *
4
- * Main orchestrator for dependency analysis
5
- */
6
- import type { DependencyAnalysisResult, DependencyAnalysisOptions } from './types.js';
7
- /**
8
- * Default file patterns for multi-language support
9
- */
10
- export declare const DEFAULT_ANALYSIS_PATTERN = "**/*.{ts,tsx,js,jsx,py,rs,go,c,cpp,cc,cxx,h,hpp,swift}";
11
- export declare class DependencyAnalyzer {
12
- private astParser;
13
- private circularDetector;
14
- private couplingCalculator;
15
- constructor();
16
- /**
17
- * Analyze dependencies in a directory
18
- */
19
- analyzeDependencies(directory: string, pattern?: string, options?: DependencyAnalysisOptions): Promise<DependencyAnalysisResult>;
20
- /**
21
- * Create import edges from AST imports
22
- */
23
- private createImportEdges;
24
- /**
25
- * Create export edges from AST exports
26
- */
27
- private createExportEdges;
28
- /**
29
- * Resolve import specifier to absolute file path
30
- */
31
- private resolveImportPath;
32
- /**
33
- * Find orphaned files (no dependencies)
34
- */
35
- private findOrphanedFiles;
36
- /**
37
- * Find hub files (high coupling)
38
- */
39
- private findHubFiles;
40
- /**
41
- * Calculate summary statistics
42
- */
43
- private calculateSummary;
44
- }
@@ -1,218 +0,0 @@
1
- /**
2
- * Dependency Analyzer
3
- *
4
- * Main orchestrator for dependency analysis
5
- */
6
- import { DependencyGraph } from './dependency-graph.js';
7
- import { CircularDependencyDetector } from './circular-detector.js';
8
- import { CouplingCalculator } from './coupling-calculator.js';
9
- import { getMultiLanguageParser } from '../ast/multi-language-parser.js';
10
- import { existsSync, promises as fs } from 'fs';
11
- import { glob } from 'glob';
12
- import path from 'path';
13
- /**
14
- * Default file patterns for multi-language support
15
- */
16
- export const DEFAULT_ANALYSIS_PATTERN = '**/*.{ts,tsx,js,jsx,py,rs,go,c,cpp,cc,cxx,h,hpp,swift}';
17
- export class DependencyAnalyzer {
18
- astParser;
19
- circularDetector;
20
- couplingCalculator;
21
- constructor() {
22
- this.astParser = getMultiLanguageParser();
23
- this.circularDetector = new CircularDependencyDetector();
24
- this.couplingCalculator = new CouplingCalculator();
25
- }
26
- /**
27
- * Analyze dependencies in a directory
28
- */
29
- async analyzeDependencies(directory, pattern = '**/*.{ts,tsx,js,jsx}', options = {}) {
30
- const timestamp = new Date();
31
- // Find all files
32
- const ignorePatterns = [
33
- '**/node_modules/**',
34
- '**/dist/**',
35
- '**/build/**',
36
- '**/.git/**',
37
- ...(options.ignorePatterns || []),
38
- ];
39
- const files = await glob(pattern, {
40
- cwd: directory,
41
- absolute: true,
42
- nodir: true,
43
- ignore: ignorePatterns,
44
- });
45
- // Build dependency graph
46
- const graph = new DependencyGraph();
47
- const astMap = new Map();
48
- // Parse all files
49
- for (const file of files) {
50
- try {
51
- const ast = await this.astParser.parseFile(file);
52
- astMap.set(file, ast);
53
- // Get file stats
54
- const stats = await fs.stat(file);
55
- // Create dependency node
56
- const node = {
57
- filePath: file,
58
- imports: this.createImportEdges(file, ast.imports, directory),
59
- exports: this.createExportEdges(file, ast.exports),
60
- size: stats.size,
61
- loc: ast.totalLines,
62
- };
63
- graph.addNode(node);
64
- // Add edges for internal imports
65
- for (const imp of node.imports) {
66
- if (!options.includeNodeModules && imp.to.includes('node_modules')) {
67
- continue;
68
- }
69
- graph.addEdge(imp.from, imp.to);
70
- }
71
- }
72
- catch (error) {
73
- // Skip files that can't be parsed
74
- console.error(`Error parsing ${file}:`, error);
75
- }
76
- }
77
- // Detect circular dependencies
78
- const circularDependencies = this.circularDetector.detectCycles(graph);
79
- // Calculate coupling metrics
80
- const couplingMetrics = this.couplingCalculator.calculateMetrics(graph, astMap);
81
- // Find orphaned files (no imports/exports or isolated)
82
- const orphanedFiles = this.findOrphanedFiles(graph);
83
- // Find hub files (high coupling)
84
- const hubFiles = this.findHubFiles(couplingMetrics);
85
- // Calculate summary
86
- const summary = this.calculateSummary(graph, circularDependencies, couplingMetrics);
87
- return Object.freeze({
88
- graph,
89
- circularDependencies: Object.freeze(circularDependencies),
90
- couplingMetrics: Object.freeze(couplingMetrics),
91
- orphanedFiles: Object.freeze(orphanedFiles),
92
- hubFiles: Object.freeze(hubFiles),
93
- summary: Object.freeze(summary),
94
- timestamp,
95
- });
96
- }
97
- /**
98
- * Create import edges from AST imports
99
- */
100
- createImportEdges(file, imports, baseDir) {
101
- return imports.map(imp => {
102
- const resolvedPath = this.resolveImportPath(file, imp.moduleSpecifier, baseDir);
103
- return Object.freeze({
104
- from: file,
105
- to: resolvedPath,
106
- importedSymbols: Object.freeze([
107
- ...imp.namedImports,
108
- ...(imp.defaultImport ? [imp.defaultImport] : []),
109
- ...(imp.namespaceImport ? [imp.namespaceImport] : []),
110
- ]),
111
- isDynamic: false,
112
- isTypeOnly: imp.isTypeOnly || false,
113
- });
114
- });
115
- }
116
- /**
117
- * Create export edges from AST exports
118
- */
119
- createExportEdges(file, exports) {
120
- return exports.map(exp => Object.freeze({
121
- from: file,
122
- symbols: Object.freeze([exp.name]),
123
- isDefault: exp.isDefault,
124
- isReExport: false, // Simplified for now
125
- }));
126
- }
127
- /**
128
- * Resolve import specifier to absolute file path
129
- */
130
- resolveImportPath(fromFile, specifier, baseDir) {
131
- if (specifier.startsWith('.')) {
132
- // Relative import
133
- const fromDir = path.dirname(fromFile);
134
- let resolved = path.resolve(fromDir, specifier);
135
- // Remove .js extension if present (TypeScript uses .js in imports)
136
- if (resolved.endsWith('.js')) {
137
- resolved = resolved.slice(0, -3);
138
- }
139
- // Try extensions
140
- const extensions = ['.ts', '.tsx', '.js', '.jsx', '/index.ts', '/index.tsx', '/index.js'];
141
- for (const ext of extensions) {
142
- const testPath = resolved.endsWith('.ts') || resolved.endsWith('.tsx')
143
- ? resolved
144
- : resolved + ext;
145
- try {
146
- if (existsSync(testPath)) {
147
- return testPath;
148
- }
149
- }
150
- catch {
151
- // Continue to next extension
152
- }
153
- }
154
- // Return resolved path even if file doesn't exist
155
- return resolved + '.ts'; // Default to .ts
156
- }
157
- // External module
158
- return path.join(baseDir, 'node_modules', specifier);
159
- }
160
- /**
161
- * Find orphaned files (no dependencies)
162
- */
163
- findOrphanedFiles(graph) {
164
- const orphaned = [];
165
- for (const node of graph.getNodes()) {
166
- const afferent = graph.getAfferentDependencies(node.filePath);
167
- const efferent = graph.getEfferentDependencies(node.filePath);
168
- if (afferent.length === 0 && efferent.length === 0) {
169
- orphaned.push(node.filePath);
170
- }
171
- }
172
- return orphaned;
173
- }
174
- /**
175
- * Find hub files (high coupling)
176
- */
177
- findHubFiles(metrics) {
178
- if (metrics.length === 0)
179
- return [];
180
- // Hub = high afferent OR efferent coupling (top 10%)
181
- const sorted = [...metrics].sort((a, b) => (b.afferentCoupling + b.efferentCoupling) -
182
- (a.afferentCoupling + a.efferentCoupling));
183
- const threshold = Math.max(1, Math.ceil(sorted.length * 0.1));
184
- return sorted.slice(0, threshold).map(m => m.file);
185
- }
186
- /**
187
- * Calculate summary statistics
188
- */
189
- calculateSummary(graph, circularDeps, metrics) {
190
- const totalFiles = graph.getNodes().length;
191
- const totalDependencies = graph.getTotalEdges();
192
- const avgCa = totalFiles > 0
193
- ? metrics.reduce((sum, m) => sum + m.afferentCoupling, 0) / totalFiles
194
- : 0;
195
- const avgCe = totalFiles > 0
196
- ? metrics.reduce((sum, m) => sum + m.efferentCoupling, 0) / totalFiles
197
- : 0;
198
- const avgInstability = totalFiles > 0
199
- ? metrics.reduce((sum, m) => sum + m.instability, 0) / totalFiles
200
- : 0;
201
- const maxCycleLength = circularDeps.reduce((max, dep) => Math.max(max, dep.length), 0);
202
- // Health score (0-100)
203
- const circularPenalty = Math.min(50, circularDeps.length * 5);
204
- const instabilityPenalty = avgInstability * 20;
205
- const healthScore = Math.max(0, 100 - circularPenalty - instabilityPenalty);
206
- return Object.freeze({
207
- totalFiles,
208
- totalDependencies,
209
- averageAfferentCoupling: avgCa,
210
- averageEfferentCoupling: avgCe,
211
- averageInstability: avgInstability,
212
- circularDependencyCount: circularDeps.length,
213
- maxCycleLength,
214
- healthScore: Math.round(healthScore),
215
- });
216
- }
217
- }
218
- //# sourceMappingURL=dependency-analyzer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dependency-analyzer.js","sourceRoot":"","sources":["../../../src/analyzers/dependency/dependency-analyzer.ts"],"names":[],"mappings":"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"}
@@ -1,57 +0,0 @@
1
- /**
2
- * Dependency Graph Implementation
3
- *
4
- * Adjacency list-based directed graph for file dependencies
5
- */
6
- import type { DependencyNode, DependencyGraph as IDependencyGraph } from './types.js';
7
- export declare class DependencyGraph implements IDependencyGraph {
8
- private nodes;
9
- private adjacencyList;
10
- private reverseAdjacencyList;
11
- constructor();
12
- /**
13
- * Add node to graph
14
- */
15
- addNode(node: DependencyNode): void;
16
- /**
17
- * Add directed edge from -> to
18
- */
19
- addEdge(from: string, to: string): void;
20
- /**
21
- * Get node by file path
22
- */
23
- getNode(file: string): DependencyNode | undefined;
24
- /**
25
- * Get all nodes
26
- */
27
- getNodes(): DependencyNode[];
28
- /**
29
- * Get afferent dependencies (files that depend on this file)
30
- */
31
- getAfferentDependencies(file: string): string[];
32
- /**
33
- * Get efferent dependencies (files this file depends on)
34
- */
35
- getEfferentDependencies(file: string): string[];
36
- /**
37
- * Get total number of edges
38
- */
39
- getTotalEdges(): number;
40
- /**
41
- * Check if path exists from -> to using BFS
42
- */
43
- hasPath(from: string, to: string): boolean;
44
- /**
45
- * Topological sort using DFS
46
- * Returns sorted list and whether cycle was detected
47
- */
48
- topologicalSort(): {
49
- sorted: string[];
50
- hasCycle: boolean;
51
- };
52
- /**
53
- * Get strongly connected components using Tarjan's algorithm
54
- * (Used for circular dependency detection)
55
- */
56
- getStronglyConnectedComponents(): string[][];
57
- }