@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,88 +0,0 @@
1
- /**
2
- * Git Integration Types
3
- */
4
- /**
5
- * Git commit information
6
- */
7
- export interface GitCommit {
8
- readonly hash: string;
9
- readonly author: string;
10
- readonly date: Date;
11
- readonly message: string;
12
- readonly filesChanged: ReadonlyArray<string>;
13
- }
14
- /**
15
- * File churn metrics
16
- */
17
- export interface FileChurn {
18
- readonly filePath: string;
19
- readonly commitCount: number;
20
- readonly additions: number;
21
- readonly deletions: number;
22
- readonly totalChurn: number;
23
- readonly lastModified: Date;
24
- readonly authors: ReadonlyArray<string>;
25
- }
26
- /**
27
- * Code hotspot (high churn + high complexity)
28
- */
29
- export interface CodeHotspot {
30
- readonly filePath: string;
31
- readonly hotspotScore: number;
32
- readonly churnScore: number;
33
- readonly complexityScore: number;
34
- readonly commitCount: number;
35
- readonly totalChurn: number;
36
- readonly averageComplexity: number;
37
- readonly maxComplexity: number;
38
- readonly severity: 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL';
39
- readonly reason: string;
40
- readonly recommendation: string;
41
- }
42
- /**
43
- * Contributor statistics
44
- */
45
- export interface ContributorStats {
46
- readonly author: string;
47
- readonly commitCount: number;
48
- readonly filesChanged: number;
49
- readonly linesAdded: number;
50
- readonly linesDeleted: number;
51
- readonly firstCommit: Date;
52
- readonly lastCommit: Date;
53
- }
54
- /**
55
- * Git analysis result
56
- */
57
- export interface GitAnalysisResult {
58
- readonly hotspots: ReadonlyArray<CodeHotspot>;
59
- readonly churnMetrics: ReadonlyArray<FileChurn>;
60
- readonly contributors: ReadonlyArray<ContributorStats>;
61
- readonly summary: GitAnalysisSummary;
62
- readonly timestamp: Date;
63
- }
64
- /**
65
- * Analysis summary
66
- */
67
- export interface GitAnalysisSummary {
68
- readonly totalCommits: number;
69
- readonly filesAnalyzed: number;
70
- readonly hotspotCount: number;
71
- readonly averageChurn: number;
72
- readonly topContributor: string;
73
- readonly dateRange: {
74
- readonly from: Date;
75
- readonly to: Date;
76
- };
77
- }
78
- /**
79
- * Analysis options
80
- */
81
- export interface GitAnalysisOptions {
82
- readonly since?: string;
83
- readonly until?: string;
84
- readonly branch?: string;
85
- readonly includePatterns?: readonly string[];
86
- readonly excludePatterns?: readonly string[];
87
- readonly hotspotThreshold?: number;
88
- }
@@ -1,5 +0,0 @@
1
- /**
2
- * Git Integration Types
3
- */
4
- export {};
5
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/analyzers/git/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,30 +0,0 @@
1
- /**
2
- * Halstead Complexity Calculator
3
- *
4
- * Calculates Halstead metrics from source code tokens
5
- */
6
- import type { HalsteadMetrics } from './types.js';
7
- export declare class HalsteadCalculator {
8
- private astParser;
9
- constructor();
10
- /**
11
- * Calculate Halstead metrics for a file
12
- */
13
- calculateMetrics(filePath: string): HalsteadMetrics;
14
- /**
15
- * Compute Halstead metrics from counts
16
- */
17
- private computeMetrics;
18
- /**
19
- * Check if node is an operator
20
- */
21
- private isOperator;
22
- /**
23
- * Check if node is an operand
24
- */
25
- private isOperand;
26
- /**
27
- * Get operator symbol for syntax kind
28
- */
29
- private getOperatorSymbol;
30
- }
@@ -1,150 +0,0 @@
1
- /**
2
- * Halstead Complexity Calculator
3
- *
4
- * Calculates Halstead metrics from source code tokens
5
- */
6
- import { SyntaxKind } from 'ts-morph';
7
- import { ASTParser } from '../ast/parser.js';
8
- export class HalsteadCalculator {
9
- astParser;
10
- constructor() {
11
- this.astParser = new ASTParser();
12
- }
13
- /**
14
- * Calculate Halstead metrics for a file
15
- */
16
- calculateMetrics(filePath) {
17
- const sourceFile = this.astParser.getSourceFile(filePath);
18
- const operators = new Set();
19
- const operands = new Set();
20
- let operatorCount = 0;
21
- let operandCount = 0;
22
- // Traverse AST and count operators/operands
23
- sourceFile.forEachDescendant((node) => {
24
- const kind = node.getKind();
25
- const text = node.getText();
26
- // Operators
27
- if (this.isOperator(kind)) {
28
- operators.add(this.getOperatorSymbol(kind));
29
- operatorCount++;
30
- }
31
- // Operands (identifiers, literals)
32
- else if (this.isOperand(kind)) {
33
- operands.add(text);
34
- operandCount++;
35
- }
36
- });
37
- const n1 = operators.size;
38
- const n2 = operands.size;
39
- const N1 = operatorCount;
40
- const N2 = operandCount;
41
- return this.computeMetrics(n1, n2, N1, N2);
42
- }
43
- /**
44
- * Compute Halstead metrics from counts
45
- */
46
- computeMetrics(n1, n2, N1, N2) {
47
- const vocabulary = n1 + n2;
48
- const length = N1 + N2;
49
- const calculatedLength = n1 > 0 && n2 > 0
50
- ? n1 * Math.log2(n1) + n2 * Math.log2(n2)
51
- : 0;
52
- const volume = length > 0 && vocabulary > 0
53
- ? length * Math.log2(vocabulary)
54
- : 0;
55
- const difficulty = n1 > 0 && n2 > 0 && N2 > 0
56
- ? (n1 / 2) * (N2 / n2)
57
- : 0;
58
- const effort = difficulty * volume;
59
- const time = effort / 18; // Seconds to program
60
- const bugs = volume / 3000; // Estimated delivered bugs
61
- return Object.freeze({
62
- n1,
63
- n2,
64
- N1,
65
- N2,
66
- vocabulary,
67
- length,
68
- calculatedLength: Math.round(calculatedLength * 100) / 100,
69
- volume: Math.round(volume * 100) / 100,
70
- difficulty: Math.round(difficulty * 100) / 100,
71
- effort: Math.round(effort * 100) / 100,
72
- time: Math.round(time * 100) / 100,
73
- bugs: Math.round(bugs * 1000) / 1000,
74
- });
75
- }
76
- /**
77
- * Check if node is an operator
78
- */
79
- isOperator(kind) {
80
- const operators = [
81
- SyntaxKind.PlusToken,
82
- SyntaxKind.MinusToken,
83
- SyntaxKind.AsteriskToken,
84
- SyntaxKind.SlashToken,
85
- SyntaxKind.PercentToken,
86
- SyntaxKind.EqualsToken,
87
- SyntaxKind.EqualsEqualsToken,
88
- SyntaxKind.EqualsEqualsEqualsToken,
89
- SyntaxKind.ExclamationEqualsToken,
90
- SyntaxKind.ExclamationEqualsEqualsToken,
91
- SyntaxKind.LessThanToken,
92
- SyntaxKind.GreaterThanToken,
93
- SyntaxKind.LessThanEqualsToken,
94
- SyntaxKind.GreaterThanEqualsToken,
95
- SyntaxKind.AmpersandAmpersandToken,
96
- SyntaxKind.BarBarToken,
97
- SyntaxKind.ExclamationToken,
98
- SyntaxKind.QuestionToken,
99
- SyntaxKind.PlusPlusToken,
100
- SyntaxKind.MinusMinusToken,
101
- SyntaxKind.AmpersandToken,
102
- SyntaxKind.BarToken,
103
- SyntaxKind.CaretToken,
104
- SyntaxKind.TildeToken,
105
- SyntaxKind.LessThanLessThanToken,
106
- SyntaxKind.GreaterThanGreaterThanToken,
107
- ];
108
- return operators.includes(kind);
109
- }
110
- /**
111
- * Check if node is an operand
112
- */
113
- isOperand(kind) {
114
- return (kind === SyntaxKind.Identifier ||
115
- kind === SyntaxKind.NumericLiteral ||
116
- kind === SyntaxKind.StringLiteral ||
117
- kind === SyntaxKind.TrueKeyword ||
118
- kind === SyntaxKind.FalseKeyword ||
119
- kind === SyntaxKind.NullKeyword);
120
- }
121
- /**
122
- * Get operator symbol for syntax kind
123
- */
124
- getOperatorSymbol(kind) {
125
- const symbols = {
126
- [SyntaxKind.PlusToken]: '+',
127
- [SyntaxKind.MinusToken]: '-',
128
- [SyntaxKind.AsteriskToken]: '*',
129
- [SyntaxKind.SlashToken]: '/',
130
- [SyntaxKind.PercentToken]: '%',
131
- [SyntaxKind.EqualsToken]: '=',
132
- [SyntaxKind.EqualsEqualsToken]: '==',
133
- [SyntaxKind.EqualsEqualsEqualsToken]: '===',
134
- [SyntaxKind.ExclamationEqualsToken]: '!=',
135
- [SyntaxKind.ExclamationEqualsEqualsToken]: '!==',
136
- [SyntaxKind.LessThanToken]: '<',
137
- [SyntaxKind.GreaterThanToken]: '>',
138
- [SyntaxKind.LessThanEqualsToken]: '<=',
139
- [SyntaxKind.GreaterThanEqualsToken]: '>=',
140
- [SyntaxKind.AmpersandAmpersandToken]: '&&',
141
- [SyntaxKind.BarBarToken]: '||',
142
- [SyntaxKind.ExclamationToken]: '!',
143
- [SyntaxKind.QuestionToken]: '?',
144
- [SyntaxKind.PlusPlusToken]: '++',
145
- [SyntaxKind.MinusMinusToken]: '--',
146
- };
147
- return symbols[kind] || kind.toString();
148
- }
149
- }
150
- //# sourceMappingURL=halstead-calculator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"halstead-calculator.js","sourceRoot":"","sources":["../../../src/analyzers/metrics/halstead-calculator.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- /**
2
- * Advanced Metrics Analyzer
3
- *
4
- * Calculates Halstead metrics and Maintainability Index
5
- */
6
- export { MetricsAnalyzer } from './metrics-analyzer.js';
7
- export { HalsteadCalculator } from './halstead-calculator.js';
8
- export { MaintainabilityCalculator } from './maintainability-calculator.js';
9
- export type { HalsteadMetrics, MaintainabilityIndex, FileMetrics, MetricsAnalysisResult, MetricsAnalysisOptions, MetricsSummary, } from './types.js';
@@ -1,9 +0,0 @@
1
- /**
2
- * Advanced Metrics Analyzer
3
- *
4
- * Calculates Halstead metrics and Maintainability Index
5
- */
6
- export { MetricsAnalyzer } from './metrics-analyzer.js';
7
- export { HalsteadCalculator } from './halstead-calculator.js';
8
- export { MaintainabilityCalculator } from './maintainability-calculator.js';
9
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyzers/metrics/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC"}
@@ -1,17 +0,0 @@
1
- /**
2
- * Maintainability Index Calculator
3
- *
4
- * Calculates MI = 171 - 5.2*ln(V) - 0.23*CC - 16.2*ln(LOC)
5
- * Normalized to 0-100 scale
6
- */
7
- import type { MaintainabilityIndex } from './types.js';
8
- export declare class MaintainabilityCalculator {
9
- /**
10
- * Calculate Maintainability Index
11
- */
12
- calculateIndex(halsteadVolume: number, cyclomaticComplexity: number, linesOfCode: number): MaintainabilityIndex;
13
- /**
14
- * Get letter rating from MI score
15
- */
16
- private getRating;
17
- }
@@ -1,46 +0,0 @@
1
- /**
2
- * Maintainability Index Calculator
3
- *
4
- * Calculates MI = 171 - 5.2*ln(V) - 0.23*CC - 16.2*ln(LOC)
5
- * Normalized to 0-100 scale
6
- */
7
- export class MaintainabilityCalculator {
8
- /**
9
- * Calculate Maintainability Index
10
- */
11
- calculateIndex(halsteadVolume, cyclomaticComplexity, linesOfCode) {
12
- // Original formula: MI = 171 - 5.2*ln(V) - 0.23*CC - 16.2*ln(LOC)
13
- // Clamp values to avoid invalid log
14
- const V = Math.max(1, halsteadVolume);
15
- const CC = Math.max(1, cyclomaticComplexity);
16
- const LOC = Math.max(1, linesOfCode);
17
- const rawMI = 171 - 5.2 * Math.log(V) - 0.23 * CC - 16.2 * Math.log(LOC);
18
- // Normalize to 0-100 scale
19
- // Original MI can range from negative to ~171
20
- // We'll use: MI_normalized = max(0, (rawMI / 171) * 100)
21
- const score = Math.max(0, Math.min(100, (rawMI / 171) * 100));
22
- const rating = this.getRating(score);
23
- return Object.freeze({
24
- score: Math.round(score * 100) / 100,
25
- rating,
26
- halsteadVolume: V,
27
- cyclomaticComplexity: CC,
28
- linesOfCode: LOC,
29
- });
30
- }
31
- /**
32
- * Get letter rating from MI score
33
- */
34
- getRating(score) {
35
- if (score >= 80)
36
- return 'A'; // Highly maintainable
37
- if (score >= 65)
38
- return 'B'; // Moderately maintainable
39
- if (score >= 50)
40
- return 'C'; // Somewhat maintainable
41
- if (score >= 35)
42
- return 'D'; // Difficult to maintain
43
- return 'F'; // Very difficult to maintain
44
- }
45
- }
46
- //# sourceMappingURL=maintainability-calculator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"maintainability-calculator.js","sourceRoot":"","sources":["../../../src/analyzers/metrics/maintainability-calculator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,OAAO,yBAAyB;IACpC;;OAEG;IACH,cAAc,CACZ,cAAsB,EACtB,oBAA4B,EAC5B,WAAmB;QAEnB,kEAAkE;QAClE,oCAAoC;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QACtC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAErC,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEzE,2BAA2B;QAC3B,8CAA8C;QAC9C,yDAAyD;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAE9D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAErC,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG;YACpC,MAAM;YACN,cAAc,EAAE,CAAC;YACjB,oBAAoB,EAAE,EAAE;YACxB,WAAW,EAAE,GAAG;SACjB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,KAAa;QAC7B,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,GAAG,CAAC,CAAC,sBAAsB;QACnD,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,GAAG,CAAC,CAAC,0BAA0B;QACvD,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,GAAG,CAAC,CAAC,wBAAwB;QACrD,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,GAAG,CAAC,CAAC,wBAAwB;QACrD,OAAO,GAAG,CAAC,CAAC,6BAA6B;IAC3C,CAAC;CACF"}
@@ -1,32 +0,0 @@
1
- /**
2
- * Metrics Analyzer
3
- *
4
- * Main orchestrator for advanced code metrics analysis
5
- */
6
- import type { MetricsAnalysisResult, MetricsAnalysisOptions } from './types.js';
7
- export declare class MetricsAnalyzer {
8
- private halsteadCalculator;
9
- private maintainabilityCalculator;
10
- private astParser;
11
- constructor();
12
- /**
13
- * Analyze metrics for files matching patterns
14
- */
15
- analyze(directory: string, options?: MetricsAnalysisOptions): Promise<MetricsAnalysisResult>;
16
- /**
17
- * Analyze a single file
18
- */
19
- private analyzeFile;
20
- /**
21
- * Calculate lines of code (excluding blank lines)
22
- */
23
- private calculateLinesOfCode;
24
- /**
25
- * Get files to analyze based on patterns
26
- */
27
- private getFilesToAnalyze;
28
- /**
29
- * Calculate summary statistics
30
- */
31
- private calculateSummary;
32
- }
@@ -1,144 +0,0 @@
1
- /**
2
- * Metrics Analyzer
3
- *
4
- * Main orchestrator for advanced code metrics analysis
5
- */
6
- import { HalsteadCalculator } from './halstead-calculator.js';
7
- import { MaintainabilityCalculator } from './maintainability-calculator.js';
8
- import { getMultiLanguageParser } from '../ast/multi-language-parser.js';
9
- import { glob } from 'glob';
10
- export class MetricsAnalyzer {
11
- halsteadCalculator;
12
- maintainabilityCalculator;
13
- astParser;
14
- constructor() {
15
- this.halsteadCalculator = new HalsteadCalculator();
16
- this.maintainabilityCalculator = new MaintainabilityCalculator();
17
- this.astParser = getMultiLanguageParser();
18
- }
19
- /**
20
- * Analyze metrics for files matching patterns
21
- */
22
- async analyze(directory, options = {}) {
23
- const files = await this.getFilesToAnalyze(directory, options);
24
- const fileMetrics = [];
25
- for (const filePath of files) {
26
- try {
27
- const metrics = await this.analyzeFile(filePath);
28
- fileMetrics.push(metrics);
29
- }
30
- catch {
31
- // Skip files that fail to parse
32
- continue;
33
- }
34
- }
35
- const summary = this.calculateSummary(fileMetrics);
36
- return Object.freeze({
37
- fileMetrics: Object.freeze(fileMetrics),
38
- summary,
39
- timestamp: new Date(),
40
- });
41
- }
42
- /**
43
- * Analyze a single file
44
- */
45
- async analyzeFile(filePath) {
46
- // Calculate Halstead metrics
47
- const halstead = this.halsteadCalculator.calculateMetrics(filePath);
48
- // Get AST info for complexity and LOC
49
- const ast = await this.astParser.parseFile(filePath);
50
- // Calculate average and max complexity
51
- const complexities = ast.functions.map((f) => f.complexity);
52
- const averageComplexity = complexities.length > 0
53
- ? complexities.reduce((a, b) => a + b, 0) / complexities.length
54
- : 0;
55
- const maxComplexity = complexities.length > 0 ? Math.max(...complexities) : 0;
56
- // Calculate total lines of code (excluding blank lines and comments)
57
- const linesOfCode = this.calculateLinesOfCode(filePath);
58
- // Calculate Maintainability Index
59
- const maintainability = this.maintainabilityCalculator.calculateIndex(halstead.volume, averageComplexity, linesOfCode);
60
- return Object.freeze({
61
- filePath,
62
- halstead,
63
- maintainability,
64
- averageComplexity: Math.round(averageComplexity * 100) / 100,
65
- maxComplexity,
66
- totalFunctions: ast.functions.length,
67
- });
68
- }
69
- /**
70
- * Calculate lines of code (excluding blank lines)
71
- */
72
- calculateLinesOfCode(filePath) {
73
- const sourceFile = this.astParser.getSourceFile(filePath);
74
- if (!sourceFile) {
75
- // For non-TS/JS files, return 0 (Halstead metrics will still work)
76
- return 0;
77
- }
78
- const text = sourceFile.getFullText();
79
- const lines = text.split('\n');
80
- // Count non-blank lines
81
- let loc = 0;
82
- for (const line of lines) {
83
- const trimmed = line.trim();
84
- if (trimmed.length > 0) {
85
- loc++;
86
- }
87
- }
88
- return loc;
89
- }
90
- /**
91
- * Get files to analyze based on patterns
92
- */
93
- async getFilesToAnalyze(directory, options) {
94
- const includePatterns = options.includePatterns || ['**/*.ts', '**/*.tsx'];
95
- const excludePatterns = options.excludePatterns || [
96
- '**/node_modules/**',
97
- '**/*.test.ts',
98
- '**/*.spec.ts',
99
- '**/dist/**',
100
- '**/build/**',
101
- ];
102
- const allFiles = new Set();
103
- for (const pattern of includePatterns) {
104
- const matches = await glob(pattern, {
105
- cwd: directory,
106
- absolute: true,
107
- ignore: excludePatterns ? [...excludePatterns] : [],
108
- });
109
- for (const match of matches) {
110
- allFiles.add(match);
111
- }
112
- }
113
- return Array.from(allFiles).sort();
114
- }
115
- /**
116
- * Calculate summary statistics
117
- */
118
- calculateSummary(fileMetrics) {
119
- if (fileMetrics.length === 0) {
120
- return Object.freeze({
121
- filesAnalyzed: 0,
122
- averageMaintainability: 0,
123
- averageHalsteadVolume: 0,
124
- averageComplexity: 0,
125
- lowMaintainabilityCount: 0,
126
- highComplexityCount: 0,
127
- });
128
- }
129
- const totalMaintainability = fileMetrics.reduce((sum, m) => sum + m.maintainability.score, 0);
130
- const totalHalsteadVolume = fileMetrics.reduce((sum, m) => sum + m.halstead.volume, 0);
131
- const totalComplexity = fileMetrics.reduce((sum, m) => sum + m.averageComplexity, 0);
132
- const lowMaintainabilityCount = fileMetrics.filter((m) => m.maintainability.score < 65).length;
133
- const highComplexityCount = fileMetrics.filter((m) => m.maxComplexity > 10).length;
134
- return Object.freeze({
135
- filesAnalyzed: fileMetrics.length,
136
- averageMaintainability: Math.round((totalMaintainability / fileMetrics.length) * 100) / 100,
137
- averageHalsteadVolume: Math.round((totalHalsteadVolume / fileMetrics.length) * 100) / 100,
138
- averageComplexity: Math.round((totalComplexity / fileMetrics.length) * 100) / 100,
139
- lowMaintainabilityCount,
140
- highComplexityCount,
141
- });
142
- }
143
- }
144
- //# sourceMappingURL=metrics-analyzer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"metrics-analyzer.js","sourceRoot":"","sources":["../../../src/analyzers/metrics/metrics-analyzer.ts"],"names":[],"mappings":"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"}
@@ -1,67 +0,0 @@
1
- /**
2
- * Advanced Metrics Types
3
- */
4
- /**
5
- * Halstead complexity metrics
6
- */
7
- export interface HalsteadMetrics {
8
- readonly n1: number;
9
- readonly n2: number;
10
- readonly N1: number;
11
- readonly N2: number;
12
- readonly vocabulary: number;
13
- readonly length: number;
14
- readonly calculatedLength: number;
15
- readonly volume: number;
16
- readonly difficulty: number;
17
- readonly effort: number;
18
- readonly time: number;
19
- readonly bugs: number;
20
- }
21
- /**
22
- * Maintainability Index
23
- */
24
- export interface MaintainabilityIndex {
25
- readonly score: number;
26
- readonly rating: 'A' | 'B' | 'C' | 'D' | 'F';
27
- readonly halsteadVolume: number;
28
- readonly cyclomaticComplexity: number;
29
- readonly linesOfCode: number;
30
- }
31
- /**
32
- * File metrics
33
- */
34
- export interface FileMetrics {
35
- readonly filePath: string;
36
- readonly halstead: HalsteadMetrics;
37
- readonly maintainability: MaintainabilityIndex;
38
- readonly averageComplexity: number;
39
- readonly maxComplexity: number;
40
- readonly totalFunctions: number;
41
- }
42
- /**
43
- * Metrics analysis result
44
- */
45
- export interface MetricsAnalysisResult {
46
- readonly fileMetrics: ReadonlyArray<FileMetrics>;
47
- readonly summary: MetricsSummary;
48
- readonly timestamp: Date;
49
- }
50
- /**
51
- * Summary statistics
52
- */
53
- export interface MetricsSummary {
54
- readonly filesAnalyzed: number;
55
- readonly averageMaintainability: number;
56
- readonly averageHalsteadVolume: number;
57
- readonly averageComplexity: number;
58
- readonly lowMaintainabilityCount: number;
59
- readonly highComplexityCount: number;
60
- }
61
- /**
62
- * Analysis options
63
- */
64
- export interface MetricsAnalysisOptions {
65
- readonly includePatterns?: readonly string[];
66
- readonly excludePatterns?: readonly string[];
67
- }
@@ -1,5 +0,0 @@
1
- /**
2
- * Advanced Metrics Types
3
- */
4
- export {};
5
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/analyzers/metrics/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}