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,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;
|