@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.
- package/README.md +22 -2
- package/dist/agent/agent-executor.d.ts +1 -1
- package/dist/agent/agent-executor.js +15 -17
- package/dist/agent/agent-executor.js.map +1 -1
- package/dist/agent/execution/tool-executor.d.ts +6 -0
- package/dist/agent/execution/tool-executor.js +16 -1
- package/dist/agent/execution/tool-executor.js.map +1 -1
- package/dist/agent/llm-agent.js +91 -22
- package/dist/agent/llm-agent.js.map +1 -1
- package/dist/agent/parallel-tools.d.ts +65 -0
- package/dist/agent/parallel-tools.js +146 -0
- package/dist/agent/parallel-tools.js.map +1 -0
- package/dist/llm/tools.js +1 -1
- package/dist/llm/tools.js.map +1 -1
- package/dist/ui/components/chat-interface.js +14 -0
- package/dist/ui/components/chat-interface.js.map +1 -1
- package/dist/ui/hooks/use-input-handler.js +2 -2
- package/dist/ui/hooks/use-input-handler.js.map +1 -1
- package/dist/ui/utils/image-handler.js +8 -5
- package/dist/ui/utils/image-handler.js.map +1 -1
- package/package.json +1 -1
- package/dist/analyzers/architecture/anti-pattern-detectors/god-object-detector.d.ts +0 -29
- package/dist/analyzers/architecture/anti-pattern-detectors/god-object-detector.js +0 -103
- package/dist/analyzers/architecture/anti-pattern-detectors/god-object-detector.js.map +0 -1
- package/dist/analyzers/architecture/architecture-analyzer.d.ts +0 -58
- package/dist/analyzers/architecture/architecture-analyzer.js +0 -276
- package/dist/analyzers/architecture/architecture-analyzer.js.map +0 -1
- package/dist/analyzers/architecture/index.d.ts +0 -12
- package/dist/analyzers/architecture/index.js +0 -14
- package/dist/analyzers/architecture/index.js.map +0 -1
- package/dist/analyzers/architecture/pattern-detectors/base-detector.d.ts +0 -27
- package/dist/analyzers/architecture/pattern-detectors/base-detector.js +0 -31
- package/dist/analyzers/architecture/pattern-detectors/base-detector.js.map +0 -1
- package/dist/analyzers/architecture/pattern-detectors/clean-architecture-detector.d.ts +0 -11
- package/dist/analyzers/architecture/pattern-detectors/clean-architecture-detector.js +0 -57
- package/dist/analyzers/architecture/pattern-detectors/clean-architecture-detector.js.map +0 -1
- package/dist/analyzers/architecture/pattern-detectors/mvc-detector.d.ts +0 -11
- package/dist/analyzers/architecture/pattern-detectors/mvc-detector.js +0 -43
- package/dist/analyzers/architecture/pattern-detectors/mvc-detector.js.map +0 -1
- package/dist/analyzers/architecture/pattern-detectors/repository-detector.d.ts +0 -11
- package/dist/analyzers/architecture/pattern-detectors/repository-detector.js +0 -49
- package/dist/analyzers/architecture/pattern-detectors/repository-detector.js.map +0 -1
- package/dist/analyzers/architecture/project-structure-scanner.d.ts +0 -54
- package/dist/analyzers/architecture/project-structure-scanner.js +0 -204
- package/dist/analyzers/architecture/project-structure-scanner.js.map +0 -1
- package/dist/analyzers/ast/index.d.ts +0 -13
- package/dist/analyzers/ast/index.js +0 -16
- package/dist/analyzers/ast/index.js.map +0 -1
- package/dist/analyzers/ast/language-parser.d.ts +0 -59
- package/dist/analyzers/ast/language-parser.js +0 -107
- package/dist/analyzers/ast/language-parser.js.map +0 -1
- package/dist/analyzers/ast/multi-language-parser.d.ts +0 -79
- package/dist/analyzers/ast/multi-language-parser.js +0 -157
- package/dist/analyzers/ast/multi-language-parser.js.map +0 -1
- package/dist/analyzers/ast/node-helpers.d.ts +0 -81
- package/dist/analyzers/ast/node-helpers.js +0 -128
- package/dist/analyzers/ast/node-helpers.js.map +0 -1
- package/dist/analyzers/ast/parser.d.ts +0 -60
- package/dist/analyzers/ast/parser.js +0 -305
- package/dist/analyzers/ast/parser.js.map +0 -1
- package/dist/analyzers/ast/traverser.d.ts +0 -67
- package/dist/analyzers/ast/traverser.js +0 -156
- package/dist/analyzers/ast/traverser.js.map +0 -1
- package/dist/analyzers/ast/types.d.ts +0 -107
- package/dist/analyzers/ast/types.js +0 -7
- package/dist/analyzers/ast/types.js.map +0 -1
- package/dist/analyzers/best-practices/base-rule.d.ts +0 -45
- package/dist/analyzers/best-practices/base-rule.js +0 -45
- package/dist/analyzers/best-practices/base-rule.js.map +0 -1
- package/dist/analyzers/best-practices/best-practice-validator.d.ts +0 -35
- package/dist/analyzers/best-practices/best-practice-validator.js +0 -181
- package/dist/analyzers/best-practices/best-practice-validator.js.map +0 -1
- package/dist/analyzers/best-practices/index.d.ts +0 -10
- package/dist/analyzers/best-practices/index.js +0 -11
- package/dist/analyzers/best-practices/index.js.map +0 -1
- package/dist/analyzers/best-practices/rules/index.d.ts +0 -7
- package/dist/analyzers/best-practices/rules/index.js +0 -56
- package/dist/analyzers/best-practices/rules/index.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/consistent-naming.d.ts +0 -17
- package/dist/analyzers/best-practices/rules/typescript/consistent-naming.js +0 -41
- package/dist/analyzers/best-practices/rules/typescript/consistent-naming.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/function-complexity.d.ts +0 -27
- package/dist/analyzers/best-practices/rules/typescript/function-complexity.js +0 -76
- package/dist/analyzers/best-practices/rules/typescript/function-complexity.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/index.d.ts +0 -15
- package/dist/analyzers/best-practices/rules/typescript/index.js +0 -16
- package/dist/analyzers/best-practices/rules/typescript/index.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/max-file-length.d.ts +0 -18
- package/dist/analyzers/best-practices/rules/typescript/max-file-length.js +0 -25
- package/dist/analyzers/best-practices/rules/typescript/max-file-length.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/no-any-type.d.ts +0 -17
- package/dist/analyzers/best-practices/rules/typescript/no-any-type.js +0 -27
- package/dist/analyzers/best-practices/rules/typescript/no-any-type.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/no-implicit-any.d.ts +0 -18
- package/dist/analyzers/best-practices/rules/typescript/no-implicit-any.js +0 -39
- package/dist/analyzers/best-practices/rules/typescript/no-implicit-any.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.d.ts +0 -17
- package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js +0 -38
- package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.d.ts +0 -17
- package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js +0 -38
- package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/prefer-const.d.ts +0 -17
- package/dist/analyzers/best-practices/rules/typescript/prefer-const.js +0 -35
- package/dist/analyzers/best-practices/rules/typescript/prefer-const.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.d.ts +0 -17
- package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js +0 -36
- package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/proper-error-handling.d.ts +0 -17
- package/dist/analyzers/best-practices/rules/typescript/proper-error-handling.js +0 -27
- package/dist/analyzers/best-practices/rules/typescript/proper-error-handling.js.map +0 -1
- package/dist/analyzers/best-practices/types.d.ts +0 -86
- package/dist/analyzers/best-practices/types.js +0 -7
- package/dist/analyzers/best-practices/types.js.map +0 -1
- package/dist/analyzers/cache/analysis-cache.d.ts +0 -41
- package/dist/analyzers/cache/analysis-cache.js +0 -84
- package/dist/analyzers/cache/analysis-cache.js.map +0 -1
- package/dist/analyzers/code-smells/base-smell-detector.d.ts +0 -30
- package/dist/analyzers/code-smells/base-smell-detector.js +0 -44
- package/dist/analyzers/code-smells/base-smell-detector.js.map +0 -1
- package/dist/analyzers/code-smells/code-smell-analyzer.d.ts +0 -30
- package/dist/analyzers/code-smells/code-smell-analyzer.js +0 -167
- package/dist/analyzers/code-smells/code-smell-analyzer.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/data-clumps-detector.d.ts +0 -11
- package/dist/analyzers/code-smells/detectors/data-clumps-detector.js +0 -64
- package/dist/analyzers/code-smells/detectors/data-clumps-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/dead-code-detector.d.ts +0 -11
- package/dist/analyzers/code-smells/detectors/dead-code-detector.js +0 -58
- package/dist/analyzers/code-smells/detectors/dead-code-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/duplicate-code-detector.d.ts +0 -11
- package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js +0 -69
- package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/feature-envy-detector.d.ts +0 -11
- package/dist/analyzers/code-smells/detectors/feature-envy-detector.js +0 -70
- package/dist/analyzers/code-smells/detectors/feature-envy-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.d.ts +0 -11
- package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js +0 -59
- package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/large-class-detector.d.ts +0 -13
- package/dist/analyzers/code-smells/detectors/large-class-detector.js +0 -61
- package/dist/analyzers/code-smells/detectors/large-class-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/long-method-detector.d.ts +0 -12
- package/dist/analyzers/code-smells/detectors/long-method-detector.js +0 -55
- package/dist/analyzers/code-smells/detectors/long-method-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.d.ts +0 -12
- package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js +0 -53
- package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/magic-numbers-detector.d.ts +0 -12
- package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js +0 -56
- package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.d.ts +0 -13
- package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js +0 -77
- package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js.map +0 -1
- package/dist/analyzers/code-smells/index.d.ts +0 -16
- package/dist/analyzers/code-smells/index.js +0 -19
- package/dist/analyzers/code-smells/index.js.map +0 -1
- package/dist/analyzers/code-smells/types.d.ts +0 -82
- package/dist/analyzers/code-smells/types.js +0 -30
- package/dist/analyzers/code-smells/types.js.map +0 -1
- package/dist/analyzers/dependency/circular-detector.d.ts +0 -17
- package/dist/analyzers/dependency/circular-detector.js +0 -73
- package/dist/analyzers/dependency/circular-detector.js.map +0 -1
- package/dist/analyzers/dependency/coupling-calculator.d.ts +0 -24
- package/dist/analyzers/dependency/coupling-calculator.js +0 -86
- package/dist/analyzers/dependency/coupling-calculator.js.map +0 -1
- package/dist/analyzers/dependency/dependency-analyzer.d.ts +0 -44
- package/dist/analyzers/dependency/dependency-analyzer.js +0 -218
- package/dist/analyzers/dependency/dependency-analyzer.js.map +0 -1
- package/dist/analyzers/dependency/dependency-graph.d.ts +0 -57
- package/dist/analyzers/dependency/dependency-graph.js +0 -198
- package/dist/analyzers/dependency/dependency-graph.js.map +0 -1
- package/dist/analyzers/dependency/index.d.ts +0 -8
- package/dist/analyzers/dependency/index.js +0 -8
- package/dist/analyzers/dependency/index.js.map +0 -1
- package/dist/analyzers/dependency/types.d.ts +0 -105
- package/dist/analyzers/dependency/types.js +0 -5
- package/dist/analyzers/dependency/types.js.map +0 -1
- package/dist/analyzers/errors.d.ts +0 -51
- package/dist/analyzers/errors.js +0 -79
- package/dist/analyzers/errors.js.map +0 -1
- package/dist/analyzers/git/churn-calculator.d.ts +0 -36
- package/dist/analyzers/git/churn-calculator.js +0 -257
- package/dist/analyzers/git/churn-calculator.js.map +0 -1
- package/dist/analyzers/git/git-analyzer.d.ts +0 -19
- package/dist/analyzers/git/git-analyzer.js +0 -79
- package/dist/analyzers/git/git-analyzer.js.map +0 -1
- package/dist/analyzers/git/hotspot-detector.d.ts +0 -34
- package/dist/analyzers/git/hotspot-detector.js +0 -173
- package/dist/analyzers/git/hotspot-detector.js.map +0 -1
- package/dist/analyzers/git/index.d.ts +0 -7
- package/dist/analyzers/git/index.js +0 -7
- package/dist/analyzers/git/index.js.map +0 -1
- package/dist/analyzers/git/types.d.ts +0 -88
- package/dist/analyzers/git/types.js +0 -5
- package/dist/analyzers/git/types.js.map +0 -1
- package/dist/analyzers/metrics/halstead-calculator.d.ts +0 -30
- package/dist/analyzers/metrics/halstead-calculator.js +0 -150
- package/dist/analyzers/metrics/halstead-calculator.js.map +0 -1
- package/dist/analyzers/metrics/index.d.ts +0 -9
- package/dist/analyzers/metrics/index.js +0 -9
- package/dist/analyzers/metrics/index.js.map +0 -1
- package/dist/analyzers/metrics/maintainability-calculator.d.ts +0 -17
- package/dist/analyzers/metrics/maintainability-calculator.js +0 -46
- package/dist/analyzers/metrics/maintainability-calculator.js.map +0 -1
- package/dist/analyzers/metrics/metrics-analyzer.d.ts +0 -32
- package/dist/analyzers/metrics/metrics-analyzer.js +0 -144
- package/dist/analyzers/metrics/metrics-analyzer.js.map +0 -1
- package/dist/analyzers/metrics/types.d.ts +0 -67
- package/dist/analyzers/metrics/types.js +0 -5
- package/dist/analyzers/metrics/types.js.map +0 -1
- package/dist/analyzers/security/base-detector.d.ts +0 -58
- package/dist/analyzers/security/base-detector.js +0 -104
- package/dist/analyzers/security/base-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/command-injection-detector.d.ts +0 -12
- package/dist/analyzers/security/detectors/command-injection-detector.js +0 -84
- package/dist/analyzers/security/detectors/command-injection-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/hardcoded-secrets-detector.d.ts +0 -16
- package/dist/analyzers/security/detectors/hardcoded-secrets-detector.js +0 -140
- package/dist/analyzers/security/detectors/hardcoded-secrets-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/insecure-deserialization-detector.d.ts +0 -12
- package/dist/analyzers/security/detectors/insecure-deserialization-detector.js +0 -109
- package/dist/analyzers/security/detectors/insecure-deserialization-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/insecure-random-detector.d.ts +0 -12
- package/dist/analyzers/security/detectors/insecure-random-detector.js +0 -61
- package/dist/analyzers/security/detectors/insecure-random-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/path-traversal-detector.d.ts +0 -12
- package/dist/analyzers/security/detectors/path-traversal-detector.js +0 -82
- package/dist/analyzers/security/detectors/path-traversal-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/sql-injection-detector.d.ts +0 -12
- package/dist/analyzers/security/detectors/sql-injection-detector.js +0 -88
- package/dist/analyzers/security/detectors/sql-injection-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/weak-crypto-detector.d.ts +0 -12
- package/dist/analyzers/security/detectors/weak-crypto-detector.js +0 -104
- package/dist/analyzers/security/detectors/weak-crypto-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/xss-detector.d.ts +0 -12
- package/dist/analyzers/security/detectors/xss-detector.js +0 -90
- package/dist/analyzers/security/detectors/xss-detector.js.map +0 -1
- package/dist/analyzers/security/index.d.ts +0 -16
- package/dist/analyzers/security/index.js +0 -18
- package/dist/analyzers/security/index.js.map +0 -1
- package/dist/analyzers/security/security-analyzer.d.ts +0 -38
- package/dist/analyzers/security/security-analyzer.js +0 -215
- package/dist/analyzers/security/security-analyzer.js.map +0 -1
- package/dist/analyzers/security/types.d.ts +0 -95
- package/dist/analyzers/security/types.js +0 -7
- package/dist/analyzers/security/types.js.map +0 -1
- package/dist/tools/analysis-tools/architecture-tool.d.ts +0 -46
- package/dist/tools/analysis-tools/architecture-tool.js +0 -124
- package/dist/tools/analysis-tools/architecture-tool.js.map +0 -1
- package/dist/tools/analysis-tools/validation-tool.d.ts +0 -51
- package/dist/tools/analysis-tools/validation-tool.js +0 -121
- package/dist/tools/analysis-tools/validation-tool.js.map +0 -1
- package/dist/tools/analysis-tools.d.ts +0 -73
- package/dist/tools/analysis-tools.js +0 -422
- package/dist/tools/analysis-tools.js.map +0 -1
- package/dist/types/analysis.d.ts +0 -177
- package/dist/types/analysis.js +0 -8
- package/dist/types/analysis.js.map +0 -1
- package/dist/utils/analysis-logger.d.ts +0 -50
- package/dist/utils/analysis-logger.js +0 -73
- 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":"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"}
|
|
@@ -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 +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"}
|