@savestate/cli 0.6.0 → 0.7.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 (75) hide show
  1. package/dist/migrate/__tests__/claude-loader.test.d.ts +7 -0
  2. package/dist/migrate/__tests__/claude-loader.test.d.ts.map +1 -0
  3. package/dist/migrate/__tests__/claude-loader.test.js +544 -0
  4. package/dist/migrate/__tests__/claude-loader.test.js.map +1 -0
  5. package/dist/migrate/__tests__/orchestrator.test.d.ts +8 -0
  6. package/dist/migrate/__tests__/orchestrator.test.d.ts.map +1 -0
  7. package/dist/migrate/__tests__/orchestrator.test.js +355 -0
  8. package/dist/migrate/__tests__/orchestrator.test.js.map +1 -0
  9. package/dist/migrate/extractors/__tests__/chatgpt.test.d.ts +12 -0
  10. package/dist/migrate/extractors/__tests__/chatgpt.test.d.ts.map +1 -0
  11. package/dist/migrate/extractors/__tests__/chatgpt.test.js +522 -0
  12. package/dist/migrate/extractors/__tests__/chatgpt.test.js.map +1 -0
  13. package/dist/migrate/extractors/chatgpt.d.ts +70 -0
  14. package/dist/migrate/extractors/chatgpt.d.ts.map +1 -0
  15. package/dist/migrate/extractors/chatgpt.js +791 -0
  16. package/dist/migrate/extractors/chatgpt.js.map +1 -0
  17. package/dist/migrate/extractors/registry.js +3 -2
  18. package/dist/migrate/extractors/registry.js.map +1 -1
  19. package/dist/migrate/index.d.ts +6 -1
  20. package/dist/migrate/index.d.ts.map +1 -1
  21. package/dist/migrate/index.js +12 -1
  22. package/dist/migrate/index.js.map +1 -1
  23. package/dist/migrate/loaders/claude.d.ts +61 -0
  24. package/dist/migrate/loaders/claude.d.ts.map +1 -0
  25. package/dist/migrate/loaders/claude.js +433 -0
  26. package/dist/migrate/loaders/claude.js.map +1 -0
  27. package/dist/migrate/loaders/registry.js +3 -2
  28. package/dist/migrate/loaders/registry.js.map +1 -1
  29. package/dist/migrate/orchestrator.d.ts +75 -1
  30. package/dist/migrate/orchestrator.d.ts.map +1 -1
  31. package/dist/migrate/orchestrator.js +215 -19
  32. package/dist/migrate/orchestrator.js.map +1 -1
  33. package/dist/migrate/testing/index.d.ts +28 -0
  34. package/dist/migrate/testing/index.d.ts.map +1 -0
  35. package/dist/migrate/testing/index.js +55 -0
  36. package/dist/migrate/testing/index.js.map +1 -0
  37. package/dist/migrate/testing/mock-extractor.d.ts +30 -0
  38. package/dist/migrate/testing/mock-extractor.d.ts.map +1 -0
  39. package/dist/migrate/testing/mock-extractor.js +137 -0
  40. package/dist/migrate/testing/mock-extractor.js.map +1 -0
  41. package/dist/migrate/testing/mock-loader.d.ts +36 -0
  42. package/dist/migrate/testing/mock-loader.d.ts.map +1 -0
  43. package/dist/migrate/testing/mock-loader.js +81 -0
  44. package/dist/migrate/testing/mock-loader.js.map +1 -0
  45. package/dist/migrate/testing/mock-transformer.d.ts +26 -0
  46. package/dist/migrate/testing/mock-transformer.d.ts.map +1 -0
  47. package/dist/migrate/testing/mock-transformer.js +185 -0
  48. package/dist/migrate/testing/mock-transformer.js.map +1 -0
  49. package/dist/migrate/transformers/__tests__/chatgpt-to-claude.test.d.ts +5 -0
  50. package/dist/migrate/transformers/__tests__/chatgpt-to-claude.test.d.ts.map +1 -0
  51. package/dist/migrate/transformers/__tests__/chatgpt-to-claude.test.js +333 -0
  52. package/dist/migrate/transformers/__tests__/chatgpt-to-claude.test.js.map +1 -0
  53. package/dist/migrate/transformers/__tests__/claude-to-chatgpt.test.d.ts +5 -0
  54. package/dist/migrate/transformers/__tests__/claude-to-chatgpt.test.d.ts.map +1 -0
  55. package/dist/migrate/transformers/__tests__/claude-to-chatgpt.test.js +333 -0
  56. package/dist/migrate/transformers/__tests__/claude-to-chatgpt.test.js.map +1 -0
  57. package/dist/migrate/transformers/__tests__/rules.test.d.ts +5 -0
  58. package/dist/migrate/transformers/__tests__/rules.test.d.ts.map +1 -0
  59. package/dist/migrate/transformers/__tests__/rules.test.js +375 -0
  60. package/dist/migrate/transformers/__tests__/rules.test.js.map +1 -0
  61. package/dist/migrate/transformers/chatgpt-to-claude.d.ts +40 -0
  62. package/dist/migrate/transformers/chatgpt-to-claude.d.ts.map +1 -0
  63. package/dist/migrate/transformers/chatgpt-to-claude.js +443 -0
  64. package/dist/migrate/transformers/chatgpt-to-claude.js.map +1 -0
  65. package/dist/migrate/transformers/claude-to-chatgpt.d.ts +41 -0
  66. package/dist/migrate/transformers/claude-to-chatgpt.d.ts.map +1 -0
  67. package/dist/migrate/transformers/claude-to-chatgpt.js +532 -0
  68. package/dist/migrate/transformers/claude-to-chatgpt.js.map +1 -0
  69. package/dist/migrate/transformers/registry.js +6 -4
  70. package/dist/migrate/transformers/registry.js.map +1 -1
  71. package/dist/migrate/transformers/rules.d.ts +168 -0
  72. package/dist/migrate/transformers/rules.d.ts.map +1 -0
  73. package/dist/migrate/transformers/rules.js +487 -0
  74. package/dist/migrate/transformers/rules.js.map +1 -0
  75. package/package.json +6 -2
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Claude Loader Tests
3
+ *
4
+ * Tests for the Claude Projects loader implementation.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=claude-loader.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-loader.test.d.ts","sourceRoot":"","sources":["../../../src/migrate/__tests__/claude-loader.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,544 @@
1
+ /**
2
+ * Claude Loader Tests
3
+ *
4
+ * Tests for the Claude Projects loader implementation.
5
+ */
6
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
7
+ import { mkdir, writeFile, rm } from 'node:fs/promises';
8
+ import { existsSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+ import { tmpdir } from 'node:os';
11
+ import { ClaudeLoader } from '../loaders/claude.js';
12
+ // Mock fetch globally
13
+ const mockFetch = vi.fn();
14
+ global.fetch = mockFetch;
15
+ describe('ClaudeLoader', () => {
16
+ let testWorkDir;
17
+ let loader;
18
+ // Helper to create a test bundle
19
+ function createTestBundle(overrides = {}) {
20
+ return {
21
+ version: '1.0',
22
+ id: 'test-bundle-123',
23
+ source: {
24
+ platform: 'chatgpt',
25
+ extractedAt: '2026-02-07T10:00:00Z',
26
+ extractorVersion: '1.0.0',
27
+ },
28
+ target: {
29
+ platform: 'claude',
30
+ transformedAt: '2026-02-07T11:00:00Z',
31
+ transformerVersion: '1.0.0',
32
+ },
33
+ contents: {
34
+ instructions: {
35
+ content: 'You are a helpful assistant. Be concise and accurate.',
36
+ length: 49,
37
+ },
38
+ memories: {
39
+ entries: [
40
+ { id: 'm1', content: 'User prefers dark mode', createdAt: '2026-01-01T00:00:00Z', category: 'Preferences' },
41
+ { id: 'm2', content: 'User works in tech industry', createdAt: '2026-01-02T00:00:00Z', category: 'Work' },
42
+ { id: 'm3', content: 'User likes TypeScript', createdAt: '2026-01-03T00:00:00Z', category: 'Preferences' },
43
+ ],
44
+ count: 3,
45
+ },
46
+ ...overrides.contents,
47
+ },
48
+ metadata: {
49
+ totalItems: 4,
50
+ itemCounts: {
51
+ instructions: 1,
52
+ memories: 3,
53
+ conversations: 0,
54
+ files: 0,
55
+ customBots: 0,
56
+ },
57
+ warnings: [],
58
+ errors: [],
59
+ ...overrides.metadata,
60
+ },
61
+ ...overrides,
62
+ };
63
+ }
64
+ // Helper to mock successful API responses
65
+ function mockApiSuccess() {
66
+ mockFetch.mockImplementation(async (url, options) => {
67
+ const path = new URL(url).pathname;
68
+ const method = options.method || 'GET';
69
+ // Create project
70
+ if (method === 'POST' && path === '/v1/projects') {
71
+ return new Response(JSON.stringify({
72
+ id: 'proj_test123',
73
+ name: 'Test Project',
74
+ created_at: '2026-02-07T12:00:00Z',
75
+ updated_at: '2026-02-07T12:00:00Z',
76
+ }), { status: 200, headers: { 'Content-Type': 'application/json' } });
77
+ }
78
+ // Update project prompt
79
+ if (method === 'PUT' && path.match(/\/v1\/projects\/[^/]+$/)) {
80
+ return new Response(JSON.stringify({ success: true }), {
81
+ status: 200,
82
+ headers: { 'Content-Type': 'application/json' },
83
+ });
84
+ }
85
+ // Create document
86
+ if (method === 'POST' && path.match(/\/v1\/projects\/[^/]+\/docs$/)) {
87
+ return new Response(JSON.stringify({
88
+ id: `doc_${Date.now()}`,
89
+ name: 'test.md',
90
+ content: 'test',
91
+ created_at: '2026-02-07T12:00:00Z',
92
+ updated_at: '2026-02-07T12:00:00Z',
93
+ }), { status: 200, headers: { 'Content-Type': 'application/json' } });
94
+ }
95
+ // Upload file
96
+ if (method === 'POST' && path.match(/\/v1\/projects\/[^/]+\/files$/)) {
97
+ return new Response(JSON.stringify({
98
+ id: `file_${Date.now()}`,
99
+ name: 'test.txt',
100
+ content_type: 'text/plain',
101
+ size: 100,
102
+ created_at: '2026-02-07T12:00:00Z',
103
+ }), { status: 200, headers: { 'Content-Type': 'application/json' } });
104
+ }
105
+ // Delete project
106
+ if (method === 'DELETE' && path.match(/\/v1\/projects\/[^/]+$/)) {
107
+ return new Response(null, { status: 204 });
108
+ }
109
+ return new Response(JSON.stringify({ error: { message: 'Not found' } }), { status: 404 });
110
+ });
111
+ }
112
+ beforeEach(async () => {
113
+ testWorkDir = join(tmpdir(), `claude-loader-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
114
+ await mkdir(testWorkDir, { recursive: true });
115
+ mockFetch.mockReset();
116
+ loader = new ClaudeLoader({
117
+ apiKey: 'test-api-key',
118
+ baseUrl: 'https://api.anthropic.com',
119
+ });
120
+ });
121
+ afterEach(async () => {
122
+ if (existsSync(testWorkDir)) {
123
+ await rm(testWorkDir, { recursive: true, force: true });
124
+ }
125
+ });
126
+ describe('canLoad', () => {
127
+ it('should return true when API key is set', async () => {
128
+ const result = await loader.canLoad();
129
+ expect(result).toBe(true);
130
+ });
131
+ it('should return false when API key is missing', async () => {
132
+ const loaderNoKey = new ClaudeLoader({ apiKey: '' });
133
+ const result = await loaderNoKey.canLoad();
134
+ expect(result).toBe(false);
135
+ });
136
+ });
137
+ describe('load - success cases', () => {
138
+ it('should create a Claude project with all components', async () => {
139
+ mockApiSuccess();
140
+ const bundle = createTestBundle();
141
+ const result = await loader.load(bundle, {
142
+ projectName: 'Test Migration',
143
+ });
144
+ expect(result.success).toBe(true);
145
+ expect(result.loaded.instructions).toBe(true);
146
+ expect(result.loaded.memories).toBe(3);
147
+ expect(result.created?.projectId).toBe('proj_test123');
148
+ expect(result.created?.projectUrl).toContain('proj_test123');
149
+ expect(result.errors).toHaveLength(0);
150
+ });
151
+ it('should set system prompt from instructions', async () => {
152
+ mockApiSuccess();
153
+ const bundle = createTestBundle();
154
+ await loader.load(bundle, {});
155
+ // Verify PUT request was made to update project prompt
156
+ const putCalls = mockFetch.mock.calls.filter((call) => {
157
+ const [url, opts] = call;
158
+ return opts.method === 'PUT' && url.includes('/v1/projects/');
159
+ });
160
+ expect(putCalls.length).toBe(1);
161
+ const [, opts] = putCalls[0];
162
+ const body = JSON.parse(opts.body);
163
+ expect(body.prompt_template).toBe(bundle.contents.instructions?.content);
164
+ });
165
+ it('should create memories document with formatted content', async () => {
166
+ mockApiSuccess();
167
+ const bundle = createTestBundle();
168
+ await loader.load(bundle, {});
169
+ // Verify POST request was made to create document
170
+ const docCalls = mockFetch.mock.calls.filter((call) => {
171
+ const [url, opts] = call;
172
+ return opts.method === 'POST' && url.includes('/docs');
173
+ });
174
+ expect(docCalls.length).toBeGreaterThanOrEqual(1);
175
+ const [, opts] = docCalls[0];
176
+ const body = JSON.parse(opts.body);
177
+ expect(body.name).toBe('memories.md');
178
+ expect(body.content).toContain('Migrated Memories');
179
+ expect(body.content).toContain('User prefers dark mode');
180
+ });
181
+ it('should handle bundle without instructions', async () => {
182
+ mockApiSuccess();
183
+ const bundle = createTestBundle({
184
+ contents: {
185
+ memories: {
186
+ entries: [{ id: 'm1', content: 'Test memory', createdAt: '2026-01-01T00:00:00Z' }],
187
+ count: 1,
188
+ },
189
+ },
190
+ });
191
+ const result = await loader.load(bundle, {});
192
+ expect(result.success).toBe(true);
193
+ expect(result.loaded.instructions).toBe(false);
194
+ expect(result.loaded.memories).toBe(1);
195
+ });
196
+ it('should handle bundle without memories', async () => {
197
+ mockApiSuccess();
198
+ const bundle = createTestBundle({
199
+ contents: {
200
+ instructions: { content: 'Test instructions', length: 17 },
201
+ },
202
+ });
203
+ const result = await loader.load(bundle, {});
204
+ expect(result.success).toBe(true);
205
+ expect(result.loaded.instructions).toBe(true);
206
+ expect(result.loaded.memories).toBe(0);
207
+ });
208
+ it('should track progress during load', async () => {
209
+ mockApiSuccess();
210
+ const bundle = createTestBundle();
211
+ const progressUpdates = [];
212
+ await loader.load(bundle, {
213
+ onProgress: (progress, message) => {
214
+ progressUpdates.push({ progress, message });
215
+ },
216
+ });
217
+ expect(progressUpdates.length).toBeGreaterThan(0);
218
+ // Progress should increase monotonically
219
+ let lastProgress = 0;
220
+ for (const update of progressUpdates) {
221
+ expect(update.progress).toBeGreaterThanOrEqual(lastProgress);
222
+ lastProgress = update.progress;
223
+ }
224
+ // Should reach 100%
225
+ expect(progressUpdates[progressUpdates.length - 1].progress).toBe(1.0);
226
+ });
227
+ });
228
+ describe('load - file uploads', () => {
229
+ it('should upload files to project', async () => {
230
+ mockApiSuccess();
231
+ // Create a test file
232
+ const testFilePath = join(testWorkDir, 'test-document.txt');
233
+ await writeFile(testFilePath, 'Hello, this is test content');
234
+ const bundle = createTestBundle({
235
+ contents: {
236
+ instructions: { content: 'Test', length: 4 },
237
+ files: {
238
+ files: [
239
+ {
240
+ id: 'f1',
241
+ filename: 'test-document.txt',
242
+ mimeType: 'text/plain',
243
+ size: 27,
244
+ path: testFilePath,
245
+ },
246
+ ],
247
+ count: 1,
248
+ totalSize: 27,
249
+ },
250
+ },
251
+ });
252
+ const result = await loader.load(bundle, {});
253
+ expect(result.success).toBe(true);
254
+ expect(result.loaded.files).toBe(1);
255
+ // Verify file upload was called
256
+ const fileCalls = mockFetch.mock.calls.filter((call) => {
257
+ const [url] = call;
258
+ return url.includes('/files');
259
+ });
260
+ expect(fileCalls.length).toBe(1);
261
+ });
262
+ it('should skip files exceeding size limit', async () => {
263
+ mockApiSuccess();
264
+ const testFilePath = join(testWorkDir, 'large-file.txt');
265
+ await writeFile(testFilePath, 'x'.repeat(100));
266
+ const bundle = createTestBundle({
267
+ contents: {
268
+ instructions: { content: 'Test', length: 4 },
269
+ files: {
270
+ files: [
271
+ {
272
+ id: 'f1',
273
+ filename: 'large-file.txt',
274
+ mimeType: 'text/plain',
275
+ size: 50 * 1024 * 1024, // 50MB (exceeds 32MB limit)
276
+ path: testFilePath,
277
+ },
278
+ ],
279
+ count: 1,
280
+ totalSize: 50 * 1024 * 1024,
281
+ },
282
+ },
283
+ });
284
+ const result = await loader.load(bundle, {});
285
+ expect(result.success).toBe(true);
286
+ expect(result.loaded.files).toBe(0);
287
+ expect(result.warnings).toContainEqual(expect.stringContaining('exceeds size limit'));
288
+ });
289
+ it('should warn about missing files', async () => {
290
+ mockApiSuccess();
291
+ const bundle = createTestBundle({
292
+ contents: {
293
+ instructions: { content: 'Test', length: 4 },
294
+ files: {
295
+ files: [
296
+ {
297
+ id: 'f1',
298
+ filename: 'missing-file.txt',
299
+ mimeType: 'text/plain',
300
+ size: 100,
301
+ path: '/nonexistent/missing-file.txt',
302
+ },
303
+ ],
304
+ count: 1,
305
+ totalSize: 100,
306
+ },
307
+ },
308
+ });
309
+ const result = await loader.load(bundle, {});
310
+ expect(result.success).toBe(true);
311
+ expect(result.loaded.files).toBe(0);
312
+ expect(result.warnings).toContainEqual(expect.stringContaining('not found'));
313
+ });
314
+ });
315
+ describe('load - context summary', () => {
316
+ it('should create context summary from conversation summaries', async () => {
317
+ mockApiSuccess();
318
+ const bundle = createTestBundle({
319
+ contents: {
320
+ instructions: { content: 'Test', length: 4 },
321
+ conversations: {
322
+ path: '/conversations',
323
+ count: 2,
324
+ messageCount: 100,
325
+ summaries: [
326
+ {
327
+ id: 'c1',
328
+ title: 'Project Discussion',
329
+ messageCount: 50,
330
+ createdAt: '2026-01-01T00:00:00Z',
331
+ updatedAt: '2026-01-02T00:00:00Z',
332
+ keyPoints: ['Decided to use TypeScript', 'Agreed on weekly meetings'],
333
+ },
334
+ {
335
+ id: 'c2',
336
+ title: 'Code Review',
337
+ messageCount: 50,
338
+ createdAt: '2026-01-03T00:00:00Z',
339
+ updatedAt: '2026-01-04T00:00:00Z',
340
+ keyPoints: ['Need more tests', 'Consider refactoring auth module'],
341
+ },
342
+ ],
343
+ },
344
+ },
345
+ });
346
+ await loader.load(bundle, {});
347
+ // Verify context summary document was created
348
+ const docCalls = mockFetch.mock.calls.filter((call) => {
349
+ const [url, opts] = call;
350
+ return opts.method === 'POST' && url.includes('/docs');
351
+ });
352
+ const contextDocCall = docCalls.find((call) => {
353
+ const [, opts] = call;
354
+ const body = JSON.parse(opts.body);
355
+ return body.name === 'context-summary.md';
356
+ });
357
+ expect(contextDocCall).toBeDefined();
358
+ const [, contextOpts] = contextDocCall;
359
+ const body = JSON.parse(contextOpts.body);
360
+ expect(body.content).toContain('Conversation Context Summary');
361
+ expect(body.content).toContain('Decided to use TypeScript');
362
+ });
363
+ });
364
+ describe('load - dry run', () => {
365
+ it('should not make API calls in dry run mode', async () => {
366
+ const bundle = createTestBundle();
367
+ const result = await loader.load(bundle, { dryRun: true });
368
+ expect(result.success).toBe(true);
369
+ expect(result.warnings).toContain('Dry run - no changes made');
370
+ expect(mockFetch).not.toHaveBeenCalled();
371
+ });
372
+ it('should report potential issues in dry run', async () => {
373
+ const bundle = createTestBundle({
374
+ contents: {
375
+ instructions: { content: 'x'.repeat(10000), length: 10000 }, // Exceeds 8000 char limit
376
+ },
377
+ });
378
+ const result = await loader.load(bundle, { dryRun: true });
379
+ expect(result.warnings).toContainEqual(expect.stringContaining('would be truncated'));
380
+ });
381
+ });
382
+ describe('load - error handling', () => {
383
+ it('should handle API errors gracefully', async () => {
384
+ mockFetch.mockResolvedValueOnce(new Response(JSON.stringify({ error: { message: 'Invalid API key' } }), {
385
+ status: 401,
386
+ }));
387
+ const bundle = createTestBundle();
388
+ const result = await loader.load(bundle, {});
389
+ expect(result.success).toBe(false);
390
+ expect(result.errors).toContainEqual(expect.stringContaining('Invalid API key'));
391
+ });
392
+ it('should return partial results on mid-load failure', async () => {
393
+ // First call succeeds (create project)
394
+ mockFetch
395
+ .mockResolvedValueOnce(new Response(JSON.stringify({
396
+ id: 'proj_partial',
397
+ name: 'Partial Project',
398
+ created_at: '2026-02-07T12:00:00Z',
399
+ updated_at: '2026-02-07T12:00:00Z',
400
+ }), { status: 200, headers: { 'Content-Type': 'application/json' } }))
401
+ // Second call fails (set prompt)
402
+ .mockResolvedValueOnce(new Response(JSON.stringify({ error: { message: 'Server error' } }), {
403
+ status: 500,
404
+ }));
405
+ const bundle = createTestBundle();
406
+ const result = await loader.load(bundle, {});
407
+ expect(result.success).toBe(false);
408
+ expect(result.created?.projectId).toBe('proj_partial');
409
+ expect(result.loaded.instructions).toBe(false);
410
+ });
411
+ it('should retry on rate limit errors', async () => {
412
+ let callCount = 0;
413
+ mockFetch.mockImplementation(async () => {
414
+ callCount++;
415
+ if (callCount === 1) {
416
+ return new Response(JSON.stringify({ error: { message: 'Rate limited' } }), {
417
+ status: 429,
418
+ headers: { 'retry-after': '0' }, // Immediate retry for test
419
+ });
420
+ }
421
+ return new Response(JSON.stringify({
422
+ id: 'proj_retry',
423
+ name: 'Retry Project',
424
+ created_at: '2026-02-07T12:00:00Z',
425
+ updated_at: '2026-02-07T12:00:00Z',
426
+ }), { status: 200, headers: { 'Content-Type': 'application/json' } });
427
+ });
428
+ const bundle = createTestBundle({
429
+ contents: {
430
+ instructions: { content: 'Test', length: 4 },
431
+ },
432
+ });
433
+ // Use minimal bundle to reduce API calls
434
+ bundle.contents.memories = undefined;
435
+ const loaderWithRetry = new ClaudeLoader({
436
+ apiKey: 'test-key',
437
+ retryDelayMs: 10, // Fast retries for test
438
+ });
439
+ const result = await loaderWithRetry.load(bundle, {});
440
+ expect(result.success).toBe(true);
441
+ expect(callCount).toBeGreaterThan(1);
442
+ });
443
+ });
444
+ describe('load - bundle validation', () => {
445
+ it('should reject bundles not transformed for Claude', async () => {
446
+ const bundle = createTestBundle({
447
+ target: {
448
+ platform: 'chatgpt',
449
+ transformedAt: '2026-02-07T11:00:00Z',
450
+ transformerVersion: '1.0.0',
451
+ },
452
+ });
453
+ await expect(loader.load(bundle, {})).rejects.toThrow('not transformed for Claude');
454
+ });
455
+ });
456
+ describe('load - custom bots handling', () => {
457
+ it('should add manual steps when custom bots are present', async () => {
458
+ mockApiSuccess();
459
+ const bundle = createTestBundle({
460
+ contents: {
461
+ instructions: { content: 'Test', length: 4 },
462
+ customBots: {
463
+ bots: [
464
+ {
465
+ id: 'gpt1',
466
+ name: 'My Custom GPT',
467
+ instructions: 'Be helpful',
468
+ createdAt: '2026-01-01T00:00:00Z',
469
+ },
470
+ ],
471
+ count: 1,
472
+ },
473
+ },
474
+ });
475
+ const result = await loader.load(bundle, {});
476
+ expect(result.success).toBe(true);
477
+ expect(result.loaded.customBots).toBe(0);
478
+ expect(result.manualSteps).toBeDefined();
479
+ expect(result.manualSteps).toContainEqual(expect.stringContaining('custom bots'));
480
+ });
481
+ });
482
+ describe('load state management', () => {
483
+ it('should track and expose load state for checkpointing', async () => {
484
+ mockApiSuccess();
485
+ const bundle = createTestBundle();
486
+ await loader.load(bundle, {});
487
+ const state = loader.getLoadState();
488
+ expect(state.projectId).toBe('proj_test123');
489
+ expect(state.instructionsLoaded).toBe(true);
490
+ expect(state.memoriesDocId).toBeDefined();
491
+ });
492
+ it('should allow setting load state for resume', async () => {
493
+ const previousState = {
494
+ projectId: 'proj_resume',
495
+ instructionsLoaded: true,
496
+ memoriesDocId: 'doc_123',
497
+ contextDocId: undefined,
498
+ uploadedFileIds: ['file_1', 'file_2'],
499
+ uploadedFilenames: ['a.txt', 'b.txt'],
500
+ lastFileIndex: 1,
501
+ };
502
+ loader.setLoadState(previousState);
503
+ const state = loader.getLoadState();
504
+ expect(state.projectId).toBe('proj_resume');
505
+ expect(state.uploadedFileIds).toEqual(['file_1', 'file_2']);
506
+ expect(state.lastFileIndex).toBe(1);
507
+ });
508
+ });
509
+ describe('getProgress', () => {
510
+ it('should return current progress', async () => {
511
+ mockApiSuccess();
512
+ const bundle = createTestBundle();
513
+ // Before load
514
+ expect(loader.getProgress()).toBe(0);
515
+ await loader.load(bundle, {});
516
+ // After load
517
+ expect(loader.getProgress()).toBe(100);
518
+ });
519
+ });
520
+ describe('instructions truncation', () => {
521
+ it('should truncate instructions exceeding limit and warn', async () => {
522
+ mockApiSuccess();
523
+ const longInstructions = 'x'.repeat(10000); // Exceeds 8000 char limit
524
+ const bundle = createTestBundle({
525
+ contents: {
526
+ instructions: { content: longInstructions, length: 10000 },
527
+ },
528
+ });
529
+ const result = await loader.load(bundle, {});
530
+ expect(result.success).toBe(true);
531
+ expect(result.warnings).toContainEqual(expect.stringContaining('truncated'));
532
+ // Verify truncated content was sent
533
+ const putCalls = mockFetch.mock.calls.filter((call) => {
534
+ const [url, opts] = call;
535
+ return opts.method === 'PUT' && url.includes('/v1/projects/');
536
+ });
537
+ expect(putCalls.length).toBe(1);
538
+ const [, opts] = putCalls[0];
539
+ const body = JSON.parse(opts.body);
540
+ expect(body.prompt_template.length).toBe(8000);
541
+ });
542
+ });
543
+ });
544
+ //# sourceMappingURL=claude-loader.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-loader.test.js","sourceRoot":"","sources":["../../../src/migrate/__tests__/claude-loader.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Migration Orchestrator Tests
3
+ *
4
+ * Tests for the three-phase migration architecture:
5
+ * Extract → Transform → Load
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=orchestrator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.test.d.ts","sourceRoot":"","sources":["../../../src/migrate/__tests__/orchestrator.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}