@savestate/cli 0.5.0 → 0.6.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.
Files changed (35) hide show
  1. package/dist/cli.js +8 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/mcp/server.d.ts +26 -0
  4. package/dist/mcp/server.d.ts.map +1 -0
  5. package/dist/mcp/server.js +371 -0
  6. package/dist/mcp/server.js.map +1 -0
  7. package/dist/migrate/capabilities.d.ts +23 -0
  8. package/dist/migrate/capabilities.d.ts.map +1 -0
  9. package/dist/migrate/capabilities.js +80 -0
  10. package/dist/migrate/capabilities.js.map +1 -0
  11. package/dist/migrate/extractors/registry.d.ts +24 -0
  12. package/dist/migrate/extractors/registry.d.ts.map +1 -0
  13. package/dist/migrate/extractors/registry.js +38 -0
  14. package/dist/migrate/extractors/registry.js.map +1 -0
  15. package/dist/migrate/index.d.ts +13 -0
  16. package/dist/migrate/index.d.ts.map +1 -0
  17. package/dist/migrate/index.js +15 -0
  18. package/dist/migrate/index.js.map +1 -0
  19. package/dist/migrate/loaders/registry.d.ts +24 -0
  20. package/dist/migrate/loaders/registry.d.ts.map +1 -0
  21. package/dist/migrate/loaders/registry.js +38 -0
  22. package/dist/migrate/loaders/registry.js.map +1 -0
  23. package/dist/migrate/orchestrator.d.ts +77 -0
  24. package/dist/migrate/orchestrator.d.ts.map +1 -0
  25. package/dist/migrate/orchestrator.js +322 -0
  26. package/dist/migrate/orchestrator.js.map +1 -0
  27. package/dist/migrate/transformers/registry.d.ts +27 -0
  28. package/dist/migrate/transformers/registry.d.ts.map +1 -0
  29. package/dist/migrate/transformers/registry.js +47 -0
  30. package/dist/migrate/transformers/registry.js.map +1 -0
  31. package/dist/migrate/types.d.ts +350 -0
  32. package/dist/migrate/types.d.ts.map +1 -0
  33. package/dist/migrate/types.js +8 -0
  34. package/dist/migrate/types.js.map +1 -0
  35. package/package.json +4 -2
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Migration Wizard
3
+ *
4
+ * Platform-to-platform AI identity migration.
5
+ * Extract → Transform → Load
6
+ */
7
+ // Orchestrator
8
+ export { MigrationOrchestrator } from './orchestrator.js';
9
+ // Registries
10
+ export { getExtractor, registerExtractor, listExtractors, hasExtractor } from './extractors/registry.js';
11
+ export { getTransformer, registerTransformer, listTransformers, hasTransformer } from './transformers/registry.js';
12
+ export { getLoader, registerLoader, listLoaders, hasLoader } from './loaders/registry.js';
13
+ // Platform capabilities (for compatibility checking)
14
+ export { getPlatformCapabilities, PLATFORM_CAPABILITIES } from './capabilities.js';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrate/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwBH,eAAe;AACf,OAAO,EAAE,qBAAqB,EAAmD,MAAM,mBAAmB,CAAC;AAE3G,aAAa;AACb,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACzG,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACnH,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAE1F,qDAAqD;AACrD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Loader Registry
3
+ *
4
+ * Manages available loaders for different platforms.
5
+ * New loaders are registered here.
6
+ */
7
+ import type { Platform, Loader } from '../types.js';
8
+ /**
9
+ * Register a loader for a platform.
10
+ */
11
+ export declare function registerLoader(platform: Platform, factory: () => Loader): void;
12
+ /**
13
+ * Get a loader for a platform.
14
+ */
15
+ export declare function getLoader(platform: Platform): Loader | null;
16
+ /**
17
+ * List all registered loaders.
18
+ */
19
+ export declare function listLoaders(): Platform[];
20
+ /**
21
+ * Check if a loader exists for a platform.
22
+ */
23
+ export declare function hasLoader(platform: Platform): boolean;
24
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/migrate/loaders/registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIpD;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,MAAM,GAAG,IAAI,CAE9E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAG3D;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,QAAQ,EAAE,CAExC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAErD"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Loader Registry
3
+ *
4
+ * Manages available loaders for different platforms.
5
+ * New loaders are registered here.
6
+ */
7
+ const loaders = new Map();
8
+ /**
9
+ * Register a loader for a platform.
10
+ */
11
+ export function registerLoader(platform, factory) {
12
+ loaders.set(platform, factory);
13
+ }
14
+ /**
15
+ * Get a loader for a platform.
16
+ */
17
+ export function getLoader(platform) {
18
+ const factory = loaders.get(platform);
19
+ return factory ? factory() : null;
20
+ }
21
+ /**
22
+ * List all registered loaders.
23
+ */
24
+ export function listLoaders() {
25
+ return [...loaders.keys()];
26
+ }
27
+ /**
28
+ * Check if a loader exists for a platform.
29
+ */
30
+ export function hasLoader(platform) {
31
+ return loaders.has(platform);
32
+ }
33
+ // ─── Register Built-in Loaders ───────────────────────────────
34
+ // Claude loader will be registered in #25
35
+ // registerLoader('claude', () => new ClaudeLoader());
36
+ // ChatGPT loader will be registered in #30
37
+ // registerLoader('chatgpt', () => new ChatGPTLoader());
38
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/migrate/loaders/registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;AAElD;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAkB,EAAE,OAAqB;IACtE,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,QAAkB;IAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtC,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,QAAkB;IAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED,gEAAgE;AAEhE,0CAA0C;AAC1C,sDAAsD;AAEtD,2CAA2C;AAC3C,wDAAwD"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Migration Orchestrator
3
+ *
4
+ * Coordinates the three-phase migration process:
5
+ * Extract → Transform → Load
6
+ *
7
+ * Features:
8
+ * - Phase checkpoint/resume capability
9
+ * - Progress tracking
10
+ * - Error recovery
11
+ * - Rollback support
12
+ */
13
+ import type { Platform, MigrationBundle, MigrationState, MigrationPhase, MigrationOptions, CompatibilityReport, LoadResult } from './types.js';
14
+ export type MigrationEventType = 'phase:start' | 'phase:complete' | 'phase:error' | 'progress' | 'checkpoint' | 'complete' | 'error';
15
+ export interface MigrationEvent {
16
+ type: MigrationEventType;
17
+ phase?: MigrationPhase;
18
+ progress?: number;
19
+ message?: string;
20
+ error?: Error;
21
+ data?: unknown;
22
+ }
23
+ export type MigrationEventHandler = (event: MigrationEvent) => void;
24
+ export declare class MigrationOrchestrator {
25
+ private state;
26
+ private bundle;
27
+ private eventHandlers;
28
+ private workDir;
29
+ constructor(source: Platform, target: Platform, options?: MigrationOptions);
30
+ /**
31
+ * Run the full migration pipeline.
32
+ */
33
+ run(): Promise<LoadResult>;
34
+ /**
35
+ * Run only the extract phase (useful for debugging/inspection).
36
+ */
37
+ extract(): Promise<MigrationBundle>;
38
+ /**
39
+ * Generate compatibility report without running full migration.
40
+ */
41
+ analyze(): Promise<CompatibilityReport>;
42
+ /**
43
+ * Resume a failed or interrupted migration.
44
+ */
45
+ static resume(migrationId: string, workDir?: string): Promise<MigrationOrchestrator>;
46
+ /**
47
+ * Resume and continue the migration from where it left off.
48
+ */
49
+ continue(): Promise<LoadResult>;
50
+ /**
51
+ * Clean up migration artifacts.
52
+ */
53
+ cleanup(): Promise<void>;
54
+ /**
55
+ * Subscribe to migration events.
56
+ */
57
+ on(handler: MigrationEventHandler): () => void;
58
+ /**
59
+ * Get current migration state.
60
+ */
61
+ getState(): MigrationState;
62
+ /**
63
+ * Get the migration bundle (if extracted).
64
+ */
65
+ getBundle(): MigrationBundle | null;
66
+ private runExtractPhase;
67
+ private runTransformPhase;
68
+ private runLoadPhase;
69
+ private generateId;
70
+ private ensureWorkDir;
71
+ private setPhase;
72
+ private saveState;
73
+ private saveCheckpoint;
74
+ private loadCheckpoint;
75
+ private emit;
76
+ }
77
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/migrate/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EACf,cAAc,EACd,cAAc,EAEd,gBAAgB,EAChB,mBAAmB,EAInB,UAAU,EACX,MAAM,YAAY,CAAC;AAQpB,MAAM,MAAM,kBAAkB,GAC1B,aAAa,GACb,gBAAgB,GAChB,aAAa,GACb,UAAU,GACV,YAAY,GACZ,UAAU,GACV,OAAO,CAAC;AAEZ,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;AAIpE,qBAAa,qBAAqB;IAChC,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,OAAO,CAAS;gBAGtB,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,QAAQ,EAChB,OAAO,GAAE,gBAAqB;IAoBhC;;OAEG;IACG,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;IA+BhC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC;IAMzC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAkB7C;;OAEG;WACU,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAwB1F;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IA+BrC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B;;OAEG;IACH,EAAE,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,IAAI;IAQ9C;;OAEG;IACH,QAAQ,IAAI,cAAc;IAI1B;;OAEG;IACH,SAAS,IAAI,eAAe,GAAG,IAAI;YAMrB,eAAe;YAgCf,iBAAiB;YA+BjB,YAAY;IAqD1B,OAAO,CAAC,UAAU;YAIJ,aAAa;IAI3B,OAAO,CAAC,QAAQ;YAKF,SAAS;YAKT,cAAc;YA4Bd,cAAc;IAc5B,OAAO,CAAC,IAAI;CASb"}
@@ -0,0 +1,322 @@
1
+ /**
2
+ * Migration Orchestrator
3
+ *
4
+ * Coordinates the three-phase migration process:
5
+ * Extract → Transform → Load
6
+ *
7
+ * Features:
8
+ * - Phase checkpoint/resume capability
9
+ * - Progress tracking
10
+ * - Error recovery
11
+ * - Rollback support
12
+ */
13
+ import { randomBytes } from 'node:crypto';
14
+ import { mkdir, writeFile, readFile, rm } from 'node:fs/promises';
15
+ import { existsSync } from 'node:fs';
16
+ import { join } from 'node:path';
17
+ import { createHash } from 'node:crypto';
18
+ import { getExtractor } from './extractors/registry.js';
19
+ import { getTransformer } from './transformers/registry.js';
20
+ import { getLoader } from './loaders/registry.js';
21
+ // ─── Orchestrator ────────────────────────────────────────────
22
+ export class MigrationOrchestrator {
23
+ state;
24
+ bundle = null;
25
+ eventHandlers = [];
26
+ workDir;
27
+ constructor(source, target, options = {}) {
28
+ const id = this.generateId();
29
+ this.workDir = options.workDir ?? join(process.cwd(), '.savestate', 'migrations', id);
30
+ this.state = {
31
+ id,
32
+ phase: 'pending',
33
+ source,
34
+ target,
35
+ startedAt: new Date().toISOString(),
36
+ phaseStartedAt: new Date().toISOString(),
37
+ checkpoints: [],
38
+ progress: 0,
39
+ options,
40
+ };
41
+ }
42
+ // ─── Public API ────────────────────────────────────────────
43
+ /**
44
+ * Run the full migration pipeline.
45
+ */
46
+ async run() {
47
+ await this.ensureWorkDir();
48
+ try {
49
+ // Phase 1: Extract
50
+ await this.runExtractPhase();
51
+ // Phase 2: Transform
52
+ await this.runTransformPhase();
53
+ // Phase 3: Load
54
+ const result = await this.runLoadPhase();
55
+ this.state.phase = 'complete';
56
+ this.state.completedAt = new Date().toISOString();
57
+ await this.saveState();
58
+ this.emit({ type: 'complete', data: result });
59
+ return result;
60
+ }
61
+ catch (error) {
62
+ this.state.phase = 'failed';
63
+ this.state.error = error instanceof Error ? error.message : String(error);
64
+ await this.saveState();
65
+ this.emit({ type: 'error', error: error instanceof Error ? error : new Error(String(error)) });
66
+ throw error;
67
+ }
68
+ }
69
+ /**
70
+ * Run only the extract phase (useful for debugging/inspection).
71
+ */
72
+ async extract() {
73
+ await this.ensureWorkDir();
74
+ await this.runExtractPhase();
75
+ return this.bundle;
76
+ }
77
+ /**
78
+ * Generate compatibility report without running full migration.
79
+ */
80
+ async analyze() {
81
+ await this.ensureWorkDir();
82
+ // Extract first if we don't have a bundle
83
+ if (!this.bundle) {
84
+ await this.runExtractPhase();
85
+ }
86
+ const transformer = getTransformer(this.state.source, this.state.target);
87
+ if (!transformer) {
88
+ throw new Error(`No transformer available for ${this.state.source} → ${this.state.target}`);
89
+ }
90
+ return transformer.analyze(this.bundle);
91
+ }
92
+ /**
93
+ * Resume a failed or interrupted migration.
94
+ */
95
+ static async resume(migrationId, workDir) {
96
+ const baseDir = workDir ?? join(process.cwd(), '.savestate', 'migrations', migrationId);
97
+ const statePath = join(baseDir, 'state.json');
98
+ if (!existsSync(statePath)) {
99
+ throw new Error(`Migration ${migrationId} not found at ${baseDir}`);
100
+ }
101
+ const stateJson = await readFile(statePath, 'utf-8');
102
+ const state = JSON.parse(stateJson);
103
+ const orchestrator = new MigrationOrchestrator(state.source, state.target, state.options);
104
+ orchestrator.state = state;
105
+ orchestrator.workDir = baseDir;
106
+ // Load bundle if we have one
107
+ if (state.bundlePath && existsSync(state.bundlePath)) {
108
+ const bundleJson = await readFile(state.bundlePath, 'utf-8');
109
+ orchestrator.bundle = JSON.parse(bundleJson);
110
+ }
111
+ return orchestrator;
112
+ }
113
+ /**
114
+ * Resume and continue the migration from where it left off.
115
+ */
116
+ async continue() {
117
+ const lastCheckpoint = this.state.checkpoints[this.state.checkpoints.length - 1];
118
+ if (!lastCheckpoint) {
119
+ // No checkpoint, start from beginning
120
+ return this.run();
121
+ }
122
+ // Resume from the phase after the last checkpoint
123
+ switch (lastCheckpoint.phase) {
124
+ case 'extracting':
125
+ // Extract completed, continue with transform
126
+ await this.loadCheckpoint(lastCheckpoint);
127
+ await this.runTransformPhase();
128
+ return this.runLoadPhase();
129
+ case 'transforming':
130
+ // Transform completed, continue with load
131
+ await this.loadCheckpoint(lastCheckpoint);
132
+ return this.runLoadPhase();
133
+ case 'loading':
134
+ // Load was in progress, need to restart it
135
+ await this.loadCheckpoint(lastCheckpoint);
136
+ return this.runLoadPhase();
137
+ default:
138
+ return this.run();
139
+ }
140
+ }
141
+ /**
142
+ * Clean up migration artifacts.
143
+ */
144
+ async cleanup() {
145
+ if (existsSync(this.workDir)) {
146
+ await rm(this.workDir, { recursive: true, force: true });
147
+ }
148
+ }
149
+ /**
150
+ * Subscribe to migration events.
151
+ */
152
+ on(handler) {
153
+ this.eventHandlers.push(handler);
154
+ return () => {
155
+ const index = this.eventHandlers.indexOf(handler);
156
+ if (index >= 0)
157
+ this.eventHandlers.splice(index, 1);
158
+ };
159
+ }
160
+ /**
161
+ * Get current migration state.
162
+ */
163
+ getState() {
164
+ return { ...this.state };
165
+ }
166
+ /**
167
+ * Get the migration bundle (if extracted).
168
+ */
169
+ getBundle() {
170
+ return this.bundle;
171
+ }
172
+ // ─── Phase Runners ─────────────────────────────────────────
173
+ async runExtractPhase() {
174
+ this.setPhase('extracting');
175
+ this.emit({ type: 'phase:start', phase: 'extracting', message: 'Starting extraction...' });
176
+ const extractor = getExtractor(this.state.source);
177
+ if (!extractor) {
178
+ throw new Error(`No extractor available for ${this.state.source}`);
179
+ }
180
+ const canExtract = await extractor.canExtract();
181
+ if (!canExtract) {
182
+ throw new Error(`Cannot extract from ${this.state.source} - check authentication`);
183
+ }
184
+ this.bundle = await extractor.extract({
185
+ include: this.state.options.include,
186
+ workDir: this.workDir,
187
+ onProgress: (progress, message) => {
188
+ this.state.progress = progress * 0.33; // Extract is 0-33%
189
+ this.emit({ type: 'progress', progress: this.state.progress, message });
190
+ },
191
+ });
192
+ // Save bundle to disk
193
+ const bundlePath = join(this.workDir, 'bundle.json');
194
+ await writeFile(bundlePath, JSON.stringify(this.bundle, null, 2));
195
+ this.state.bundlePath = bundlePath;
196
+ await this.saveCheckpoint('extracting');
197
+ this.emit({ type: 'phase:complete', phase: 'extracting', message: 'Extraction complete' });
198
+ }
199
+ async runTransformPhase() {
200
+ if (!this.bundle) {
201
+ throw new Error('No bundle to transform - run extract phase first');
202
+ }
203
+ this.setPhase('transforming');
204
+ this.emit({ type: 'phase:start', phase: 'transforming', message: 'Starting transformation...' });
205
+ const transformer = getTransformer(this.state.source, this.state.target);
206
+ if (!transformer) {
207
+ throw new Error(`No transformer available for ${this.state.source} → ${this.state.target}`);
208
+ }
209
+ this.bundle = await transformer.transform(this.bundle, {
210
+ overflowStrategy: 'summarize',
211
+ onProgress: (progress, message) => {
212
+ this.state.progress = 33 + progress * 0.34; // Transform is 33-67%
213
+ this.emit({ type: 'progress', progress: this.state.progress, message });
214
+ },
215
+ });
216
+ // Update bundle on disk
217
+ const bundlePath = join(this.workDir, 'bundle.json');
218
+ await writeFile(bundlePath, JSON.stringify(this.bundle, null, 2));
219
+ await this.saveCheckpoint('transforming');
220
+ this.emit({ type: 'phase:complete', phase: 'transforming', message: 'Transformation complete' });
221
+ }
222
+ async runLoadPhase() {
223
+ if (!this.bundle) {
224
+ throw new Error('No bundle to load - run extract and transform phases first');
225
+ }
226
+ this.setPhase('loading');
227
+ this.emit({ type: 'phase:start', phase: 'loading', message: 'Starting load...' });
228
+ // Handle dry run
229
+ if (this.state.options.dryRun) {
230
+ const dryRunResult = {
231
+ success: true,
232
+ loaded: {
233
+ instructions: !!this.bundle.contents.instructions,
234
+ memories: this.bundle.contents.memories?.count ?? 0,
235
+ files: this.bundle.contents.files?.count ?? 0,
236
+ customBots: this.bundle.contents.customBots?.count ?? 0,
237
+ },
238
+ warnings: ['Dry run - no changes made'],
239
+ errors: [],
240
+ };
241
+ this.emit({ type: 'phase:complete', phase: 'loading', message: 'Dry run complete' });
242
+ return dryRunResult;
243
+ }
244
+ const loader = getLoader(this.state.target);
245
+ if (!loader) {
246
+ throw new Error(`No loader available for ${this.state.target}`);
247
+ }
248
+ const canLoad = await loader.canLoad();
249
+ if (!canLoad) {
250
+ throw new Error(`Cannot load to ${this.state.target} - check authentication`);
251
+ }
252
+ const result = await loader.load(this.bundle, {
253
+ dryRun: false,
254
+ projectName: `Migrated from ${this.state.source} (${new Date().toISOString().split('T')[0]})`,
255
+ onProgress: (progress, message) => {
256
+ this.state.progress = 67 + progress * 0.33; // Load is 67-100%
257
+ this.emit({ type: 'progress', progress: this.state.progress, message });
258
+ },
259
+ });
260
+ await this.saveCheckpoint('loading');
261
+ this.emit({ type: 'phase:complete', phase: 'loading', message: 'Load complete', data: result });
262
+ return result;
263
+ }
264
+ // ─── Helpers ───────────────────────────────────────────────
265
+ generateId() {
266
+ return `mig_${randomBytes(8).toString('hex')}`;
267
+ }
268
+ async ensureWorkDir() {
269
+ await mkdir(this.workDir, { recursive: true });
270
+ }
271
+ setPhase(phase) {
272
+ this.state.phase = phase;
273
+ this.state.phaseStartedAt = new Date().toISOString();
274
+ }
275
+ async saveState() {
276
+ const statePath = join(this.workDir, 'state.json');
277
+ await writeFile(statePath, JSON.stringify(this.state, null, 2));
278
+ }
279
+ async saveCheckpoint(phase) {
280
+ const checkpointId = `checkpoint_${phase}_${Date.now()}`;
281
+ const checkpointPath = join(this.workDir, `${checkpointId}.json`);
282
+ const checkpointData = {
283
+ phase,
284
+ bundle: this.bundle,
285
+ state: this.state,
286
+ };
287
+ const dataStr = JSON.stringify(checkpointData);
288
+ await writeFile(checkpointPath, dataStr);
289
+ const checksum = createHash('sha256').update(dataStr).digest('hex');
290
+ const checkpoint = {
291
+ phase,
292
+ timestamp: new Date().toISOString(),
293
+ dataPath: checkpointPath,
294
+ checksum,
295
+ };
296
+ this.state.checkpoints.push(checkpoint);
297
+ await this.saveState();
298
+ this.emit({ type: 'checkpoint', phase, message: `Checkpoint saved: ${checkpointId}` });
299
+ }
300
+ async loadCheckpoint(checkpoint) {
301
+ const dataStr = await readFile(checkpoint.dataPath, 'utf-8');
302
+ // Verify checksum
303
+ const actualChecksum = createHash('sha256').update(dataStr).digest('hex');
304
+ if (actualChecksum !== checkpoint.checksum) {
305
+ throw new Error(`Checkpoint corrupted: ${checkpoint.dataPath}`);
306
+ }
307
+ const data = JSON.parse(dataStr);
308
+ this.bundle = data.bundle;
309
+ // Don't overwrite current state - we want to keep progress info
310
+ }
311
+ emit(event) {
312
+ for (const handler of this.eventHandlers) {
313
+ try {
314
+ handler(event);
315
+ }
316
+ catch {
317
+ // Don't let handler errors break the migration
318
+ }
319
+ }
320
+ }
321
+ }
322
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/migrate/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Transformer Registry
3
+ *
4
+ * Manages available transformers for platform-to-platform conversions.
5
+ * Transformers are keyed by "source→target" pairs.
6
+ */
7
+ import type { Platform, Transformer } from '../types.js';
8
+ /**
9
+ * Register a transformer for a source→target pair.
10
+ */
11
+ export declare function registerTransformer(source: Platform, target: Platform, factory: () => Transformer): void;
12
+ /**
13
+ * Get a transformer for a source→target pair.
14
+ */
15
+ export declare function getTransformer(source: Platform, target: Platform): Transformer | null;
16
+ /**
17
+ * List all registered transformer pairs.
18
+ */
19
+ export declare function listTransformers(): Array<{
20
+ source: Platform;
21
+ target: Platform;
22
+ }>;
23
+ /**
24
+ * Check if a transformer exists for a source→target pair.
25
+ */
26
+ export declare function hasTransformer(source: Platform, target: Platform): boolean;
27
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/migrate/transformers/registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAWzD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,QAAQ,EAChB,OAAO,EAAE,MAAM,WAAW,GACzB,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,IAAI,CAGrF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,KAAK,CAAC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,CAAC,CAKhF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,CAE1E"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Transformer Registry
3
+ *
4
+ * Manages available transformers for platform-to-platform conversions.
5
+ * Transformers are keyed by "source→target" pairs.
6
+ */
7
+ const transformers = new Map();
8
+ /**
9
+ * Create a key for the transformer map.
10
+ */
11
+ function transformerKey(source, target) {
12
+ return `${source}→${target}`;
13
+ }
14
+ /**
15
+ * Register a transformer for a source→target pair.
16
+ */
17
+ export function registerTransformer(source, target, factory) {
18
+ transformers.set(transformerKey(source, target), factory);
19
+ }
20
+ /**
21
+ * Get a transformer for a source→target pair.
22
+ */
23
+ export function getTransformer(source, target) {
24
+ const factory = transformers.get(transformerKey(source, target));
25
+ return factory ? factory() : null;
26
+ }
27
+ /**
28
+ * List all registered transformer pairs.
29
+ */
30
+ export function listTransformers() {
31
+ return [...transformers.keys()].map((key) => {
32
+ const [source, target] = key.split('→');
33
+ return { source, target };
34
+ });
35
+ }
36
+ /**
37
+ * Check if a transformer exists for a source→target pair.
38
+ */
39
+ export function hasTransformer(source, target) {
40
+ return transformers.has(transformerKey(source, target));
41
+ }
42
+ // ─── Register Built-in Transformers ──────────────────────────
43
+ // ChatGPT → Claude will be registered in #26
44
+ // registerTransformer('chatgpt', 'claude', () => new ChatGPTToClaudeTransformer());
45
+ // Claude → ChatGPT will be registered in #26
46
+ // registerTransformer('claude', 'chatgpt', () => new ClaudeToChatGPTTransformer());
47
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/migrate/transformers/registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,YAAY,GAAG,IAAI,GAAG,EAA6B,CAAC;AAE1D;;GAEG;AACH,SAAS,cAAc,CAAC,MAAgB,EAAE,MAAgB;IACxD,OAAO,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAgB,EAChB,MAAgB,EAChB,OAA0B;IAE1B,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAgB,EAAE,MAAgB;IAC/D,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjE,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QAChE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAgB,EAAE,MAAgB;IAC/D,OAAO,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,gEAAgE;AAEhE,6CAA6C;AAC7C,oFAAoF;AAEpF,6CAA6C;AAC7C,oFAAoF"}