@savestate/cli 0.6.0 → 0.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.
Files changed (159) hide show
  1. package/dist/cli/__tests__/progress.test.d.ts +5 -0
  2. package/dist/cli/__tests__/progress.test.d.ts.map +1 -0
  3. package/dist/cli/__tests__/progress.test.js +212 -0
  4. package/dist/cli/__tests__/progress.test.js.map +1 -0
  5. package/dist/cli/__tests__/signal-handler.test.d.ts +5 -0
  6. package/dist/cli/__tests__/signal-handler.test.d.ts.map +1 -0
  7. package/dist/cli/__tests__/signal-handler.test.js +99 -0
  8. package/dist/cli/__tests__/signal-handler.test.js.map +1 -0
  9. package/dist/cli/__tests__/summary.test.d.ts +5 -0
  10. package/dist/cli/__tests__/summary.test.d.ts.map +1 -0
  11. package/dist/cli/__tests__/summary.test.js +242 -0
  12. package/dist/cli/__tests__/summary.test.js.map +1 -0
  13. package/dist/cli/index.d.ts +10 -0
  14. package/dist/cli/index.d.ts.map +1 -0
  15. package/dist/cli/index.js +10 -0
  16. package/dist/cli/index.js.map +1 -0
  17. package/dist/cli/progress.d.ts +86 -0
  18. package/dist/cli/progress.d.ts.map +1 -0
  19. package/dist/cli/progress.js +205 -0
  20. package/dist/cli/progress.js.map +1 -0
  21. package/dist/cli/prompts.d.ts +49 -0
  22. package/dist/cli/prompts.d.ts.map +1 -0
  23. package/dist/cli/prompts.js +266 -0
  24. package/dist/cli/prompts.js.map +1 -0
  25. package/dist/cli/signal-handler.d.ts +63 -0
  26. package/dist/cli/signal-handler.d.ts.map +1 -0
  27. package/dist/cli/signal-handler.js +165 -0
  28. package/dist/cli/signal-handler.js.map +1 -0
  29. package/dist/cli/summary.d.ts +33 -0
  30. package/dist/cli/summary.d.ts.map +1 -0
  31. package/dist/cli/summary.js +296 -0
  32. package/dist/cli/summary.js.map +1 -0
  33. package/dist/cli.js +7 -1
  34. package/dist/cli.js.map +1 -1
  35. package/dist/commands/migrate.d.ts +18 -4
  36. package/dist/commands/migrate.d.ts.map +1 -1
  37. package/dist/commands/migrate.js +324 -163
  38. package/dist/commands/migrate.js.map +1 -1
  39. package/dist/migrate/__tests__/capabilities.test.d.ts +7 -0
  40. package/dist/migrate/__tests__/capabilities.test.d.ts.map +1 -0
  41. package/dist/migrate/__tests__/capabilities.test.js +90 -0
  42. package/dist/migrate/__tests__/capabilities.test.js.map +1 -0
  43. package/dist/migrate/__tests__/chatgpt-loader.test.d.ts +7 -0
  44. package/dist/migrate/__tests__/chatgpt-loader.test.d.ts.map +1 -0
  45. package/dist/migrate/__tests__/chatgpt-loader.test.js +889 -0
  46. package/dist/migrate/__tests__/chatgpt-loader.test.js.map +1 -0
  47. package/dist/migrate/__tests__/claude-loader.test.d.ts +7 -0
  48. package/dist/migrate/__tests__/claude-loader.test.d.ts.map +1 -0
  49. package/dist/migrate/__tests__/claude-loader.test.js +544 -0
  50. package/dist/migrate/__tests__/claude-loader.test.js.map +1 -0
  51. package/dist/migrate/__tests__/edge-cases.test.d.ts +7 -0
  52. package/dist/migrate/__tests__/edge-cases.test.d.ts.map +1 -0
  53. package/dist/migrate/__tests__/edge-cases.test.js +787 -0
  54. package/dist/migrate/__tests__/edge-cases.test.js.map +1 -0
  55. package/dist/migrate/__tests__/error-recovery.test.d.ts +7 -0
  56. package/dist/migrate/__tests__/error-recovery.test.d.ts.map +1 -0
  57. package/dist/migrate/__tests__/error-recovery.test.js +461 -0
  58. package/dist/migrate/__tests__/error-recovery.test.js.map +1 -0
  59. package/dist/migrate/__tests__/integration.test.d.ts +7 -0
  60. package/dist/migrate/__tests__/integration.test.d.ts.map +1 -0
  61. package/dist/migrate/__tests__/integration.test.js +536 -0
  62. package/dist/migrate/__tests__/integration.test.js.map +1 -0
  63. package/dist/migrate/__tests__/orchestrator.test.d.ts +8 -0
  64. package/dist/migrate/__tests__/orchestrator.test.d.ts.map +1 -0
  65. package/dist/migrate/__tests__/orchestrator.test.js +355 -0
  66. package/dist/migrate/__tests__/orchestrator.test.js.map +1 -0
  67. package/dist/migrate/__tests__/performance.test.d.ts +7 -0
  68. package/dist/migrate/__tests__/performance.test.d.ts.map +1 -0
  69. package/dist/migrate/__tests__/performance.test.js +478 -0
  70. package/dist/migrate/__tests__/performance.test.js.map +1 -0
  71. package/dist/migrate/__tests__/registry.test.d.ts +7 -0
  72. package/dist/migrate/__tests__/registry.test.d.ts.map +1 -0
  73. package/dist/migrate/__tests__/registry.test.js +167 -0
  74. package/dist/migrate/__tests__/registry.test.js.map +1 -0
  75. package/dist/migrate/compatibility.d.ts +47 -0
  76. package/dist/migrate/compatibility.d.ts.map +1 -0
  77. package/dist/migrate/compatibility.js +468 -0
  78. package/dist/migrate/compatibility.js.map +1 -0
  79. package/dist/migrate/extractors/__tests__/chatgpt.test.d.ts +12 -0
  80. package/dist/migrate/extractors/__tests__/chatgpt.test.d.ts.map +1 -0
  81. package/dist/migrate/extractors/__tests__/chatgpt.test.js +522 -0
  82. package/dist/migrate/extractors/__tests__/chatgpt.test.js.map +1 -0
  83. package/dist/migrate/extractors/__tests__/claude.test.d.ts +12 -0
  84. package/dist/migrate/extractors/__tests__/claude.test.d.ts.map +1 -0
  85. package/dist/migrate/extractors/__tests__/claude.test.js +789 -0
  86. package/dist/migrate/extractors/__tests__/claude.test.js.map +1 -0
  87. package/dist/migrate/extractors/chatgpt.d.ts +70 -0
  88. package/dist/migrate/extractors/chatgpt.d.ts.map +1 -0
  89. package/dist/migrate/extractors/chatgpt.js +791 -0
  90. package/dist/migrate/extractors/chatgpt.js.map +1 -0
  91. package/dist/migrate/extractors/claude.d.ts +69 -0
  92. package/dist/migrate/extractors/claude.d.ts.map +1 -0
  93. package/dist/migrate/extractors/claude.js +1136 -0
  94. package/dist/migrate/extractors/claude.js.map +1 -0
  95. package/dist/migrate/extractors/registry.js +6 -4
  96. package/dist/migrate/extractors/registry.js.map +1 -1
  97. package/dist/migrate/index.d.ts +6 -1
  98. package/dist/migrate/index.d.ts.map +1 -1
  99. package/dist/migrate/index.js +12 -1
  100. package/dist/migrate/index.js.map +1 -1
  101. package/dist/migrate/loaders/chatgpt.d.ts +72 -0
  102. package/dist/migrate/loaders/chatgpt.d.ts.map +1 -0
  103. package/dist/migrate/loaders/chatgpt.js +691 -0
  104. package/dist/migrate/loaders/chatgpt.js.map +1 -0
  105. package/dist/migrate/loaders/claude.d.ts +61 -0
  106. package/dist/migrate/loaders/claude.d.ts.map +1 -0
  107. package/dist/migrate/loaders/claude.js +433 -0
  108. package/dist/migrate/loaders/claude.js.map +1 -0
  109. package/dist/migrate/loaders/registry.js +6 -4
  110. package/dist/migrate/loaders/registry.js.map +1 -1
  111. package/dist/migrate/orchestrator.d.ts +75 -1
  112. package/dist/migrate/orchestrator.d.ts.map +1 -1
  113. package/dist/migrate/orchestrator.js +215 -19
  114. package/dist/migrate/orchestrator.js.map +1 -1
  115. package/dist/migrate/testing/index.d.ts +28 -0
  116. package/dist/migrate/testing/index.d.ts.map +1 -0
  117. package/dist/migrate/testing/index.js +55 -0
  118. package/dist/migrate/testing/index.js.map +1 -0
  119. package/dist/migrate/testing/mock-extractor.d.ts +30 -0
  120. package/dist/migrate/testing/mock-extractor.d.ts.map +1 -0
  121. package/dist/migrate/testing/mock-extractor.js +137 -0
  122. package/dist/migrate/testing/mock-extractor.js.map +1 -0
  123. package/dist/migrate/testing/mock-loader.d.ts +36 -0
  124. package/dist/migrate/testing/mock-loader.d.ts.map +1 -0
  125. package/dist/migrate/testing/mock-loader.js +81 -0
  126. package/dist/migrate/testing/mock-loader.js.map +1 -0
  127. package/dist/migrate/testing/mock-transformer.d.ts +26 -0
  128. package/dist/migrate/testing/mock-transformer.d.ts.map +1 -0
  129. package/dist/migrate/testing/mock-transformer.js +185 -0
  130. package/dist/migrate/testing/mock-transformer.js.map +1 -0
  131. package/dist/migrate/transformers/__tests__/chatgpt-to-claude.test.d.ts +5 -0
  132. package/dist/migrate/transformers/__tests__/chatgpt-to-claude.test.d.ts.map +1 -0
  133. package/dist/migrate/transformers/__tests__/chatgpt-to-claude.test.js +333 -0
  134. package/dist/migrate/transformers/__tests__/chatgpt-to-claude.test.js.map +1 -0
  135. package/dist/migrate/transformers/__tests__/claude-to-chatgpt.test.d.ts +5 -0
  136. package/dist/migrate/transformers/__tests__/claude-to-chatgpt.test.d.ts.map +1 -0
  137. package/dist/migrate/transformers/__tests__/claude-to-chatgpt.test.js +333 -0
  138. package/dist/migrate/transformers/__tests__/claude-to-chatgpt.test.js.map +1 -0
  139. package/dist/migrate/transformers/__tests__/rules.test.d.ts +5 -0
  140. package/dist/migrate/transformers/__tests__/rules.test.d.ts.map +1 -0
  141. package/dist/migrate/transformers/__tests__/rules.test.js +375 -0
  142. package/dist/migrate/transformers/__tests__/rules.test.js.map +1 -0
  143. package/dist/migrate/transformers/chatgpt-to-claude.d.ts +40 -0
  144. package/dist/migrate/transformers/chatgpt-to-claude.d.ts.map +1 -0
  145. package/dist/migrate/transformers/chatgpt-to-claude.js +443 -0
  146. package/dist/migrate/transformers/chatgpt-to-claude.js.map +1 -0
  147. package/dist/migrate/transformers/claude-to-chatgpt.d.ts +41 -0
  148. package/dist/migrate/transformers/claude-to-chatgpt.d.ts.map +1 -0
  149. package/dist/migrate/transformers/claude-to-chatgpt.js +532 -0
  150. package/dist/migrate/transformers/claude-to-chatgpt.js.map +1 -0
  151. package/dist/migrate/transformers/registry.js +6 -4
  152. package/dist/migrate/transformers/registry.js.map +1 -1
  153. package/dist/migrate/transformers/rules.d.ts +168 -0
  154. package/dist/migrate/transformers/rules.d.ts.map +1 -0
  155. package/dist/migrate/transformers/rules.js +487 -0
  156. package/dist/migrate/transformers/rules.js.map +1 -0
  157. package/dist/migrate/types.d.ts +2 -0
  158. package/dist/migrate/types.d.ts.map +1 -1
  159. package/package.json +7 -2
@@ -0,0 +1,522 @@
1
+ /**
2
+ * ChatGPT Extractor Tests
3
+ *
4
+ * Tests for extracting data from ChatGPT:
5
+ * - Custom instructions
6
+ * - Memory entries
7
+ * - Conversation history
8
+ * - Files/attachments
9
+ * - Custom GPTs
10
+ */
11
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
12
+ import { existsSync } from 'node:fs';
13
+ import { rm, mkdir, writeFile, readFile, readdir } from 'node:fs/promises';
14
+ import { join } from 'node:path';
15
+ import { tmpdir } from 'node:os';
16
+ import { ChatGPTExtractor } from '../chatgpt.js';
17
+ describe('ChatGPTExtractor', () => {
18
+ let testDir;
19
+ let exportDir;
20
+ let workDir;
21
+ beforeEach(async () => {
22
+ // Create unique temp directories for each test
23
+ const testId = `savestate-chatgpt-test-${Date.now()}-${Math.random().toString(36).slice(2)}`;
24
+ testDir = join(tmpdir(), testId);
25
+ exportDir = join(testDir, 'export');
26
+ workDir = join(testDir, 'work');
27
+ await mkdir(exportDir, { recursive: true });
28
+ await mkdir(workDir, { recursive: true });
29
+ });
30
+ afterEach(async () => {
31
+ // Clean up test directories
32
+ if (existsSync(testDir)) {
33
+ await rm(testDir, { recursive: true, force: true });
34
+ }
35
+ });
36
+ // ─── Helper Functions ────────────────────────────────────────
37
+ async function createMockExport(options = {}) {
38
+ const { conversations = true, memories = true, instructions = true, files = false, gpts = false, conversationCount = 3, largeConversations = false, } = options;
39
+ // Create conversations.json
40
+ if (conversations) {
41
+ const convs = [];
42
+ for (let i = 0; i < conversationCount; i++) {
43
+ const msgCount = largeConversations ? 100 : 5;
44
+ const mapping = {};
45
+ // Create root node
46
+ mapping['root'] = {
47
+ id: 'root',
48
+ children: ['msg_1'],
49
+ };
50
+ // Create message chain
51
+ for (let j = 1; j <= msgCount; j++) {
52
+ const role = j % 2 === 1 ? 'user' : 'assistant';
53
+ mapping[`msg_${j}`] = {
54
+ id: `msg_${j}`,
55
+ message: {
56
+ id: `msg_${j}`,
57
+ author: { role },
58
+ create_time: Date.now() / 1000 + j,
59
+ content: {
60
+ content_type: 'text',
61
+ parts: [`Test message ${j} from ${role} in conversation ${i + 1}`],
62
+ },
63
+ metadata: role === 'assistant' ? { model_slug: 'gpt-4' } : undefined,
64
+ },
65
+ parent: j === 1 ? 'root' : `msg_${j - 1}`,
66
+ children: j < msgCount ? [`msg_${j + 1}`] : [],
67
+ };
68
+ }
69
+ convs.push({
70
+ id: `conv_${i + 1}`,
71
+ title: `Test Conversation ${i + 1}`,
72
+ create_time: Date.now() / 1000,
73
+ update_time: Date.now() / 1000 + 3600,
74
+ mapping,
75
+ current_node: `msg_${msgCount}`,
76
+ });
77
+ }
78
+ await writeFile(join(exportDir, 'conversations.json'), JSON.stringify(convs));
79
+ }
80
+ // Create memories.json
81
+ if (memories) {
82
+ const mems = [
83
+ {
84
+ id: 'mem_1',
85
+ content: 'User prefers TypeScript over JavaScript',
86
+ created_at: '2024-01-15T10:00:00Z',
87
+ },
88
+ {
89
+ id: 'mem_2',
90
+ content: 'User is working on a project called SaveState',
91
+ created_at: '2024-01-16T10:00:00Z',
92
+ updated_at: '2024-01-17T10:00:00Z',
93
+ },
94
+ {
95
+ id: 'mem_3',
96
+ content: 'User lives in Austin, Texas',
97
+ created_at: '2024-01-18T10:00:00Z',
98
+ },
99
+ ];
100
+ await writeFile(join(exportDir, 'memories.json'), JSON.stringify(mems));
101
+ }
102
+ // Create user.json with custom instructions
103
+ if (instructions) {
104
+ const user = {
105
+ custom_instructions: {
106
+ about_user: 'I am a software developer specializing in AI systems. I prefer concise, technical responses.',
107
+ about_model: 'Be direct and technical. Provide code examples when relevant. Avoid unnecessary pleasantries.',
108
+ },
109
+ };
110
+ await writeFile(join(exportDir, 'user.json'), JSON.stringify(user));
111
+ }
112
+ // Create files directory
113
+ if (files) {
114
+ const filesDir = join(exportDir, 'files');
115
+ await mkdir(filesDir, { recursive: true });
116
+ await writeFile(join(filesDir, 'project-notes.md'), '# Project Notes\n\nThis is a test file.');
117
+ await writeFile(join(filesDir, 'data.json'), JSON.stringify({ key: 'value' }));
118
+ }
119
+ // Create gpts.json
120
+ if (gpts) {
121
+ const gptList = [
122
+ {
123
+ id: 'gpt_1',
124
+ name: 'Code Review Helper',
125
+ description: 'Helps review code and suggest improvements',
126
+ instructions: 'You are a code review assistant. Focus on code quality, best practices, and security.',
127
+ tools: ['python', 'browser'],
128
+ knowledge_files: [{ id: 'file_1', name: 'coding-standards.pdf' }],
129
+ created_at: '2024-01-01T00:00:00Z',
130
+ updated_at: '2024-01-15T00:00:00Z',
131
+ },
132
+ {
133
+ id: 'gpt_2',
134
+ name: 'Writing Assistant',
135
+ description: 'Helps with writing and editing',
136
+ instructions: 'You are a writing assistant. Help improve clarity, grammar, and style.',
137
+ tools: [],
138
+ created_at: '2024-02-01T00:00:00Z',
139
+ },
140
+ ];
141
+ await writeFile(join(exportDir, 'gpts.json'), JSON.stringify(gptList));
142
+ }
143
+ }
144
+ // ─── Basic Extraction Tests ──────────────────────────────────
145
+ describe('canExtract', () => {
146
+ it('should return true when export path exists', async () => {
147
+ await createMockExport();
148
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
149
+ const result = await extractor.canExtract();
150
+ expect(result).toBe(true);
151
+ });
152
+ it('should return false when export path does not exist', async () => {
153
+ const extractor = new ChatGPTExtractor({
154
+ exportPath: '/non/existent/path',
155
+ });
156
+ const result = await extractor.canExtract();
157
+ expect(result).toBe(false);
158
+ });
159
+ it('should return false when no credentials or export path provided', async () => {
160
+ const extractor = new ChatGPTExtractor({});
161
+ const result = await extractor.canExtract();
162
+ expect(result).toBe(false);
163
+ });
164
+ });
165
+ describe('extract', () => {
166
+ it('should extract all data from a complete export', async () => {
167
+ await createMockExport({
168
+ conversations: true,
169
+ memories: true,
170
+ instructions: true,
171
+ files: true,
172
+ gpts: true,
173
+ });
174
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
175
+ const bundle = await extractor.extract({ workDir });
176
+ // Verify bundle structure
177
+ expect(bundle.version).toBe('1.0');
178
+ expect(bundle.source.platform).toBe('chatgpt');
179
+ expect(bundle.source.extractorVersion).toBe('1.0.0');
180
+ // Verify contents
181
+ expect(bundle.contents.instructions).toBeDefined();
182
+ expect(bundle.contents.memories).toBeDefined();
183
+ expect(bundle.contents.conversations).toBeDefined();
184
+ expect(bundle.contents.files).toBeDefined();
185
+ expect(bundle.contents.customBots).toBeDefined();
186
+ // Verify metadata
187
+ expect(bundle.metadata.totalItems).toBeGreaterThan(0);
188
+ expect(bundle.metadata.errors).toHaveLength(0);
189
+ });
190
+ it('should handle partial exports gracefully', async () => {
191
+ // Only create conversations, no other data
192
+ await createMockExport({
193
+ conversations: true,
194
+ memories: false,
195
+ instructions: false,
196
+ files: false,
197
+ gpts: false,
198
+ });
199
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
200
+ const bundle = await extractor.extract({ workDir });
201
+ expect(bundle.contents.conversations).toBeDefined();
202
+ expect(bundle.contents.conversations?.count).toBe(3);
203
+ // Other contents should be undefined (not errors)
204
+ expect(bundle.metadata.errors).toHaveLength(0);
205
+ });
206
+ it('should respect include filter', async () => {
207
+ await createMockExport();
208
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
209
+ const bundle = await extractor.extract({
210
+ workDir,
211
+ include: ['instructions', 'memories'],
212
+ });
213
+ expect(bundle.contents.instructions).toBeDefined();
214
+ expect(bundle.contents.memories).toBeDefined();
215
+ expect(bundle.contents.conversations).toBeUndefined();
216
+ expect(bundle.contents.files).toBeUndefined();
217
+ expect(bundle.contents.customBots).toBeUndefined();
218
+ });
219
+ });
220
+ // ─── Instructions Extraction ─────────────────────────────────
221
+ describe('instructions extraction', () => {
222
+ it('should extract custom instructions from user.json', async () => {
223
+ await createMockExport({ instructions: true });
224
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
225
+ const bundle = await extractor.extract({ workDir });
226
+ const instructions = bundle.contents.instructions;
227
+ expect(instructions).toBeDefined();
228
+ expect(instructions?.content).toContain('software developer');
229
+ expect(instructions?.content).toContain('direct and technical');
230
+ expect(instructions?.length).toBeGreaterThan(0);
231
+ });
232
+ it('should parse instruction sections', async () => {
233
+ await createMockExport({ instructions: true });
234
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
235
+ const bundle = await extractor.extract({ workDir });
236
+ const sections = bundle.contents.instructions?.sections ?? [];
237
+ expect(sections.length).toBeGreaterThan(0);
238
+ const titles = sections.map((s) => s.title);
239
+ expect(titles).toContain('About Me');
240
+ expect(titles).toContain('How ChatGPT Should Respond');
241
+ });
242
+ });
243
+ // ─── Memories Extraction ─────────────────────────────────────
244
+ describe('memories extraction', () => {
245
+ it('should extract all memory entries', async () => {
246
+ await createMockExport({ memories: true });
247
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
248
+ const bundle = await extractor.extract({ workDir });
249
+ const memories = bundle.contents.memories;
250
+ expect(memories).toBeDefined();
251
+ expect(memories?.count).toBe(3);
252
+ expect(memories?.entries).toHaveLength(3);
253
+ });
254
+ it('should preserve memory metadata', async () => {
255
+ await createMockExport({ memories: true });
256
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
257
+ const bundle = await extractor.extract({ workDir });
258
+ const entries = bundle.contents.memories?.entries ?? [];
259
+ const updatedEntry = entries.find((e) => e.id === 'mem_2');
260
+ expect(updatedEntry).toBeDefined();
261
+ expect(updatedEntry?.content).toContain('SaveState');
262
+ expect(updatedEntry?.createdAt).toBeDefined();
263
+ expect(updatedEntry?.updatedAt).toBeDefined();
264
+ });
265
+ });
266
+ // ─── Conversations Extraction ────────────────────────────────
267
+ describe('conversations extraction', () => {
268
+ it('should extract all conversations', async () => {
269
+ await createMockExport({ conversationCount: 5 });
270
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
271
+ const bundle = await extractor.extract({ workDir });
272
+ const conversations = bundle.contents.conversations;
273
+ expect(conversations).toBeDefined();
274
+ expect(conversations?.count).toBe(5);
275
+ expect(conversations?.summaries).toHaveLength(5);
276
+ });
277
+ it('should save individual conversation files', async () => {
278
+ await createMockExport({ conversationCount: 3 });
279
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
280
+ await extractor.extract({ workDir });
281
+ const convDir = join(workDir, 'conversations');
282
+ const files = await readdir(convDir);
283
+ expect(files).toHaveLength(3);
284
+ expect(files.every((f) => f.endsWith('.json'))).toBe(true);
285
+ });
286
+ it('should extract messages in correct order', async () => {
287
+ await createMockExport({ conversationCount: 1 });
288
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
289
+ await extractor.extract({ workDir });
290
+ const convFile = join(workDir, 'conversations', 'conv_1.json');
291
+ const convData = JSON.parse(await readFile(convFile, 'utf-8'));
292
+ expect(convData.messages).toBeDefined();
293
+ expect(convData.messages.length).toBeGreaterThan(0);
294
+ // Check alternating roles
295
+ const roles = convData.messages.map((m) => m.role);
296
+ expect(roles[0]).toBe('user');
297
+ expect(roles[1]).toBe('assistant');
298
+ });
299
+ it('should count total messages correctly', async () => {
300
+ await createMockExport({ conversationCount: 2 });
301
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
302
+ const bundle = await extractor.extract({ workDir });
303
+ const conversations = bundle.contents.conversations;
304
+ // 2 conversations × 5 messages each = 10 messages
305
+ expect(conversations?.messageCount).toBe(10);
306
+ });
307
+ it('should respect maxConversations limit', async () => {
308
+ await createMockExport({ conversationCount: 10 });
309
+ const extractor = new ChatGPTExtractor({
310
+ exportPath: exportDir,
311
+ maxConversations: 3,
312
+ });
313
+ const bundle = await extractor.extract({ workDir });
314
+ expect(bundle.contents.conversations?.count).toBe(3);
315
+ });
316
+ it('should generate conversation summaries', async () => {
317
+ await createMockExport({ conversationCount: 2 });
318
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
319
+ const bundle = await extractor.extract({ workDir });
320
+ const summaries = bundle.contents.conversations?.summaries ?? [];
321
+ expect(summaries).toHaveLength(2);
322
+ for (const summary of summaries) {
323
+ expect(summary.id).toBeDefined();
324
+ expect(summary.title).toBeDefined();
325
+ expect(summary.messageCount).toBeGreaterThan(0);
326
+ expect(summary.createdAt).toBeDefined();
327
+ expect(summary.updatedAt).toBeDefined();
328
+ }
329
+ });
330
+ });
331
+ // ─── Files Extraction ────────────────────────────────────────
332
+ describe('files extraction', () => {
333
+ it('should extract files from export', async () => {
334
+ await createMockExport({ files: true });
335
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
336
+ const bundle = await extractor.extract({ workDir });
337
+ const files = bundle.contents.files;
338
+ expect(files).toBeDefined();
339
+ expect(files?.count).toBe(2);
340
+ expect(files?.totalSize).toBeGreaterThan(0);
341
+ });
342
+ it('should copy files to work directory', async () => {
343
+ await createMockExport({ files: true });
344
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
345
+ await extractor.extract({ workDir });
346
+ const filesDir = join(workDir, 'files');
347
+ const files = await readdir(filesDir);
348
+ expect(files).toContain('project-notes.md');
349
+ expect(files).toContain('data.json');
350
+ });
351
+ it('should detect MIME types correctly', async () => {
352
+ await createMockExport({ files: true });
353
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
354
+ const bundle = await extractor.extract({ workDir });
355
+ const files = bundle.contents.files?.files ?? [];
356
+ const mdFile = files.find((f) => f.filename === 'project-notes.md');
357
+ const jsonFile = files.find((f) => f.filename === 'data.json');
358
+ expect(mdFile?.mimeType).toBe('text/markdown');
359
+ expect(jsonFile?.mimeType).toBe('application/json');
360
+ });
361
+ });
362
+ // ─── Custom GPTs Extraction ──────────────────────────────────
363
+ describe('custom GPTs extraction', () => {
364
+ it('should extract custom GPTs from export', async () => {
365
+ await createMockExport({ gpts: true });
366
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
367
+ const bundle = await extractor.extract({ workDir });
368
+ const customBots = bundle.contents.customBots;
369
+ expect(customBots).toBeDefined();
370
+ expect(customBots?.count).toBe(2);
371
+ });
372
+ it('should preserve GPT details', async () => {
373
+ await createMockExport({ gpts: true });
374
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
375
+ const bundle = await extractor.extract({ workDir });
376
+ const bots = bundle.contents.customBots?.bots ?? [];
377
+ const codeReviewer = bots.find((b) => b.id === 'gpt_1');
378
+ expect(codeReviewer).toBeDefined();
379
+ expect(codeReviewer?.name).toBe('Code Review Helper');
380
+ expect(codeReviewer?.description).toContain('review code');
381
+ expect(codeReviewer?.instructions).toContain('code review assistant');
382
+ expect(codeReviewer?.capabilities).toContain('python');
383
+ expect(codeReviewer?.knowledgeFiles).toContain('coding-standards.pdf');
384
+ expect(codeReviewer?.createdAt).toBeDefined();
385
+ expect(codeReviewer?.updatedAt).toBeDefined();
386
+ });
387
+ });
388
+ // ─── Progress Tracking ───────────────────────────────────────
389
+ describe('progress tracking', () => {
390
+ it('should report progress during extraction', async () => {
391
+ await createMockExport();
392
+ const progressEvents = [];
393
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
394
+ await extractor.extract({
395
+ workDir,
396
+ onProgress: (progress, message) => {
397
+ progressEvents.push({ progress, message });
398
+ },
399
+ });
400
+ expect(progressEvents.length).toBeGreaterThan(0);
401
+ // Progress should increase (with small tolerance for floating point)
402
+ const progressValues = progressEvents.map((e) => e.progress);
403
+ for (let i = 1; i < progressValues.length; i++) {
404
+ // Allow small floating point tolerance (0.0001)
405
+ expect(progressValues[i]).toBeGreaterThanOrEqual(progressValues[i - 1] - 0.0001);
406
+ }
407
+ // Final progress should be 1.0
408
+ expect(progressValues[progressValues.length - 1]).toBe(1.0);
409
+ });
410
+ it('should track progress via getProgress()', async () => {
411
+ await createMockExport();
412
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
413
+ // Before extraction
414
+ expect(extractor.getProgress()).toBe(0);
415
+ await extractor.extract({ workDir });
416
+ // After extraction
417
+ expect(extractor.getProgress()).toBe(100);
418
+ });
419
+ });
420
+ // ─── Error Handling ──────────────────────────────────────────
421
+ describe('error handling', () => {
422
+ it('should handle missing conversations.json gracefully', async () => {
423
+ // Create export without conversations
424
+ await createMockExport({
425
+ conversations: false,
426
+ memories: true,
427
+ });
428
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
429
+ const bundle = await extractor.extract({ workDir });
430
+ // Should have memories but not conversations (not an error)
431
+ expect(bundle.contents.memories).toBeDefined();
432
+ expect(bundle.contents.conversations).toBeUndefined();
433
+ });
434
+ it('should handle corrupted JSON files', async () => {
435
+ await createMockExport();
436
+ // Corrupt the conversations file
437
+ await writeFile(join(exportDir, 'conversations.json'), 'not valid json {{{');
438
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
439
+ const bundle = await extractor.extract({ workDir });
440
+ // Should complete with errors logged
441
+ expect(bundle.metadata.errors.length).toBeGreaterThan(0);
442
+ });
443
+ it('should handle empty exports', async () => {
444
+ // Create empty export directory (no files)
445
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
446
+ const bundle = await extractor.extract({ workDir });
447
+ // Should complete without crashing
448
+ expect(bundle.version).toBe('1.0');
449
+ expect(bundle.metadata.totalItems).toBe(0);
450
+ });
451
+ });
452
+ // ─── Metadata ────────────────────────────────────────────────
453
+ describe('metadata', () => {
454
+ it('should generate accurate item counts', async () => {
455
+ await createMockExport({
456
+ conversations: true,
457
+ conversationCount: 5,
458
+ memories: true,
459
+ instructions: true,
460
+ files: true,
461
+ gpts: true,
462
+ });
463
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
464
+ const bundle = await extractor.extract({ workDir });
465
+ expect(bundle.metadata.itemCounts.instructions).toBe(1);
466
+ expect(bundle.metadata.itemCounts.memories).toBe(3);
467
+ expect(bundle.metadata.itemCounts.conversations).toBe(5);
468
+ expect(bundle.metadata.itemCounts.files).toBe(2);
469
+ expect(bundle.metadata.itemCounts.customBots).toBe(2);
470
+ expect(bundle.metadata.totalItems).toBe(1 + 3 + 5 + 2 + 2);
471
+ });
472
+ it('should include extraction timestamp', async () => {
473
+ await createMockExport();
474
+ const before = new Date().toISOString();
475
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
476
+ const bundle = await extractor.extract({ workDir });
477
+ const after = new Date().toISOString();
478
+ expect(bundle.source.extractedAt).toBeDefined();
479
+ expect(bundle.source.extractedAt >= before).toBe(true);
480
+ expect(bundle.source.extractedAt <= after).toBe(true);
481
+ });
482
+ it('should generate unique bundle IDs', async () => {
483
+ await createMockExport();
484
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
485
+ const bundle1 = await extractor.extract({ workDir: join(workDir, 'b1') });
486
+ const bundle2 = await extractor.extract({ workDir: join(workDir, 'b2') });
487
+ expect(bundle1.id).not.toBe(bundle2.id);
488
+ expect(bundle1.id).toMatch(/^bundle_[a-f0-9]+$/);
489
+ });
490
+ });
491
+ // ─── Large Data Handling ─────────────────────────────────────
492
+ describe('large data handling', () => {
493
+ it('should handle many conversations', async () => {
494
+ await createMockExport({ conversationCount: 100 });
495
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
496
+ const bundle = await extractor.extract({ workDir });
497
+ expect(bundle.contents.conversations?.count).toBe(100);
498
+ });
499
+ it('should handle conversations with many messages', async () => {
500
+ await createMockExport({
501
+ conversationCount: 2,
502
+ largeConversations: true,
503
+ });
504
+ const extractor = new ChatGPTExtractor({ exportPath: exportDir });
505
+ const bundle = await extractor.extract({ workDir });
506
+ // 2 conversations × 100 messages each = 200 messages
507
+ expect(bundle.contents.conversations?.messageCount).toBe(200);
508
+ });
509
+ });
510
+ // ─── Extractor Properties ────────────────────────────────────
511
+ describe('extractor properties', () => {
512
+ it('should have correct platform', () => {
513
+ const extractor = new ChatGPTExtractor();
514
+ expect(extractor.platform).toBe('chatgpt');
515
+ });
516
+ it('should have version string', () => {
517
+ const extractor = new ChatGPTExtractor();
518
+ expect(extractor.version).toMatch(/^\d+\.\d+\.\d+$/);
519
+ });
520
+ });
521
+ });
522
+ //# sourceMappingURL=chatgpt.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatgpt.test.js","sourceRoot":"","sources":["../../../../src/migrate/extractors/__tests__/chatgpt.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Claude Extractor Tests
3
+ *
4
+ * Tests for extracting data from Claude:
5
+ * - System prompts (from projects)
6
+ * - Project knowledge documents
7
+ * - Project files (attachments)
8
+ * - Artifacts
9
+ * - Conversations
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=claude.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.test.d.ts","sourceRoot":"","sources":["../../../../src/migrate/extractors/__tests__/claude.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}