@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.
- package/dist/cli/__tests__/progress.test.d.ts +5 -0
- package/dist/cli/__tests__/progress.test.d.ts.map +1 -0
- package/dist/cli/__tests__/progress.test.js +212 -0
- package/dist/cli/__tests__/progress.test.js.map +1 -0
- package/dist/cli/__tests__/signal-handler.test.d.ts +5 -0
- package/dist/cli/__tests__/signal-handler.test.d.ts.map +1 -0
- package/dist/cli/__tests__/signal-handler.test.js +99 -0
- package/dist/cli/__tests__/signal-handler.test.js.map +1 -0
- package/dist/cli/__tests__/summary.test.d.ts +5 -0
- package/dist/cli/__tests__/summary.test.d.ts.map +1 -0
- package/dist/cli/__tests__/summary.test.js +242 -0
- package/dist/cli/__tests__/summary.test.js.map +1 -0
- package/dist/cli/index.d.ts +10 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +10 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/progress.d.ts +86 -0
- package/dist/cli/progress.d.ts.map +1 -0
- package/dist/cli/progress.js +205 -0
- package/dist/cli/progress.js.map +1 -0
- package/dist/cli/prompts.d.ts +49 -0
- package/dist/cli/prompts.d.ts.map +1 -0
- package/dist/cli/prompts.js +266 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/cli/signal-handler.d.ts +63 -0
- package/dist/cli/signal-handler.d.ts.map +1 -0
- package/dist/cli/signal-handler.js +165 -0
- package/dist/cli/signal-handler.js.map +1 -0
- package/dist/cli/summary.d.ts +33 -0
- package/dist/cli/summary.d.ts.map +1 -0
- package/dist/cli/summary.js +296 -0
- package/dist/cli/summary.js.map +1 -0
- package/dist/cli.js +7 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/migrate.d.ts +18 -4
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +324 -163
- package/dist/commands/migrate.js.map +1 -1
- package/dist/migrate/__tests__/capabilities.test.d.ts +7 -0
- package/dist/migrate/__tests__/capabilities.test.d.ts.map +1 -0
- package/dist/migrate/__tests__/capabilities.test.js +90 -0
- package/dist/migrate/__tests__/capabilities.test.js.map +1 -0
- package/dist/migrate/__tests__/chatgpt-loader.test.d.ts +7 -0
- package/dist/migrate/__tests__/chatgpt-loader.test.d.ts.map +1 -0
- package/dist/migrate/__tests__/chatgpt-loader.test.js +889 -0
- package/dist/migrate/__tests__/chatgpt-loader.test.js.map +1 -0
- package/dist/migrate/__tests__/claude-loader.test.d.ts +7 -0
- package/dist/migrate/__tests__/claude-loader.test.d.ts.map +1 -0
- package/dist/migrate/__tests__/claude-loader.test.js +544 -0
- package/dist/migrate/__tests__/claude-loader.test.js.map +1 -0
- package/dist/migrate/__tests__/edge-cases.test.d.ts +7 -0
- package/dist/migrate/__tests__/edge-cases.test.d.ts.map +1 -0
- package/dist/migrate/__tests__/edge-cases.test.js +787 -0
- package/dist/migrate/__tests__/edge-cases.test.js.map +1 -0
- package/dist/migrate/__tests__/error-recovery.test.d.ts +7 -0
- package/dist/migrate/__tests__/error-recovery.test.d.ts.map +1 -0
- package/dist/migrate/__tests__/error-recovery.test.js +461 -0
- package/dist/migrate/__tests__/error-recovery.test.js.map +1 -0
- package/dist/migrate/__tests__/integration.test.d.ts +7 -0
- package/dist/migrate/__tests__/integration.test.d.ts.map +1 -0
- package/dist/migrate/__tests__/integration.test.js +536 -0
- package/dist/migrate/__tests__/integration.test.js.map +1 -0
- package/dist/migrate/__tests__/orchestrator.test.d.ts +8 -0
- package/dist/migrate/__tests__/orchestrator.test.d.ts.map +1 -0
- package/dist/migrate/__tests__/orchestrator.test.js +355 -0
- package/dist/migrate/__tests__/orchestrator.test.js.map +1 -0
- package/dist/migrate/__tests__/performance.test.d.ts +7 -0
- package/dist/migrate/__tests__/performance.test.d.ts.map +1 -0
- package/dist/migrate/__tests__/performance.test.js +478 -0
- package/dist/migrate/__tests__/performance.test.js.map +1 -0
- package/dist/migrate/__tests__/registry.test.d.ts +7 -0
- package/dist/migrate/__tests__/registry.test.d.ts.map +1 -0
- package/dist/migrate/__tests__/registry.test.js +167 -0
- package/dist/migrate/__tests__/registry.test.js.map +1 -0
- package/dist/migrate/compatibility.d.ts +47 -0
- package/dist/migrate/compatibility.d.ts.map +1 -0
- package/dist/migrate/compatibility.js +468 -0
- package/dist/migrate/compatibility.js.map +1 -0
- package/dist/migrate/extractors/__tests__/chatgpt.test.d.ts +12 -0
- package/dist/migrate/extractors/__tests__/chatgpt.test.d.ts.map +1 -0
- package/dist/migrate/extractors/__tests__/chatgpt.test.js +522 -0
- package/dist/migrate/extractors/__tests__/chatgpt.test.js.map +1 -0
- package/dist/migrate/extractors/__tests__/claude.test.d.ts +12 -0
- package/dist/migrate/extractors/__tests__/claude.test.d.ts.map +1 -0
- package/dist/migrate/extractors/__tests__/claude.test.js +789 -0
- package/dist/migrate/extractors/__tests__/claude.test.js.map +1 -0
- package/dist/migrate/extractors/chatgpt.d.ts +70 -0
- package/dist/migrate/extractors/chatgpt.d.ts.map +1 -0
- package/dist/migrate/extractors/chatgpt.js +791 -0
- package/dist/migrate/extractors/chatgpt.js.map +1 -0
- package/dist/migrate/extractors/claude.d.ts +69 -0
- package/dist/migrate/extractors/claude.d.ts.map +1 -0
- package/dist/migrate/extractors/claude.js +1136 -0
- package/dist/migrate/extractors/claude.js.map +1 -0
- package/dist/migrate/extractors/registry.js +6 -4
- package/dist/migrate/extractors/registry.js.map +1 -1
- package/dist/migrate/index.d.ts +6 -1
- package/dist/migrate/index.d.ts.map +1 -1
- package/dist/migrate/index.js +12 -1
- package/dist/migrate/index.js.map +1 -1
- package/dist/migrate/loaders/chatgpt.d.ts +72 -0
- package/dist/migrate/loaders/chatgpt.d.ts.map +1 -0
- package/dist/migrate/loaders/chatgpt.js +691 -0
- package/dist/migrate/loaders/chatgpt.js.map +1 -0
- package/dist/migrate/loaders/claude.d.ts +61 -0
- package/dist/migrate/loaders/claude.d.ts.map +1 -0
- package/dist/migrate/loaders/claude.js +433 -0
- package/dist/migrate/loaders/claude.js.map +1 -0
- package/dist/migrate/loaders/registry.js +6 -4
- package/dist/migrate/loaders/registry.js.map +1 -1
- package/dist/migrate/orchestrator.d.ts +75 -1
- package/dist/migrate/orchestrator.d.ts.map +1 -1
- package/dist/migrate/orchestrator.js +215 -19
- package/dist/migrate/orchestrator.js.map +1 -1
- package/dist/migrate/testing/index.d.ts +28 -0
- package/dist/migrate/testing/index.d.ts.map +1 -0
- package/dist/migrate/testing/index.js +55 -0
- package/dist/migrate/testing/index.js.map +1 -0
- package/dist/migrate/testing/mock-extractor.d.ts +30 -0
- package/dist/migrate/testing/mock-extractor.d.ts.map +1 -0
- package/dist/migrate/testing/mock-extractor.js +137 -0
- package/dist/migrate/testing/mock-extractor.js.map +1 -0
- package/dist/migrate/testing/mock-loader.d.ts +36 -0
- package/dist/migrate/testing/mock-loader.d.ts.map +1 -0
- package/dist/migrate/testing/mock-loader.js +81 -0
- package/dist/migrate/testing/mock-loader.js.map +1 -0
- package/dist/migrate/testing/mock-transformer.d.ts +26 -0
- package/dist/migrate/testing/mock-transformer.d.ts.map +1 -0
- package/dist/migrate/testing/mock-transformer.js +185 -0
- package/dist/migrate/testing/mock-transformer.js.map +1 -0
- package/dist/migrate/transformers/__tests__/chatgpt-to-claude.test.d.ts +5 -0
- package/dist/migrate/transformers/__tests__/chatgpt-to-claude.test.d.ts.map +1 -0
- package/dist/migrate/transformers/__tests__/chatgpt-to-claude.test.js +333 -0
- package/dist/migrate/transformers/__tests__/chatgpt-to-claude.test.js.map +1 -0
- package/dist/migrate/transformers/__tests__/claude-to-chatgpt.test.d.ts +5 -0
- package/dist/migrate/transformers/__tests__/claude-to-chatgpt.test.d.ts.map +1 -0
- package/dist/migrate/transformers/__tests__/claude-to-chatgpt.test.js +333 -0
- package/dist/migrate/transformers/__tests__/claude-to-chatgpt.test.js.map +1 -0
- package/dist/migrate/transformers/__tests__/rules.test.d.ts +5 -0
- package/dist/migrate/transformers/__tests__/rules.test.d.ts.map +1 -0
- package/dist/migrate/transformers/__tests__/rules.test.js +375 -0
- package/dist/migrate/transformers/__tests__/rules.test.js.map +1 -0
- package/dist/migrate/transformers/chatgpt-to-claude.d.ts +40 -0
- package/dist/migrate/transformers/chatgpt-to-claude.d.ts.map +1 -0
- package/dist/migrate/transformers/chatgpt-to-claude.js +443 -0
- package/dist/migrate/transformers/chatgpt-to-claude.js.map +1 -0
- package/dist/migrate/transformers/claude-to-chatgpt.d.ts +41 -0
- package/dist/migrate/transformers/claude-to-chatgpt.d.ts.map +1 -0
- package/dist/migrate/transformers/claude-to-chatgpt.js +532 -0
- package/dist/migrate/transformers/claude-to-chatgpt.js.map +1 -0
- package/dist/migrate/transformers/registry.js +6 -4
- package/dist/migrate/transformers/registry.js.map +1 -1
- package/dist/migrate/transformers/rules.d.ts +168 -0
- package/dist/migrate/transformers/rules.d.ts.map +1 -0
- package/dist/migrate/transformers/rules.js +487 -0
- package/dist/migrate/transformers/rules.js.map +1 -0
- package/dist/migrate/types.d.ts +2 -0
- package/dist/migrate/types.d.ts.map +1 -1
- 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"}
|