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.
Files changed (202) hide show
  1. package/README.md +240 -0
  2. package/package.json +10 -2
  3. package/src/agents/Agent.js +300 -0
  4. package/src/agents/AgentAdditionService.js +311 -0
  5. package/src/agents/AgentCheckService.js +690 -0
  6. package/src/agents/AgentInstallationService.js +140 -0
  7. package/src/agents/AgentSetupService.js +467 -0
  8. package/src/agents/AgentStatus.js +183 -0
  9. package/src/agents/AgentVerificationService.js +634 -0
  10. package/src/agents/ConfigurationSchemaValidator.js +543 -0
  11. package/src/agents/EnvironmentConfigurationManager.js +602 -0
  12. package/src/agents/InstallationErrorHandler.js +372 -0
  13. package/src/agents/InstallationLog.js +363 -0
  14. package/src/agents/InstallationMethod.js +510 -0
  15. package/src/agents/InstallationOrchestrator.js +352 -0
  16. package/src/agents/InstallationProgressReporter.js +372 -0
  17. package/src/agents/InstallationRetryManager.js +322 -0
  18. package/src/agents/InstallationType.js +254 -0
  19. package/src/agents/OperationTypes.js +310 -0
  20. package/src/agents/PerformanceMetricsCollector.js +493 -0
  21. package/src/agents/SecurityValidationService.js +534 -0
  22. package/src/agents/VerificationTest.js +354 -0
  23. package/src/agents/VerificationType.js +226 -0
  24. package/src/agents/WindowsPermissionHandler.js +518 -0
  25. package/src/agents/config/AgentConfigManager.js +393 -0
  26. package/src/agents/config/AgentDefaultsRegistry.js +373 -0
  27. package/src/agents/config/ConfigValidator.js +281 -0
  28. package/src/agents/discovery/AgentDiscoveryService.js +707 -0
  29. package/src/agents/logging/AgentLogger.js +511 -0
  30. package/src/agents/status/AgentStatusManager.js +481 -0
  31. package/src/agents/storage/FileManager.js +454 -0
  32. package/src/agents/verification/AgentCommunicationTester.js +474 -0
  33. package/src/agents/verification/BaseVerifier.js +430 -0
  34. package/src/agents/verification/CommandVerifier.js +480 -0
  35. package/src/agents/verification/FileOperationVerifier.js +453 -0
  36. package/src/agents/verification/ResultAnalyzer.js +707 -0
  37. package/src/agents/verification/TestRequirementManager.js +495 -0
  38. package/src/agents/verification/VerificationRunner.js +433 -0
  39. package/src/agents/windows/BaseWindowsInstaller.js +441 -0
  40. package/src/agents/windows/ChocolateyInstaller.js +509 -0
  41. package/src/agents/windows/DirectInstaller.js +443 -0
  42. package/src/agents/windows/InstallerFactory.js +391 -0
  43. package/src/agents/windows/NpmInstaller.js +505 -0
  44. package/src/agents/windows/PowerShellInstaller.js +458 -0
  45. package/src/agents/windows/WinGetInstaller.js +390 -0
  46. package/src/analysis/analysis-reporter.js +132 -0
  47. package/src/analysis/boundary-detector.js +712 -0
  48. package/src/analysis/categorizer.js +340 -0
  49. package/src/analysis/codebase-scanner.js +384 -0
  50. package/src/analysis/line-counter.js +513 -0
  51. package/src/analysis/priority-calculator.js +679 -0
  52. package/src/analysis/report/analysis-report.js +250 -0
  53. package/src/analysis/report/package-analyzer.js +278 -0
  54. package/src/analysis/report/recommendation-generator.js +382 -0
  55. package/src/analysis/report/statistics-generator.js +515 -0
  56. package/src/analysis/reports/analysis-report-model.js +101 -0
  57. package/src/analysis/reports/recommendation-generator.js +283 -0
  58. package/src/analysis/reports/report-generators.js +191 -0
  59. package/src/analysis/reports/statistics-calculator.js +231 -0
  60. package/src/analysis/reports/trend-analyzer.js +219 -0
  61. package/src/analysis/strategy-generator.js +814 -0
  62. package/src/auto-mode/AutoModeBusinessLogic.js +836 -0
  63. package/src/config/refactoring-config.js +307 -0
  64. package/src/health-tracking/json-storage.js +38 -2
  65. package/src/ide-integration/applescript-manager-core.js +233 -0
  66. package/src/ide-integration/applescript-manager.cjs +357 -28
  67. package/src/ide-integration/applescript-manager.js +89 -3599
  68. package/src/ide-integration/cdp-manager.js +306 -0
  69. package/src/ide-integration/claude-code-cli-manager.cjs +1 -1
  70. package/src/ide-integration/continuation-handler.js +337 -0
  71. package/src/ide-integration/ide-status-checker.js +292 -0
  72. package/src/ide-integration/macos-ide-manager.js +627 -0
  73. package/src/ide-integration/macos-text-sender.js +528 -0
  74. package/src/ide-integration/response-reader.js +548 -0
  75. package/src/ide-integration/windows-automation-manager.js +121 -0
  76. package/src/ide-integration/windows-ide-manager.js +373 -0
  77. package/src/index.cjs +25 -3
  78. package/src/index.js +15 -1
  79. package/src/llm/direct-llm-manager.cjs +90 -2
  80. package/src/models/compliance-report.js +538 -0
  81. package/src/models/file-analysis.js +681 -0
  82. package/src/models/refactoring-plan.js +770 -0
  83. package/src/monitoring/alert-system.js +834 -0
  84. package/src/monitoring/compliance-progress-tracker.js +437 -0
  85. package/src/monitoring/continuous-scan-notifications.js +661 -0
  86. package/src/monitoring/continuous-scanner.js +279 -0
  87. package/src/monitoring/file-monitor/file-analyzer.js +262 -0
  88. package/src/monitoring/file-monitor/file-monitor.js +237 -0
  89. package/src/monitoring/file-monitor/watcher.js +194 -0
  90. package/src/monitoring/file-monitor.js +17 -0
  91. package/src/monitoring/notification-manager.js +437 -0
  92. package/src/monitoring/scanner-core.js +368 -0
  93. package/src/monitoring/scanner-events.js +214 -0
  94. package/src/monitoring/violation-notification-system.js +515 -0
  95. package/src/refactoring/boundaries/cohesion-analyzer.js +316 -0
  96. package/src/refactoring/boundaries/extraction-result.js +285 -0
  97. package/src/refactoring/boundaries/extraction-strategies.js +392 -0
  98. package/src/refactoring/boundaries/module-boundary.js +209 -0
  99. package/src/refactoring/boundary/boundary-detector.js +741 -0
  100. package/src/refactoring/boundary/boundary-types.js +405 -0
  101. package/src/refactoring/boundary/extraction-strategies.js +554 -0
  102. package/src/refactoring/boundary-extraction-result.js +77 -0
  103. package/src/refactoring/boundary-extraction-strategies.js +330 -0
  104. package/src/refactoring/boundary-extractor.js +384 -0
  105. package/src/refactoring/boundary-types.js +46 -0
  106. package/src/refactoring/circular/circular-dependency.js +88 -0
  107. package/src/refactoring/circular/cycle-detection.js +147 -0
  108. package/src/refactoring/circular/dependency-node.js +82 -0
  109. package/src/refactoring/circular/dependency-result.js +107 -0
  110. package/src/refactoring/circular/dependency-types.js +58 -0
  111. package/src/refactoring/circular/graph-builder.js +213 -0
  112. package/src/refactoring/circular/resolution-strategy.js +72 -0
  113. package/src/refactoring/circular/strategy-generator.js +229 -0
  114. package/src/refactoring/circular-dependency-resolver-original.js +809 -0
  115. package/src/refactoring/circular-dependency-resolver.js +200 -0
  116. package/src/refactoring/code-mover.js +761 -0
  117. package/src/refactoring/file-splitter.js +696 -0
  118. package/src/refactoring/functionality-validator.js +816 -0
  119. package/src/refactoring/import-manager.js +774 -0
  120. package/src/refactoring/module-boundary.js +107 -0
  121. package/src/refactoring/refactoring-executor.js +672 -0
  122. package/src/refactoring/refactoring-rollback.js +614 -0
  123. package/src/refactoring/test-validator.js +631 -0
  124. package/src/requirement-management/default-requirement-manager.js +321 -0
  125. package/src/requirement-management/requirement-file-parser.js +159 -0
  126. package/src/requirement-management/requirement-sequencer.js +221 -0
  127. package/src/rui/commands/AgentCommandParser.js +600 -0
  128. package/src/rui/commands/AgentCommands.js +487 -0
  129. package/src/rui/commands/AgentResponseFormatter.js +832 -0
  130. package/src/scripts/verify-full-compliance.js +269 -0
  131. package/src/sync/sync-engine-core.js +1 -0
  132. package/src/sync/sync-engine-remote-handlers.js +135 -0
  133. package/src/task-generation/automated-task-generator.js +351 -0
  134. package/src/task-generation/prioritizer.js +287 -0
  135. package/src/task-generation/task-list-updater.js +215 -0
  136. package/src/task-generation/task-management-integration.js +480 -0
  137. package/src/task-generation/task-manager-integration.js +270 -0
  138. package/src/task-generation/violation-task-generator.js +474 -0
  139. package/src/task-management/continuous-scan-integration.js +342 -0
  140. package/src/timeout-management/index.js +12 -3
  141. package/src/timeout-management/response-time-tracker.js +167 -0
  142. package/src/timeout-management/timeout-calculator.js +159 -0
  143. package/src/timeout-management/timeout-config-manager.js +172 -0
  144. package/src/utils/ast-analyzer.js +417 -0
  145. package/src/utils/current-requirement-manager.js +276 -0
  146. package/src/utils/current-requirement-operations.js +472 -0
  147. package/src/utils/dependency-mapper.js +456 -0
  148. package/src/utils/download-with-progress.js +4 -2
  149. package/src/utils/electron-update-checker.js +4 -1
  150. package/src/utils/file-size-analyzer.js +272 -0
  151. package/src/utils/import-updater.js +280 -0
  152. package/src/utils/refactoring-tools.js +512 -0
  153. package/src/utils/report-generator.js +569 -0
  154. package/src/utils/reports/report-analysis.js +218 -0
  155. package/src/utils/reports/report-types.js +55 -0
  156. package/src/utils/reports/summary-generators.js +102 -0
  157. package/src/utils/requirement-file-management.js +157 -0
  158. package/src/utils/requirement-helpers/requirement-file-ops.js +392 -0
  159. package/src/utils/requirement-helpers/requirement-mover.js +414 -0
  160. package/src/utils/requirement-helpers/requirement-parser.js +326 -0
  161. package/src/utils/requirement-helpers/requirement-status.js +320 -0
  162. package/src/utils/requirement-helpers-new.js +55 -0
  163. package/src/utils/requirement-helpers-refactored.js +367 -0
  164. package/src/utils/requirement-helpers.js +291 -1191
  165. package/src/utils/requirement-movement-operations.js +450 -0
  166. package/src/utils/requirement-movement.js +312 -0
  167. package/src/utils/requirement-parsing-helpers.js +56 -0
  168. package/src/utils/requirement-statistics.js +200 -0
  169. package/src/utils/requirement-text-utils.js +58 -0
  170. package/src/utils/rollback/rollback-handlers.js +125 -0
  171. package/src/utils/rollback/rollback-operation.js +63 -0
  172. package/src/utils/rollback/rollback-recorder.js +166 -0
  173. package/src/utils/rollback/rollback-state-manager.js +175 -0
  174. package/src/utils/rollback/rollback-types.js +33 -0
  175. package/src/utils/rollback/rollback-utils.js +110 -0
  176. package/src/utils/rollback-manager-original.js +569 -0
  177. package/src/utils/rollback-manager.js +202 -0
  178. package/src/utils/smoke-test-cli.js +362 -0
  179. package/src/utils/smoke-test-gui.js +351 -0
  180. package/src/utils/smoke-test-orchestrator.js +321 -0
  181. package/src/utils/smoke-test-runner.js +60 -0
  182. package/src/utils/smoke-test-web.js +347 -0
  183. package/src/utils/specification-helpers.js +39 -13
  184. package/src/utils/specification-migration.js +97 -0
  185. package/src/utils/test-runner.js +579 -0
  186. package/src/utils/validation-framework.js +518 -0
  187. package/src/validation/compliance-analyzer.js +197 -0
  188. package/src/validation/compliance-report-generator.js +343 -0
  189. package/src/validation/compliance-reporter.js +711 -0
  190. package/src/validation/compliance-rules.js +127 -0
  191. package/src/validation/constitution-validator-new.js +196 -0
  192. package/src/validation/constitution-validator.js +17 -0
  193. package/src/validation/file-validators.js +170 -0
  194. package/src/validation/line-limit/file-analyzer.js +201 -0
  195. package/src/validation/line-limit/line-limit-validator.js +208 -0
  196. package/src/validation/line-limit/validation-result.js +144 -0
  197. package/src/validation/line-limit-core.js +225 -0
  198. package/src/validation/line-limit-reporter.js +134 -0
  199. package/src/validation/line-limit-result.js +125 -0
  200. package/src/validation/line-limit-validator.js +41 -0
  201. package/src/validation/metrics-calculator.js +660 -0
  202. 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;