@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,257 +0,0 @@
1
- /**
2
- * Git Churn Calculator
3
- *
4
- * Calculates file churn metrics from git history
5
- */
6
- import { spawnSync } from 'child_process';
7
- export class ChurnCalculator {
8
- repositoryPath;
9
- constructor(repositoryPath) {
10
- this.repositoryPath = repositoryPath;
11
- }
12
- /**
13
- * Calculate churn for all files
14
- */
15
- async calculateChurn(options = {}) {
16
- const gitLogOutput = this.getGitLog(options);
17
- const fileChurnMap = new Map();
18
- // Parse git log output
19
- const commits = this.parseGitLog(gitLogOutput);
20
- for (const commit of commits) {
21
- for (const file of commit.files) {
22
- if (!this.shouldIncludeFile(file.path, options))
23
- continue;
24
- if (!fileChurnMap.has(file.path)) {
25
- fileChurnMap.set(file.path, {
26
- commits: 0,
27
- additions: 0,
28
- deletions: 0,
29
- lastModified: commit.date,
30
- authors: new Set(),
31
- });
32
- }
33
- const churn = fileChurnMap.get(file.path);
34
- if (!churn)
35
- continue; // Safety guard
36
- churn.commits++;
37
- churn.additions += file.additions;
38
- churn.deletions += file.deletions;
39
- churn.authors.add(commit.author);
40
- // Update last modified date
41
- if (commit.date > churn.lastModified) {
42
- churn.lastModified = commit.date;
43
- }
44
- }
45
- }
46
- // Convert to FileChurn array
47
- const result = [];
48
- for (const [filePath, data] of fileChurnMap.entries()) {
49
- result.push(Object.freeze({
50
- filePath,
51
- commitCount: data.commits,
52
- additions: data.additions,
53
- deletions: data.deletions,
54
- totalChurn: data.additions + data.deletions,
55
- lastModified: data.lastModified,
56
- authors: Object.freeze(Array.from(data.authors)),
57
- }));
58
- }
59
- // Sort by total churn (descending)
60
- return result.sort((a, b) => b.totalChurn - a.totalChurn);
61
- }
62
- /**
63
- * Calculate contributor statistics
64
- */
65
- async calculateContributorStats(options = {}) {
66
- const gitLogOutput = this.getGitLog(options);
67
- const commits = this.parseGitLog(gitLogOutput);
68
- const contributorMap = new Map();
69
- for (const commit of commits) {
70
- if (!contributorMap.has(commit.author)) {
71
- contributorMap.set(commit.author, {
72
- commits: 0,
73
- files: new Set(),
74
- added: 0,
75
- deleted: 0,
76
- firstCommit: commit.date,
77
- lastCommit: commit.date,
78
- });
79
- }
80
- const stats = contributorMap.get(commit.author);
81
- if (!stats)
82
- continue; // Safety guard
83
- stats.commits++;
84
- for (const file of commit.files) {
85
- if (this.shouldIncludeFile(file.path, options)) {
86
- stats.files.add(file.path);
87
- stats.added += file.additions;
88
- stats.deleted += file.deletions;
89
- }
90
- }
91
- // Update date range
92
- if (commit.date < stats.firstCommit) {
93
- stats.firstCommit = commit.date;
94
- }
95
- if (commit.date > stats.lastCommit) {
96
- stats.lastCommit = commit.date;
97
- }
98
- }
99
- // Convert to ContributorStats array
100
- const result = [];
101
- for (const [author, data] of contributorMap.entries()) {
102
- result.push(Object.freeze({
103
- author,
104
- commitCount: data.commits,
105
- filesChanged: data.files.size,
106
- linesAdded: data.added,
107
- linesDeleted: data.deleted,
108
- firstCommit: data.firstCommit,
109
- lastCommit: data.lastCommit,
110
- }));
111
- }
112
- // Sort by commit count (descending)
113
- return result.sort((a, b) => b.commitCount - a.commitCount);
114
- }
115
- /**
116
- * Get git log with file stats
117
- * SECURITY FIX: Prevent command injection by validating inputs and using array-based execution
118
- */
119
- getGitLog(options) {
120
- const args = ['log', '--numstat', '--pretty=format:%H|%an|%ad|%s'];
121
- // SECURITY FIX: Validate and sanitize inputs to prevent command injection
122
- if (options.since) {
123
- // Validate date format: only allow alphanumeric, spaces, hyphens, colons, and slashes
124
- if (!/^[\w\s\-:\/]+$/.test(options.since)) {
125
- throw new Error(`Invalid since parameter: contains unsafe characters`);
126
- }
127
- args.push('--since', options.since); // Pass as separate argument to prevent injection
128
- }
129
- if (options.until) {
130
- // Validate date format
131
- if (!/^[\w\s\-:\/]+$/.test(options.until)) {
132
- throw new Error(`Invalid until parameter: contains unsafe characters`);
133
- }
134
- args.push('--until', options.until);
135
- }
136
- if (options.branch) {
137
- // Validate branch name: only allow alphanumeric, hyphens, slashes, underscores, and dots
138
- if (!/^[\w\-\/\.]+$/.test(options.branch)) {
139
- throw new Error(`Invalid branch name: contains unsafe characters`);
140
- }
141
- args.push(options.branch);
142
- }
143
- try {
144
- // SECURITY FIX: Use spawnSync with array args instead of string interpolation
145
- // This prevents shell injection by not invoking a shell
146
- const result = spawnSync('git', args, {
147
- cwd: this.repositoryPath,
148
- encoding: 'utf-8',
149
- maxBuffer: 10 * 1024 * 1024, // 10MB buffer
150
- stdio: ['pipe', 'pipe', 'ignore'], // Ignore stderr to suppress warnings
151
- });
152
- if (result.error) {
153
- return '';
154
- }
155
- return result.stdout || '';
156
- }
157
- catch {
158
- // If git command fails, return empty string
159
- return '';
160
- }
161
- }
162
- /**
163
- * Parse git log output
164
- */
165
- parseGitLog(output) {
166
- const commits = [];
167
- const lines = output.split('\n');
168
- let currentCommit = null;
169
- for (const line of lines) {
170
- if (!line.trim())
171
- continue;
172
- // Commit line: hash|author|date|message
173
- if (line.includes('|')) {
174
- const parts = line.split('|');
175
- if (parts.length >= 4) {
176
- // Save previous commit
177
- if (currentCommit) {
178
- commits.push(currentCommit);
179
- }
180
- // Start new commit
181
- // BUG FIX: Validate date to avoid Invalid Date objects
182
- const parsedDate = new Date(parts[2]);
183
- const validDate = isNaN(parsedDate.getTime()) ? new Date() : parsedDate;
184
- currentCommit = {
185
- hash: parts[0],
186
- author: parts[1],
187
- date: validDate,
188
- message: parts[3],
189
- files: [],
190
- };
191
- }
192
- }
193
- else if (currentCommit) {
194
- // File stat line: additions deletions filename
195
- const parts = line.split('\t');
196
- if (parts.length >= 3) {
197
- // BUG FIX: Handle NaN from parseInt - use || 0 to default to 0
198
- const additions = parts[0] === '-' ? 0 : (parseInt(parts[0], 10) || 0);
199
- const deletions = parts[1] === '-' ? 0 : (parseInt(parts[1], 10) || 0);
200
- const path = parts[2];
201
- currentCommit.files.push({ path, additions, deletions });
202
- }
203
- }
204
- }
205
- // Add last commit
206
- if (currentCommit) {
207
- commits.push(currentCommit);
208
- }
209
- return commits;
210
- }
211
- /**
212
- * Check if file should be included based on patterns
213
- */
214
- shouldIncludeFile(filePath, options) {
215
- // Check exclude patterns
216
- if (options.excludePatterns) {
217
- for (const pattern of options.excludePatterns) {
218
- if (this.matchPattern(filePath, pattern)) {
219
- return false;
220
- }
221
- }
222
- }
223
- // Check include patterns
224
- if (options.includePatterns && options.includePatterns.length > 0) {
225
- for (const pattern of options.includePatterns) {
226
- if (this.matchPattern(filePath, pattern)) {
227
- return true;
228
- }
229
- }
230
- return false;
231
- }
232
- return true;
233
- }
234
- /**
235
- * Simple pattern matching (supports * wildcard)
236
- * SECURITY FIX: Prevent ReDoS by using non-greedy matching and proper escaping
237
- */
238
- matchPattern(filePath, pattern) {
239
- // CRITICAL FIX: Escape special regex characters EXCEPT * to prevent injection
240
- // Must escape: . + ? ^ $ { } ( ) | [ ] \
241
- const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
242
- // CRITICAL FIX: Replace * with [^/]* (non-greedy, doesn't cross directories)
243
- // This prevents catastrophic backtracking from nested wildcards like "a*b*c*d*"
244
- // Old: .* (greedy, can cause ReDoS)
245
- // New: [^/]* (matches anything except /, prevents exponential backtracking)
246
- const regexPattern = '^' + escaped.replace(/\*/g, '[^/]*') + '$';
247
- try {
248
- const regex = new RegExp(regexPattern);
249
- return regex.test(filePath);
250
- }
251
- catch {
252
- // If regex construction fails, return false
253
- return false;
254
- }
255
- }
256
- }
257
- //# sourceMappingURL=churn-calculator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"churn-calculator.js","sourceRoot":"","sources":["../../../src/analyzers/git/churn-calculator.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- /**
2
- * Git Analyzer
3
- *
4
- * Main orchestrator for Git history analysis
5
- */
6
- import type { GitAnalysisResult, GitAnalysisOptions } from './types.js';
7
- export declare class GitAnalyzer {
8
- private churnCalculator;
9
- private hotspotDetector;
10
- constructor(repositoryPath: string);
11
- /**
12
- * Perform complete Git analysis
13
- */
14
- analyze(options?: GitAnalysisOptions): Promise<GitAnalysisResult>;
15
- /**
16
- * Calculate summary statistics
17
- */
18
- private calculateSummary;
19
- }
@@ -1,79 +0,0 @@
1
- /**
2
- * Git Analyzer
3
- *
4
- * Main orchestrator for Git history analysis
5
- */
6
- import { ChurnCalculator } from './churn-calculator.js';
7
- import { HotspotDetector } from './hotspot-detector.js';
8
- export class GitAnalyzer {
9
- churnCalculator;
10
- hotspotDetector;
11
- constructor(repositoryPath) {
12
- this.churnCalculator = new ChurnCalculator(repositoryPath);
13
- this.hotspotDetector = new HotspotDetector();
14
- }
15
- /**
16
- * Perform complete Git analysis
17
- */
18
- async analyze(options = {}) {
19
- const timestamp = new Date();
20
- // Calculate churn metrics
21
- const churnMetrics = await this.churnCalculator.calculateChurn(options);
22
- // Calculate contributor statistics
23
- const contributors = await this.churnCalculator.calculateContributorStats(options);
24
- // Detect hotspots
25
- const hotspots = await this.hotspotDetector.detectHotspots(churnMetrics, options);
26
- // Calculate summary
27
- const summary = this.calculateSummary(churnMetrics, hotspots, contributors);
28
- return Object.freeze({
29
- hotspots: Object.freeze(hotspots),
30
- churnMetrics: Object.freeze(churnMetrics),
31
- contributors: Object.freeze(contributors),
32
- summary: Object.freeze(summary),
33
- timestamp,
34
- });
35
- }
36
- /**
37
- * Calculate summary statistics
38
- */
39
- calculateSummary(churnMetrics, hotspots, contributors) {
40
- const totalCommits = contributors.reduce((sum, c) => sum + c.commitCount, 0);
41
- const averageChurn = churnMetrics.length > 0
42
- ? churnMetrics.reduce((sum, c) => sum + c.totalChurn, 0) / churnMetrics.length
43
- : 0;
44
- const topContributor = contributors.length > 0
45
- ? contributors[0].author
46
- : 'Unknown';
47
- // BUG FIX: Handle empty contributors array to avoid invalid date range (from > to)
48
- // When no contributors, use current date for both to create a valid empty range
49
- const now = new Date();
50
- let earliestDate = now;
51
- let latestDate = now;
52
- if (contributors.length > 0) {
53
- // Initialize with first contributor's dates
54
- earliestDate = contributors[0].firstCommit;
55
- latestDate = contributors[0].lastCommit;
56
- // Find actual min/max across all contributors
57
- for (const contributor of contributors) {
58
- if (contributor.firstCommit < earliestDate) {
59
- earliestDate = contributor.firstCommit;
60
- }
61
- if (contributor.lastCommit > latestDate) {
62
- latestDate = contributor.lastCommit;
63
- }
64
- }
65
- }
66
- return {
67
- totalCommits,
68
- filesAnalyzed: churnMetrics.length,
69
- hotspotCount: hotspots.length,
70
- averageChurn: Math.round(averageChurn),
71
- topContributor,
72
- dateRange: {
73
- from: earliestDate,
74
- to: latestDate,
75
- },
76
- };
77
- }
78
- }
79
- //# sourceMappingURL=git-analyzer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"git-analyzer.js","sourceRoot":"","sources":["../../../src/analyzers/git/git-analyzer.ts"],"names":[],"mappings":"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"}
@@ -1,34 +0,0 @@
1
- /**
2
- * Hotspot Detector
3
- *
4
- * Identifies code hotspots using churn × complexity formula
5
- */
6
- import type { FileChurn, CodeHotspot, GitAnalysisOptions } from './types.js';
7
- export declare class HotspotDetector {
8
- private astParser;
9
- constructor();
10
- /**
11
- * Detect hotspots from churn metrics
12
- */
13
- detectHotspots(churnMetrics: readonly FileChurn[], options?: GitAnalysisOptions): Promise<CodeHotspot[]>;
14
- /**
15
- * Get complexity metrics from file
16
- */
17
- private getComplexityMetrics;
18
- /**
19
- * Normalize complexity to 0-100 scale
20
- */
21
- private normalizeComplexity;
22
- /**
23
- * Calculate severity based on hotspot score
24
- */
25
- private calculateSeverity;
26
- /**
27
- * Generate reason for hotspot
28
- */
29
- private generateReason;
30
- /**
31
- * Generate recommendation
32
- */
33
- private generateRecommendation;
34
- }
@@ -1,173 +0,0 @@
1
- /**
2
- * Hotspot Detector
3
- *
4
- * Identifies code hotspots using churn × complexity formula
5
- */
6
- import { getMultiLanguageParser } from '../ast/multi-language-parser.js';
7
- export class HotspotDetector {
8
- astParser;
9
- constructor() {
10
- this.astParser = getMultiLanguageParser();
11
- }
12
- /**
13
- * Detect hotspots from churn metrics
14
- */
15
- async detectHotspots(churnMetrics, options = {}) {
16
- const threshold = options.hotspotThreshold ?? 70;
17
- const hotspots = [];
18
- // Calculate max values for normalization
19
- // BUG FIX: Handle empty arrays safely to avoid -Infinity from Math.max
20
- const churnValues = churnMetrics.map(c => c.totalChurn);
21
- const commitValues = churnMetrics.map(c => c.commitCount);
22
- const maxChurn = churnValues.length > 0 ? Math.max(...churnValues) : 1;
23
- const maxCommits = commitValues.length > 0 ? Math.max(...commitValues) : 1;
24
- for (const churn of churnMetrics) {
25
- try {
26
- // Get complexity metrics from AST
27
- const complexity = await this.getComplexityMetrics(churn.filePath);
28
- if (!complexity)
29
- continue;
30
- // Normalize churn (0-100)
31
- const normalizedChurn = (churn.totalChurn / maxChurn) * 100;
32
- const normalizedCommits = (churn.commitCount / maxCommits) * 100;
33
- const churnScore = (normalizedChurn * 0.6 + normalizedCommits * 0.4);
34
- // Normalize complexity (0-100)
35
- const complexityScore = this.normalizeComplexity(complexity.average, complexity.max);
36
- // Calculate hotspot score using weighted formula
37
- // Churn: 40%, Complexity: 30%, Commit Frequency: 30%
38
- const hotspotScore = Math.round(churnScore * 0.4 +
39
- complexityScore * 0.3 +
40
- normalizedCommits * 0.3);
41
- // Only include if above threshold
42
- if (hotspotScore >= threshold) {
43
- const severity = this.calculateSeverity(hotspotScore);
44
- const reason = this.generateReason(churn, complexity, hotspotScore);
45
- const recommendation = this.generateRecommendation(churn, complexity, severity);
46
- hotspots.push(Object.freeze({
47
- filePath: churn.filePath,
48
- hotspotScore,
49
- churnScore: Math.round(churnScore),
50
- complexityScore: Math.round(complexityScore),
51
- commitCount: churn.commitCount,
52
- totalChurn: churn.totalChurn,
53
- averageComplexity: complexity.average,
54
- maxComplexity: complexity.max,
55
- severity,
56
- reason,
57
- recommendation,
58
- }));
59
- }
60
- }
61
- catch {
62
- // Skip files that can't be analyzed
63
- continue;
64
- }
65
- }
66
- // Sort by hotspot score (descending)
67
- return hotspots.sort((a, b) => b.hotspotScore - a.hotspotScore);
68
- }
69
- /**
70
- * Get complexity metrics from file
71
- */
72
- async getComplexityMetrics(filePath) {
73
- try {
74
- const ast = await this.astParser.parseFile(filePath);
75
- const complexities = [];
76
- // Collect function complexities
77
- for (const func of ast.functions) {
78
- complexities.push(func.complexity);
79
- }
80
- // Collect method complexities
81
- for (const cls of ast.classes) {
82
- for (const method of cls.methods) {
83
- complexities.push(method.complexity);
84
- }
85
- }
86
- if (complexities.length === 0) {
87
- return null;
88
- }
89
- const average = complexities.reduce((sum, c) => sum + c, 0) / complexities.length;
90
- const max = Math.max(...complexities);
91
- return { average, max };
92
- }
93
- catch {
94
- return null;
95
- }
96
- }
97
- /**
98
- * Normalize complexity to 0-100 scale
99
- */
100
- normalizeComplexity(average, max) {
101
- // McCabe complexity thresholds:
102
- // 1-10: Simple
103
- // 11-20: Moderate
104
- // 21-50: Complex
105
- // 50+: Very complex
106
- const avgScore = Math.min(100, (average / 20) * 100);
107
- const maxScore = Math.min(100, (max / 50) * 100);
108
- // Weight average more than max
109
- return avgScore * 0.7 + maxScore * 0.3;
110
- }
111
- /**
112
- * Calculate severity based on hotspot score
113
- */
114
- calculateSeverity(score) {
115
- if (score >= 90)
116
- return 'CRITICAL';
117
- if (score >= 80)
118
- return 'HIGH';
119
- if (score >= 70)
120
- return 'MEDIUM';
121
- return 'LOW';
122
- }
123
- /**
124
- * Generate reason for hotspot
125
- */
126
- generateReason(churn, complexity, score) {
127
- const reasons = [];
128
- if (churn.commitCount > 20) {
129
- reasons.push(`high change frequency (${churn.commitCount} commits)`);
130
- }
131
- if (churn.totalChurn > 500) {
132
- reasons.push(`high churn (${churn.totalChurn} lines changed)`);
133
- }
134
- if (complexity.average > 10) {
135
- reasons.push(`high average complexity (${complexity.average.toFixed(1)})`);
136
- }
137
- if (complexity.max > 20) {
138
- reasons.push(`very complex functions (max: ${complexity.max})`);
139
- }
140
- if (churn.authors.length > 5) {
141
- reasons.push(`many contributors (${churn.authors.length})`);
142
- }
143
- return `Hotspot (score: ${score}/100): ${reasons.join(', ')}`;
144
- }
145
- /**
146
- * Generate recommendation
147
- */
148
- generateRecommendation(churn, complexity, severity) {
149
- const recommendations = [];
150
- if (complexity.max > 20) {
151
- recommendations.push('Reduce complexity by breaking down complex functions');
152
- }
153
- if (churn.commitCount > 30) {
154
- recommendations.push('Stabilize this file - consider refactoring to reduce change frequency');
155
- }
156
- if (churn.authors.length > 8) {
157
- recommendations.push('Establish clear ownership and coding standards');
158
- }
159
- if (complexity.average > 15) {
160
- recommendations.push('Simplify logic and improve code structure');
161
- }
162
- if (recommendations.length === 0) {
163
- recommendations.push('Monitor this file for further changes and consider refactoring');
164
- }
165
- const prefix = severity === 'CRITICAL' || severity === 'HIGH'
166
- ? 'URGENT: '
167
- : severity === 'MEDIUM'
168
- ? 'Important: '
169
- : '';
170
- return prefix + recommendations.join('. ') + '.';
171
- }
172
- }
173
- //# sourceMappingURL=hotspot-detector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hotspot-detector.js","sourceRoot":"","sources":["../../../src/analyzers/git/hotspot-detector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,sBAAsB,EAA4B,MAAM,iCAAiC,CAAC;AAGnG,MAAM,OAAO,eAAe;IAClB,SAAS,CAAsB;IAEvC;QACE,IAAI,CAAC,SAAS,GAAG,sBAAsB,EAAE,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,YAAkC,EAClC,UAA8B,EAAE;QAEhC,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAkB,EAAE,CAAC;QAEnC,yCAAyC;QACzC,uEAAuE;QACvE,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE3E,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,kCAAkC;gBAClC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAEnE,IAAI,CAAC,UAAU;oBAAE,SAAS;gBAE1B,0BAA0B;gBAC1B,MAAM,eAAe,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC;gBAC5D,MAAM,iBAAiB,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC;gBACjE,MAAM,UAAU,GAAG,CAAC,eAAe,GAAG,GAAG,GAAG,iBAAiB,GAAG,GAAG,CAAC,CAAC;gBAErE,+BAA+B;gBAC/B,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAC9C,UAAU,CAAC,OAAO,EAClB,UAAU,CAAC,GAAG,CACf,CAAC;gBAEF,iDAAiD;gBACjD,qDAAqD;gBACrD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAC7B,UAAU,GAAG,GAAG;oBAChB,eAAe,GAAG,GAAG;oBACrB,iBAAiB,GAAG,GAAG,CACxB,CAAC;gBAEF,kCAAkC;gBAClC,IAAI,YAAY,IAAI,SAAS,EAAE,CAAC;oBAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;oBACtD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;oBACpE,MAAM,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;oBAEhF,QAAQ,CAAC,IAAI,CACX,MAAM,CAAC,MAAM,CAAC;wBACZ,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,YAAY;wBACZ,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;wBAClC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC;wBAC5C,WAAW,EAAE,KAAK,CAAC,WAAW;wBAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;wBAC5B,iBAAiB,EAAE,UAAU,CAAC,OAAO;wBACrC,aAAa,EAAE,UAAU,CAAC,GAAG;wBAC7B,QAAQ;wBACR,MAAM;wBACN,cAAc;qBACf,CAAC,CACH,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,oCAAoC;gBACpC,SAAS;YACX,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,oBAAoB,CAChC,QAAgB;QAEhB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAErD,MAAM,YAAY,GAAa,EAAE,CAAC;YAElC,gCAAgC;YAChC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBACjC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACrC,CAAC;YAED,8BAA8B;YAC9B,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC9B,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;oBACjC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;YAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC;YAClF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC;YAEtC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,OAAe,EAAE,GAAW;QACtD,gCAAgC;QAChC,eAAe;QACf,kBAAkB;QAClB,iBAAiB;QACjB,oBAAoB;QAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;QAEjD,+BAA+B;QAC/B,OAAO,QAAQ,GAAG,GAAG,GAAG,QAAQ,GAAG,GAAG,CAAC;IACzC,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,KAAa;QACrC,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,UAAU,CAAC;QACnC,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,MAAM,CAAC;QAC/B,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,QAAQ,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,cAAc,CACpB,KAAgB,EAChB,UAA4C,EAC5C,KAAa;QAEb,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,IAAI,KAAK,CAAC,WAAW,GAAG,EAAE,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,WAAW,WAAW,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,KAAK,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,eAAe,KAAK,CAAC,UAAU,iBAAiB,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,UAAU,CAAC,OAAO,GAAG,EAAE,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,4BAA4B,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,UAAU,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,gCAAgC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,sBAAsB,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,mBAAmB,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAChE,CAAC;IAED;;OAEG;IACK,sBAAsB,CAC5B,KAAgB,EAChB,UAA4C,EAC5C,QAAgD;QAEhD,MAAM,eAAe,GAAa,EAAE,CAAC;QAErC,IAAI,UAAU,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;YACxB,eAAe,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QAC/E,CAAC;QAED,IAAI,KAAK,CAAC,WAAW,GAAG,EAAE,EAAE,CAAC;YAC3B,eAAe,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;QAChG,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,eAAe,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,UAAU,CAAC,OAAO,GAAG,EAAE,EAAE,CAAC;YAC5B,eAAe,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,eAAe,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;QACzF,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,MAAM;YAC3D,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,QAAQ,KAAK,QAAQ;gBACvB,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;IACnD,CAAC;CACF"}
@@ -1,7 +0,0 @@
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';
@@ -1,7 +0,0 @@
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
@@ -1 +0,0 @@
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"}