agentic-qe 1.6.1 â 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 +651 -0
- package/README.md +52 -8
- package/dist/agents/BaseAgent.d.ts +30 -10
- package/dist/agents/BaseAgent.d.ts.map +1 -1
- package/dist/agents/BaseAgent.js +115 -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/FleetCommanderAgent.d.ts +16 -0
- package/dist/agents/FleetCommanderAgent.d.ts.map +1 -1
- package/dist/agents/FleetCommanderAgent.js +35 -20
- package/dist/agents/FleetCommanderAgent.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/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +0 -2
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/lifecycle/AgentLifecycleManager.d.ts +5 -0
- package/dist/agents/lifecycle/AgentLifecycleManager.d.ts.map +1 -1
- package/dist/agents/lifecycle/AgentLifecycleManager.js +10 -0
- package/dist/agents/lifecycle/AgentLifecycleManager.js.map +1 -1
- package/dist/cli/commands/agentdb/learn.d.ts.map +1 -1
- package/dist/cli/commands/agentdb/learn.js +190 -71
- package/dist/cli/commands/agentdb/learn.js.map +1 -1
- package/dist/cli/commands/debug/agent.d.ts.map +1 -1
- package/dist/cli/commands/debug/agent.js +40 -13
- package/dist/cli/commands/debug/agent.js.map +1 -1
- package/dist/cli/commands/debug/diagnostics.js +38 -11
- package/dist/cli/commands/debug/diagnostics.js.map +1 -1
- package/dist/cli/commands/debug/health-check.js +47 -12
- package/dist/cli/commands/debug/health-check.js.map +1 -1
- package/dist/cli/commands/debug/profile.js +7 -7
- package/dist/cli/commands/debug/profile.js.map +1 -1
- package/dist/cli/commands/debug/trace.js +4 -4
- package/dist/cli/commands/debug/trace.js.map +1 -1
- package/dist/cli/commands/debug/troubleshoot.js +41 -27
- package/dist/cli/commands/debug/troubleshoot.js.map +1 -1
- 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 +71 -54
- 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/commands/test/clean.d.ts.map +1 -1
- package/dist/cli/commands/test/clean.js +26 -9
- package/dist/cli/commands/test/clean.js.map +1 -1
- package/dist/cli/commands/test/debug.js +6 -7
- package/dist/cli/commands/test/debug.js.map +1 -1
- package/dist/cli/commands/test/diff.js +4 -37
- package/dist/cli/commands/test/diff.js.map +1 -1
- package/dist/cli/commands/test/profile.js +7 -40
- package/dist/cli/commands/test/profile.js.map +1 -1
- package/dist/cli/commands/test/trace.js +4 -37
- package/dist/cli/commands/test/trace.js.map +1 -1
- package/dist/cli/index.js +14 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/ArtifactWorkflow.d.ts +4 -0
- package/dist/core/ArtifactWorkflow.d.ts.map +1 -1
- package/dist/core/ArtifactWorkflow.js +34 -13
- package/dist/core/ArtifactWorkflow.js.map +1 -1
- package/dist/core/coordination/BlackboardCoordination.d.ts +4 -0
- package/dist/core/coordination/BlackboardCoordination.d.ts.map +1 -1
- package/dist/core/coordination/BlackboardCoordination.js +28 -22
- package/dist/core/coordination/BlackboardCoordination.js.map +1 -1
- package/dist/core/coordination/ConsensusGating.d.ts +4 -0
- package/dist/core/coordination/ConsensusGating.d.ts.map +1 -1
- package/dist/core/coordination/ConsensusGating.js +25 -18
- package/dist/core/coordination/ConsensusGating.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/AgentDBService.d.ts.map +1 -1
- package/dist/core/memory/AgentDBService.js +6 -3
- package/dist/core/memory/AgentDBService.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 +157 -73
- package/dist/learning/LearningEngine.js.map +1 -1
- package/dist/learning/StateExtractor.d.ts +1 -1
- package/dist/learning/StateExtractor.d.ts.map +1 -1
- package/dist/learning/StateExtractor.js +62 -13
- package/dist/learning/StateExtractor.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/Config.d.ts.map +1 -1
- package/dist/utils/Config.js +14 -5
- package/dist/utils/Config.js.map +1 -1
- package/dist/utils/Database.d.ts.map +1 -1
- package/dist/utils/Database.js +5 -2
- package/dist/utils/Database.js.map +1 -1
- 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/Logger.d.ts +1 -1
- package/dist/utils/Logger.d.ts.map +1 -1
- package/dist/utils/Logger.js +4 -4
- package/dist/utils/Logger.js.map +1 -1
- package/dist/utils/SecurityScanner.js +1 -1
- package/dist/utils/SecurityScanner.js.map +1 -1
- 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
|
@@ -272,14 +272,14 @@ export declare const test_generate_unit: {
|
|
|
272
272
|
aiEnhanced: z.ZodOptional<z.ZodBoolean>;
|
|
273
273
|
includeEdgeCases: z.ZodOptional<z.ZodBoolean>;
|
|
274
274
|
}, "strip", z.ZodTypeAny, {
|
|
275
|
-
framework: "
|
|
275
|
+
framework: "testing" | "jest" | "mocha" | "pytest" | "junit";
|
|
276
276
|
language: "typescript" | "javascript" | "python" | "java" | "go";
|
|
277
277
|
sourceCode: string;
|
|
278
278
|
coverageGoal?: number | undefined;
|
|
279
279
|
includeEdgeCases?: boolean | undefined;
|
|
280
280
|
aiEnhanced?: boolean | undefined;
|
|
281
281
|
}, {
|
|
282
|
-
framework: "
|
|
282
|
+
framework: "testing" | "jest" | "mocha" | "pytest" | "junit";
|
|
283
283
|
language: "typescript" | "javascript" | "python" | "java" | "go";
|
|
284
284
|
sourceCode: string;
|
|
285
285
|
coverageGoal?: number | undefined;
|
|
@@ -304,14 +304,14 @@ export declare const test_generate_integration: {
|
|
|
304
304
|
includeDatabaseTests: z.ZodOptional<z.ZodBoolean>;
|
|
305
305
|
}, "strip", z.ZodTypeAny, {
|
|
306
306
|
framework?: "supertest" | "axios" | "pact" | "rest-assured" | undefined;
|
|
307
|
-
apiSpec?: string | undefined;
|
|
308
307
|
endpoints?: string[] | undefined;
|
|
308
|
+
apiSpec?: string | undefined;
|
|
309
309
|
includeContractTests?: boolean | undefined;
|
|
310
310
|
includeDatabaseTests?: boolean | undefined;
|
|
311
311
|
}, {
|
|
312
312
|
framework?: "supertest" | "axios" | "pact" | "rest-assured" | undefined;
|
|
313
|
-
apiSpec?: string | undefined;
|
|
314
313
|
endpoints?: string[] | undefined;
|
|
314
|
+
apiSpec?: string | undefined;
|
|
315
315
|
includeContractTests?: boolean | undefined;
|
|
316
316
|
includeDatabaseTests?: boolean | undefined;
|
|
317
317
|
}>;
|
|
@@ -980,14 +980,14 @@ export declare const deprecatedTools: ({
|
|
|
980
980
|
aiEnhanced: z.ZodOptional<z.ZodBoolean>;
|
|
981
981
|
includeEdgeCases: z.ZodOptional<z.ZodBoolean>;
|
|
982
982
|
}, "strip", z.ZodTypeAny, {
|
|
983
|
-
framework: "
|
|
983
|
+
framework: "testing" | "jest" | "mocha" | "pytest" | "junit";
|
|
984
984
|
language: "typescript" | "javascript" | "python" | "java" | "go";
|
|
985
985
|
sourceCode: string;
|
|
986
986
|
coverageGoal?: number | undefined;
|
|
987
987
|
includeEdgeCases?: boolean | undefined;
|
|
988
988
|
aiEnhanced?: boolean | undefined;
|
|
989
989
|
}, {
|
|
990
|
-
framework: "
|
|
990
|
+
framework: "testing" | "jest" | "mocha" | "pytest" | "junit";
|
|
991
991
|
language: "typescript" | "javascript" | "python" | "java" | "go";
|
|
992
992
|
sourceCode: string;
|
|
993
993
|
coverageGoal?: number | undefined;
|
|
@@ -1006,14 +1006,14 @@ export declare const deprecatedTools: ({
|
|
|
1006
1006
|
includeDatabaseTests: z.ZodOptional<z.ZodBoolean>;
|
|
1007
1007
|
}, "strip", z.ZodTypeAny, {
|
|
1008
1008
|
framework?: "supertest" | "axios" | "pact" | "rest-assured" | undefined;
|
|
1009
|
-
apiSpec?: string | undefined;
|
|
1010
1009
|
endpoints?: string[] | undefined;
|
|
1010
|
+
apiSpec?: string | undefined;
|
|
1011
1011
|
includeContractTests?: boolean | undefined;
|
|
1012
1012
|
includeDatabaseTests?: boolean | undefined;
|
|
1013
1013
|
}, {
|
|
1014
1014
|
framework?: "supertest" | "axios" | "pact" | "rest-assured" | undefined;
|
|
1015
|
-
apiSpec?: string | undefined;
|
|
1016
1015
|
endpoints?: string[] | undefined;
|
|
1016
|
+
apiSpec?: string | undefined;
|
|
1017
1017
|
includeContractTests?: boolean | undefined;
|
|
1018
1018
|
includeDatabaseTests?: boolean | undefined;
|
|
1019
1019
|
}>;
|
|
@@ -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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"}
|