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,437 @@
1
+ /**
2
+ * Compliance Progress Tracker
3
+ *
4
+ * Tracks progress toward 100% file size compliance across the codebase.
5
+ * Provides metrics, trends, and projections for completion tracking.
6
+ */
7
+
8
+ const fs = require('fs');
9
+ const path = require('path');
10
+
11
+ class ComplianceProgressTracker {
12
+ constructor(options = {}) {
13
+ this.options = {
14
+ maxFileSize: options.maxFileSize || 555,
15
+ historyFile: options.historyFile || path.resolve(__dirname, '../../../.compliance-history.json'),
16
+ trackingEnabled: options.trackingEnabled !== false,
17
+ ...options
18
+ };
19
+
20
+ this.historyData = this.loadHistory();
21
+ }
22
+
23
+ /**
24
+ * Load historical progress data
25
+ */
26
+ loadHistory() {
27
+ try {
28
+ if (fs.existsSync(this.options.historyFile)) {
29
+ return JSON.parse(fs.readFileSync(this.options.historyFile, 'utf8'));
30
+ }
31
+ } catch (error) {
32
+ console.warn('Failed to load compliance history:', error.message);
33
+ }
34
+
35
+ return {
36
+ snapshots: [],
37
+ milestones: [],
38
+ projections: {}
39
+ };
40
+ }
41
+
42
+ /**
43
+ * Save historical progress data
44
+ */
45
+ saveHistory() {
46
+ try {
47
+ fs.writeFileSync(this.options.historyFile, JSON.stringify(this.historyData, null, 2));
48
+ } catch (error) {
49
+ console.error('Failed to save compliance history:', error.message);
50
+ }
51
+ }
52
+
53
+ /**
54
+ * Track current compliance progress
55
+ */
56
+ trackProgress(scanResults, taskStats = {}) {
57
+ const timestamp = new Date().toISOString();
58
+
59
+ const currentSnapshot = {
60
+ timestamp,
61
+ totalFiles: scanResults.totalFiles || 0,
62
+ compliantFiles: scanResults.compliantFiles || 0,
63
+ nonCompliantFiles: scanResults.nonCompliantFiles || 0,
64
+ totalViolations: scanResults.totalViolations || 0,
65
+ compliancePercentage: this.calculateCompliancePercentage(scanResults),
66
+ tasksCompleted: taskStats.completed || 0,
67
+ tasksTotal: taskStats.total || 0,
68
+ taskCompletionPercentage: taskStats.total > 0 ? (taskStats.completed / taskStats.total) * 100 : 0,
69
+ estimatedHoursRemaining: this.estimateHoursRemaining(scanResults, taskStats),
70
+ trend: this.calculateTrend(),
71
+ projectedCompletion: this.projectCompletionDate(scanResults, taskStats)
72
+ };
73
+
74
+ // Add to history
75
+ this.historyData.snapshots.push(currentSnapshot);
76
+
77
+ // Keep only last 30 days of snapshots
78
+ const thirtyDaysAgo = new Date();
79
+ thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);
80
+ this.historyData.snapshots = this.historyData.snapshots.filter(
81
+ snapshot => new Date(snapshot.timestamp) > thirtyDaysAgo
82
+ );
83
+
84
+ // Check for milestones
85
+ this.checkMilestones(currentSnapshot);
86
+
87
+ // Update projections
88
+ this.updateProjections(currentSnapshot);
89
+
90
+ // Save updated history
91
+ this.saveHistory();
92
+
93
+ return currentSnapshot;
94
+ }
95
+
96
+ /**
97
+ * Calculate compliance percentage
98
+ */
99
+ calculateCompliancePercentage(scanResults) {
100
+ if (!scanResults.totalFiles || scanResults.totalFiles === 0) {
101
+ return 0;
102
+ }
103
+
104
+ return Math.round((scanResults.compliantFiles / scanResults.totalFiles) * 100);
105
+ }
106
+
107
+ /**
108
+ * Calculate trend based on recent snapshots
109
+ */
110
+ calculateTrend() {
111
+ const snapshots = this.historyData.snapshots;
112
+ if (snapshots.length < 2) {
113
+ return 'insufficient_data';
114
+ }
115
+
116
+ const recent = snapshots.slice(-5); // Last 5 snapshots
117
+ const first = recent[0];
118
+ const last = recent[recent.length - 1];
119
+
120
+ const complianceChange = last.compliancePercentage - first.compliancePercentage;
121
+ const taskChange = last.taskCompletionPercentage - first.taskCompletionPercentage;
122
+
123
+ if (complianceChange > 5 && taskChange > 5) {
124
+ return 'improving';
125
+ } else if (complianceChange < -5 || taskChange < -5) {
126
+ return 'declining';
127
+ } else if (Math.abs(complianceChange) < 2 && Math.abs(taskChange) < 2) {
128
+ return 'stalled';
129
+ } else {
130
+ return 'stable';
131
+ }
132
+ }
133
+
134
+ /**
135
+ * Estimate hours remaining to completion
136
+ */
137
+ estimateHoursRemaining(scanResults, taskStats) {
138
+ const remainingTasks = (taskStats.total || 0) - (taskStats.completed || 0);
139
+ const avgHoursPerTask = 4; // Average estimation from task generator
140
+
141
+ return remainingTasks * avgHoursPerTask;
142
+ }
143
+
144
+ /**
145
+ * Project completion date based on current progress rate
146
+ */
147
+ projectCompletionDate(scanResults, taskStats) {
148
+ const snapshots = this.historyData.snapshots;
149
+ if (snapshots.length < 3) {
150
+ return null;
151
+ }
152
+
153
+ // Calculate completion rate from recent snapshots
154
+ const recent = snapshots.slice(-7); // Last week of data
155
+ if (recent.length < 2) {
156
+ return null;
157
+ }
158
+
159
+ const firstRecent = recent[0];
160
+ const lastRecent = recent[recent.length - 1];
161
+
162
+ const daysDiff = (new Date(lastRecent.timestamp) - new Date(firstRecent.timestamp)) / (1000 * 60 * 60 * 24);
163
+ const complianceProgress = lastRecent.compliancePercentage - firstRecent.compliancePercentage;
164
+ const taskProgress = lastRecent.taskCompletionPercentage - firstRecent.taskCompletionPercentage;
165
+
166
+ if (daysDiff === 0 || (complianceProgress === 0 && taskProgress === 0)) {
167
+ return null;
168
+ }
169
+
170
+ // Project based on task completion (more reliable)
171
+ const taskCompletionRate = taskProgress / daysDiff; // Percentage per day
172
+ const remainingTaskPercentage = 100 - lastRecent.taskCompletionPercentage;
173
+ const daysToComplete = remainingTaskPercentage / taskCompletionRate;
174
+
175
+ if (daysToComplete < 0 || daysToComplete > 365) { // Cap at 1 year
176
+ return null;
177
+ }
178
+
179
+ const projectedDate = new Date();
180
+ projectedDate.setDate(projectedDate.getDate() + Math.ceil(daysToComplete));
181
+
182
+ return projectedDate.toISOString();
183
+ }
184
+
185
+ /**
186
+ * Check for and record milestones
187
+ */
188
+ checkMilestones(snapshot) {
189
+ const milestones = [
190
+ { threshold: 10, name: 'Initial Progress', description: '10% compliance achieved' },
191
+ { threshold: 25, name: 'Quarter Progress', description: '25% compliance achieved' },
192
+ { threshold: 50, name: 'Halfway There', description: '50% compliance achieved' },
193
+ { threshold: 75, name: 'Major Progress', description: '75% compliance achieved' },
194
+ { threshold: 90, name: 'Near Complete', description: '90% compliance achieved' },
195
+ { threshold: 95, name: 'Almost Done', description: '95% compliance achieved' },
196
+ { threshold: 100, name: 'Complete', description: '100% compliance achieved' }
197
+ ];
198
+
199
+ for (const milestone of milestones) {
200
+ if (snapshot.compliancePercentage >= milestone.threshold) {
201
+ // Check if milestone was already achieved
202
+ const alreadyAchieved = this.historyData.milestones.some(m =>
203
+ m.name === milestone.name
204
+ );
205
+
206
+ if (!alreadyAchieved) {
207
+ this.historyData.milestones.push({
208
+ ...milestone,
209
+ achievedAt: snapshot.timestamp,
210
+ compliancePercentage: snapshot.compliancePercentage,
211
+ taskCompletionPercentage: snapshot.taskCompletionPercentage
212
+ });
213
+ }
214
+ }
215
+ }
216
+ }
217
+
218
+ /**
219
+ * Update projections based on current data
220
+ */
221
+ updateProjections(snapshot) {
222
+ this.historyData.projections = {
223
+ lastUpdated: snapshot.timestamp,
224
+ currentComplianceRate: snapshot.compliancePercentage,
225
+ currentTaskRate: snapshot.taskCompletionPercentage,
226
+ projectedCompletion: snapshot.projectedCompletion,
227
+ estimatedHoursRemaining: snapshot.estimatedHoursRemaining,
228
+ trend: snapshot.trend
229
+ };
230
+ }
231
+
232
+ /**
233
+ * Get current progress summary
234
+ */
235
+ getProgressSummary() {
236
+ const latest = this.historyData.snapshots[this.historyData.snapshots.length - 1];
237
+
238
+ if (!latest) {
239
+ return {
240
+ status: 'no_data',
241
+ message: 'No progress data available'
242
+ };
243
+ }
244
+
245
+ return {
246
+ status: latest.compliancePercentage === 100 ? 'complete' : 'in_progress',
247
+ compliancePercentage: latest.compliancePercentage,
248
+ taskCompletionPercentage: latest.taskCompletionPercentage,
249
+ filesRemaining: latest.nonCompliantFiles,
250
+ tasksRemaining: latest.tasksTotal - latest.tasksCompleted,
251
+ trend: latest.trend,
252
+ projectedCompletion: latest.projectedCompletion,
253
+ estimatedHoursRemaining: latest.estimatedHoursRemaining,
254
+ nextMilestone: this.getNextMilestone(latest.compliancePercentage),
255
+ recentMilestones: this.historyData.milestones.slice(-3).reverse()
256
+ };
257
+ }
258
+
259
+ /**
260
+ * Get next milestone
261
+ */
262
+ getNextMilestone(currentPercentage) {
263
+ const milestones = [
264
+ { threshold: 10, name: 'Initial Progress' },
265
+ { threshold: 25, name: 'Quarter Progress' },
266
+ { threshold: 50, name: 'Halfway There' },
267
+ { threshold: 75, name: 'Major Progress' },
268
+ { threshold: 90, name: 'Near Complete' },
269
+ { threshold: 95, name: 'Almost Done' },
270
+ { threshold: 100, name: 'Complete' }
271
+ ];
272
+
273
+ for (const milestone of milestones) {
274
+ if (currentPercentage < milestone.threshold) {
275
+ const alreadyAchieved = this.historyData.milestones.some(m =>
276
+ m.name === milestone.name
277
+ );
278
+
279
+ if (!alreadyAchieved) {
280
+ return {
281
+ ...milestone,
282
+ percentageToGo: milestone.threshold - currentPercentage,
283
+ estimatedDaysToReach: this.estimateDaysToMilestone(milestone.threshold, currentPercentage)
284
+ };
285
+ }
286
+ }
287
+ }
288
+
289
+ return null;
290
+ }
291
+
292
+ /**
293
+ * Estimate days to reach a milestone
294
+ */
295
+ estimateDaysToMilestone(targetPercentage, currentPercentage) {
296
+ const snapshots = this.historyData.snapshots;
297
+ if (snapshots.length < 3) {
298
+ return null;
299
+ }
300
+
301
+ const recent = snapshots.slice(-7);
302
+ if (recent.length < 2) {
303
+ return null;
304
+ }
305
+
306
+ const firstRecent = recent[0];
307
+ const lastRecent = recent[recent.length - 1];
308
+
309
+ const daysDiff = (new Date(lastRecent.timestamp) - new Date(firstRecent.timestamp)) / (1000 * 60 * 60 * 24);
310
+ const progressRate = (lastRecent.compliancePercentage - firstRecent.compliancePercentage) / daysDiff;
311
+
312
+ if (progressRate <= 0) {
313
+ return null;
314
+ }
315
+
316
+ const percentageToGo = targetPercentage - currentPercentage;
317
+ return Math.ceil(percentageToGo / progressRate);
318
+ }
319
+
320
+ /**
321
+ * Generate progress report
322
+ */
323
+ generateProgressReport() {
324
+ const summary = this.getProgressSummary();
325
+ const latest = this.historyData.snapshots[this.historyData.snapshots.length - 1];
326
+
327
+ const report = {
328
+ generatedAt: new Date().toISOString(),
329
+ summary,
330
+ currentSnapshot: latest,
331
+ milestones: this.historyData.milestones,
332
+ projections: this.historyData.projections,
333
+ recommendations: this.generateRecommendations(summary),
334
+ history: {
335
+ totalSnapshots: this.historyData.snapshots.length,
336
+ dateRange: {
337
+ start: this.historyData.snapshots[0]?.timestamp,
338
+ end: this.historyData.snapshots[this.historyData.snapshots.length - 1]?.timestamp
339
+ }
340
+ }
341
+ };
342
+
343
+ return report;
344
+ }
345
+
346
+ /**
347
+ * Generate recommendations based on progress
348
+ */
349
+ generateRecommendations(summary) {
350
+ const recommendations = [];
351
+
352
+ if (summary.status === 'complete') {
353
+ recommendations.push({
354
+ type: 'celebration',
355
+ title: '🎉 Congratulations!',
356
+ description: '100% compliance achieved! All files are under 555 lines.',
357
+ priority: 'info'
358
+ });
359
+ return recommendations;
360
+ }
361
+
362
+ if (summary.trend === 'declining') {
363
+ recommendations.push({
364
+ type: 'warning',
365
+ title: 'Progress Declining',
366
+ description: 'Compliance progress has been declining recently. Consider reviewing recent changes.',
367
+ priority: 'high'
368
+ });
369
+ }
370
+
371
+ if (summary.trend === 'stalled') {
372
+ recommendations.push({
373
+ type: 'suggestion',
374
+ title: 'Progress Stalled',
375
+ description: 'Progress has stalled. Focus on completing high-priority refactoring tasks.',
376
+ priority: 'medium'
377
+ });
378
+ }
379
+
380
+ if (summary.filesRemaining > 50) {
381
+ recommendations.push({
382
+ type: 'action',
383
+ title: 'Focus on Large Files',
384
+ description: `${summary.filesRemaining} files still need refactoring. Start with the largest files first.`,
385
+ priority: 'high'
386
+ });
387
+ }
388
+
389
+ if (summary.nextMilestone && summary.nextMilestone.estimatedDaysToReach) {
390
+ if (summary.nextMilestone.estimatedDaysToReach > 30) {
391
+ recommendations.push({
392
+ type: 'suggestion',
393
+ title: 'Accelerate Progress',
394
+ description: `At current rate, reaching ${summary.nextMilestone.name} will take ${summary.nextMilestone.estimatedDaysToReach} days. Consider increasing refactoring capacity.`,
395
+ priority: 'medium'
396
+ });
397
+ }
398
+ }
399
+
400
+ return recommendations;
401
+ }
402
+
403
+ /**
404
+ * Export progress data for external analysis
405
+ */
406
+ exportProgressData(format = 'json') {
407
+ const data = this.generateProgressReport();
408
+
409
+ switch (format.toLowerCase()) {
410
+ case 'json':
411
+ return JSON.stringify(data, null, 2);
412
+ case 'csv':
413
+ return this.generateCSV(data);
414
+ default:
415
+ throw new Error(`Unsupported export format: ${format}`);
416
+ }
417
+ }
418
+
419
+ /**
420
+ * Generate CSV format for snapshots
421
+ */
422
+ generateCSV(data) {
423
+ const snapshots = this.historyData.snapshots;
424
+ if (snapshots.length === 0) {
425
+ return 'timestamp,totalFiles,compliantFiles,nonCompliantFiles,compliancePercentage,tasksCompleted,tasksTotal,taskCompletionPercentage\n';
426
+ }
427
+
428
+ const headers = 'timestamp,totalFiles,compliantFiles,nonCompliantFiles,compliancePercentage,tasksCompleted,tasksTotal,taskCompletionPercentage,trend\n';
429
+ const rows = snapshots.map(snapshot =>
430
+ `${snapshot.timestamp},${snapshot.totalFiles},${snapshot.compliantFiles},${snapshot.nonCompliantFiles},${snapshot.compliancePercentage},${snapshot.tasksCompleted},${snapshot.tasksTotal},${snapshot.taskCompletionPercentage},${snapshot.trend}`
431
+ ).join('\n');
432
+
433
+ return headers + rows;
434
+ }
435
+ }
436
+
437
+ module.exports = ComplianceProgressTracker;