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.
- package/package.json +1 -1
- package/src/agents/AgentCheckDiscoveryService.js +180 -0
- package/src/agents/AgentCheckService.js +18 -261
- package/src/agents/AgentCheckStatisticsService.js +195 -0
- package/src/agents/EnvironmentConfigurationManager.js +31 -380
- package/src/agents/InstallationType.js +19 -6
- package/src/agents/SimpleAgentCheckService.js +472 -0
- package/src/agents/config-managers/ConfigUtils.js +72 -0
- package/src/agents/config-managers/DefaultConfig.js +58 -0
- package/src/agents/config-managers/EnvVarLoader.js +66 -0
- package/src/agents/config-managers/FileConfigLoader.js +124 -0
- package/src/agents/config-managers/TypeConverters.js +61 -0
- package/src/agents/config-managers/VariableMappings.js +92 -0
- package/src/agents/discovery/AgentDiscoveryService-refactored.js +272 -0
- package/src/agents/discovery/AgentDiscoveryService.js +29 -403
- package/src/agents/discovery/agent-validator.js +262 -0
- package/src/agents/discovery/discovery-results.js +176 -0
- package/src/agents/discovery/discovery-scanner.js +268 -0
- package/src/agents/discovery/discovery-utils.js +161 -0
- package/src/agents/discovery/executable-analyzer.js +290 -0
- package/src/agents/discovery/history-manager.js +310 -0
- package/src/agents/verification/ResultAnalyzer-refactored.js +341 -0
- package/src/agents/verification/ResultAnalyzer.js +30 -431
- package/src/agents/verification/analysis-utils.js +310 -0
- package/src/agents/verification/batch-analyzer.js +440 -0
- package/src/agents/verification/pattern-recognizer.js +369 -0
- package/src/agents/verification/report-generator.js +320 -0
- package/src/agents/verification/test-analyzer.js +290 -0
- package/src/agents/windows/InstallerFactory.js +4 -0
- package/src/agents/windows/VSCodeExtensionInstaller.js +404 -0
- package/src/analysis/analysis-engine.js +314 -0
- package/src/analysis/ast-analyzer.js +342 -0
- package/src/analysis/boundary-detector-refactored.js +378 -0
- package/src/analysis/boundary-detector.js +200 -603
- package/src/analysis/boundary-scanner.js +609 -0
- package/src/analysis/boundary-types.js +118 -0
- package/src/analysis/boundary-utils.js +293 -0
- package/src/analysis/deadline-priority-calculator.js +18 -0
- package/src/analysis/detection-methods.js +347 -0
- package/src/analysis/importance-priority-calculator.js +18 -0
- package/src/analysis/priority/factor-calculators.js +204 -0
- package/src/analysis/priority/factor-helpers.js +71 -0
- package/src/analysis/priority/priority-constants.js +73 -0
- package/src/analysis/priority/priority-factor-calculators.js +301 -0
- package/src/analysis/priority/reasons-generator.js +44 -0
- package/src/analysis/priority-calculator.js +15 -580
- package/src/analysis/strategy-generator.js +16 -66
- package/src/analysis/type-priority-calculator.js +18 -0
- package/src/analysis/urgency-priority-calculator.js +18 -0
- package/src/auto-mode/AutoModeBusinessLogic.js +2 -40
- package/src/commands/disable-requirement.js +60 -0
- package/src/commands/disable-spec.js +60 -0
- package/src/commands/enable-requirement.js +60 -0
- package/src/commands/enable-spec.js +60 -0
- package/src/commands/registry.js +1 -6
- package/src/commands/requirements.js +8 -2
- package/src/ide-integration/applescript-manager.cjs +9 -24
- package/src/ide-integration/cdp-handlers/chat-reader.js +44 -0
- package/src/ide-integration/cdp-handlers/connection-handler.js +88 -0
- package/src/ide-integration/cdp-handlers/continuation-handler.js +314 -0
- package/src/ide-integration/cdp-handlers/message-submitter.js +75 -0
- package/src/ide-integration/cdp-handlers/text-sender.js +138 -0
- package/src/ide-integration/cdp-manager.js +28 -573
- package/src/ide-integration/claude-code-cli-manager.cjs +48 -12
- package/src/ide-integration/ide-openers/claude-opener.js +171 -0
- package/src/ide-integration/ide-openers/cursor-opener.js +53 -0
- package/src/ide-integration/ide-openers/other-ides-opener.js +230 -0
- package/src/ide-integration/ide-openers/vscode-opener.js +147 -0
- package/src/ide-integration/macos-ide-manager.js +20 -582
- package/src/ide-integration/macos-quota-checker.js +164 -0
- package/src/ide-integration/macos-text-sender.js +19 -38
- package/src/ide-integration/provider-manager.cjs +52 -7
- package/src/index.cjs +6 -0
- package/src/index.js +10 -0
- package/src/llm/direct-llm-manager.cjs +501 -0
- package/src/localization/translations/en-part1.js +363 -0
- package/src/localization/translations/en-part2.js +320 -0
- package/src/localization/translations/en.js +4 -687
- package/src/localization/translations/es-part1.js +363 -0
- package/src/localization/translations/es-part2.js +320 -0
- package/src/localization/translations/es.js +4 -688
- package/src/models/file-analysis-collection.js +139 -0
- package/src/models/file-analysis-metrics.js +50 -0
- package/src/models/file-analysis.js +15 -262
- package/src/models/plan-manager.js +410 -0
- package/src/models/refactoring-models.js +380 -0
- package/src/models/refactoring-plan-refactored.js +81 -0
- package/src/models/refactoring-plan.js +2 -663
- package/src/monitoring/alert-system.js +4 -45
- package/src/monitoring/continuous-scan-notifications.js +37 -191
- package/src/monitoring/notification-handlers/base-handler.js +58 -0
- package/src/monitoring/notification-handlers/error-handler.js +36 -0
- package/src/monitoring/notification-handlers/index.js +21 -0
- package/src/monitoring/notification-handlers/new-violation-handler.js +91 -0
- package/src/monitoring/notification-handlers/progress-handler.js +48 -0
- package/src/monitoring/notification-handlers/resolved-violation-handler.js +54 -0
- package/src/monitoring/notification-handlers/threshold-handler.js +36 -0
- package/src/provider-registry.js +8 -0
- package/src/refactoring/boundary/boundary-detector-refactored.js +58 -0
- package/src/refactoring/boundary/boundary-detector.js +26 -596
- package/src/refactoring/boundary/detectors/boundary-analyzers.js +281 -0
- package/src/refactoring/boundary/detectors/boundary-core.js +167 -0
- package/src/refactoring/boundary/detectors/class-detector.js +247 -0
- package/src/refactoring/boundary/detectors/config-detector.js +270 -0
- package/src/refactoring/boundary/detectors/constant-detector.js +269 -0
- package/src/refactoring/boundary/detectors/function-detector.js +248 -0
- package/src/refactoring/boundary/detectors/module-detector.js +249 -0
- package/src/refactoring/boundary/detectors/object-detector.js +247 -0
- package/src/refactoring/boundary/detectors/type-detectors.js +338 -0
- package/src/refactoring/boundary/detectors/utility-detector.js +270 -0
- package/src/refactoring/circular-dependency-resolver-original.js +16 -76
- package/src/refactoring/code-mover-refactored.js +309 -0
- package/src/refactoring/code-mover.js +48 -355
- package/src/refactoring/execution-status.js +18 -0
- package/src/refactoring/execution-strategies.js +172 -0
- package/src/refactoring/file-splitter-core.js +568 -0
- package/src/refactoring/file-splitter-types.js +136 -0
- package/src/refactoring/file-splitter.js +2 -682
- package/src/refactoring/functionality-validator.js +11 -51
- package/src/refactoring/import-manager-refactored.js +385 -0
- package/src/refactoring/import-manager.js +112 -487
- package/src/refactoring/import-models.js +189 -0
- package/src/refactoring/import-parser.js +306 -0
- package/src/refactoring/move-executor.js +431 -0
- package/src/refactoring/move-utils.js +368 -0
- package/src/refactoring/operation-executor.js +76 -0
- package/src/refactoring/plan-creator.js +36 -0
- package/src/refactoring/plan-executor.js +143 -0
- package/src/refactoring/plan-validator.js +68 -0
- package/src/refactoring/refactoring-executor-result.js +70 -0
- package/src/refactoring/refactoring-executor.js +34 -569
- package/src/refactoring/refactoring-operation.js +94 -0
- package/src/refactoring/refactoring-plan.js +69 -0
- package/src/refactoring/refactoring-rollback.js +22 -527
- package/src/refactoring/rollback-handlers/RollbackExecutor.js +107 -0
- package/src/refactoring/rollback-handlers/RollbackManager.js +265 -0
- package/src/refactoring/rollback-handlers/RollbackOperation.js +105 -0
- package/src/refactoring/rollback-handlers/RollbackResult.js +109 -0
- package/src/refactoring/rollback-handlers/RollbackStatistics.js +77 -0
- package/src/refactoring/test-validator.js +32 -448
- package/src/refactoring/validation/baseline-runner.js +71 -0
- package/src/refactoring/validation/report-generator.js +136 -0
- package/src/refactoring/validation/result-comparator.js +92 -0
- package/src/refactoring/validation/test-suite.js +59 -0
- package/src/refactoring/validation/test-validation-result.js +83 -0
- package/src/refactoring/validation/validation-runner.js +95 -0
- package/src/refactoring/validation/validation-status.js +18 -0
- package/src/rui/commands/AgentCommandParser.js +60 -369
- package/src/rui/commands/AgentResponseFormatter.js +7 -47
- package/src/rui/commands/parsers/CommandMapper.js +148 -0
- package/src/rui/commands/parsers/CommandValidator.js +228 -0
- package/src/rui/commands/parsers/ComponentExtractor.js +100 -0
- package/src/rui/commands/parsers/TokenParser.js +69 -0
- package/src/rui/commands/parsers/tokenizer.js +153 -0
- package/src/utils/current-requirement-operations.js +50 -1
- package/src/utils/report-generator.js +18 -514
- package/src/utils/report-generators/analysis-generator.js +115 -0
- package/src/utils/report-generators/base-generator.js +141 -0
- package/src/utils/report-generators/compliance-generator.js +41 -0
- package/src/utils/report-generators/format-handlers.js +185 -0
- package/src/utils/report-generators/refactoring-generator.js +46 -0
- package/src/utils/report-generators/validation-generator.js +63 -0
- package/src/utils/requirement-enable-disable.js +265 -0
- package/src/utils/requirement-helpers/requirement-file-ops.js +69 -1
- package/src/utils/requirement-helpers/requirement-mover.js +88 -1
- package/src/utils/requirement-helpers.js +5 -2
- package/src/utils/smoke-test-cli.js +45 -8
- package/src/utils/specification-enable-disable.js +122 -0
- package/src/utils/specification-helpers.js +30 -4
- package/src/utils/specification-migration.js +5 -5
- package/src/utils/test-comparator.js +118 -0
- package/src/utils/test-config.js +54 -0
- package/src/utils/test-executor.js +133 -0
- package/src/utils/test-parser.js +215 -0
- package/src/utils/test-runner-baseline.js +63 -0
- package/src/utils/test-runner-core.js +98 -0
- package/src/utils/test-runner-report.js +39 -0
- package/src/utils/test-runner-validation.js +71 -0
- package/src/utils/test-runner.js +11 -535
- package/src/validation/comparison-analyzer.js +333 -0
- package/src/validation/compliance-reporter-new.js +282 -0
- package/src/validation/compliance-reporter-refactored.js +344 -0
- package/src/validation/compliance-reporter.js +278 -591
- package/src/validation/compliance-utils.js +278 -0
- package/src/validation/html-generator.js +446 -0
- package/src/validation/metrics/category-calculator.js +137 -0
- package/src/validation/metrics/metrics-helpers.js +155 -0
- package/src/validation/metrics/overview-calculator.js +85 -0
- package/src/validation/metrics/overview-metrics.js +41 -0
- package/src/validation/metrics/quality-calculator.js +166 -0
- package/src/validation/metrics/size-calculator.js +69 -0
- 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
|
|
9
|
-
const
|
|
10
|
-
const { RollbackManager } = require('
|
|
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.
|
|
214
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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) {
|
|
447
|
-
|
|
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
|
-
|
|
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
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|