agentic-qe 1.7.0 â 1.8.0
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/.claude/skills/sherlock-review/SKILL.md +786 -0
- package/CHANGELOG.md +531 -0
- package/README.md +37 -21
- package/dist/agents/BaseAgent.d.ts +8 -10
- package/dist/agents/BaseAgent.d.ts.map +1 -1
- package/dist/agents/BaseAgent.js +41 -43
- package/dist/agents/BaseAgent.js.map +1 -1
- package/dist/agents/CoverageAnalyzerAgent.js +2 -2
- package/dist/agents/CoverageAnalyzerAgent.js.map +1 -1
- package/dist/agents/LearningAgent.d.ts +2 -2
- package/dist/agents/LearningAgent.d.ts.map +1 -1
- package/dist/agents/LearningAgent.js +4 -4
- package/dist/agents/LearningAgent.js.map +1 -1
- package/dist/agents/TestExecutorAgent.d.ts +9 -0
- package/dist/agents/TestExecutorAgent.d.ts.map +1 -1
- package/dist/agents/TestExecutorAgent.js +60 -0
- package/dist/agents/TestExecutorAgent.js.map +1 -1
- package/dist/agents/examples/batchAnalyze.d.ts +252 -0
- package/dist/agents/examples/batchAnalyze.d.ts.map +1 -0
- package/dist/agents/examples/batchAnalyze.js +259 -0
- package/dist/agents/examples/batchAnalyze.js.map +1 -0
- package/dist/agents/examples/batchGenerate.d.ts +153 -0
- package/dist/agents/examples/batchGenerate.d.ts.map +1 -0
- package/dist/agents/examples/batchGenerate.js +166 -0
- package/dist/agents/examples/batchGenerate.js.map +1 -0
- package/dist/agents/generateWithPII.d.ts +128 -0
- package/dist/agents/generateWithPII.d.ts.map +1 -0
- package/dist/agents/generateWithPII.js +175 -0
- package/dist/agents/generateWithPII.js.map +1 -0
- package/dist/cli/commands/init.d.ts +6 -3
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +51 -46
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/learn/index.d.ts +4 -0
- package/dist/cli/commands/learn/index.d.ts.map +1 -1
- package/dist/cli/commands/learn/index.js +57 -0
- package/dist/cli/commands/learn/index.js.map +1 -1
- package/dist/cli/index.js +14 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/memory/AgentDBManager.d.ts +5 -0
- package/dist/core/memory/AgentDBManager.d.ts.map +1 -1
- package/dist/core/memory/AgentDBManager.js +19 -1
- package/dist/core/memory/AgentDBManager.js.map +1 -1
- package/dist/core/memory/RealAgentDBAdapter.d.ts +8 -0
- package/dist/core/memory/RealAgentDBAdapter.d.ts.map +1 -1
- package/dist/core/memory/RealAgentDBAdapter.js +74 -17
- package/dist/core/memory/RealAgentDBAdapter.js.map +1 -1
- package/dist/core/memory/ReasoningBankAdapter.d.ts +4 -0
- package/dist/core/memory/ReasoningBankAdapter.d.ts.map +1 -1
- package/dist/core/memory/ReasoningBankAdapter.js +20 -0
- package/dist/core/memory/ReasoningBankAdapter.js.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.d.ts +8 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.js +33 -0
- package/dist/core/memory/SwarmMemoryManager.js.map +1 -1
- package/dist/learning/ImprovementLoop.js +2 -2
- package/dist/learning/ImprovementLoop.js.map +1 -1
- package/dist/learning/LearningEngine.d.ts +11 -7
- package/dist/learning/LearningEngine.d.ts.map +1 -1
- package/dist/learning/LearningEngine.js +156 -72
- package/dist/learning/LearningEngine.js.map +1 -1
- package/dist/mcp/handlers/filtered/coverage-analyzer-filtered.d.ts +83 -0
- package/dist/mcp/handlers/filtered/coverage-analyzer-filtered.d.ts.map +1 -0
- package/dist/mcp/handlers/filtered/coverage-analyzer-filtered.js +130 -0
- package/dist/mcp/handlers/filtered/coverage-analyzer-filtered.js.map +1 -0
- package/dist/mcp/handlers/filtered/flaky-detector-filtered.d.ts +58 -0
- package/dist/mcp/handlers/filtered/flaky-detector-filtered.d.ts.map +1 -0
- package/dist/mcp/handlers/filtered/flaky-detector-filtered.js +84 -0
- package/dist/mcp/handlers/filtered/flaky-detector-filtered.js.map +1 -0
- package/dist/mcp/handlers/filtered/index.d.ts +47 -0
- package/dist/mcp/handlers/filtered/index.d.ts.map +1 -0
- package/dist/mcp/handlers/filtered/index.js +63 -0
- package/dist/mcp/handlers/filtered/index.js.map +1 -0
- package/dist/mcp/handlers/filtered/performance-tester-filtered.d.ts +57 -0
- package/dist/mcp/handlers/filtered/performance-tester-filtered.d.ts.map +1 -0
- package/dist/mcp/handlers/filtered/performance-tester-filtered.js +83 -0
- package/dist/mcp/handlers/filtered/performance-tester-filtered.js.map +1 -0
- package/dist/mcp/handlers/filtered/quality-assessor-filtered.d.ts +57 -0
- package/dist/mcp/handlers/filtered/quality-assessor-filtered.d.ts.map +1 -0
- package/dist/mcp/handlers/filtered/quality-assessor-filtered.js +93 -0
- package/dist/mcp/handlers/filtered/quality-assessor-filtered.js.map +1 -0
- package/dist/mcp/handlers/filtered/security-scanner-filtered.d.ts +54 -0
- package/dist/mcp/handlers/filtered/security-scanner-filtered.d.ts.map +1 -0
- package/dist/mcp/handlers/filtered/security-scanner-filtered.js +73 -0
- package/dist/mcp/handlers/filtered/security-scanner-filtered.js.map +1 -0
- package/dist/mcp/handlers/filtered/test-executor-filtered.d.ts +61 -0
- package/dist/mcp/handlers/filtered/test-executor-filtered.d.ts.map +1 -0
- package/dist/mcp/handlers/filtered/test-executor-filtered.js +117 -0
- package/dist/mcp/handlers/filtered/test-executor-filtered.js.map +1 -0
- package/dist/mcp/handlers/phase2/Phase2Tools.js +2 -2
- package/dist/mcp/handlers/phase2/Phase2Tools.js.map +1 -1
- package/dist/mcp/tools/deprecated.d.ts +8 -8
- package/dist/scripts/backup-helper.d.ts +64 -0
- package/dist/scripts/backup-helper.d.ts.map +1 -0
- package/dist/scripts/backup-helper.js +251 -0
- package/dist/scripts/backup-helper.js.map +1 -0
- package/dist/scripts/migrate-with-backup.d.ts +15 -0
- package/dist/scripts/migrate-with-backup.d.ts.map +1 -0
- package/dist/scripts/migrate-with-backup.js +194 -0
- package/dist/scripts/migrate-with-backup.js.map +1 -0
- package/dist/security/pii-tokenization.d.ts +216 -0
- package/dist/security/pii-tokenization.d.ts.map +1 -0
- package/dist/security/pii-tokenization.js +325 -0
- package/dist/security/pii-tokenization.js.map +1 -0
- package/dist/utils/EmbeddingGenerator.d.ts +35 -0
- package/dist/utils/EmbeddingGenerator.d.ts.map +1 -0
- package/dist/utils/EmbeddingGenerator.js +72 -0
- package/dist/utils/EmbeddingGenerator.js.map +1 -0
- package/dist/utils/batch-operations.d.ts +215 -0
- package/dist/utils/batch-operations.d.ts.map +1 -0
- package/dist/utils/batch-operations.js +266 -0
- package/dist/utils/batch-operations.js.map +1 -0
- package/dist/utils/filtering.d.ts +180 -0
- package/dist/utils/filtering.d.ts.map +1 -0
- package/dist/utils/filtering.js +288 -0
- package/dist/utils/filtering.js.map +1 -0
- package/dist/utils/prompt-cache-examples.d.ts +111 -0
- package/dist/utils/prompt-cache-examples.d.ts.map +1 -0
- package/dist/utils/prompt-cache-examples.js +416 -0
- package/dist/utils/prompt-cache-examples.js.map +1 -0
- package/dist/utils/prompt-cache.d.ts +305 -0
- package/dist/utils/prompt-cache.d.ts.map +1 -0
- package/dist/utils/prompt-cache.js +448 -0
- package/dist/utils/prompt-cache.js.map +1 -0
- package/package.json +6 -3
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backup Helper for Database Migration
|
|
3
|
+
* Integrates backup system with migration scripts
|
|
4
|
+
*/
|
|
5
|
+
export interface BackupResult {
|
|
6
|
+
success: boolean;
|
|
7
|
+
timestamp: string;
|
|
8
|
+
files: string[];
|
|
9
|
+
totalSize: number;
|
|
10
|
+
compressed: boolean;
|
|
11
|
+
error?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface RestoreResult {
|
|
14
|
+
success: boolean;
|
|
15
|
+
timestamp: string;
|
|
16
|
+
filesRestored: number;
|
|
17
|
+
error?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare class BackupHelper {
|
|
20
|
+
private backupDir;
|
|
21
|
+
private scriptsDir;
|
|
22
|
+
/**
|
|
23
|
+
* Create a database backup before migration
|
|
24
|
+
*/
|
|
25
|
+
createBackup(options?: {
|
|
26
|
+
compress?: boolean;
|
|
27
|
+
verify?: boolean;
|
|
28
|
+
}): Promise<BackupResult>;
|
|
29
|
+
/**
|
|
30
|
+
* Restore database from backup
|
|
31
|
+
*/
|
|
32
|
+
restoreBackup(timestamp: string, options?: {
|
|
33
|
+
verify?: boolean;
|
|
34
|
+
force?: boolean;
|
|
35
|
+
}): Promise<RestoreResult>;
|
|
36
|
+
/**
|
|
37
|
+
* List available backups
|
|
38
|
+
*/
|
|
39
|
+
listBackups(): Promise<Array<{
|
|
40
|
+
timestamp: string;
|
|
41
|
+
date: string;
|
|
42
|
+
files: number;
|
|
43
|
+
size: number;
|
|
44
|
+
metadata?: any;
|
|
45
|
+
}>>;
|
|
46
|
+
/**
|
|
47
|
+
* Verify backup integrity
|
|
48
|
+
*/
|
|
49
|
+
verifyBackup(timestamp: string): Promise<boolean>;
|
|
50
|
+
/**
|
|
51
|
+
* Clean old backups
|
|
52
|
+
*/
|
|
53
|
+
cleanOldBackups(keepLast?: number): Promise<number>;
|
|
54
|
+
/**
|
|
55
|
+
* Get backup files for a specific timestamp
|
|
56
|
+
*/
|
|
57
|
+
private getBackupFiles;
|
|
58
|
+
/**
|
|
59
|
+
* Create automatic backup before dangerous operation
|
|
60
|
+
*/
|
|
61
|
+
createSafetyBackup(operationName: string): Promise<BackupResult>;
|
|
62
|
+
}
|
|
63
|
+
export declare const backupHelper: BackupHelper;
|
|
64
|
+
//# sourceMappingURL=backup-helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-helper.d.ts","sourceRoot":"","sources":["../../src/scripts/backup-helper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,UAAU,CAAa;IAE/B;;OAEG;IACG,YAAY,CAAC,OAAO,GAAE;QAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,MAAM,CAAC,EAAE,OAAO,CAAC;KACb,GAAG,OAAO,CAAC,YAAY,CAAC;IA4D9B;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE;QAC9C,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,OAAO,CAAC;KACZ,GAAG,OAAO,CAAC,aAAa,CAAC;IA6C/B;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC;QACjC,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,GAAG,CAAC;KAChB,CAAC,CAAC;IAkDH;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAcvD;;OAEG;IACG,eAAe,CAAC,QAAQ,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAe7D;;OAEG;YACW,cAAc;IAa5B;;OAEG;IACG,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAevE;AAGD,eAAO,MAAM,YAAY,cAAqB,CAAC"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Backup Helper for Database Migration
|
|
4
|
+
* Integrates backup system with migration scripts
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.backupHelper = exports.BackupHelper = void 0;
|
|
41
|
+
const child_process_1 = require("child_process");
|
|
42
|
+
const util_1 = require("util");
|
|
43
|
+
const fs = __importStar(require("fs/promises"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
46
|
+
class BackupHelper {
|
|
47
|
+
constructor() {
|
|
48
|
+
this.backupDir = '.agentic-qe/backups';
|
|
49
|
+
this.scriptsDir = 'scripts';
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create a database backup before migration
|
|
53
|
+
*/
|
|
54
|
+
async createBackup(options = {}) {
|
|
55
|
+
const { compress = true, verify = true } = options;
|
|
56
|
+
try {
|
|
57
|
+
console.log('đ Creating database backup...');
|
|
58
|
+
const flags = [
|
|
59
|
+
compress ? '--compress' : '',
|
|
60
|
+
!verify ? '--no-verify' : ''
|
|
61
|
+
].filter(Boolean).join(' ');
|
|
62
|
+
const backupScript = path.join(this.scriptsDir, 'backup-databases.sh');
|
|
63
|
+
// Make script executable
|
|
64
|
+
await execAsync(`chmod +x ${backupScript}`);
|
|
65
|
+
// Run backup
|
|
66
|
+
const { stdout, stderr } = await execAsync(`${backupScript} ${flags}`);
|
|
67
|
+
console.log(stdout);
|
|
68
|
+
if (stderr) {
|
|
69
|
+
console.warn('Backup warnings:', stderr);
|
|
70
|
+
}
|
|
71
|
+
// Parse output to get timestamp
|
|
72
|
+
const timestampMatch = stdout.match(/Timestamp: (\d{8}-\d{6})/);
|
|
73
|
+
const timestamp = timestampMatch ? timestampMatch[1] : '';
|
|
74
|
+
// Get backup files
|
|
75
|
+
const files = await this.getBackupFiles(timestamp);
|
|
76
|
+
// Calculate total size
|
|
77
|
+
let totalSize = 0;
|
|
78
|
+
for (const file of files) {
|
|
79
|
+
const stats = await fs.stat(file);
|
|
80
|
+
totalSize += stats.size;
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
success: true,
|
|
84
|
+
timestamp,
|
|
85
|
+
files,
|
|
86
|
+
totalSize,
|
|
87
|
+
compressed: compress
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
92
|
+
console.error('â Backup failed:', errorMessage);
|
|
93
|
+
return {
|
|
94
|
+
success: false,
|
|
95
|
+
timestamp: '',
|
|
96
|
+
files: [],
|
|
97
|
+
totalSize: 0,
|
|
98
|
+
compressed: false,
|
|
99
|
+
error: errorMessage
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Restore database from backup
|
|
105
|
+
*/
|
|
106
|
+
async restoreBackup(timestamp, options = {}) {
|
|
107
|
+
const { verify = true, force = false } = options;
|
|
108
|
+
try {
|
|
109
|
+
console.log(`đ Restoring database backup: ${timestamp}...`);
|
|
110
|
+
const flags = [
|
|
111
|
+
!verify ? '--no-verify' : '',
|
|
112
|
+
force ? '--force' : ''
|
|
113
|
+
].filter(Boolean).join(' ');
|
|
114
|
+
const restoreScript = path.join(this.scriptsDir, 'restore-databases.sh');
|
|
115
|
+
// Make script executable
|
|
116
|
+
await execAsync(`chmod +x ${restoreScript}`);
|
|
117
|
+
// Run restore (with force flag to skip confirmation)
|
|
118
|
+
const { stdout, stderr } = await execAsync(`${restoreScript} ${timestamp} ${flags}`);
|
|
119
|
+
console.log(stdout);
|
|
120
|
+
if (stderr) {
|
|
121
|
+
console.warn('Restore warnings:', stderr);
|
|
122
|
+
}
|
|
123
|
+
// Count restored files
|
|
124
|
+
const filesRestored = await this.getBackupFiles(timestamp);
|
|
125
|
+
return {
|
|
126
|
+
success: true,
|
|
127
|
+
timestamp,
|
|
128
|
+
filesRestored: filesRestored.length
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
133
|
+
console.error('â Restore failed:', errorMessage);
|
|
134
|
+
return {
|
|
135
|
+
success: false,
|
|
136
|
+
timestamp,
|
|
137
|
+
filesRestored: 0,
|
|
138
|
+
error: errorMessage
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* List available backups
|
|
144
|
+
*/
|
|
145
|
+
async listBackups() {
|
|
146
|
+
try {
|
|
147
|
+
const backupFiles = await fs.readdir(this.backupDir);
|
|
148
|
+
const backupPattern = /\.backup\.(\d{8}-\d{6})/;
|
|
149
|
+
const timestamps = new Set();
|
|
150
|
+
for (const file of backupFiles) {
|
|
151
|
+
const match = file.match(backupPattern);
|
|
152
|
+
if (match) {
|
|
153
|
+
timestamps.add(match[1]);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const backups = [];
|
|
157
|
+
for (const timestamp of Array.from(timestamps).sort().reverse()) {
|
|
158
|
+
const files = await this.getBackupFiles(timestamp);
|
|
159
|
+
let totalSize = 0;
|
|
160
|
+
for (const file of files) {
|
|
161
|
+
const stats = await fs.stat(file);
|
|
162
|
+
totalSize += stats.size;
|
|
163
|
+
}
|
|
164
|
+
let metadata;
|
|
165
|
+
const metadataFile = path.join(this.backupDir, `backup-metadata.${timestamp}.json`);
|
|
166
|
+
try {
|
|
167
|
+
const metadataContent = await fs.readFile(metadataFile, 'utf-8');
|
|
168
|
+
metadata = JSON.parse(metadataContent);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
// Metadata not available
|
|
172
|
+
}
|
|
173
|
+
backups.push({
|
|
174
|
+
timestamp,
|
|
175
|
+
date: metadata?.date || timestamp,
|
|
176
|
+
files: files.length,
|
|
177
|
+
size: totalSize,
|
|
178
|
+
metadata
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
return backups;
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
console.error('Failed to list backups:', error);
|
|
185
|
+
return [];
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Verify backup integrity
|
|
190
|
+
*/
|
|
191
|
+
async verifyBackup(timestamp) {
|
|
192
|
+
try {
|
|
193
|
+
const manageScript = path.join(this.scriptsDir, 'manage-backups.sh');
|
|
194
|
+
await execAsync(`chmod +x ${manageScript}`);
|
|
195
|
+
const { stdout } = await execAsync(`${manageScript} verify ${timestamp}`);
|
|
196
|
+
return stdout.includes('All files verified');
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
console.error('Backup verification failed:', error);
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Clean old backups
|
|
205
|
+
*/
|
|
206
|
+
async cleanOldBackups(keepLast = 10) {
|
|
207
|
+
try {
|
|
208
|
+
const manageScript = path.join(this.scriptsDir, 'manage-backups.sh');
|
|
209
|
+
await execAsync(`chmod +x ${manageScript}`);
|
|
210
|
+
const { stdout } = await execAsync(`${manageScript} clean ${keepLast}`);
|
|
211
|
+
const removedMatch = stdout.match(/Removed (\d+) old backup/);
|
|
212
|
+
return removedMatch ? parseInt(removedMatch[1]) : 0;
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
console.error('Failed to clean old backups:', error);
|
|
216
|
+
return 0;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Get backup files for a specific timestamp
|
|
221
|
+
*/
|
|
222
|
+
async getBackupFiles(timestamp) {
|
|
223
|
+
try {
|
|
224
|
+
const allFiles = await fs.readdir(this.backupDir);
|
|
225
|
+
const backupFiles = allFiles.filter(f => f.includes(`.backup.${timestamp}`) && !f.endsWith('.sha256'));
|
|
226
|
+
return backupFiles.map(f => path.join(this.backupDir, f));
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
return [];
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Create automatic backup before dangerous operation
|
|
234
|
+
*/
|
|
235
|
+
async createSafetyBackup(operationName) {
|
|
236
|
+
console.log(`đĄī¸ Creating safety backup before: ${operationName}`);
|
|
237
|
+
const result = await this.createBackup({
|
|
238
|
+
compress: true,
|
|
239
|
+
verify: true
|
|
240
|
+
});
|
|
241
|
+
if (result.success) {
|
|
242
|
+
console.log(`â
Safety backup created: ${result.timestamp}`);
|
|
243
|
+
console.log(` Use this to rollback: ./scripts/restore-databases.sh ${result.timestamp}`);
|
|
244
|
+
}
|
|
245
|
+
return result;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
exports.BackupHelper = BackupHelper;
|
|
249
|
+
// Export singleton instance
|
|
250
|
+
exports.backupHelper = new BackupHelper();
|
|
251
|
+
//# sourceMappingURL=backup-helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-helper.js","sourceRoot":"","sources":["../../src/scripts/backup-helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Database Migration with Integrated Backup System
|
|
4
|
+
*
|
|
5
|
+
* This script demonstrates how to safely perform database migrations
|
|
6
|
+
* with automatic backup and restore capabilities.
|
|
7
|
+
*/
|
|
8
|
+
interface MigrationOptions {
|
|
9
|
+
skipBackup?: boolean;
|
|
10
|
+
autoRestore?: boolean;
|
|
11
|
+
verifyBackup?: boolean;
|
|
12
|
+
}
|
|
13
|
+
declare function performDatabaseMigration(options?: MigrationOptions): Promise<void>;
|
|
14
|
+
export { performDatabaseMigration };
|
|
15
|
+
//# sourceMappingURL=migrate-with-backup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-with-backup.d.ts","sourceRoot":"","sources":["../../src/scripts/migrate-with-backup.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAIH,UAAU,gBAAgB;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,iBAAe,wBAAwB,CAAC,OAAO,GAAE,gBAAqB,iBAyGrE;AA4GD,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Database Migration with Integrated Backup System
|
|
5
|
+
*
|
|
6
|
+
* This script demonstrates how to safely perform database migrations
|
|
7
|
+
* with automatic backup and restore capabilities.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.performDatabaseMigration = performDatabaseMigration;
|
|
11
|
+
const backup_helper_1 = require("./backup-helper");
|
|
12
|
+
async function performDatabaseMigration(options = {}) {
|
|
13
|
+
const { skipBackup = false, autoRestore = true, verifyBackup = true } = options;
|
|
14
|
+
let backupTimestamp;
|
|
15
|
+
try {
|
|
16
|
+
console.log('đ Starting Database Migration');
|
|
17
|
+
console.log('================================');
|
|
18
|
+
console.log('');
|
|
19
|
+
// Step 1: Create safety backup
|
|
20
|
+
if (!skipBackup) {
|
|
21
|
+
console.log('đĻ Step 1: Creating pre-migration backup...');
|
|
22
|
+
const backupResult = await backup_helper_1.backupHelper.createSafetyBackup('database-migration');
|
|
23
|
+
if (!backupResult.success) {
|
|
24
|
+
console.error('â Backup failed! Aborting migration.');
|
|
25
|
+
console.error('Error:', backupResult.error);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
backupTimestamp = backupResult.timestamp;
|
|
29
|
+
console.log(`â
Backup created: ${backupTimestamp}`);
|
|
30
|
+
console.log(` Files: ${backupResult.files.length}`);
|
|
31
|
+
console.log(` Size: ${formatBytes(backupResult.totalSize)}`);
|
|
32
|
+
console.log('');
|
|
33
|
+
// Verify backup if requested
|
|
34
|
+
if (verifyBackup) {
|
|
35
|
+
console.log('đ Verifying backup integrity...');
|
|
36
|
+
const isValid = await backup_helper_1.backupHelper.verifyBackup(backupTimestamp);
|
|
37
|
+
if (!isValid) {
|
|
38
|
+
console.error('â Backup verification failed! Aborting migration.');
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
console.log('â
Backup verified');
|
|
42
|
+
console.log('');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
console.log('â ī¸ Skipping backup (--skip-backup flag)');
|
|
47
|
+
console.log('');
|
|
48
|
+
}
|
|
49
|
+
// Step 2: Perform migration
|
|
50
|
+
console.log('đ Step 2: Performing migration...');
|
|
51
|
+
await executeMigrationSteps();
|
|
52
|
+
console.log('â
Migration completed successfully');
|
|
53
|
+
console.log('');
|
|
54
|
+
// Step 3: Verify migration
|
|
55
|
+
console.log('â
Step 3: Verifying migration...');
|
|
56
|
+
await verifyMigration();
|
|
57
|
+
console.log('â
Migration verification passed');
|
|
58
|
+
console.log('');
|
|
59
|
+
// Success!
|
|
60
|
+
console.log('đ Migration Complete!');
|
|
61
|
+
console.log('=====================');
|
|
62
|
+
if (backupTimestamp) {
|
|
63
|
+
console.log(`Safety backup: ${backupTimestamp}`);
|
|
64
|
+
console.log(`To rollback: ./scripts/restore-databases.sh ${backupTimestamp} --force`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.error('');
|
|
69
|
+
console.error('â Migration Failed!');
|
|
70
|
+
console.error('====================');
|
|
71
|
+
console.error('Error:', error instanceof Error ? error.message : String(error));
|
|
72
|
+
console.error('');
|
|
73
|
+
// Automatic restore if enabled and backup exists
|
|
74
|
+
if (autoRestore && backupTimestamp) {
|
|
75
|
+
console.log('đ Auto-restore enabled. Restoring from backup...');
|
|
76
|
+
try {
|
|
77
|
+
const restoreResult = await backup_helper_1.backupHelper.restoreBackup(backupTimestamp, {
|
|
78
|
+
verify: true,
|
|
79
|
+
force: true
|
|
80
|
+
});
|
|
81
|
+
if (restoreResult.success) {
|
|
82
|
+
console.log('â
Database restored to pre-migration state');
|
|
83
|
+
console.log(` Files restored: ${restoreResult.filesRestored}`);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
console.error('â Auto-restore failed!');
|
|
87
|
+
console.error('Manual restore required:');
|
|
88
|
+
console.error(` ./scripts/restore-databases.sh ${backupTimestamp} --force`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (restoreError) {
|
|
92
|
+
console.error('â Auto-restore failed with error:', restoreError);
|
|
93
|
+
console.error('Manual restore required:');
|
|
94
|
+
console.error(` ./scripts/restore-databases.sh ${backupTimestamp} --force`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else if (backupTimestamp) {
|
|
98
|
+
console.log('âšī¸ To restore manually:');
|
|
99
|
+
console.log(` ./scripts/restore-databases.sh ${backupTimestamp} --force`);
|
|
100
|
+
}
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Execute actual migration steps
|
|
106
|
+
* Replace this with your actual migration logic
|
|
107
|
+
*/
|
|
108
|
+
async function executeMigrationSteps() {
|
|
109
|
+
// Example migration steps:
|
|
110
|
+
// 1. Update schema
|
|
111
|
+
// 2. Migrate data
|
|
112
|
+
// 3. Update indexes
|
|
113
|
+
// 4. Clean up old data
|
|
114
|
+
console.log(' - Updating schema...');
|
|
115
|
+
await simulateStep(1000);
|
|
116
|
+
console.log(' - Migrating data...');
|
|
117
|
+
await simulateStep(2000);
|
|
118
|
+
console.log(' - Creating indexes...');
|
|
119
|
+
await simulateStep(1000);
|
|
120
|
+
console.log(' - Cleaning up...');
|
|
121
|
+
await simulateStep(500);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Verify migration success
|
|
125
|
+
*/
|
|
126
|
+
async function verifyMigration() {
|
|
127
|
+
console.log(' - Checking schema integrity...');
|
|
128
|
+
await simulateStep(500);
|
|
129
|
+
console.log(' - Validating data...');
|
|
130
|
+
await simulateStep(500);
|
|
131
|
+
console.log(' - Testing queries...');
|
|
132
|
+
await simulateStep(500);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Simulate async step
|
|
136
|
+
*/
|
|
137
|
+
function simulateStep(ms) {
|
|
138
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Format bytes to human readable
|
|
142
|
+
*/
|
|
143
|
+
function formatBytes(bytes) {
|
|
144
|
+
if (bytes === 0)
|
|
145
|
+
return '0 Bytes';
|
|
146
|
+
const k = 1024;
|
|
147
|
+
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
|
|
148
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
149
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* CLI entry point
|
|
153
|
+
*/
|
|
154
|
+
async function main() {
|
|
155
|
+
const args = process.argv.slice(2);
|
|
156
|
+
const options = {
|
|
157
|
+
skipBackup: args.includes('--skip-backup'),
|
|
158
|
+
autoRestore: !args.includes('--no-auto-restore'),
|
|
159
|
+
verifyBackup: !args.includes('--no-verify')
|
|
160
|
+
};
|
|
161
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
162
|
+
console.log(`
|
|
163
|
+
Database Migration with Backup
|
|
164
|
+
|
|
165
|
+
Usage: node migrate-with-backup.js [options]
|
|
166
|
+
|
|
167
|
+
Options:
|
|
168
|
+
--skip-backup Skip pre-migration backup (dangerous!)
|
|
169
|
+
--no-auto-restore Disable automatic restore on failure
|
|
170
|
+
--no-verify Skip backup verification
|
|
171
|
+
--help, -h Show this help message
|
|
172
|
+
|
|
173
|
+
Examples:
|
|
174
|
+
# Normal migration with backup
|
|
175
|
+
node migrate-with-backup.js
|
|
176
|
+
|
|
177
|
+
# Migration without verification (faster)
|
|
178
|
+
node migrate-with-backup.js --no-verify
|
|
179
|
+
|
|
180
|
+
# Migration without auto-restore
|
|
181
|
+
node migrate-with-backup.js --no-auto-restore
|
|
182
|
+
`);
|
|
183
|
+
process.exit(0);
|
|
184
|
+
}
|
|
185
|
+
await performDatabaseMigration(options);
|
|
186
|
+
}
|
|
187
|
+
// Run if called directly
|
|
188
|
+
if (require.main === module) {
|
|
189
|
+
main().catch(error => {
|
|
190
|
+
console.error('Fatal error:', error);
|
|
191
|
+
process.exit(1);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=migrate-with-backup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-with-backup.js","sourceRoot":"","sources":["../../src/scripts/migrate-with-backup.ts"],"names":[],"mappings":"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"}
|