@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,103 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* God Object Anti-Pattern Detector
|
|
3
|
-
*
|
|
4
|
-
* Detects files that are too large and have too many responsibilities.
|
|
5
|
-
* Indicates violation of Single Responsibility Principle.
|
|
6
|
-
*/
|
|
7
|
-
import { promises as fs } from 'fs';
|
|
8
|
-
export class GodObjectDetector {
|
|
9
|
-
LINE_THRESHOLD = 500;
|
|
10
|
-
METHOD_THRESHOLD = 20;
|
|
11
|
-
LARGE_LINE_THRESHOLD = 1000;
|
|
12
|
-
async detect(structure) {
|
|
13
|
-
const antiPatterns = [];
|
|
14
|
-
// Find large source files
|
|
15
|
-
const largeFiles = structure.files.filter((f) => f.lines > this.LINE_THRESHOLD && this.isSourceFile(f));
|
|
16
|
-
// Analyze each large file
|
|
17
|
-
for (const file of largeFiles) {
|
|
18
|
-
try {
|
|
19
|
-
const content = await fs.readFile(file.path, 'utf-8');
|
|
20
|
-
const methodCount = this.countMethods(content);
|
|
21
|
-
const classCount = this.countClasses(content);
|
|
22
|
-
// Only flag as God Object if it has many methods
|
|
23
|
-
if (methodCount > this.METHOD_THRESHOLD) {
|
|
24
|
-
antiPatterns.push(Object.freeze({
|
|
25
|
-
name: 'God Object',
|
|
26
|
-
severity: this.calculateSeverity(file.lines, methodCount),
|
|
27
|
-
locations: [file.relativePath],
|
|
28
|
-
description: `File has ${file.lines} lines and ${methodCount} methods, indicating a God Object anti-pattern`,
|
|
29
|
-
suggestion: 'Consider splitting this file into smaller, focused modules following the Single Responsibility Principle',
|
|
30
|
-
impact: 'Reduces maintainability, makes testing difficult, increases coupling, and violates SOLID principles',
|
|
31
|
-
metadata: Object.freeze({
|
|
32
|
-
lines: file.lines,
|
|
33
|
-
methods: methodCount,
|
|
34
|
-
classes: classCount,
|
|
35
|
-
linesPerMethod: methodCount > 0 ? Math.round(file.lines / methodCount) : 0,
|
|
36
|
-
}),
|
|
37
|
-
}));
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
catch (error) {
|
|
41
|
-
// Skip files that can't be read
|
|
42
|
-
console.warn(`Failed to analyze file ${file.relativePath}:`, error.message);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
return antiPatterns;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Check if file is a source code file
|
|
49
|
-
*/
|
|
50
|
-
isSourceFile(file) {
|
|
51
|
-
return /\.(ts|js|tsx|jsx)$/.test(file.extension);
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Count methods/functions in file
|
|
55
|
-
*/
|
|
56
|
-
countMethods(content) {
|
|
57
|
-
let count = 0;
|
|
58
|
-
// Function declarations
|
|
59
|
-
const functionDeclarations = content.match(/function\s+\w+\s*\(/g);
|
|
60
|
-
if (functionDeclarations)
|
|
61
|
-
count += functionDeclarations.length;
|
|
62
|
-
// Arrow functions assigned to variables/constants
|
|
63
|
-
const arrowFunctions = content.match(/(const|let|var)\s+\w+\s*=\s*\([^)]*\)\s*=>/g);
|
|
64
|
-
if (arrowFunctions)
|
|
65
|
-
count += arrowFunctions.length;
|
|
66
|
-
// Class methods
|
|
67
|
-
const classMethods = content.match(/^\s+(public|private|protected|async|static)*\s*\w+\s*\([^)]*\)\s*[:{]/gm);
|
|
68
|
-
if (classMethods)
|
|
69
|
-
count += classMethods.length;
|
|
70
|
-
// Object methods
|
|
71
|
-
const objectMethods = content.match(/\w+\s*:\s*(async\s+)?function\s*\(/g);
|
|
72
|
-
if (objectMethods)
|
|
73
|
-
count += objectMethods.length;
|
|
74
|
-
return count;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Count classes in file
|
|
78
|
-
*/
|
|
79
|
-
countClasses(content) {
|
|
80
|
-
const classes = content.match(/class\s+\w+/g);
|
|
81
|
-
return classes ? classes.length : 0;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Calculate severity based on file size and method count
|
|
85
|
-
*/
|
|
86
|
-
calculateSeverity(lines, methods) {
|
|
87
|
-
// Critical: Extremely large or many methods
|
|
88
|
-
if (lines > this.LARGE_LINE_THRESHOLD || methods > 50) {
|
|
89
|
-
return 'critical';
|
|
90
|
-
}
|
|
91
|
-
// High: Very large
|
|
92
|
-
if (lines > 750 || methods > 30) {
|
|
93
|
-
return 'high';
|
|
94
|
-
}
|
|
95
|
-
// Medium: Large
|
|
96
|
-
if (lines > 600 || methods > 25) {
|
|
97
|
-
return 'medium';
|
|
98
|
-
}
|
|
99
|
-
// Low: Moderately large
|
|
100
|
-
return 'low';
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
//# sourceMappingURL=god-object-detector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"god-object-detector.js","sourceRoot":"","sources":["../../../../src/analyzers/architecture/anti-pattern-detectors/god-object-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Architecture Analyzer
|
|
3
|
-
*
|
|
4
|
-
* Main orchestrator for architecture analysis.
|
|
5
|
-
* Coordinates pattern detection, anti-pattern detection, and generates recommendations.
|
|
6
|
-
*/
|
|
7
|
-
import type { ArchitectureAnalysis, AnalysisDepth } from '../../types/analysis.js';
|
|
8
|
-
import type { Logger } from '../../utils/analysis-logger.js';
|
|
9
|
-
export declare class ArchitectureAnalyzer {
|
|
10
|
-
private readonly scanner;
|
|
11
|
-
private readonly cache;
|
|
12
|
-
private readonly logger;
|
|
13
|
-
constructor(logger?: Logger);
|
|
14
|
-
/**
|
|
15
|
-
* Analyze project architecture
|
|
16
|
-
*/
|
|
17
|
-
analyzeProject(projectPath: string, depth?: AnalysisDepth): Promise<ArchitectureAnalysis>;
|
|
18
|
-
/**
|
|
19
|
-
* Detect architectural patterns
|
|
20
|
-
*/
|
|
21
|
-
private detectPatterns;
|
|
22
|
-
/**
|
|
23
|
-
* Detect anti-patterns
|
|
24
|
-
*/
|
|
25
|
-
private detectAntiPatterns;
|
|
26
|
-
/**
|
|
27
|
-
* Generate architecture recommendations
|
|
28
|
-
*/
|
|
29
|
-
private generateRecommendations;
|
|
30
|
-
/**
|
|
31
|
-
* Calculate overall architecture score (0-100)
|
|
32
|
-
*/
|
|
33
|
-
private calculateArchitectureScore;
|
|
34
|
-
/**
|
|
35
|
-
* Generate analysis summary
|
|
36
|
-
*/
|
|
37
|
-
private generateSummary;
|
|
38
|
-
/**
|
|
39
|
-
* Calculate project hash for cache validation
|
|
40
|
-
*/
|
|
41
|
-
private calculateProjectHash;
|
|
42
|
-
/**
|
|
43
|
-
* Estimate effort required to fix anti-pattern
|
|
44
|
-
*/
|
|
45
|
-
private estimateEffort;
|
|
46
|
-
/**
|
|
47
|
-
* Get related patterns for anti-pattern remediation
|
|
48
|
-
*/
|
|
49
|
-
private getRelatedPatterns;
|
|
50
|
-
/**
|
|
51
|
-
* Get letter grade from score
|
|
52
|
-
*/
|
|
53
|
-
private getGrade;
|
|
54
|
-
/**
|
|
55
|
-
* Clear analysis cache
|
|
56
|
-
*/
|
|
57
|
-
clearCache(): void;
|
|
58
|
-
}
|
|
@@ -1,276 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Architecture Analyzer
|
|
3
|
-
*
|
|
4
|
-
* Main orchestrator for architecture analysis.
|
|
5
|
-
* Coordinates pattern detection, anti-pattern detection, and generates recommendations.
|
|
6
|
-
*/
|
|
7
|
-
import crypto from 'crypto';
|
|
8
|
-
import { ProjectStructureScanner } from './project-structure-scanner.js';
|
|
9
|
-
import { AnalysisCache } from '../cache/analysis-cache.js';
|
|
10
|
-
import { createLogger } from '../../utils/analysis-logger.js';
|
|
11
|
-
// Pattern Detectors
|
|
12
|
-
import { MVCDetector } from './pattern-detectors/mvc-detector.js';
|
|
13
|
-
import { CleanArchitectureDetector } from './pattern-detectors/clean-architecture-detector.js';
|
|
14
|
-
import { RepositoryDetector } from './pattern-detectors/repository-detector.js';
|
|
15
|
-
// Anti-Pattern Detectors
|
|
16
|
-
import { GodObjectDetector } from './anti-pattern-detectors/god-object-detector.js';
|
|
17
|
-
export class ArchitectureAnalyzer {
|
|
18
|
-
scanner = new ProjectStructureScanner();
|
|
19
|
-
cache = new AnalysisCache();
|
|
20
|
-
logger;
|
|
21
|
-
constructor(logger) {
|
|
22
|
-
this.logger = logger || createLogger();
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Analyze project architecture
|
|
26
|
-
*/
|
|
27
|
-
async analyzeProject(projectPath, depth = 'quick') {
|
|
28
|
-
const startTime = Date.now();
|
|
29
|
-
this.logger.info('Starting architecture analysis', { projectPath, depth });
|
|
30
|
-
try {
|
|
31
|
-
// Check cache
|
|
32
|
-
const hash = await this.calculateProjectHash(projectPath);
|
|
33
|
-
const cached = await this.cache.get(projectPath, hash);
|
|
34
|
-
if (cached) {
|
|
35
|
-
this.logger.info('Returning cached analysis', { projectPath });
|
|
36
|
-
return cached;
|
|
37
|
-
}
|
|
38
|
-
// Scan project structure
|
|
39
|
-
const structure = await this.scanner.scan(projectPath);
|
|
40
|
-
this.logger.debug('Project structure scanned', {
|
|
41
|
-
files: structure.totalFiles,
|
|
42
|
-
lines: structure.totalLines,
|
|
43
|
-
});
|
|
44
|
-
// Detect patterns in parallel
|
|
45
|
-
const patterns = await this.detectPatterns(structure);
|
|
46
|
-
this.logger.debug('Patterns detected', { count: patterns.length });
|
|
47
|
-
// Detect anti-patterns in parallel (only in deep mode)
|
|
48
|
-
const antiPatterns = depth === 'deep' ? await this.detectAntiPatterns(structure) : [];
|
|
49
|
-
this.logger.debug('Anti-patterns detected', { count: antiPatterns.length });
|
|
50
|
-
// Generate recommendations
|
|
51
|
-
const recommendations = this.generateRecommendations(patterns, antiPatterns);
|
|
52
|
-
// Calculate score
|
|
53
|
-
const score = this.calculateArchitectureScore(patterns, antiPatterns);
|
|
54
|
-
// Build result
|
|
55
|
-
const result = Object.freeze({
|
|
56
|
-
timestamp: Date.now(),
|
|
57
|
-
durationMs: Date.now() - startTime,
|
|
58
|
-
projectPath,
|
|
59
|
-
detectedPatterns: Object.freeze(patterns),
|
|
60
|
-
antiPatterns: Object.freeze(antiPatterns),
|
|
61
|
-
recommendations: Object.freeze(recommendations),
|
|
62
|
-
architectureScore: score,
|
|
63
|
-
summary: this.generateSummary(patterns, antiPatterns, score),
|
|
64
|
-
});
|
|
65
|
-
// Cache result
|
|
66
|
-
this.cache.set(projectPath, result, hash);
|
|
67
|
-
this.logger.info('Architecture analysis completed', {
|
|
68
|
-
projectPath,
|
|
69
|
-
duration: result.durationMs,
|
|
70
|
-
patterns: patterns.length,
|
|
71
|
-
antiPatterns: antiPatterns.length,
|
|
72
|
-
score,
|
|
73
|
-
});
|
|
74
|
-
return result;
|
|
75
|
-
}
|
|
76
|
-
catch (error) {
|
|
77
|
-
this.logger.error('Architecture analysis failed', error, {
|
|
78
|
-
projectPath,
|
|
79
|
-
});
|
|
80
|
-
throw error;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Detect architectural patterns
|
|
85
|
-
*/
|
|
86
|
-
async detectPatterns(structure) {
|
|
87
|
-
const detectors = [
|
|
88
|
-
new MVCDetector(),
|
|
89
|
-
new CleanArchitectureDetector(),
|
|
90
|
-
new RepositoryDetector(),
|
|
91
|
-
];
|
|
92
|
-
// Execute all detectors in parallel
|
|
93
|
-
const results = await Promise.all(detectors.map(async (detector) => {
|
|
94
|
-
try {
|
|
95
|
-
return detector.detect(structure);
|
|
96
|
-
}
|
|
97
|
-
catch (error) {
|
|
98
|
-
this.logger.warn(`Pattern detector ${detector.constructor.name} failed`, { error: error.message });
|
|
99
|
-
return null;
|
|
100
|
-
}
|
|
101
|
-
}));
|
|
102
|
-
return results.filter((p) => p !== null);
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Detect anti-patterns
|
|
106
|
-
*/
|
|
107
|
-
async detectAntiPatterns(structure) {
|
|
108
|
-
const detectors = [new GodObjectDetector()];
|
|
109
|
-
// Execute in parallel and flatten results
|
|
110
|
-
const results = await Promise.all(detectors.map(async (detector) => {
|
|
111
|
-
try {
|
|
112
|
-
return await detector.detect(structure);
|
|
113
|
-
}
|
|
114
|
-
catch (error) {
|
|
115
|
-
this.logger.warn(`Anti-pattern detector ${detector.constructor.name} failed`, { error: error.message });
|
|
116
|
-
return [];
|
|
117
|
-
}
|
|
118
|
-
}));
|
|
119
|
-
return results.flat();
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Generate architecture recommendations
|
|
123
|
-
*/
|
|
124
|
-
generateRecommendations(patterns, antiPatterns) {
|
|
125
|
-
const recommendations = [];
|
|
126
|
-
// If no patterns detected, suggest adopting one
|
|
127
|
-
if (patterns.length === 0) {
|
|
128
|
-
recommendations.push(Object.freeze({
|
|
129
|
-
title: 'Adopt an architectural pattern',
|
|
130
|
-
priority: 'medium',
|
|
131
|
-
description: 'No clear architectural pattern detected. Consider adopting one for better code organization.',
|
|
132
|
-
rationale: 'Architectural patterns improve maintainability, testability, and team collaboration',
|
|
133
|
-
estimatedEffort: 'high',
|
|
134
|
-
benefits: Object.freeze([
|
|
135
|
-
'Improved code organization',
|
|
136
|
-
'Better separation of concerns',
|
|
137
|
-
'Easier onboarding for new developers',
|
|
138
|
-
'Reduced coupling between components',
|
|
139
|
-
]),
|
|
140
|
-
tradeoffs: Object.freeze([
|
|
141
|
-
'Initial learning curve',
|
|
142
|
-
'Refactoring required',
|
|
143
|
-
'More boilerplate code initially',
|
|
144
|
-
]),
|
|
145
|
-
relatedPatterns: Object.freeze([
|
|
146
|
-
'MVC',
|
|
147
|
-
'Clean Architecture',
|
|
148
|
-
'Layered Architecture',
|
|
149
|
-
]),
|
|
150
|
-
}));
|
|
151
|
-
}
|
|
152
|
-
// For each anti-pattern, create a recommendation
|
|
153
|
-
for (const antiPattern of antiPatterns) {
|
|
154
|
-
recommendations.push(Object.freeze({
|
|
155
|
-
title: `Fix ${antiPattern.name}`,
|
|
156
|
-
priority: antiPattern.severity,
|
|
157
|
-
description: antiPattern.suggestion,
|
|
158
|
-
rationale: antiPattern.impact,
|
|
159
|
-
estimatedEffort: this.estimateEffort(antiPattern),
|
|
160
|
-
benefits: Object.freeze([
|
|
161
|
-
'Improved maintainability',
|
|
162
|
-
'Better testability',
|
|
163
|
-
'Reduced coupling',
|
|
164
|
-
'Easier to understand and modify',
|
|
165
|
-
]),
|
|
166
|
-
tradeoffs: Object.freeze(['Requires refactoring time']),
|
|
167
|
-
relatedPatterns: Object.freeze(this.getRelatedPatterns(antiPattern)),
|
|
168
|
-
}));
|
|
169
|
-
}
|
|
170
|
-
return recommendations;
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Calculate overall architecture score (0-100)
|
|
174
|
-
*/
|
|
175
|
-
calculateArchitectureScore(patterns, antiPatterns) {
|
|
176
|
-
let score = 50; // Base score
|
|
177
|
-
// Bonus for detected patterns
|
|
178
|
-
score += patterns.length * 10;
|
|
179
|
-
score += patterns.reduce((sum, p) => sum + p.confidence * 10, 0);
|
|
180
|
-
// Penalty for anti-patterns
|
|
181
|
-
const severityPenalty = {
|
|
182
|
-
critical: 25,
|
|
183
|
-
high: 15,
|
|
184
|
-
medium: 10,
|
|
185
|
-
low: 5,
|
|
186
|
-
info: 0,
|
|
187
|
-
};
|
|
188
|
-
for (const antiPattern of antiPatterns) {
|
|
189
|
-
score -= severityPenalty[antiPattern.severity] || 0;
|
|
190
|
-
}
|
|
191
|
-
return Math.max(0, Math.min(100, Math.round(score)));
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* Generate analysis summary
|
|
195
|
-
*/
|
|
196
|
-
generateSummary(patterns, antiPatterns, score) {
|
|
197
|
-
const parts = [];
|
|
198
|
-
if (patterns.length > 0) {
|
|
199
|
-
const patternNames = patterns.map((p) => p.name).join(', ');
|
|
200
|
-
parts.push(`Detected ${patterns.length} architectural pattern${patterns.length === 1 ? '' : 's'}: ${patternNames}`);
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
parts.push('No clear architectural patterns detected');
|
|
204
|
-
}
|
|
205
|
-
if (antiPatterns.length > 0) {
|
|
206
|
-
const antiPatternNames = antiPatterns.map((ap) => ap.name).join(', ');
|
|
207
|
-
parts.push(`Found ${antiPatterns.length} anti-pattern${antiPatterns.length === 1 ? '' : 's'}: ${antiPatternNames}`);
|
|
208
|
-
}
|
|
209
|
-
const grade = this.getGrade(score);
|
|
210
|
-
parts.push(`Overall architecture score: ${score}/100 (Grade: ${grade})`);
|
|
211
|
-
return parts.join('. ');
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Calculate project hash for cache validation
|
|
215
|
-
*/
|
|
216
|
-
async calculateProjectHash(projectPath) {
|
|
217
|
-
try {
|
|
218
|
-
const structure = await this.scanner.scan(projectPath);
|
|
219
|
-
// Simple hash based on file count and total lines
|
|
220
|
-
const hashInput = `${structure.totalFiles}-${structure.totalLines}`;
|
|
221
|
-
return crypto.createHash('sha256').update(hashInput).digest('hex');
|
|
222
|
-
}
|
|
223
|
-
catch {
|
|
224
|
-
// Fallback to path-based hash
|
|
225
|
-
return crypto.createHash('sha256').update(projectPath).digest('hex');
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* Estimate effort required to fix anti-pattern
|
|
230
|
-
*/
|
|
231
|
-
estimateEffort(antiPattern) {
|
|
232
|
-
switch (antiPattern.severity) {
|
|
233
|
-
case 'critical':
|
|
234
|
-
case 'high':
|
|
235
|
-
return 'high';
|
|
236
|
-
case 'medium':
|
|
237
|
-
return 'medium';
|
|
238
|
-
default:
|
|
239
|
-
return 'low';
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
/**
|
|
243
|
-
* Get related patterns for anti-pattern remediation
|
|
244
|
-
*/
|
|
245
|
-
getRelatedPatterns(antiPattern) {
|
|
246
|
-
const patternMap = {
|
|
247
|
-
'God Object': ['Single Responsibility', 'Extract Class', 'Facade'],
|
|
248
|
-
'Circular Dependencies': [
|
|
249
|
-
'Dependency Injection',
|
|
250
|
-
'Interface Segregation',
|
|
251
|
-
],
|
|
252
|
-
};
|
|
253
|
-
return patternMap[antiPattern.name] || [];
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* Get letter grade from score
|
|
257
|
-
*/
|
|
258
|
-
getGrade(score) {
|
|
259
|
-
if (score >= 90)
|
|
260
|
-
return 'A';
|
|
261
|
-
if (score >= 80)
|
|
262
|
-
return 'B';
|
|
263
|
-
if (score >= 70)
|
|
264
|
-
return 'C';
|
|
265
|
-
if (score >= 60)
|
|
266
|
-
return 'D';
|
|
267
|
-
return 'F';
|
|
268
|
-
}
|
|
269
|
-
/**
|
|
270
|
-
* Clear analysis cache
|
|
271
|
-
*/
|
|
272
|
-
clearCache() {
|
|
273
|
-
this.cache.clear();
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
//# sourceMappingURL=architecture-analyzer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"architecture-analyzer.js","sourceRoot":"","sources":["../../../src/analyzers/architecture/architecture-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Architecture Analysis Module
|
|
3
|
-
*
|
|
4
|
-
* Exports all architecture analysis components
|
|
5
|
-
*/
|
|
6
|
-
export { ArchitectureAnalyzer } from './architecture-analyzer.js';
|
|
7
|
-
export { ProjectStructureScanner } from './project-structure-scanner.js';
|
|
8
|
-
export { MVCDetector } from './pattern-detectors/mvc-detector.js';
|
|
9
|
-
export { CleanArchitectureDetector } from './pattern-detectors/clean-architecture-detector.js';
|
|
10
|
-
export { RepositoryDetector } from './pattern-detectors/repository-detector.js';
|
|
11
|
-
export type { PatternDetector } from './pattern-detectors/base-detector.js';
|
|
12
|
-
export { GodObjectDetector } from './anti-pattern-detectors/god-object-detector.js';
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Architecture Analysis Module
|
|
3
|
-
*
|
|
4
|
-
* Exports all architecture analysis components
|
|
5
|
-
*/
|
|
6
|
-
export { ArchitectureAnalyzer } from './architecture-analyzer.js';
|
|
7
|
-
export { ProjectStructureScanner } from './project-structure-scanner.js';
|
|
8
|
-
// Pattern Detectors
|
|
9
|
-
export { MVCDetector } from './pattern-detectors/mvc-detector.js';
|
|
10
|
-
export { CleanArchitectureDetector } from './pattern-detectors/clean-architecture-detector.js';
|
|
11
|
-
export { RepositoryDetector } from './pattern-detectors/repository-detector.js';
|
|
12
|
-
// Anti-Pattern Detectors
|
|
13
|
-
export { GodObjectDetector } from './anti-pattern-detectors/god-object-detector.js';
|
|
14
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyzers/architecture/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAEzE,oBAAoB;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oDAAoD,CAAC;AAC/F,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAGhF,yBAAyB;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iDAAiD,CAAC"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Base Pattern Detector
|
|
3
|
-
*
|
|
4
|
-
* Abstract base class for all pattern detectors.
|
|
5
|
-
* Provides common utilities and enforces interface contract.
|
|
6
|
-
*/
|
|
7
|
-
import type { DetectedPattern, ProjectStructure } from '../../../types/analysis.js';
|
|
8
|
-
import { ProjectStructureScanner } from '../project-structure-scanner.js';
|
|
9
|
-
export interface PatternDetector {
|
|
10
|
-
/**
|
|
11
|
-
* Detect pattern in project structure
|
|
12
|
-
* Returns null if pattern is not detected
|
|
13
|
-
*/
|
|
14
|
-
detect(structure: ProjectStructure): DetectedPattern | null;
|
|
15
|
-
}
|
|
16
|
-
export declare abstract class BasePatternDetector implements PatternDetector {
|
|
17
|
-
protected readonly scanner: ProjectStructureScanner;
|
|
18
|
-
abstract detect(structure: ProjectStructure): DetectedPattern | null;
|
|
19
|
-
/**
|
|
20
|
-
* Create a detected pattern with proper typing and immutability
|
|
21
|
-
*/
|
|
22
|
-
protected createPattern(name: string, category: DetectedPattern['category'], confidence: number, locations: string[], description: string, metadata?: Record<string, unknown>): DetectedPattern;
|
|
23
|
-
/**
|
|
24
|
-
* Calculate confidence based on number of matches vs expected
|
|
25
|
-
*/
|
|
26
|
-
protected calculateConfidence(matched: number, expected: number, baseConfidence?: number): number;
|
|
27
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Base Pattern Detector
|
|
3
|
-
*
|
|
4
|
-
* Abstract base class for all pattern detectors.
|
|
5
|
-
* Provides common utilities and enforces interface contract.
|
|
6
|
-
*/
|
|
7
|
-
import { ProjectStructureScanner } from '../project-structure-scanner.js';
|
|
8
|
-
export class BasePatternDetector {
|
|
9
|
-
scanner = new ProjectStructureScanner();
|
|
10
|
-
/**
|
|
11
|
-
* Create a detected pattern with proper typing and immutability
|
|
12
|
-
*/
|
|
13
|
-
createPattern(name, category, confidence, locations, description, metadata) {
|
|
14
|
-
return Object.freeze({
|
|
15
|
-
name,
|
|
16
|
-
category,
|
|
17
|
-
confidence: Math.max(0, Math.min(1, confidence)),
|
|
18
|
-
locations: Object.freeze(locations),
|
|
19
|
-
description,
|
|
20
|
-
metadata: metadata ? Object.freeze(metadata) : undefined,
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Calculate confidence based on number of matches vs expected
|
|
25
|
-
*/
|
|
26
|
-
calculateConfidence(matched, expected, baseConfidence = 0.5) {
|
|
27
|
-
const ratio = matched / expected;
|
|
28
|
-
return Math.min(1.0, baseConfidence + ratio * (1.0 - baseConfidence));
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=base-detector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base-detector.js","sourceRoot":"","sources":["../../../../src/analyzers/architecture/pattern-detectors/base-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAU1E,MAAM,OAAgB,mBAAmB;IACpB,OAAO,GAAG,IAAI,uBAAuB,EAAE,CAAC;IAI3D;;OAEG;IACO,aAAa,CACrB,IAAY,EACZ,QAAqC,EACrC,UAAkB,EAClB,SAAmB,EACnB,WAAmB,EACnB,QAAkC;QAElC,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,IAAI;YACJ,QAAQ;YACR,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YAChD,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;YACnC,WAAW;YACX,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;SACzD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACO,mBAAmB,CAC3B,OAAe,EACf,QAAgB,EAChB,cAAc,GAAG,GAAG;QAEpB,MAAM,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;QACjC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,GAAG,KAAK,GAAG,CAAC,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC;IACxE,CAAC;CACF"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Clean Architecture Pattern Detector
|
|
3
|
-
*
|
|
4
|
-
* Detects Clean Architecture (Uncle Bob's architecture pattern).
|
|
5
|
-
* Looks for domain/, application/, infrastructure/, and presentation/ layers.
|
|
6
|
-
*/
|
|
7
|
-
import type { DetectedPattern, ProjectStructure } from '../../../types/analysis.js';
|
|
8
|
-
import { BasePatternDetector } from './base-detector.js';
|
|
9
|
-
export declare class CleanArchitectureDetector extends BasePatternDetector {
|
|
10
|
-
detect(structure: ProjectStructure): DetectedPattern | null;
|
|
11
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Clean Architecture Pattern Detector
|
|
3
|
-
*
|
|
4
|
-
* Detects Clean Architecture (Uncle Bob's architecture pattern).
|
|
5
|
-
* Looks for domain/, application/, infrastructure/, and presentation/ layers.
|
|
6
|
-
*/
|
|
7
|
-
import { BasePatternDetector } from './base-detector.js';
|
|
8
|
-
export class CleanArchitectureDetector extends BasePatternDetector {
|
|
9
|
-
detect(structure) {
|
|
10
|
-
// Check for core layers
|
|
11
|
-
const hasDomain = this.scanner.hasDirectory(structure, 'domain');
|
|
12
|
-
const hasApplication = this.scanner.hasDirectory(structure, 'application');
|
|
13
|
-
const hasInfrastructure = this.scanner.hasDirectory(structure, 'infrastructure');
|
|
14
|
-
// Check for presentation layer (multiple possible names)
|
|
15
|
-
const hasPresentation = this.scanner.hasDirectory(structure, 'presentation') ||
|
|
16
|
-
this.scanner.hasDirectory(structure, 'api') ||
|
|
17
|
-
this.scanner.hasDirectory(structure, 'ui') ||
|
|
18
|
-
this.scanner.hasDirectory(structure, 'web');
|
|
19
|
-
// Need at least domain + infrastructure to suggest Clean Architecture
|
|
20
|
-
if (!hasDomain || !hasInfrastructure) {
|
|
21
|
-
return null;
|
|
22
|
-
}
|
|
23
|
-
const locations = [];
|
|
24
|
-
let confidence = 0.5; // Base confidence for domain + infrastructure
|
|
25
|
-
if (hasDomain) {
|
|
26
|
-
const domainDirs = structure.directories.filter((d) => d.relativePath.toLowerCase().includes('domain'));
|
|
27
|
-
locations.push(...domainDirs.map((d) => d.relativePath));
|
|
28
|
-
confidence += 0.15;
|
|
29
|
-
}
|
|
30
|
-
if (hasApplication) {
|
|
31
|
-
const appDirs = structure.directories.filter((d) => d.relativePath.toLowerCase().includes('application'));
|
|
32
|
-
locations.push(...appDirs.map((d) => d.relativePath));
|
|
33
|
-
confidence += 0.15;
|
|
34
|
-
}
|
|
35
|
-
if (hasInfrastructure) {
|
|
36
|
-
const infraDirs = structure.directories.filter((d) => d.relativePath.toLowerCase().includes('infrastructure'));
|
|
37
|
-
locations.push(...infraDirs.map((d) => d.relativePath));
|
|
38
|
-
confidence += 0.1;
|
|
39
|
-
}
|
|
40
|
-
if (hasPresentation) {
|
|
41
|
-
const presentationDirs = structure.directories.filter((d) => d.relativePath.toLowerCase().includes('presentation') ||
|
|
42
|
-
d.relativePath.toLowerCase().includes('api') ||
|
|
43
|
-
d.relativePath.toLowerCase().includes('ui') ||
|
|
44
|
-
d.relativePath.toLowerCase().includes('web'));
|
|
45
|
-
locations.push(...presentationDirs.map((d) => d.relativePath));
|
|
46
|
-
confidence += 0.1;
|
|
47
|
-
}
|
|
48
|
-
return this.createPattern('Clean Architecture', 'architectural', Math.min(confidence, 1.0), locations, 'Separates concerns into layers: Domain (entities), Application (use cases), Infrastructure (external dependencies), and Presentation (UI/API)', {
|
|
49
|
-
hasDomain,
|
|
50
|
-
hasApplication,
|
|
51
|
-
hasInfrastructure,
|
|
52
|
-
hasPresentation,
|
|
53
|
-
layerCount: [hasDomain, hasApplication, hasInfrastructure, hasPresentation].filter(Boolean).length,
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=clean-architecture-detector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"clean-architecture-detector.js","sourceRoot":"","sources":["../../../../src/analyzers/architecture/pattern-detectors/clean-architecture-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MVC Pattern Detector
|
|
3
|
-
*
|
|
4
|
-
* Detects Model-View-Controller architectural pattern.
|
|
5
|
-
* Looks for models/, views/, and controllers/ directories.
|
|
6
|
-
*/
|
|
7
|
-
import type { DetectedPattern, ProjectStructure } from '../../../types/analysis.js';
|
|
8
|
-
import { BasePatternDetector } from './base-detector.js';
|
|
9
|
-
export declare class MVCDetector extends BasePatternDetector {
|
|
10
|
-
detect(structure: ProjectStructure): DetectedPattern | null;
|
|
11
|
-
}
|