vibecodingmachine-core 2026.2.26-1739 → 2026.3.9-850

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 (192) hide show
  1. package/package.json +1 -1
  2. package/src/agents/AgentCheckDiscoveryService.js +180 -0
  3. package/src/agents/AgentCheckService.js +18 -261
  4. package/src/agents/AgentCheckStatisticsService.js +195 -0
  5. package/src/agents/EnvironmentConfigurationManager.js +31 -380
  6. package/src/agents/InstallationType.js +19 -6
  7. package/src/agents/SimpleAgentCheckService.js +472 -0
  8. package/src/agents/config-managers/ConfigUtils.js +72 -0
  9. package/src/agents/config-managers/DefaultConfig.js +58 -0
  10. package/src/agents/config-managers/EnvVarLoader.js +66 -0
  11. package/src/agents/config-managers/FileConfigLoader.js +124 -0
  12. package/src/agents/config-managers/TypeConverters.js +61 -0
  13. package/src/agents/config-managers/VariableMappings.js +92 -0
  14. package/src/agents/discovery/AgentDiscoveryService-refactored.js +272 -0
  15. package/src/agents/discovery/AgentDiscoveryService.js +29 -403
  16. package/src/agents/discovery/agent-validator.js +262 -0
  17. package/src/agents/discovery/discovery-results.js +176 -0
  18. package/src/agents/discovery/discovery-scanner.js +268 -0
  19. package/src/agents/discovery/discovery-utils.js +161 -0
  20. package/src/agents/discovery/executable-analyzer.js +290 -0
  21. package/src/agents/discovery/history-manager.js +310 -0
  22. package/src/agents/verification/ResultAnalyzer-refactored.js +341 -0
  23. package/src/agents/verification/ResultAnalyzer.js +30 -431
  24. package/src/agents/verification/analysis-utils.js +310 -0
  25. package/src/agents/verification/batch-analyzer.js +440 -0
  26. package/src/agents/verification/pattern-recognizer.js +369 -0
  27. package/src/agents/verification/report-generator.js +320 -0
  28. package/src/agents/verification/test-analyzer.js +290 -0
  29. package/src/agents/windows/InstallerFactory.js +4 -0
  30. package/src/agents/windows/VSCodeExtensionInstaller.js +404 -0
  31. package/src/analysis/analysis-engine.js +314 -0
  32. package/src/analysis/ast-analyzer.js +342 -0
  33. package/src/analysis/boundary-detector-refactored.js +378 -0
  34. package/src/analysis/boundary-detector.js +200 -603
  35. package/src/analysis/boundary-scanner.js +609 -0
  36. package/src/analysis/boundary-types.js +118 -0
  37. package/src/analysis/boundary-utils.js +293 -0
  38. package/src/analysis/deadline-priority-calculator.js +18 -0
  39. package/src/analysis/detection-methods.js +347 -0
  40. package/src/analysis/importance-priority-calculator.js +18 -0
  41. package/src/analysis/priority/factor-calculators.js +204 -0
  42. package/src/analysis/priority/factor-helpers.js +71 -0
  43. package/src/analysis/priority/priority-constants.js +73 -0
  44. package/src/analysis/priority/priority-factor-calculators.js +301 -0
  45. package/src/analysis/priority/reasons-generator.js +44 -0
  46. package/src/analysis/priority-calculator.js +15 -580
  47. package/src/analysis/strategy-generator.js +16 -66
  48. package/src/analysis/type-priority-calculator.js +18 -0
  49. package/src/analysis/urgency-priority-calculator.js +18 -0
  50. package/src/auto-mode/AutoModeBusinessLogic.js +2 -40
  51. package/src/commands/disable-requirement.js +60 -0
  52. package/src/commands/disable-spec.js +60 -0
  53. package/src/commands/enable-requirement.js +60 -0
  54. package/src/commands/enable-spec.js +60 -0
  55. package/src/commands/registry.js +1 -6
  56. package/src/commands/requirements.js +8 -2
  57. package/src/ide-integration/applescript-manager.cjs +9 -24
  58. package/src/ide-integration/cdp-handlers/chat-reader.js +44 -0
  59. package/src/ide-integration/cdp-handlers/connection-handler.js +88 -0
  60. package/src/ide-integration/cdp-handlers/continuation-handler.js +314 -0
  61. package/src/ide-integration/cdp-handlers/message-submitter.js +75 -0
  62. package/src/ide-integration/cdp-handlers/text-sender.js +138 -0
  63. package/src/ide-integration/cdp-manager.js +28 -573
  64. package/src/ide-integration/claude-code-cli-manager.cjs +48 -12
  65. package/src/ide-integration/ide-openers/claude-opener.js +171 -0
  66. package/src/ide-integration/ide-openers/cursor-opener.js +53 -0
  67. package/src/ide-integration/ide-openers/other-ides-opener.js +230 -0
  68. package/src/ide-integration/ide-openers/vscode-opener.js +147 -0
  69. package/src/ide-integration/macos-ide-manager.js +20 -582
  70. package/src/ide-integration/macos-quota-checker.js +164 -0
  71. package/src/ide-integration/macos-text-sender.js +19 -38
  72. package/src/ide-integration/provider-manager.cjs +52 -7
  73. package/src/index.cjs +6 -0
  74. package/src/index.js +10 -0
  75. package/src/llm/direct-llm-manager.cjs +501 -0
  76. package/src/localization/translations/en-part1.js +363 -0
  77. package/src/localization/translations/en-part2.js +320 -0
  78. package/src/localization/translations/en.js +4 -687
  79. package/src/localization/translations/es-part1.js +363 -0
  80. package/src/localization/translations/es-part2.js +320 -0
  81. package/src/localization/translations/es.js +4 -688
  82. package/src/models/file-analysis-collection.js +139 -0
  83. package/src/models/file-analysis-metrics.js +50 -0
  84. package/src/models/file-analysis.js +15 -262
  85. package/src/models/plan-manager.js +410 -0
  86. package/src/models/refactoring-models.js +380 -0
  87. package/src/models/refactoring-plan-refactored.js +81 -0
  88. package/src/models/refactoring-plan.js +2 -663
  89. package/src/monitoring/alert-system.js +4 -45
  90. package/src/monitoring/continuous-scan-notifications.js +37 -191
  91. package/src/monitoring/notification-handlers/base-handler.js +58 -0
  92. package/src/monitoring/notification-handlers/error-handler.js +36 -0
  93. package/src/monitoring/notification-handlers/index.js +21 -0
  94. package/src/monitoring/notification-handlers/new-violation-handler.js +91 -0
  95. package/src/monitoring/notification-handlers/progress-handler.js +48 -0
  96. package/src/monitoring/notification-handlers/resolved-violation-handler.js +54 -0
  97. package/src/monitoring/notification-handlers/threshold-handler.js +36 -0
  98. package/src/provider-registry.js +8 -0
  99. package/src/refactoring/boundary/boundary-detector-refactored.js +58 -0
  100. package/src/refactoring/boundary/boundary-detector.js +26 -596
  101. package/src/refactoring/boundary/detectors/boundary-analyzers.js +281 -0
  102. package/src/refactoring/boundary/detectors/boundary-core.js +167 -0
  103. package/src/refactoring/boundary/detectors/class-detector.js +247 -0
  104. package/src/refactoring/boundary/detectors/config-detector.js +270 -0
  105. package/src/refactoring/boundary/detectors/constant-detector.js +269 -0
  106. package/src/refactoring/boundary/detectors/function-detector.js +248 -0
  107. package/src/refactoring/boundary/detectors/module-detector.js +249 -0
  108. package/src/refactoring/boundary/detectors/object-detector.js +247 -0
  109. package/src/refactoring/boundary/detectors/type-detectors.js +338 -0
  110. package/src/refactoring/boundary/detectors/utility-detector.js +270 -0
  111. package/src/refactoring/circular-dependency-resolver-original.js +16 -76
  112. package/src/refactoring/code-mover-refactored.js +309 -0
  113. package/src/refactoring/code-mover.js +48 -355
  114. package/src/refactoring/execution-status.js +18 -0
  115. package/src/refactoring/execution-strategies.js +172 -0
  116. package/src/refactoring/file-splitter-core.js +568 -0
  117. package/src/refactoring/file-splitter-types.js +136 -0
  118. package/src/refactoring/file-splitter.js +2 -682
  119. package/src/refactoring/functionality-validator.js +11 -51
  120. package/src/refactoring/import-manager-refactored.js +385 -0
  121. package/src/refactoring/import-manager.js +112 -487
  122. package/src/refactoring/import-models.js +189 -0
  123. package/src/refactoring/import-parser.js +306 -0
  124. package/src/refactoring/move-executor.js +431 -0
  125. package/src/refactoring/move-utils.js +368 -0
  126. package/src/refactoring/operation-executor.js +76 -0
  127. package/src/refactoring/plan-creator.js +36 -0
  128. package/src/refactoring/plan-executor.js +143 -0
  129. package/src/refactoring/plan-validator.js +68 -0
  130. package/src/refactoring/refactoring-executor-result.js +70 -0
  131. package/src/refactoring/refactoring-executor.js +34 -569
  132. package/src/refactoring/refactoring-operation.js +94 -0
  133. package/src/refactoring/refactoring-plan.js +69 -0
  134. package/src/refactoring/refactoring-rollback.js +22 -527
  135. package/src/refactoring/rollback-handlers/RollbackExecutor.js +107 -0
  136. package/src/refactoring/rollback-handlers/RollbackManager.js +265 -0
  137. package/src/refactoring/rollback-handlers/RollbackOperation.js +105 -0
  138. package/src/refactoring/rollback-handlers/RollbackResult.js +109 -0
  139. package/src/refactoring/rollback-handlers/RollbackStatistics.js +77 -0
  140. package/src/refactoring/test-validator.js +32 -448
  141. package/src/refactoring/validation/baseline-runner.js +71 -0
  142. package/src/refactoring/validation/report-generator.js +136 -0
  143. package/src/refactoring/validation/result-comparator.js +92 -0
  144. package/src/refactoring/validation/test-suite.js +59 -0
  145. package/src/refactoring/validation/test-validation-result.js +83 -0
  146. package/src/refactoring/validation/validation-runner.js +95 -0
  147. package/src/refactoring/validation/validation-status.js +18 -0
  148. package/src/rui/commands/AgentCommandParser.js +60 -369
  149. package/src/rui/commands/AgentResponseFormatter.js +7 -47
  150. package/src/rui/commands/parsers/CommandMapper.js +148 -0
  151. package/src/rui/commands/parsers/CommandValidator.js +228 -0
  152. package/src/rui/commands/parsers/ComponentExtractor.js +100 -0
  153. package/src/rui/commands/parsers/TokenParser.js +69 -0
  154. package/src/rui/commands/parsers/tokenizer.js +153 -0
  155. package/src/utils/current-requirement-operations.js +50 -1
  156. package/src/utils/report-generator.js +18 -514
  157. package/src/utils/report-generators/analysis-generator.js +115 -0
  158. package/src/utils/report-generators/base-generator.js +141 -0
  159. package/src/utils/report-generators/compliance-generator.js +41 -0
  160. package/src/utils/report-generators/format-handlers.js +185 -0
  161. package/src/utils/report-generators/refactoring-generator.js +46 -0
  162. package/src/utils/report-generators/validation-generator.js +63 -0
  163. package/src/utils/requirement-enable-disable.js +265 -0
  164. package/src/utils/requirement-helpers/requirement-file-ops.js +69 -1
  165. package/src/utils/requirement-helpers/requirement-mover.js +88 -1
  166. package/src/utils/requirement-helpers.js +5 -2
  167. package/src/utils/smoke-test-cli.js +45 -8
  168. package/src/utils/specification-enable-disable.js +122 -0
  169. package/src/utils/specification-helpers.js +30 -4
  170. package/src/utils/specification-migration.js +5 -5
  171. package/src/utils/test-comparator.js +118 -0
  172. package/src/utils/test-config.js +54 -0
  173. package/src/utils/test-executor.js +133 -0
  174. package/src/utils/test-parser.js +215 -0
  175. package/src/utils/test-runner-baseline.js +63 -0
  176. package/src/utils/test-runner-core.js +98 -0
  177. package/src/utils/test-runner-report.js +39 -0
  178. package/src/utils/test-runner-validation.js +71 -0
  179. package/src/utils/test-runner.js +11 -535
  180. package/src/validation/comparison-analyzer.js +333 -0
  181. package/src/validation/compliance-reporter-new.js +282 -0
  182. package/src/validation/compliance-reporter-refactored.js +344 -0
  183. package/src/validation/compliance-reporter.js +278 -591
  184. package/src/validation/compliance-utils.js +278 -0
  185. package/src/validation/html-generator.js +446 -0
  186. package/src/validation/metrics/category-calculator.js +137 -0
  187. package/src/validation/metrics/metrics-helpers.js +155 -0
  188. package/src/validation/metrics/overview-calculator.js +85 -0
  189. package/src/validation/metrics/overview-metrics.js +41 -0
  190. package/src/validation/metrics/quality-calculator.js +166 -0
  191. package/src/validation/metrics/size-calculator.js +69 -0
  192. package/src/validation/metrics-calculator.js +27 -551
@@ -5,604 +5,99 @@
5
5
  * Ensures safe restoration of original state with comprehensive tracking.
6
6
  */
7
7
 
8
- const fs = require('fs');
9
- const path = require('path');
10
- const { RollbackManager } = require('../utils/rollback-manager');
11
-
12
- /**
13
- * Rollback status
14
- */
15
- const ROLLBACK_STATUS = {
16
- PENDING: 'pending',
17
- RUNNING: 'running',
18
- COMPLETED: 'completed',
19
- FAILED: 'failed',
20
- PARTIAL: 'partial'
21
- };
22
-
23
- /**
24
- * Rollback operation class
25
- */
26
- class RollbackOperation {
27
- constructor(operationId, type, targetPath) {
28
- this.id = this.generateId();
29
- this.operationId = operationId;
30
- this.type = type;
31
- this.targetPath = targetPath;
32
- this.status = ROLLBACK_STATUS.PENDING;
33
- this.startTime = null;
34
- this.endTime = null;
35
- this.duration = 0;
36
- this.success = false;
37
- this.errors = [];
38
- this.warnings = [];
39
- this.metadata = {
40
- createdAt: new Date().toISOString(),
41
- backupPath: null,
42
- originalSize: 0,
43
- restoredSize: 0
44
- };
45
- }
46
-
47
- generateId() {
48
- return `rollback_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
49
- }
50
-
51
- setStatus(status) {
52
- this.status = status;
53
- if (status === ROLLBACK_STATUS.RUNNING && !this.startTime) {
54
- this.startTime = new Date().toISOString();
55
- }
56
- if ([ROLLBACK_STATUS.COMPLETED, ROLLBACK_STATUS.FAILED, ROLLBACK_STATUS.PARTIAL].includes(status)) {
57
- this.endTime = new Date().toISOString();
58
- this.duration = this.endTime && this.startTime ?
59
- (new Date(this.endTime) - new Date(this.startTime)) / 1000 : 0;
60
- }
61
- }
62
-
63
- setSuccess(success) {
64
- this.success = success;
65
- }
66
-
67
- addError(error) {
68
- this.errors.push({
69
- message: error.message,
70
- timestamp: new Date().toISOString(),
71
- stack: error.stack
72
- });
73
- }
74
-
75
- addWarning(warning) {
76
- this.warnings.push({
77
- message: warning,
78
- timestamp: new Date().toISOString()
79
- });
80
- }
81
-
82
- setBackupPath(backupPath) {
83
- this.metadata.backupPath = backupPath;
84
- }
85
-
86
- setOriginalSize(size) {
87
- this.metadata.originalSize = size;
88
- }
89
-
90
- setRestoredSize(size) {
91
- this.metadata.restoredSize = size;
92
- }
93
-
94
- getSummary() {
95
- return {
96
- id: this.id,
97
- operationId: this.operationId,
98
- type: this.type,
99
- targetPath: this.targetPath,
100
- status: this.status,
101
- success: this.success,
102
- duration: this.duration,
103
- errorCount: this.errors.length,
104
- warningCount: this.warnings.length,
105
- backupPath: this.metadata.backupPath
106
- };
107
- }
108
- }
109
-
110
- /**
111
- * Rollback result class
112
- */
113
- class RollbackResult {
114
- constructor(rollbackId) {
115
- this.rollbackId = rollbackId;
116
- this.operations = [];
117
- this.status = ROLLBACK_STATUS.PENDING;
118
- this.success = false;
119
- this.startTime = null;
120
- this.endTime = null;
121
- this.duration = 0;
122
- this.errors = [];
123
- this.warnings = [];
124
- this.metadata = {
125
- createdAt: new Date().toISOString(),
126
- triggerReason: '',
127
- affectedFiles: 0,
128
- totalFilesRestored: 0
129
- };
130
- }
131
-
132
- addOperation(operation) {
133
- this.operations.push(operation);
134
- }
135
-
136
- setStatus(status) {
137
- this.status = status;
138
- if (status === ROLLBACK_STATUS.RUNNING && !this.startTime) {
139
- this.startTime = new Date().toISOString();
140
- }
141
- if ([ROLLBACK_STATUS.COMPLETED, ROLLBACK_STATUS.FAILED, ROLLBACK_STATUS.PARTIAL].includes(status)) {
142
- this.endTime = new Date().toISOString();
143
- this.duration = this.endTime && this.startTime ?
144
- (new Date(this.endTime) - new Date(this.startTime)) / 1000 : 0;
145
- }
146
- }
147
-
148
- setSuccess(success) {
149
- this.success = success;
150
- }
151
-
152
- setTriggerReason(reason) {
153
- this.metadata.triggerReason = reason;
154
- }
155
-
156
- addError(error) {
157
- this.errors.push({
158
- message: error.message,
159
- timestamp: new Date().toISOString(),
160
- stack: error.stack
161
- });
162
- }
163
-
164
- addWarning(warning) {
165
- this.warnings.push({
166
- message: warning,
167
- timestamp: new Date().toISOString()
168
- });
169
- }
170
-
171
- calculateSummary() {
172
- const successfulOps = this.operations.filter(op => op.success).length;
173
- const failedOps = this.operations.filter(op => !op.success).length;
174
-
175
- if (failedOps === 0) {
176
- this.setStatus(ROLLBACK_STATUS.COMPLETED);
177
- this.setSuccess(true);
178
- } else if (successfulOps > 0) {
179
- this.setStatus(ROLLBACK_STATUS.PARTIAL);
180
- this.setSuccess(false);
181
- } else {
182
- this.setStatus(ROLLBACK_STATUS.FAILED);
183
- this.setSuccess(false);
184
- }
185
-
186
- this.metadata.affectedFiles = this.operations.length;
187
- this.metadata.totalFilesRestored = successfulOps;
188
- }
189
-
190
- getSummary() {
191
- this.calculateSummary();
192
-
193
- return {
194
- rollbackId: this.rollbackId,
195
- status: this.status,
196
- success: this.success,
197
- duration: this.duration,
198
- triggerReason: this.metadata.triggerReason,
199
- affectedFiles: this.metadata.affectedFiles,
200
- totalFilesRestored: this.metadata.totalFilesRestored,
201
- operations: this.operations.map(op => op.getSummary()),
202
- errorCount: this.errors.length,
203
- warningCount: this.warnings.length
204
- };
205
- }
206
- }
8
+ const { RollbackOperation, ROLLBACK_STATUS } = require('./rollback-handlers/RollbackOperation');
9
+ const { RollbackResult } = require('./rollback-handlers/RollbackResult');
10
+ const { RollbackManager } = require('./rollback-handlers/RollbackManager');
11
+ const { RollbackStatistics } = require('./rollback-handlers/RollbackStatistics');
207
12
 
208
13
  /**
209
14
  * Refactoring rollback manager class
210
15
  */
211
16
  class RefactoringRollback {
212
17
  constructor(options = {}) {
213
- this.options = {
214
- createBackups: true,
215
- validateAfterRollback: true,
216
- preserveRollbackLogs: true,
217
- maxRollbackAttempts: 3,
218
- ...options
219
- };
220
-
221
- this.rollbackManager = new RollbackManager();
222
- this.rollbackHistory = new Map();
223
- this.currentRollback = null;
224
- this.isRollingBack = false;
18
+ this.manager = new RollbackManager(options);
19
+ this.statistics = new RollbackStatistics(this.manager.rollbackHistory);
225
20
  }
226
21
 
227
22
  /**
228
23
  * Create rollback point for a refactoring operation
229
24
  */
230
25
  async createRollbackPoint(operationId, operation) {
231
- console.log(`Creating rollback point for operation: ${operationId}`);
232
-
233
- try {
234
- const rollbackOp = new RollbackOperation(operationId, 'create_backup', operation.targetPath);
235
-
236
- // Create backup for each affected file
237
- for (const affectedFile of operation.affectedFiles || [operation.targetPath]) {
238
- if (fs.existsSync(affectedFile)) {
239
- const backupPath = this.rollbackManager.backupFile(affectedFile);
240
- rollbackOp.setBackupPath(backupPath);
241
- rollbackOp.setOriginalSize(fs.statSync(affectedFile).size);
242
- }
243
- }
244
-
245
- rollbackOp.setStatus(ROLLBACK_STATUS.COMPLETED);
246
- rollbackOp.setSuccess(true);
247
-
248
- // Store rollback operation
249
- if (!this.rollbackHistory.has(operationId)) {
250
- this.rollbackHistory.set(operationId, []);
251
- }
252
- this.rollbackHistory.get(operationId).push(rollbackOp);
253
-
254
- console.log(`Rollback point created for ${operationId}`);
255
-
256
- return rollbackOp;
257
-
258
- } catch (error) {
259
- console.error(`Failed to create rollback point for ${operationId}:`, error.message);
260
- throw error;
261
- }
26
+ return this.manager.createRollbackPoint(operationId, operation);
262
27
  }
263
28
 
264
29
  /**
265
30
  * Execute rollback for a failed operation
266
31
  */
267
32
  async executeRollback(operationId, reason = 'Operation failed') {
268
- if (this.isRollingBack) {
269
- throw new Error('Rollback already in progress');
270
- }
271
-
272
- this.isRollingBack = true;
273
- const rollbackId = this.generateRollbackId();
274
- const result = new RollbackResult(rollbackId);
275
- result.setTriggerReason(reason);
276
-
277
- try {
278
- console.log(`Executing rollback for operation: ${operationId}`);
279
- result.setStatus(ROLLBACK_STATUS.RUNNING);
280
-
281
- // Get rollback operations for the operation
282
- const rollbackOps = this.rollbackHistory.get(operationId) || [];
283
-
284
- if (rollbackOps.length === 0) {
285
- throw new Error(`No rollback point found for operation: ${operationId}`);
286
- }
287
-
288
- // Execute rollback operations in reverse order
289
- const reversedOps = rollbackOps.reverse();
290
-
291
- for (const rollbackOp of reversedOps) {
292
- try {
293
- await this.executeRollbackOperation(rollbackOp);
294
- result.addOperation(rollbackOp);
295
- } catch (error) {
296
- rollbackOp.addError(error);
297
- rollbackOp.setStatus(ROLLBACK_STATUS.FAILED);
298
- rollbackOp.setSuccess(false);
299
- result.addOperation(rollbackOp);
300
-
301
- // Continue with other operations even if one fails
302
- console.warn(`Rollback operation failed: ${rollbackOp.id}`, error.message);
303
- }
304
- }
305
-
306
- // Validate rollback if enabled
307
- if (this.options.validateAfterRollback) {
308
- await this.validateRollback(result);
309
- }
310
-
311
- result.calculateSummary();
312
-
313
- console.log(`Rollback completed: ${result.success ? 'SUCCESS' : 'PARTIAL/FAILED'}`);
314
-
315
- } catch (error) {
316
- result.addError(error);
317
- result.setStatus(ROLLBACK_STATUS.FAILED);
318
- result.setSuccess(false);
319
- console.error(`Rollback execution failed:`, error.message);
320
- } finally {
321
- this.isRollingBack = false;
322
- this.currentRollback = result;
323
- }
324
-
325
- return result;
326
- }
327
-
328
- /**
329
- * Execute individual rollback operation
330
- */
331
- async executeRollbackOperation(rollbackOp) {
332
- console.log(`Executing rollback operation: ${rollbackOp.id}`);
333
- rollbackOp.setStatus(ROLLBACK_STATUS.RUNNING);
334
-
335
- try {
336
- if (!rollbackOp.metadata.backupPath || !fs.existsSync(rollbackOp.metadata.backupPath)) {
337
- throw new Error(`Backup file not found: ${rollbackOp.metadata.backupPath}`);
338
- }
339
-
340
- // Restore file from backup
341
- const targetDir = path.dirname(rollbackOp.targetPath);
342
- if (!fs.existsSync(targetDir)) {
343
- fs.mkdirSync(targetDir, { recursive: true });
344
- }
345
-
346
- fs.copyFileSync(rollbackOp.metadata.backupPath, rollbackOp.targetPath);
347
-
348
- // Verify restoration
349
- if (fs.existsSync(rollbackOp.targetPath)) {
350
- const restoredSize = fs.statSync(rollbackOp.targetPath).size;
351
- rollbackOp.setRestoredSize(restoredSize);
352
-
353
- // Check if size matches (basic integrity check)
354
- if (Math.abs(restoredSize - rollbackOp.metadata.originalSize) > 100) {
355
- rollbackOp.addWarning('File size difference detected after restoration');
356
- }
357
- } else {
358
- throw new Error('Failed to restore file');
359
- }
360
-
361
- rollbackOp.setStatus(ROLLBACK_STATUS.COMPLETED);
362
- rollbackOp.setSuccess(true);
363
-
364
- console.log(`Rollback operation completed: ${rollbackOp.id}`);
365
-
366
- } catch (error) {
367
- rollbackOp.addError(error);
368
- rollbackOp.setStatus(ROLLBACK_STATUS.FAILED);
369
- rollbackOp.setSuccess(false);
370
- throw error;
371
- }
372
- }
373
-
374
- /**
375
- * Validate rollback results
376
- */
377
- async validateRollback(result) {
378
- console.log('Validating rollback results...');
379
-
380
- for (const operation of result.operations) {
381
- if (operation.success) {
382
- try {
383
- // Basic file existence check
384
- if (!fs.existsSync(operation.targetPath)) {
385
- operation.addWarning('Target file does not exist after rollback');
386
- }
387
-
388
- // Basic syntax check for JavaScript files
389
- if (operation.targetPath.endsWith('.js') && fs.existsSync(operation.targetPath)) {
390
- const content = fs.readFileSync(operation.targetPath, 'utf8');
391
- this.validateJavaScriptSyntax(content);
392
- }
393
-
394
- } catch (error) {
395
- operation.addError(error);
396
- }
397
- }
398
- }
399
- }
400
-
401
- /**
402
- * Validate JavaScript syntax
403
- */
404
- validateJavaScriptSyntax(content) {
405
- try {
406
- const vm = require('vm');
407
- new vm.Script(content, { filename: 'validation' });
408
- } catch (error) {
409
- throw new Error(`JavaScript syntax validation failed: ${error.message}`);
410
- }
33
+ return this.manager.executeRollback(operationId, reason);
411
34
  }
412
35
 
413
36
  /**
414
37
  * Cancel current rollback
415
38
  */
416
39
  async cancelRollback() {
417
- if (!this.isRollingBack || !this.currentRollback) {
418
- return false;
419
- }
420
-
421
- this.currentRollback.setStatus(ROLLBACK_STATUS.FAILED);
422
- this.currentRollback.addError(new Error('Rollback cancelled by user'));
423
- this.isRollingBack = false;
424
-
425
- return true;
40
+ return this.manager.cancelRollback();
426
41
  }
427
42
 
428
43
  /**
429
44
  * Get rollback status
430
45
  */
431
46
  getRollbackStatus() {
432
- return {
433
- isRollingBack: this.isRollingBack,
434
- currentRollback: this.currentRollback ? this.currentRollback.getSummary() : null,
435
- rollbackHistory: Array.from(this.rollbackHistory.entries()).map(([opId, ops]) => ({
436
- operationId: opId,
437
- rollbackOperations: ops.length,
438
- lastRollback: ops[ops.length - 1]?.getSummary()
439
- }))
440
- };
47
+ return this.manager.getRollbackStatus();
441
48
  }
442
49
 
443
50
  /**
444
51
  * Clean up old rollback points
445
52
  */
446
- async cleanup(maxAge = 7 * 24 * 60 * 60 * 1000) { // 7 days default
447
- console.log('Cleaning up old rollback points...');
448
-
449
- let cleaned = 0;
450
- const now = Date.now();
451
-
452
- for (const [operationId, rollbackOps] of this.rollbackHistory.entries()) {
453
- const recentOps = rollbackOps.filter(op => {
454
- const createdAt = new Date(op.metadata.createdAt).getTime();
455
- return (now - createdAt) < maxAge;
456
- });
457
-
458
- if (recentOps.length < rollbackOps.length) {
459
- this.rollbackHistory.set(operationId, recentOps);
460
- cleaned += rollbackOps.length - recentOps.length;
461
- }
462
- }
463
-
464
- // Clean up rollback manager backups
465
- const backupCleaned = this.rollbackManager.cleanup(maxAge);
466
-
467
- console.log(`Cleanup completed: ${cleaned} rollback operations, ${backupCleaned} backup files`);
468
-
469
- return { rollbackOperations: cleaned, backupFiles: backupCleaned };
53
+ async cleanup(maxAge = 7 * 24 * 60 * 60 * 1000) {
54
+ return this.manager.cleanup(maxAge);
470
55
  }
471
56
 
472
57
  /**
473
58
  * Get rollback statistics
474
59
  */
475
60
  getStatistics() {
476
- const stats = {
477
- totalRollbackPoints: 0,
478
- totalRollbacks: 0,
479
- successfulRollbacks: 0,
480
- failedRollbacks: 0,
481
- partialRollbacks: 0,
482
- averageRollbackTime: 0,
483
- commonFailureReasons: {},
484
- oldestRollback: null,
485
- newestRollback: null
486
- };
487
-
488
- let totalTime = 0;
489
- let oldestTime = null;
490
- let newestTime = null;
491
- const failureReasons = {};
492
-
493
- for (const rollbackOps of this.rollbackHistory.values()) {
494
- stats.totalRollbackPoints += rollbackOps.length;
495
-
496
- for (const op of rollbackOps) {
497
- if (op.endTime) {
498
- const opTime = new Date(op.endTime);
499
- if (!oldestTime || opTime < oldestTime) oldestTime = opTime;
500
- if (!newestTime || opTime > newestTime) newestTime = opTime;
501
- }
502
- }
503
- }
504
-
505
- stats.oldestRollback = oldestTime ? oldestTime.toISOString() : null;
506
- stats.newestRollback = newestTime ? newestTime.toISOString() : null;
507
-
508
- return stats;
61
+ return this.statistics.getStatistics();
509
62
  }
510
63
 
511
64
  /**
512
65
  * Export rollback data
513
66
  */
514
67
  exportRollbackData(format = 'json') {
515
- const exportData = {
516
- metadata: {
517
- exportedAt: new Date().toISOString(),
518
- version: '1.0.0',
519
- options: this.options
520
- },
521
- rollbackHistory: Array.from(this.rollbackHistory.entries()).map(([opId, ops]) => ({
522
- operationId: opId,
523
- operations: ops.map(op => op.getSummary())
524
- })),
525
- currentRollback: this.currentRollback ? this.currentRollback.getSummary() : null,
526
- statistics: this.getStatistics()
527
- };
528
-
529
- if (format === 'json') {
530
- return JSON.stringify(exportData, null, 2);
531
- }
532
-
533
- return exportData;
534
- }
535
-
536
- /**
537
- * Generate rollback ID
538
- */
539
- generateRollbackId() {
540
- return `rollback_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
68
+ return this.statistics.exportRollbackData(
69
+ this.manager.options,
70
+ this.manager.currentRollback,
71
+ format
72
+ );
541
73
  }
542
74
 
543
75
  /**
544
76
  * Check if rollback is available for an operation
545
77
  */
546
78
  hasRollbackPoint(operationId) {
547
- const rollbackOps = this.rollbackHistory.get(operationId);
548
- return rollbackOps && rollbackOps.length > 0;
79
+ return this.manager.hasRollbackPoint(operationId);
549
80
  }
550
81
 
551
82
  /**
552
83
  * Get rollback operations for an operation
553
84
  */
554
85
  getRollbackOperations(operationId) {
555
- return this.rollbackHistory.get(operationId) || [];
86
+ return this.manager.getRollbackOperations(operationId);
556
87
  }
557
88
 
558
89
  /**
559
90
  * Remove rollback point for an operation
560
91
  */
561
92
  removeRollbackPoint(operationId) {
562
- const rollbackOps = this.rollbackHistory.get(operationId);
563
- if (rollbackOps) {
564
- // Clean up backup files
565
- for (const op of rollbackOps) {
566
- if (op.metadata.backupPath && fs.existsSync(op.metadata.backupPath)) {
567
- try {
568
- fs.unlinkSync(op.metadata.backupPath);
569
- } catch (error) {
570
- console.warn(`Failed to cleanup backup file: ${op.metadata.backupPath}`, error.message);
571
- }
572
- }
573
- }
574
-
575
- this.rollbackHistory.delete(operationId);
576
- return true;
577
- }
578
-
579
- return false;
93
+ return this.manager.removeRollbackPoint(operationId);
580
94
  }
581
95
 
582
96
  /**
583
97
  * Reset all rollback data
584
98
  */
585
99
  reset() {
586
- console.log('Resetting all rollback data...');
587
-
588
- // Clean up all backup files
589
- for (const rollbackOps of this.rollbackHistory.values()) {
590
- for (const op of rollbackOps) {
591
- if (op.metadata.backupPath && fs.existsSync(op.metadata.backupPath)) {
592
- try {
593
- fs.unlinkSync(op.metadata.backupPath);
594
- } catch (error) {
595
- console.warn(`Failed to cleanup backup file: ${op.metadata.backupPath}`, error.message);
596
- }
597
- }
598
- }
599
- }
600
-
601
- this.rollbackHistory.clear();
602
- this.currentRollback = null;
603
- this.isRollingBack = false;
604
-
605
- console.log('Rollback data reset completed');
100
+ return this.manager.reset();
606
101
  }
607
102
  }
608
103