@defai.digital/ax-cli 3.4.5 → 3.5.2

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 (211) hide show
  1. package/LICENSE +2 -6
  2. package/README.md +91 -3
  3. package/dist/analyzers/ast/parser.d.ts +59 -0
  4. package/dist/analyzers/ast/parser.js +293 -0
  5. package/dist/analyzers/ast/parser.js.map +1 -0
  6. package/dist/analyzers/ast/types.d.ts +107 -0
  7. package/dist/analyzers/ast/types.js +7 -0
  8. package/dist/analyzers/ast/types.js.map +1 -0
  9. package/dist/analyzers/code-smells/base-smell-detector.d.ts +30 -0
  10. package/dist/analyzers/code-smells/base-smell-detector.js +44 -0
  11. package/dist/analyzers/code-smells/base-smell-detector.js.map +1 -0
  12. package/dist/analyzers/code-smells/code-smell-analyzer.d.ts +30 -0
  13. package/dist/analyzers/code-smells/code-smell-analyzer.js +167 -0
  14. package/dist/analyzers/code-smells/code-smell-analyzer.js.map +1 -0
  15. package/dist/analyzers/code-smells/detectors/data-clumps-detector.d.ts +11 -0
  16. package/dist/analyzers/code-smells/detectors/data-clumps-detector.js +66 -0
  17. package/dist/analyzers/code-smells/detectors/data-clumps-detector.js.map +1 -0
  18. package/dist/analyzers/code-smells/detectors/dead-code-detector.d.ts +11 -0
  19. package/dist/analyzers/code-smells/detectors/dead-code-detector.js +53 -0
  20. package/dist/analyzers/code-smells/detectors/dead-code-detector.js.map +1 -0
  21. package/dist/analyzers/code-smells/detectors/duplicate-code-detector.d.ts +11 -0
  22. package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js +51 -0
  23. package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js.map +1 -0
  24. package/dist/analyzers/code-smells/detectors/feature-envy-detector.d.ts +11 -0
  25. package/dist/analyzers/code-smells/detectors/feature-envy-detector.js +64 -0
  26. package/dist/analyzers/code-smells/detectors/feature-envy-detector.js.map +1 -0
  27. package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.d.ts +11 -0
  28. package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js +56 -0
  29. package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js.map +1 -0
  30. package/dist/analyzers/code-smells/detectors/large-class-detector.d.ts +13 -0
  31. package/dist/analyzers/code-smells/detectors/large-class-detector.js +58 -0
  32. package/dist/analyzers/code-smells/detectors/large-class-detector.js.map +1 -0
  33. package/dist/analyzers/code-smells/detectors/long-method-detector.d.ts +12 -0
  34. package/dist/analyzers/code-smells/detectors/long-method-detector.js +52 -0
  35. package/dist/analyzers/code-smells/detectors/long-method-detector.js.map +1 -0
  36. package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.d.ts +12 -0
  37. package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js +50 -0
  38. package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js.map +1 -0
  39. package/dist/analyzers/code-smells/detectors/magic-numbers-detector.d.ts +12 -0
  40. package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js +54 -0
  41. package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js.map +1 -0
  42. package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.d.ts +13 -0
  43. package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js +71 -0
  44. package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js.map +1 -0
  45. package/dist/analyzers/code-smells/index.d.ts +16 -0
  46. package/dist/analyzers/code-smells/index.js +19 -0
  47. package/dist/analyzers/code-smells/index.js.map +1 -0
  48. package/dist/analyzers/code-smells/types.d.ts +82 -0
  49. package/dist/analyzers/code-smells/types.js +30 -0
  50. package/dist/analyzers/code-smells/types.js.map +1 -0
  51. package/dist/analyzers/dependency/circular-detector.d.ts +17 -0
  52. package/dist/analyzers/dependency/circular-detector.js +71 -0
  53. package/dist/analyzers/dependency/circular-detector.js.map +1 -0
  54. package/dist/analyzers/dependency/coupling-calculator.d.ts +24 -0
  55. package/dist/analyzers/dependency/coupling-calculator.js +86 -0
  56. package/dist/analyzers/dependency/coupling-calculator.js.map +1 -0
  57. package/dist/analyzers/dependency/dependency-analyzer.d.ts +40 -0
  58. package/dist/analyzers/dependency/dependency-analyzer.js +214 -0
  59. package/dist/analyzers/dependency/dependency-analyzer.js.map +1 -0
  60. package/dist/analyzers/dependency/dependency-graph.d.ts +57 -0
  61. package/dist/analyzers/dependency/dependency-graph.js +186 -0
  62. package/dist/analyzers/dependency/dependency-graph.js.map +1 -0
  63. package/dist/analyzers/dependency/index.d.ts +8 -0
  64. package/dist/analyzers/dependency/index.js +8 -0
  65. package/dist/analyzers/dependency/index.js.map +1 -0
  66. package/dist/analyzers/dependency/types.d.ts +105 -0
  67. package/dist/analyzers/dependency/types.js +5 -0
  68. package/dist/analyzers/dependency/types.js.map +1 -0
  69. package/dist/analyzers/git/churn-calculator.d.ts +34 -0
  70. package/dist/analyzers/git/churn-calculator.js +214 -0
  71. package/dist/analyzers/git/churn-calculator.js.map +1 -0
  72. package/dist/analyzers/git/git-analyzer.d.ts +19 -0
  73. package/dist/analyzers/git/git-analyzer.js +71 -0
  74. package/dist/analyzers/git/git-analyzer.js.map +1 -0
  75. package/dist/analyzers/git/hotspot-detector.d.ts +34 -0
  76. package/dist/analyzers/git/hotspot-detector.js +170 -0
  77. package/dist/analyzers/git/hotspot-detector.js.map +1 -0
  78. package/dist/analyzers/git/index.d.ts +7 -0
  79. package/dist/analyzers/git/index.js +7 -0
  80. package/dist/analyzers/git/index.js.map +1 -0
  81. package/dist/analyzers/git/types.d.ts +88 -0
  82. package/dist/analyzers/git/types.js +5 -0
  83. package/dist/analyzers/git/types.js.map +1 -0
  84. package/dist/analyzers/metrics/halstead-calculator.d.ts +30 -0
  85. package/dist/analyzers/metrics/halstead-calculator.js +150 -0
  86. package/dist/analyzers/metrics/halstead-calculator.js.map +1 -0
  87. package/dist/analyzers/metrics/index.d.ts +9 -0
  88. package/dist/analyzers/metrics/index.js +9 -0
  89. package/dist/analyzers/metrics/index.js.map +1 -0
  90. package/dist/analyzers/metrics/maintainability-calculator.d.ts +17 -0
  91. package/dist/analyzers/metrics/maintainability-calculator.js +46 -0
  92. package/dist/analyzers/metrics/maintainability-calculator.js.map +1 -0
  93. package/dist/analyzers/metrics/metrics-analyzer.d.ts +32 -0
  94. package/dist/analyzers/metrics/metrics-analyzer.js +140 -0
  95. package/dist/analyzers/metrics/metrics-analyzer.js.map +1 -0
  96. package/dist/analyzers/metrics/types.d.ts +67 -0
  97. package/dist/analyzers/metrics/types.js +5 -0
  98. package/dist/analyzers/metrics/types.js.map +1 -0
  99. package/dist/analyzers/security/base-detector.d.ts +58 -0
  100. package/dist/analyzers/security/base-detector.js +104 -0
  101. package/dist/analyzers/security/base-detector.js.map +1 -0
  102. package/dist/analyzers/security/detectors/command-injection-detector.d.ts +12 -0
  103. package/dist/analyzers/security/detectors/command-injection-detector.js +84 -0
  104. package/dist/analyzers/security/detectors/command-injection-detector.js.map +1 -0
  105. package/dist/analyzers/security/detectors/hardcoded-secrets-detector.d.ts +16 -0
  106. package/dist/analyzers/security/detectors/hardcoded-secrets-detector.js +140 -0
  107. package/dist/analyzers/security/detectors/hardcoded-secrets-detector.js.map +1 -0
  108. package/dist/analyzers/security/detectors/insecure-deserialization-detector.d.ts +12 -0
  109. package/dist/analyzers/security/detectors/insecure-deserialization-detector.js +109 -0
  110. package/dist/analyzers/security/detectors/insecure-deserialization-detector.js.map +1 -0
  111. package/dist/analyzers/security/detectors/insecure-random-detector.d.ts +12 -0
  112. package/dist/analyzers/security/detectors/insecure-random-detector.js +61 -0
  113. package/dist/analyzers/security/detectors/insecure-random-detector.js.map +1 -0
  114. package/dist/analyzers/security/detectors/path-traversal-detector.d.ts +12 -0
  115. package/dist/analyzers/security/detectors/path-traversal-detector.js +82 -0
  116. package/dist/analyzers/security/detectors/path-traversal-detector.js.map +1 -0
  117. package/dist/analyzers/security/detectors/sql-injection-detector.d.ts +12 -0
  118. package/dist/analyzers/security/detectors/sql-injection-detector.js +88 -0
  119. package/dist/analyzers/security/detectors/sql-injection-detector.js.map +1 -0
  120. package/dist/analyzers/security/detectors/weak-crypto-detector.d.ts +12 -0
  121. package/dist/analyzers/security/detectors/weak-crypto-detector.js +104 -0
  122. package/dist/analyzers/security/detectors/weak-crypto-detector.js.map +1 -0
  123. package/dist/analyzers/security/detectors/xss-detector.d.ts +12 -0
  124. package/dist/analyzers/security/detectors/xss-detector.js +90 -0
  125. package/dist/analyzers/security/detectors/xss-detector.js.map +1 -0
  126. package/dist/analyzers/security/index.d.ts +16 -0
  127. package/dist/analyzers/security/index.js +18 -0
  128. package/dist/analyzers/security/index.js.map +1 -0
  129. package/dist/analyzers/security/security-analyzer.d.ts +38 -0
  130. package/dist/analyzers/security/security-analyzer.js +215 -0
  131. package/dist/analyzers/security/security-analyzer.js.map +1 -0
  132. package/dist/analyzers/security/types.d.ts +95 -0
  133. package/dist/analyzers/security/types.js +7 -0
  134. package/dist/analyzers/security/types.js.map +1 -0
  135. package/dist/commands/memory.js +1 -1
  136. package/dist/commands/memory.js.map +1 -1
  137. package/dist/commands/setup.js +6 -1
  138. package/dist/commands/setup.js.map +1 -1
  139. package/dist/hooks/use-enhanced-input.d.ts +0 -1
  140. package/dist/hooks/use-enhanced-input.js.map +1 -1
  141. package/dist/mcp/health.js +4 -2
  142. package/dist/mcp/health.js.map +1 -1
  143. package/dist/mcp/validation.js +12 -6
  144. package/dist/mcp/validation.js.map +1 -1
  145. package/dist/tools/analysis-tools.d.ts +73 -0
  146. package/dist/tools/analysis-tools.js +422 -0
  147. package/dist/tools/analysis-tools.js.map +1 -0
  148. package/dist/tools/bash.js +2 -1
  149. package/dist/tools/bash.js.map +1 -1
  150. package/dist/ui/components/chat-history.js +1 -1
  151. package/dist/ui/components/chat-history.js.map +1 -1
  152. package/dist/ui/components/chat-interface.js +3 -2
  153. package/dist/ui/components/chat-interface.js.map +1 -1
  154. package/dist/ui/components/confirmation-dialog.js +1 -1
  155. package/dist/ui/components/confirmation-dialog.js.map +1 -1
  156. package/dist/ui/components/welcome-panel.js +1 -1
  157. package/dist/ui/components/welcome-panel.js.map +1 -1
  158. package/dist/ui/hooks/use-chat-reducer.d.ts +61 -0
  159. package/dist/ui/hooks/use-chat-reducer.js +118 -0
  160. package/dist/ui/hooks/use-chat-reducer.js.map +1 -0
  161. package/dist/ui/hooks/use-enhanced-input.d.ts +40 -0
  162. package/dist/ui/hooks/use-enhanced-input.js +254 -0
  163. package/dist/ui/hooks/use-enhanced-input.js.map +1 -0
  164. package/dist/ui/hooks/use-input-handler.d.ts +46 -0
  165. package/dist/ui/hooks/use-input-handler.js +1434 -0
  166. package/dist/ui/hooks/use-input-handler.js.map +1 -0
  167. package/dist/ui/hooks/use-input-history.d.ts +9 -0
  168. package/dist/ui/hooks/use-input-history.js +117 -0
  169. package/dist/ui/hooks/use-input-history.js.map +1 -0
  170. package/dist/utils/config-loader.js +3 -3
  171. package/dist/utils/config-loader.js.map +1 -1
  172. package/dist/utils/parallel-analyzer.js +7 -11
  173. package/dist/utils/parallel-analyzer.js.map +1 -1
  174. package/dist/utils/paste-collapse.d.ts +46 -0
  175. package/dist/utils/paste-collapse.js +77 -0
  176. package/dist/utils/paste-collapse.js.map +1 -0
  177. package/dist/utils/settings-manager.js +16 -2
  178. package/dist/utils/settings-manager.js.map +1 -1
  179. package/dist/utils/streaming-analyzer.js +9 -21
  180. package/dist/utils/streaming-analyzer.js.map +1 -1
  181. package/package.json +5 -5
  182. package/vitest.config.ts +1 -0
  183. package/dist/commands/weather.d.ts +0 -8
  184. package/dist/commands/weather.js +0 -160
  185. package/dist/commands/weather.js.map +0 -1
  186. package/dist/grok/client.d.ts +0 -144
  187. package/dist/grok/client.js +0 -237
  188. package/dist/grok/client.js.map +0 -1
  189. package/dist/grok/tools.d.ts +0 -8
  190. package/dist/grok/tools.js +0 -318
  191. package/dist/grok/tools.js.map +0 -1
  192. package/dist/grok/types.d.ts +0 -291
  193. package/dist/grok/types.js +0 -127
  194. package/dist/grok/types.js.map +0 -1
  195. package/dist/tools/morph-editor.d.ts +0 -36
  196. package/dist/tools/morph-editor.js +0 -308
  197. package/dist/tools/morph-editor.js.map +0 -1
  198. package/dist/ui/components/session-recovery.d.ts +0 -12
  199. package/dist/ui/components/session-recovery.js +0 -93
  200. package/dist/ui/components/session-recovery.js.map +0 -1
  201. package/dist/utils/model-config.d.ts +0 -28
  202. package/dist/utils/model-config.js +0 -43
  203. package/dist/utils/model-config.js.map +0 -1
  204. package/dist/utils/tool-helpers.d.ts +0 -25
  205. package/dist/utils/tool-helpers.js +0 -79
  206. package/dist/utils/tool-helpers.js.map +0 -1
  207. /package/{automatosx.config.json → ax.config.json} +0 -0
  208. /package/{config → config-defaults}/messages.yaml +0 -0
  209. /package/{config → config-defaults}/models.yaml +0 -0
  210. /package/{config → config-defaults}/prompts.yaml +0 -0
  211. /package/{config → config-defaults}/settings.yaml +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hotspot-detector.js","sourceRoot":"","sources":["../../../src/analyzers/git/hotspot-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Git Integration Module
3
+ */
4
+ export { GitAnalyzer } from './git-analyzer.js';
5
+ export { ChurnCalculator } from './churn-calculator.js';
6
+ export { HotspotDetector } from './hotspot-detector.js';
7
+ export type { GitCommit, FileChurn, CodeHotspot, ContributorStats, GitAnalysisResult, GitAnalysisSummary, GitAnalysisOptions, } from './types.js';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Git Integration Module
3
+ */
4
+ export { GitAnalyzer } from './git-analyzer.js';
5
+ export { ChurnCalculator } from './churn-calculator.js';
6
+ export { HotspotDetector } from './hotspot-detector.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyzers/git/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,88 @@
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
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Git Integration Types
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/analyzers/git/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,30 @@
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
+ }
@@ -0,0 +1,150 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"halstead-calculator.js","sourceRoot":"","sources":["../../../src/analyzers/metrics/halstead-calculator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
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';
@@ -0,0 +1,9 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,17 @@
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
+ }
@@ -0,0 +1,46 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,32 @@
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
+ }
@@ -0,0 +1,140 @@
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 { ASTParser } from '../ast/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 = new ASTParser();
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 (error) {
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 = 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
+ const text = sourceFile.getFullText();
75
+ const lines = text.split('\n');
76
+ // Count non-blank lines
77
+ let loc = 0;
78
+ for (const line of lines) {
79
+ const trimmed = line.trim();
80
+ if (trimmed.length > 0) {
81
+ loc++;
82
+ }
83
+ }
84
+ return loc;
85
+ }
86
+ /**
87
+ * Get files to analyze based on patterns
88
+ */
89
+ async getFilesToAnalyze(directory, options) {
90
+ const includePatterns = options.includePatterns || ['**/*.ts', '**/*.tsx'];
91
+ const excludePatterns = options.excludePatterns || [
92
+ '**/node_modules/**',
93
+ '**/*.test.ts',
94
+ '**/*.spec.ts',
95
+ '**/dist/**',
96
+ '**/build/**',
97
+ ];
98
+ const allFiles = new Set();
99
+ for (const pattern of includePatterns) {
100
+ const matches = await glob(pattern, {
101
+ cwd: directory,
102
+ absolute: true,
103
+ ignore: excludePatterns ? [...excludePatterns] : [],
104
+ });
105
+ for (const match of matches) {
106
+ allFiles.add(match);
107
+ }
108
+ }
109
+ return Array.from(allFiles).sort();
110
+ }
111
+ /**
112
+ * Calculate summary statistics
113
+ */
114
+ calculateSummary(fileMetrics) {
115
+ if (fileMetrics.length === 0) {
116
+ return Object.freeze({
117
+ filesAnalyzed: 0,
118
+ averageMaintainability: 0,
119
+ averageHalsteadVolume: 0,
120
+ averageComplexity: 0,
121
+ lowMaintainabilityCount: 0,
122
+ highComplexityCount: 0,
123
+ });
124
+ }
125
+ const totalMaintainability = fileMetrics.reduce((sum, m) => sum + m.maintainability.score, 0);
126
+ const totalHalsteadVolume = fileMetrics.reduce((sum, m) => sum + m.halstead.volume, 0);
127
+ const totalComplexity = fileMetrics.reduce((sum, m) => sum + m.averageComplexity, 0);
128
+ const lowMaintainabilityCount = fileMetrics.filter((m) => m.maintainability.score < 65).length;
129
+ const highComplexityCount = fileMetrics.filter((m) => m.maxComplexity > 10).length;
130
+ return Object.freeze({
131
+ filesAnalyzed: fileMetrics.length,
132
+ averageMaintainability: Math.round((totalMaintainability / fileMetrics.length) * 100) / 100,
133
+ averageHalsteadVolume: Math.round((totalHalsteadVolume / fileMetrics.length) * 100) / 100,
134
+ averageComplexity: Math.round((totalComplexity / fileMetrics.length) * 100) / 100,
135
+ lowMaintainabilityCount,
136
+ highComplexityCount,
137
+ });
138
+ }
139
+ }
140
+ //# sourceMappingURL=metrics-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-analyzer.js","sourceRoot":"","sources":["../../../src/analyzers/metrics/metrics-analyzer.ts"],"names":[],"mappings":"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"}