vibecodingmachine-core 2026.2.20-438 → 2026.2.26-1642
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 +240 -0
- package/package.json +10 -2
- package/src/agents/Agent.js +300 -0
- package/src/agents/AgentAdditionService.js +311 -0
- package/src/agents/AgentCheckService.js +690 -0
- package/src/agents/AgentInstallationService.js +140 -0
- package/src/agents/AgentSetupService.js +467 -0
- package/src/agents/AgentStatus.js +183 -0
- package/src/agents/AgentVerificationService.js +634 -0
- package/src/agents/ConfigurationSchemaValidator.js +543 -0
- package/src/agents/EnvironmentConfigurationManager.js +602 -0
- package/src/agents/InstallationErrorHandler.js +372 -0
- package/src/agents/InstallationLog.js +363 -0
- package/src/agents/InstallationMethod.js +510 -0
- package/src/agents/InstallationOrchestrator.js +352 -0
- package/src/agents/InstallationProgressReporter.js +372 -0
- package/src/agents/InstallationRetryManager.js +322 -0
- package/src/agents/InstallationType.js +254 -0
- package/src/agents/OperationTypes.js +310 -0
- package/src/agents/PerformanceMetricsCollector.js +493 -0
- package/src/agents/SecurityValidationService.js +534 -0
- package/src/agents/VerificationTest.js +354 -0
- package/src/agents/VerificationType.js +226 -0
- package/src/agents/WindowsPermissionHandler.js +518 -0
- package/src/agents/config/AgentConfigManager.js +393 -0
- package/src/agents/config/AgentDefaultsRegistry.js +373 -0
- package/src/agents/config/ConfigValidator.js +281 -0
- package/src/agents/discovery/AgentDiscoveryService.js +707 -0
- package/src/agents/logging/AgentLogger.js +511 -0
- package/src/agents/status/AgentStatusManager.js +481 -0
- package/src/agents/storage/FileManager.js +454 -0
- package/src/agents/verification/AgentCommunicationTester.js +474 -0
- package/src/agents/verification/BaseVerifier.js +430 -0
- package/src/agents/verification/CommandVerifier.js +480 -0
- package/src/agents/verification/FileOperationVerifier.js +453 -0
- package/src/agents/verification/ResultAnalyzer.js +707 -0
- package/src/agents/verification/TestRequirementManager.js +495 -0
- package/src/agents/verification/VerificationRunner.js +433 -0
- package/src/agents/windows/BaseWindowsInstaller.js +441 -0
- package/src/agents/windows/ChocolateyInstaller.js +509 -0
- package/src/agents/windows/DirectInstaller.js +443 -0
- package/src/agents/windows/InstallerFactory.js +391 -0
- package/src/agents/windows/NpmInstaller.js +505 -0
- package/src/agents/windows/PowerShellInstaller.js +458 -0
- package/src/agents/windows/WinGetInstaller.js +390 -0
- package/src/analysis/analysis-reporter.js +132 -0
- package/src/analysis/boundary-detector.js +712 -0
- package/src/analysis/categorizer.js +340 -0
- package/src/analysis/codebase-scanner.js +384 -0
- package/src/analysis/line-counter.js +513 -0
- package/src/analysis/priority-calculator.js +679 -0
- package/src/analysis/report/analysis-report.js +250 -0
- package/src/analysis/report/package-analyzer.js +278 -0
- package/src/analysis/report/recommendation-generator.js +382 -0
- package/src/analysis/report/statistics-generator.js +515 -0
- package/src/analysis/reports/analysis-report-model.js +101 -0
- package/src/analysis/reports/recommendation-generator.js +283 -0
- package/src/analysis/reports/report-generators.js +191 -0
- package/src/analysis/reports/statistics-calculator.js +231 -0
- package/src/analysis/reports/trend-analyzer.js +219 -0
- package/src/analysis/strategy-generator.js +814 -0
- package/src/auto-mode/AutoModeBusinessLogic.js +836 -0
- package/src/config/refactoring-config.js +307 -0
- package/src/health-tracking/json-storage.js +38 -2
- package/src/ide-integration/applescript-manager-core.js +233 -0
- package/src/ide-integration/applescript-manager.cjs +357 -28
- package/src/ide-integration/applescript-manager.js +89 -3599
- package/src/ide-integration/cdp-manager.js +306 -0
- package/src/ide-integration/claude-code-cli-manager.cjs +1 -1
- package/src/ide-integration/continuation-handler.js +337 -0
- package/src/ide-integration/ide-status-checker.js +292 -0
- package/src/ide-integration/macos-ide-manager.js +627 -0
- package/src/ide-integration/macos-text-sender.js +528 -0
- package/src/ide-integration/response-reader.js +548 -0
- package/src/ide-integration/windows-automation-manager.js +121 -0
- package/src/ide-integration/windows-ide-manager.js +373 -0
- package/src/index.cjs +25 -3
- package/src/index.js +15 -1
- package/src/llm/direct-llm-manager.cjs +90 -2
- package/src/models/compliance-report.js +538 -0
- package/src/models/file-analysis.js +681 -0
- package/src/models/refactoring-plan.js +770 -0
- package/src/monitoring/alert-system.js +834 -0
- package/src/monitoring/compliance-progress-tracker.js +437 -0
- package/src/monitoring/continuous-scan-notifications.js +661 -0
- package/src/monitoring/continuous-scanner.js +279 -0
- package/src/monitoring/file-monitor/file-analyzer.js +262 -0
- package/src/monitoring/file-monitor/file-monitor.js +237 -0
- package/src/monitoring/file-monitor/watcher.js +194 -0
- package/src/monitoring/file-monitor.js +17 -0
- package/src/monitoring/notification-manager.js +437 -0
- package/src/monitoring/scanner-core.js +368 -0
- package/src/monitoring/scanner-events.js +214 -0
- package/src/monitoring/violation-notification-system.js +515 -0
- package/src/refactoring/boundaries/cohesion-analyzer.js +316 -0
- package/src/refactoring/boundaries/extraction-result.js +285 -0
- package/src/refactoring/boundaries/extraction-strategies.js +392 -0
- package/src/refactoring/boundaries/module-boundary.js +209 -0
- package/src/refactoring/boundary/boundary-detector.js +741 -0
- package/src/refactoring/boundary/boundary-types.js +405 -0
- package/src/refactoring/boundary/extraction-strategies.js +554 -0
- package/src/refactoring/boundary-extraction-result.js +77 -0
- package/src/refactoring/boundary-extraction-strategies.js +330 -0
- package/src/refactoring/boundary-extractor.js +384 -0
- package/src/refactoring/boundary-types.js +46 -0
- package/src/refactoring/circular/circular-dependency.js +88 -0
- package/src/refactoring/circular/cycle-detection.js +147 -0
- package/src/refactoring/circular/dependency-node.js +82 -0
- package/src/refactoring/circular/dependency-result.js +107 -0
- package/src/refactoring/circular/dependency-types.js +58 -0
- package/src/refactoring/circular/graph-builder.js +213 -0
- package/src/refactoring/circular/resolution-strategy.js +72 -0
- package/src/refactoring/circular/strategy-generator.js +229 -0
- package/src/refactoring/circular-dependency-resolver-original.js +809 -0
- package/src/refactoring/circular-dependency-resolver.js +200 -0
- package/src/refactoring/code-mover.js +761 -0
- package/src/refactoring/file-splitter.js +696 -0
- package/src/refactoring/functionality-validator.js +816 -0
- package/src/refactoring/import-manager.js +774 -0
- package/src/refactoring/module-boundary.js +107 -0
- package/src/refactoring/refactoring-executor.js +672 -0
- package/src/refactoring/refactoring-rollback.js +614 -0
- package/src/refactoring/test-validator.js +631 -0
- package/src/requirement-management/default-requirement-manager.js +321 -0
- package/src/requirement-management/requirement-file-parser.js +159 -0
- package/src/requirement-management/requirement-sequencer.js +221 -0
- package/src/rui/commands/AgentCommandParser.js +600 -0
- package/src/rui/commands/AgentCommands.js +487 -0
- package/src/rui/commands/AgentResponseFormatter.js +832 -0
- package/src/scripts/verify-full-compliance.js +269 -0
- package/src/sync/sync-engine-core.js +1 -0
- package/src/sync/sync-engine-remote-handlers.js +135 -0
- package/src/task-generation/automated-task-generator.js +351 -0
- package/src/task-generation/prioritizer.js +287 -0
- package/src/task-generation/task-list-updater.js +215 -0
- package/src/task-generation/task-management-integration.js +480 -0
- package/src/task-generation/task-manager-integration.js +270 -0
- package/src/task-generation/violation-task-generator.js +474 -0
- package/src/task-management/continuous-scan-integration.js +342 -0
- package/src/timeout-management/index.js +12 -3
- package/src/timeout-management/response-time-tracker.js +167 -0
- package/src/timeout-management/timeout-calculator.js +159 -0
- package/src/timeout-management/timeout-config-manager.js +172 -0
- package/src/utils/ast-analyzer.js +417 -0
- package/src/utils/current-requirement-manager.js +276 -0
- package/src/utils/current-requirement-operations.js +472 -0
- package/src/utils/dependency-mapper.js +456 -0
- package/src/utils/download-with-progress.js +4 -2
- package/src/utils/electron-update-checker.js +4 -1
- package/src/utils/file-size-analyzer.js +272 -0
- package/src/utils/import-updater.js +280 -0
- package/src/utils/refactoring-tools.js +512 -0
- package/src/utils/report-generator.js +569 -0
- package/src/utils/reports/report-analysis.js +218 -0
- package/src/utils/reports/report-types.js +55 -0
- package/src/utils/reports/summary-generators.js +102 -0
- package/src/utils/requirement-file-management.js +157 -0
- package/src/utils/requirement-helpers/requirement-file-ops.js +392 -0
- package/src/utils/requirement-helpers/requirement-mover.js +414 -0
- package/src/utils/requirement-helpers/requirement-parser.js +326 -0
- package/src/utils/requirement-helpers/requirement-status.js +320 -0
- package/src/utils/requirement-helpers-new.js +55 -0
- package/src/utils/requirement-helpers-refactored.js +367 -0
- package/src/utils/requirement-helpers.js +291 -1191
- package/src/utils/requirement-movement-operations.js +450 -0
- package/src/utils/requirement-movement.js +312 -0
- package/src/utils/requirement-parsing-helpers.js +56 -0
- package/src/utils/requirement-statistics.js +200 -0
- package/src/utils/requirement-text-utils.js +58 -0
- package/src/utils/rollback/rollback-handlers.js +125 -0
- package/src/utils/rollback/rollback-operation.js +63 -0
- package/src/utils/rollback/rollback-recorder.js +166 -0
- package/src/utils/rollback/rollback-state-manager.js +175 -0
- package/src/utils/rollback/rollback-types.js +33 -0
- package/src/utils/rollback/rollback-utils.js +110 -0
- package/src/utils/rollback-manager-original.js +569 -0
- package/src/utils/rollback-manager.js +202 -0
- package/src/utils/smoke-test-cli.js +362 -0
- package/src/utils/smoke-test-gui.js +351 -0
- package/src/utils/smoke-test-orchestrator.js +321 -0
- package/src/utils/smoke-test-runner.js +60 -0
- package/src/utils/smoke-test-web.js +347 -0
- package/src/utils/specification-helpers.js +39 -13
- package/src/utils/specification-migration.js +97 -0
- package/src/utils/test-runner.js +579 -0
- package/src/utils/validation-framework.js +518 -0
- package/src/validation/compliance-analyzer.js +197 -0
- package/src/validation/compliance-report-generator.js +343 -0
- package/src/validation/compliance-reporter.js +711 -0
- package/src/validation/compliance-rules.js +127 -0
- package/src/validation/constitution-validator-new.js +196 -0
- package/src/validation/constitution-validator.js +17 -0
- package/src/validation/file-validators.js +170 -0
- package/src/validation/line-limit/file-analyzer.js +201 -0
- package/src/validation/line-limit/line-limit-validator.js +208 -0
- package/src/validation/line-limit/validation-result.js +144 -0
- package/src/validation/line-limit-core.js +225 -0
- package/src/validation/line-limit-reporter.js +134 -0
- package/src/validation/line-limit-result.js +125 -0
- package/src/validation/line-limit-validator.js +41 -0
- package/src/validation/metrics-calculator.js +660 -0
- package/src/sync/sync-engine-backup.js +0 -559
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recommendation Generator for Analysis Reports
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Generate refactoring recommendations based on analysis data
|
|
7
|
+
*/
|
|
8
|
+
class RecommendationGenerator {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.recommendationTypes = {
|
|
11
|
+
URGENT: 'Files requiring immediate attention',
|
|
12
|
+
SIZE: 'File size violations',
|
|
13
|
+
COMPLEXITY: 'High complexity files',
|
|
14
|
+
DEPENDENCY: 'Dependency issues',
|
|
15
|
+
VIOLATION: 'Code quality violations',
|
|
16
|
+
STRATEGY: 'Refactoring strategies'
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Generate all recommendations
|
|
22
|
+
* @param {Object} analysisData - Complete analysis data
|
|
23
|
+
* @returns {Array} Array of recommendations
|
|
24
|
+
*/
|
|
25
|
+
generateRecommendations(analysisData) {
|
|
26
|
+
const recommendations = [];
|
|
27
|
+
|
|
28
|
+
// Generate urgent file recommendations
|
|
29
|
+
recommendations.push(...this.generateUrgentRecommendations(analysisData));
|
|
30
|
+
|
|
31
|
+
// Generate size-based recommendations
|
|
32
|
+
recommendations.push(...this.generateSizeRecommendations(analysisData));
|
|
33
|
+
|
|
34
|
+
// Generate complexity recommendations
|
|
35
|
+
recommendations.push(...this.generateComplexityRecommendations(analysisData));
|
|
36
|
+
|
|
37
|
+
// Generate dependency recommendations
|
|
38
|
+
recommendations.push(...this.generateDependencyRecommendations(analysisData));
|
|
39
|
+
|
|
40
|
+
// Generate violation recommendations
|
|
41
|
+
recommendations.push(...this.generateViolationRecommendations(analysisData));
|
|
42
|
+
|
|
43
|
+
// Generate strategic recommendations
|
|
44
|
+
recommendations.push(...this.generateStrategicRecommendations(analysisData));
|
|
45
|
+
|
|
46
|
+
// Sort by priority
|
|
47
|
+
return recommendations.sort((a, b) => this.getPriorityScore(b) - this.getPriorityScore(a));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Generate urgent file recommendations
|
|
52
|
+
* @param {Object} analysisData - Analysis data
|
|
53
|
+
* @returns {Array} Urgent recommendations
|
|
54
|
+
*/
|
|
55
|
+
generateUrgentRecommendations(analysisData) {
|
|
56
|
+
const recommendations = [];
|
|
57
|
+
const urgentFiles = analysisData.files ? analysisData.files.filter(f => f.urgentRefactoring) : [];
|
|
58
|
+
|
|
59
|
+
if (urgentFiles.length > 0) {
|
|
60
|
+
recommendations.push({
|
|
61
|
+
type: 'URGENT',
|
|
62
|
+
priority: 'CRITICAL',
|
|
63
|
+
title: 'Urgent Refactoring Required',
|
|
64
|
+
message: `${urgentFiles.length} files require immediate refactoring attention`,
|
|
65
|
+
details: {
|
|
66
|
+
fileCount: urgentFiles.length,
|
|
67
|
+
totalLines: urgentFiles.reduce((sum, f) => sum + f.lineCount, 0),
|
|
68
|
+
files: urgentFiles.map(f => ({
|
|
69
|
+
path: f.filePath,
|
|
70
|
+
lines: f.lineCount,
|
|
71
|
+
violations: f.violations ? f.violations.length : 0
|
|
72
|
+
}))
|
|
73
|
+
},
|
|
74
|
+
action: 'Address these files first to reduce technical debt',
|
|
75
|
+
estimatedEffort: this.estimateEffort(urgentFiles)
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return recommendations;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Generate size-based recommendations
|
|
84
|
+
* @param {Object} analysisData - Analysis data
|
|
85
|
+
* @returns {Array} Size recommendations
|
|
86
|
+
*/
|
|
87
|
+
generateSizeRecommendations(analysisData) {
|
|
88
|
+
const recommendations = [];
|
|
89
|
+
const files = analysisData.files || [];
|
|
90
|
+
|
|
91
|
+
// XLARGE files (>1000 lines)
|
|
92
|
+
const xlargeFiles = files.filter(f => f.sizeCategory === 'XLARGE');
|
|
93
|
+
if (xlargeFiles.length > 0) {
|
|
94
|
+
recommendations.push({
|
|
95
|
+
type: 'SIZE',
|
|
96
|
+
priority: 'HIGH',
|
|
97
|
+
title: 'XLARGE Files Detected',
|
|
98
|
+
message: `${xlargeFiles.length} files exceed 1000 lines`,
|
|
99
|
+
details: {
|
|
100
|
+
fileCount: xlargeFiles.length,
|
|
101
|
+
totalLines: xlargeFiles.reduce((sum, f) => sum + f.lineCount, 0),
|
|
102
|
+
averageLines: Math.round(xlargeFiles.reduce((sum, f) => sum + f.lineCount, 0) / xlargeFiles.length),
|
|
103
|
+
files: xlargeFiles.map(f => ({
|
|
104
|
+
path: f.filePath,
|
|
105
|
+
lines: f.lineCount
|
|
106
|
+
}))
|
|
107
|
+
},
|
|
108
|
+
action: 'Break down XLARGE files into smaller, focused modules',
|
|
109
|
+
estimatedEffort: this.estimateEffort(xlargeFiles)
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// LARGE files (555-1000 lines)
|
|
114
|
+
const largeFiles = files.filter(f => f.sizeCategory === 'LARGE');
|
|
115
|
+
if (largeFiles.length > 0) {
|
|
116
|
+
recommendations.push({
|
|
117
|
+
type: 'SIZE',
|
|
118
|
+
priority: 'MEDIUM',
|
|
119
|
+
title: 'LARGE Files Detected',
|
|
120
|
+
message: `${largeFiles.length} files exceed 555 lines`,
|
|
121
|
+
details: {
|
|
122
|
+
fileCount: largeFiles.length,
|
|
123
|
+
totalLines: largeFiles.reduce((sum, f) => sum + f.lineCount, 0),
|
|
124
|
+
averageLines: Math.round(largeFiles.reduce((sum, f) => sum + f.lineCount, 0) / largeFiles.length),
|
|
125
|
+
files: largeFiles.map(f => ({
|
|
126
|
+
path: f.filePath,
|
|
127
|
+
lines: f.lineCount
|
|
128
|
+
}))
|
|
129
|
+
},
|
|
130
|
+
action: 'Consider refactoring LARGE files to improve maintainability',
|
|
131
|
+
estimatedEffort: this.estimateEffort(largeFiles)
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return recommendations;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Generate complexity recommendations
|
|
140
|
+
* @param {Object} analysisData - Analysis data
|
|
141
|
+
* @returns {Array} Complexity recommendations
|
|
142
|
+
*/
|
|
143
|
+
generateComplexityRecommendations(analysisData) {
|
|
144
|
+
const recommendations = [];
|
|
145
|
+
const files = analysisData.files || [];
|
|
146
|
+
|
|
147
|
+
// High complexity files
|
|
148
|
+
const highComplexityFiles = files.filter(f => {
|
|
149
|
+
const score = f.getComplexityScore ? f.getComplexityScore() : 0;
|
|
150
|
+
return score > 50;
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
if (highComplexityFiles.length > 0) {
|
|
154
|
+
recommendations.push({
|
|
155
|
+
type: 'COMPLEXITY',
|
|
156
|
+
priority: 'MEDIUM',
|
|
157
|
+
title: 'High Complexity Files',
|
|
158
|
+
message: `${highComplexityFiles.length} files have high complexity scores`,
|
|
159
|
+
details: {
|
|
160
|
+
fileCount: highComplexityFiles.length,
|
|
161
|
+
averageComplexity: Math.round(highComplexityFiles.reduce((sum, f) => sum + (f.getComplexityScore ? f.getComplexityScore() : 0), 0) / highComplexityFiles.length),
|
|
162
|
+
files: highComplexityFiles.map(f => ({
|
|
163
|
+
path: f.filePath,
|
|
164
|
+
complexity: f.getComplexityScore ? f.getComplexityScore() : 0,
|
|
165
|
+
lines: f.lineCount
|
|
166
|
+
}))
|
|
167
|
+
},
|
|
168
|
+
action: 'Simplify complex files through better separation of concerns',
|
|
169
|
+
estimatedEffort: this.estimateEffort(highComplexityFiles)
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return recommendations;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Generate dependency recommendations
|
|
178
|
+
* @param {Object} analysisData - Analysis data
|
|
179
|
+
* @returns {Array} Dependency recommendations
|
|
180
|
+
*/
|
|
181
|
+
generateDependencyRecommendations(analysisData) {
|
|
182
|
+
const recommendations = [];
|
|
183
|
+
const files = analysisData.files || [];
|
|
184
|
+
|
|
185
|
+
// Files with circular dependencies
|
|
186
|
+
const circularDepFiles = files.filter(f => f.hasCircularDependencies);
|
|
187
|
+
if (circularDepFiles.length > 0) {
|
|
188
|
+
recommendations.push({
|
|
189
|
+
type: 'DEPENDENCY',
|
|
190
|
+
priority: 'HIGH',
|
|
191
|
+
title: 'Circular Dependencies Detected',
|
|
192
|
+
message: `${circularDepFiles.length} files have circular dependencies`,
|
|
193
|
+
details: {
|
|
194
|
+
fileCount: circularDepFiles.length,
|
|
195
|
+
files: circularDepFiles.map(f => ({
|
|
196
|
+
path: f.filePath,
|
|
197
|
+
circularDependencies: f.circularDependencies || []
|
|
198
|
+
}))
|
|
199
|
+
},
|
|
200
|
+
action: 'Resolve circular dependencies to improve code structure',
|
|
201
|
+
estimatedEffort: this.estimateEffort(circularDepFiles)
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Files with too many dependencies
|
|
206
|
+
const highDepFiles = files.filter(f => f.dependencyCount && f.dependencyCount > 20);
|
|
207
|
+
if (highDepFiles.length > 0) {
|
|
208
|
+
recommendations.push({
|
|
209
|
+
type: 'DEPENDENCY',
|
|
210
|
+
priority: 'MEDIUM',
|
|
211
|
+
title: 'High Dependency Count',
|
|
212
|
+
message: `${highDepFiles.length} files have excessive dependencies`,
|
|
213
|
+
details: {
|
|
214
|
+
fileCount: highDepFiles.length,
|
|
215
|
+
averageDependencies: Math.round(highDepFiles.reduce((sum, f) => sum + (f.dependencyCount || 0), 0) / highDepFiles.length),
|
|
216
|
+
files: highDepFiles.map(f => ({
|
|
217
|
+
path: f.filePath,
|
|
218
|
+
dependencies: f.dependencyCount || 0
|
|
219
|
+
}))
|
|
220
|
+
},
|
|
221
|
+
action: 'Reduce dependencies through better encapsulation',
|
|
222
|
+
estimatedEffort: this.estimateEffort(highDepFiles)
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
return recommendations;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Generate violation recommendations
|
|
231
|
+
* @param {Object} analysisData - Analysis data
|
|
232
|
+
* @returns {Array} Violation recommendations
|
|
233
|
+
*/
|
|
234
|
+
generateViolationRecommendations(analysisData) {
|
|
235
|
+
const recommendations = [];
|
|
236
|
+
const files = analysisData.files || [];
|
|
237
|
+
|
|
238
|
+
// Files with violations
|
|
239
|
+
const violationFiles = files.filter(f => f.violations && f.violations.length > 0);
|
|
240
|
+
if (violationFiles.length > 0) {
|
|
241
|
+
const totalViolations = violationFiles.reduce((sum, f) => sum + f.violations.length, 0);
|
|
242
|
+
|
|
243
|
+
recommendations.push({
|
|
244
|
+
type: 'VIOLATION',
|
|
245
|
+
priority: 'MEDIUM',
|
|
246
|
+
title: 'Code Quality Violations',
|
|
247
|
+
message: `${totalViolations} code quality violations found`,
|
|
248
|
+
details: {
|
|
249
|
+
fileCount: violationFiles.length,
|
|
250
|
+
totalViolations,
|
|
251
|
+
violationTypes: this.categorizeViolations(violationFiles),
|
|
252
|
+
files: violationFiles.map(f => ({
|
|
253
|
+
path: f.filePath,
|
|
254
|
+
violations: f.violations.length,
|
|
255
|
+
types: f.violations.map(v => v.type)
|
|
256
|
+
}))
|
|
257
|
+
},
|
|
258
|
+
action: 'Address code quality violations to improve maintainability',
|
|
259
|
+
estimatedEffort: this.estimateEffort(violationFiles)
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
return recommendations;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Generate strategic recommendations
|
|
268
|
+
* @param {Object} analysisData - Analysis data
|
|
269
|
+
* @returns {Array} Strategic recommendations
|
|
270
|
+
*/
|
|
271
|
+
generateStrategicRecommendations(analysisData) {
|
|
272
|
+
const recommendations = [];
|
|
273
|
+
const files = analysisData.files || [];
|
|
274
|
+
|
|
275
|
+
// Overall compliance strategy
|
|
276
|
+
const complianceRate = this.calculateComplianceRate(files);
|
|
277
|
+
if (complianceRate < 80) {
|
|
278
|
+
recommendations.push({
|
|
279
|
+
type: 'STRATEGY',
|
|
280
|
+
priority: 'HIGH',
|
|
281
|
+
title: 'Compliance Improvement Strategy',
|
|
282
|
+
message: `Overall compliance rate is ${complianceRate}%`,
|
|
283
|
+
details: {
|
|
284
|
+
currentRate: complianceRate,
|
|
285
|
+
targetRate: 100,
|
|
286
|
+
gap: 100 - complianceRate,
|
|
287
|
+
filesToAddress: files.filter(f => f.needsRefactoring).length
|
|
288
|
+
},
|
|
289
|
+
action: 'Implement systematic refactoring approach to achieve 100% compliance',
|
|
290
|
+
estimatedEffort: 'Medium to High'
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// Package-level strategy
|
|
295
|
+
if (analysisData.packageAnalysis) {
|
|
296
|
+
const highRiskPackages = Object.entries(analysisData.packageAnalysis)
|
|
297
|
+
.filter(([_, analysis]) => analysis.riskScore > 50);
|
|
298
|
+
|
|
299
|
+
if (highRiskPackages.length > 0) {
|
|
300
|
+
recommendations.push({
|
|
301
|
+
type: 'STRATEGY',
|
|
302
|
+
priority: 'MEDIUM',
|
|
303
|
+
title: 'Package-Level Refactoring Strategy',
|
|
304
|
+
message: `${highRiskPackages.length} packages require strategic refactoring`,
|
|
305
|
+
details: {
|
|
306
|
+
packageCount: highRiskPackages.length,
|
|
307
|
+
packages: highRiskPackages.map(([name, analysis]) => ({
|
|
308
|
+
name,
|
|
309
|
+
riskScore: analysis.riskScore,
|
|
310
|
+
complianceRate: analysis.complianceRate
|
|
311
|
+
}))
|
|
312
|
+
},
|
|
313
|
+
action: 'Focus on high-risk packages first for maximum impact',
|
|
314
|
+
estimatedEffort: 'Medium'
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
return recommendations;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Categorize violations
|
|
324
|
+
* @param {Array} files - Files with violations
|
|
325
|
+
* @returns {Object} Violation categories
|
|
326
|
+
*/
|
|
327
|
+
categorizeViolations(files) {
|
|
328
|
+
const categories = {};
|
|
329
|
+
|
|
330
|
+
for (const file of files) {
|
|
331
|
+
for (const violation of file.violations || []) {
|
|
332
|
+
const type = violation.type || 'UNKNOWN';
|
|
333
|
+
categories[type] = (categories[type] || 0) + 1;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
return categories;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Calculate compliance rate
|
|
342
|
+
* @param {Array} files - Files to analyze
|
|
343
|
+
* @returns {number} Compliance rate percentage
|
|
344
|
+
*/
|
|
345
|
+
calculateComplianceRate(files) {
|
|
346
|
+
if (files.length === 0) return 100;
|
|
347
|
+
const compliantFiles = files.filter(f => !f.needsRefactoring).length;
|
|
348
|
+
return Math.round((compliantFiles / files.length) * 100);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Estimate refactoring effort
|
|
353
|
+
* @param {Array} files - Files to refactor
|
|
354
|
+
* @returns {string} Effort estimate
|
|
355
|
+
*/
|
|
356
|
+
estimateEffort(files) {
|
|
357
|
+
const totalLines = files.reduce((sum, f) => sum + f.lineCount, 0);
|
|
358
|
+
|
|
359
|
+
if (totalLines < 500) return 'Low';
|
|
360
|
+
if (totalLines < 2000) return 'Medium';
|
|
361
|
+
if (totalLines < 5000) return 'High';
|
|
362
|
+
return 'Very High';
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Get priority score for sorting
|
|
367
|
+
* @param {Object} recommendation - Recommendation object
|
|
368
|
+
* @returns {number} Priority score
|
|
369
|
+
*/
|
|
370
|
+
getPriorityScore(recommendation) {
|
|
371
|
+
const priorityScores = {
|
|
372
|
+
'CRITICAL': 100,
|
|
373
|
+
'HIGH': 75,
|
|
374
|
+
'MEDIUM': 50,
|
|
375
|
+
'LOW': 25
|
|
376
|
+
};
|
|
377
|
+
|
|
378
|
+
return priorityScores[recommendation.priority] || 0;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
module.exports = RecommendationGenerator;
|