@savestate/cli 0.2.1 → 0.3.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/README.md +9 -0
- package/dist/cli.js +42 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/login.d.ts +13 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +111 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/migrate.d.ts +21 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +218 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/schedule.d.ts +14 -0
- package/dist/commands/schedule.d.ts.map +1 -0
- package/dist/commands/schedule.js +294 -0
- package/dist/commands/schedule.js.map +1 -0
- package/dist/commands/snapshot.d.ts +1 -0
- package/dist/commands/snapshot.d.ts.map +1 -1
- package/dist/commands/snapshot.js +14 -4
- package/dist/commands/snapshot.js.map +1 -1
- package/dist/incremental.d.ts +137 -0
- package/dist/incremental.d.ts.map +1 -0
- package/dist/incremental.js +289 -0
- package/dist/incremental.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/restore.d.ts.map +1 -1
- package/dist/restore.js +7 -2
- package/dist/restore.js.map +1 -1
- package/dist/snapshot.d.ts +17 -1
- package/dist/snapshot.d.ts.map +1 -1
- package/dist/snapshot.js +82 -17
- package/dist/snapshot.js.map +1 -1
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -147,6 +147,15 @@ savestate config View/edit configuration
|
|
|
147
147
|
--set <key=value> Set a config value
|
|
148
148
|
--json Output as JSON
|
|
149
149
|
savestate adapters List available adapters
|
|
150
|
+
savestate schedule Configure auto-backups (Pro/Team)
|
|
151
|
+
--every <interval> Backup interval (1h, 6h, 12h, 1d)
|
|
152
|
+
--disable Disable scheduled backups
|
|
153
|
+
--status Show schedule status
|
|
154
|
+
savestate migrate Migration wizard between platforms
|
|
155
|
+
--from <platform> Source platform
|
|
156
|
+
--to <platform> Target platform
|
|
157
|
+
--list Show platform capabilities
|
|
158
|
+
--dry-run Preview migration plan
|
|
150
159
|
```
|
|
151
160
|
|
|
152
161
|
## Storage Backends
|
package/dist/cli.js
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { Command } from 'commander';
|
|
17
17
|
import { initCommand, snapshotCommand, restoreCommand, listCommand, diffCommand, configCommand, adaptersCommand, } from './commands/index.js';
|
|
18
|
+
import { loginCommand, logoutCommand } from './commands/login.js';
|
|
18
19
|
const program = new Command();
|
|
19
20
|
program
|
|
20
21
|
.name('savestate')
|
|
@@ -33,6 +34,7 @@ program
|
|
|
33
34
|
.option('-t, --tags <tags>', 'Comma-separated tags')
|
|
34
35
|
.option('-a, --adapter <adapter>', 'Adapter to use (default: auto-detect)')
|
|
35
36
|
.option('-s, --schedule <interval>', 'Set up auto-snapshot schedule (e.g., 6h, 1d)')
|
|
37
|
+
.option('--full', 'Force a full snapshot (skip incremental)')
|
|
36
38
|
.action(snapshotCommand);
|
|
37
39
|
// ─── savestate restore ───────────────────────────────────────
|
|
38
40
|
program
|
|
@@ -67,6 +69,46 @@ program
|
|
|
67
69
|
.command('adapters')
|
|
68
70
|
.description('List available platform adapters')
|
|
69
71
|
.action(adaptersCommand);
|
|
72
|
+
// ─── savestate search ────────────────────────────────────────
|
|
73
|
+
import { searchCommand } from './commands/search.js';
|
|
74
|
+
program
|
|
75
|
+
.command('search <query>')
|
|
76
|
+
.description('Search across all snapshots')
|
|
77
|
+
.option('--type <type>', 'Filter by type (memory, conversation, identity)')
|
|
78
|
+
.option('--limit <n>', 'Maximum results')
|
|
79
|
+
.option('--snapshot <id>', 'Search within a specific snapshot')
|
|
80
|
+
.action(searchCommand);
|
|
81
|
+
// ─── savestate login ─────────────────────────────────────────
|
|
82
|
+
program
|
|
83
|
+
.command('login')
|
|
84
|
+
.description('Authenticate with SaveState cloud')
|
|
85
|
+
.option('-k, --key <api-key>', 'API key (or enter interactively)')
|
|
86
|
+
.action(loginCommand);
|
|
87
|
+
// ─── savestate logout ────────────────────────────────────────
|
|
88
|
+
program
|
|
89
|
+
.command('logout')
|
|
90
|
+
.description('Remove saved API key')
|
|
91
|
+
.action(logoutCommand);
|
|
92
|
+
// ─── savestate schedule ──────────────────────────────────────
|
|
93
|
+
import { scheduleCommand } from './commands/schedule.js';
|
|
94
|
+
program
|
|
95
|
+
.command('schedule')
|
|
96
|
+
.description('Configure automatic backup schedule (Pro/Team)')
|
|
97
|
+
.option('-e, --every <interval>', 'Backup interval (e.g., 1h, 6h, 12h, 1d)')
|
|
98
|
+
.option('-d, --disable', 'Disable scheduled backups')
|
|
99
|
+
.option('-s, --status', 'Show schedule status')
|
|
100
|
+
.action(scheduleCommand);
|
|
101
|
+
// ─── savestate migrate ───────────────────────────────────────
|
|
102
|
+
import { migrateCommand } from './commands/migrate.js';
|
|
103
|
+
program
|
|
104
|
+
.command('migrate')
|
|
105
|
+
.description('Migrate AI identity between platforms (ChatGPT → Claude, etc.)')
|
|
106
|
+
.option('-f, --from <platform>', 'Source platform to migrate from')
|
|
107
|
+
.option('-t, --to <platform>', 'Target platform to migrate to')
|
|
108
|
+
.option('-s, --snapshot <id>', 'Use existing snapshot instead of creating new one')
|
|
109
|
+
.option('--dry-run', 'Show migration plan without making changes')
|
|
110
|
+
.option('-l, --list', 'List available platforms and their capabilities')
|
|
111
|
+
.action(migrateCommand);
|
|
70
112
|
// ─── Parse & run ─────────────────────────────────────────────
|
|
71
113
|
program.parse();
|
|
72
114
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,WAAW,EACX,eAAe,EACf,cAAc,EACd,WAAW,EACX,WAAW,EACX,aAAa,EACb,eAAe,GAChB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* savestate login — Authenticate with SaveState cloud
|
|
3
|
+
*/
|
|
4
|
+
interface LoginOptions {
|
|
5
|
+
key?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function loginCommand(options: LoginOptions): Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* savestate logout — Remove API key
|
|
10
|
+
*/
|
|
11
|
+
export declare function logoutCommand(): Promise<void>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,UAAU,YAAY;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAsFvE;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAsBnD"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* savestate login — Authenticate with SaveState cloud
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import ora from 'ora';
|
|
6
|
+
import { loadConfig, saveConfig, isInitialized } from '../config.js';
|
|
7
|
+
const API_BASE = 'https://savestate.dev/api';
|
|
8
|
+
export async function loginCommand(options) {
|
|
9
|
+
console.log();
|
|
10
|
+
if (!isInitialized()) {
|
|
11
|
+
console.log(chalk.red('✗ SaveState not initialized. Run `savestate init` first.'));
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
let apiKey = options.key;
|
|
15
|
+
// If no key provided, prompt for it
|
|
16
|
+
if (!apiKey) {
|
|
17
|
+
const readline = await import('node:readline');
|
|
18
|
+
const rl = readline.createInterface({
|
|
19
|
+
input: process.stdin,
|
|
20
|
+
output: process.stdout,
|
|
21
|
+
});
|
|
22
|
+
apiKey = await new Promise((resolve) => {
|
|
23
|
+
rl.question(chalk.dim(' API Key: '), (answer) => {
|
|
24
|
+
rl.close();
|
|
25
|
+
resolve(answer.trim());
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
if (!apiKey || !apiKey.startsWith('ss_live_')) {
|
|
30
|
+
console.log(chalk.red('✗ Invalid API key. Keys start with ss_live_'));
|
|
31
|
+
console.log(chalk.dim(' Get your key at https://savestate.dev/account'));
|
|
32
|
+
console.log();
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
// Validate the key against the API
|
|
36
|
+
const spinner = ora('Validating API key...').start();
|
|
37
|
+
try {
|
|
38
|
+
const res = await fetch(`${API_BASE}/account`, {
|
|
39
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
40
|
+
});
|
|
41
|
+
if (!res.ok) {
|
|
42
|
+
spinner.fail('Invalid API key');
|
|
43
|
+
const body = await res.json().catch(() => ({}));
|
|
44
|
+
console.log(chalk.red(` ${body.error || 'Authentication failed'}`));
|
|
45
|
+
console.log();
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
const account = await res.json();
|
|
49
|
+
// Save to config
|
|
50
|
+
const config = await loadConfig();
|
|
51
|
+
// Extend config with cloud auth fields
|
|
52
|
+
const extConfig = config;
|
|
53
|
+
extConfig.apiKey = apiKey;
|
|
54
|
+
extConfig.account = {
|
|
55
|
+
email: account.email,
|
|
56
|
+
tier: account.tier,
|
|
57
|
+
};
|
|
58
|
+
await saveConfig(config);
|
|
59
|
+
spinner.succeed('Authenticated!');
|
|
60
|
+
console.log();
|
|
61
|
+
console.log(` ${chalk.dim('Account:')} ${chalk.cyan(account.email)}`);
|
|
62
|
+
console.log(` ${chalk.dim('Tier:')} ${chalk.green(account.tier.toUpperCase())}`);
|
|
63
|
+
console.log(` ${chalk.dim('Features:')} ${account.features.length} enabled`);
|
|
64
|
+
if (account.storage.limit > 0) {
|
|
65
|
+
console.log(` ${chalk.dim('Storage:')} ${formatBytes(account.storage.limit)} cloud storage`);
|
|
66
|
+
}
|
|
67
|
+
console.log();
|
|
68
|
+
console.log(chalk.dim(' Your API key is saved locally. Cloud features are now unlocked.'));
|
|
69
|
+
console.log();
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
spinner.fail('Connection failed');
|
|
73
|
+
console.log(chalk.red(` Could not reach ${API_BASE}`));
|
|
74
|
+
console.log(chalk.dim(' Check your internet connection and try again.'));
|
|
75
|
+
console.log();
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* savestate logout — Remove API key
|
|
81
|
+
*/
|
|
82
|
+
export async function logoutCommand() {
|
|
83
|
+
console.log();
|
|
84
|
+
if (!isInitialized()) {
|
|
85
|
+
console.log(chalk.red('✗ SaveState not initialized.'));
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
const config = await loadConfig();
|
|
89
|
+
const extConfig = config;
|
|
90
|
+
const hadKey = !!extConfig.apiKey;
|
|
91
|
+
delete extConfig.apiKey;
|
|
92
|
+
delete extConfig.account;
|
|
93
|
+
await saveConfig(config);
|
|
94
|
+
if (hadKey) {
|
|
95
|
+
console.log(chalk.green(' ✓ Logged out. API key removed.'));
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
console.log(chalk.dim(' Not logged in.'));
|
|
99
|
+
}
|
|
100
|
+
console.log();
|
|
101
|
+
}
|
|
102
|
+
function formatBytes(bytes) {
|
|
103
|
+
if (bytes < 1024)
|
|
104
|
+
return `${bytes} B`;
|
|
105
|
+
if (bytes < 1024 * 1024)
|
|
106
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
107
|
+
if (bytes < 1024 * 1024 * 1024)
|
|
108
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
109
|
+
return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* savestate migrate — Cross-platform AI identity migration wizard
|
|
3
|
+
*
|
|
4
|
+
* Helps users move their AI identity from one platform to another:
|
|
5
|
+
* - ChatGPT → Claude
|
|
6
|
+
* - Claude → Gemini
|
|
7
|
+
* - OpenAI Assistants → Clawdbot
|
|
8
|
+
* - etc.
|
|
9
|
+
*
|
|
10
|
+
* This is a guided wizard with clear explanations.
|
|
11
|
+
*/
|
|
12
|
+
interface MigrateOptions {
|
|
13
|
+
from?: string;
|
|
14
|
+
to?: string;
|
|
15
|
+
snapshot?: string;
|
|
16
|
+
dryRun?: boolean;
|
|
17
|
+
list?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function migrateCommand(options: MigrateOptions): Promise<void>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAYH,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAYD,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA4L3E"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* savestate migrate — Cross-platform AI identity migration wizard
|
|
3
|
+
*
|
|
4
|
+
* Helps users move their AI identity from one platform to another:
|
|
5
|
+
* - ChatGPT → Claude
|
|
6
|
+
* - Claude → Gemini
|
|
7
|
+
* - OpenAI Assistants → Clawdbot
|
|
8
|
+
* - etc.
|
|
9
|
+
*
|
|
10
|
+
* This is a guided wizard with clear explanations.
|
|
11
|
+
*/
|
|
12
|
+
import chalk from 'chalk';
|
|
13
|
+
import ora from 'ora';
|
|
14
|
+
import * as readline from 'node:readline';
|
|
15
|
+
import { isInitialized, loadConfig } from '../config.js';
|
|
16
|
+
import { getAdapter, listAdapters } from '../adapters/registry.js';
|
|
17
|
+
import { createSnapshot } from '../snapshot.js';
|
|
18
|
+
import { restoreSnapshot } from '../restore.js';
|
|
19
|
+
import { resolveStorage } from '../storage/resolve.js';
|
|
20
|
+
import { getPassphrase } from '../passphrase.js';
|
|
21
|
+
// Platform migration capabilities (what each platform can do)
|
|
22
|
+
const PLATFORM_INFO = {
|
|
23
|
+
'clawdbot': { extract: true, restore: true },
|
|
24
|
+
'claude-code': { extract: true, restore: true },
|
|
25
|
+
'openai-assistants': { extract: true, restore: true },
|
|
26
|
+
'chatgpt': { extract: true, restore: false, note: 'Memory/instructions only' },
|
|
27
|
+
'claude-web': { extract: true, restore: false, note: 'Memory/projects only' },
|
|
28
|
+
'gemini': { extract: true, restore: false, note: 'Limited restore' },
|
|
29
|
+
};
|
|
30
|
+
export async function migrateCommand(options) {
|
|
31
|
+
console.log();
|
|
32
|
+
console.log(chalk.cyan.bold('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'));
|
|
33
|
+
console.log(chalk.cyan.bold(' ⏸ SaveState Migration Wizard'));
|
|
34
|
+
console.log(chalk.cyan.bold('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'));
|
|
35
|
+
console.log();
|
|
36
|
+
if (options.list) {
|
|
37
|
+
showPlatforms();
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (!isInitialized()) {
|
|
41
|
+
console.log(chalk.red('✗ SaveState not initialized. Run `savestate init` first.'));
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
const config = await loadConfig();
|
|
45
|
+
const storage = resolveStorage(config);
|
|
46
|
+
// Interactive mode if not all options provided
|
|
47
|
+
if (!options.from || !options.to) {
|
|
48
|
+
console.log(chalk.white('This wizard helps you migrate your AI identity between platforms.'));
|
|
49
|
+
console.log(chalk.dim('Your data will be encrypted throughout the process.'));
|
|
50
|
+
console.log();
|
|
51
|
+
showPlatforms();
|
|
52
|
+
}
|
|
53
|
+
const rl = readline.createInterface({
|
|
54
|
+
input: process.stdin,
|
|
55
|
+
output: process.stdout,
|
|
56
|
+
});
|
|
57
|
+
const ask = (question) => {
|
|
58
|
+
return new Promise(resolve => {
|
|
59
|
+
rl.question(chalk.cyan(question), answer => resolve(answer.trim()));
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
try {
|
|
63
|
+
// Step 1: Select source platform
|
|
64
|
+
let sourceId = options.from;
|
|
65
|
+
if (!sourceId) {
|
|
66
|
+
sourceId = await ask('Source platform (migrate FROM): ');
|
|
67
|
+
}
|
|
68
|
+
const sourceAdapter = getAdapter(sourceId);
|
|
69
|
+
if (!sourceAdapter) {
|
|
70
|
+
console.log(chalk.red(`\n✗ Unknown platform: ${sourceId}`));
|
|
71
|
+
console.log(chalk.dim(` Available: ${listAdapters().join(', ')}`));
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
const sourceInfo = PLATFORM_INFO[sourceId];
|
|
75
|
+
if (!sourceInfo?.extract) {
|
|
76
|
+
console.log(chalk.red(`\n✗ ${sourceAdapter.name} doesn't support extraction`));
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
// Step 2: Select target platform
|
|
80
|
+
let targetId = options.to;
|
|
81
|
+
if (!targetId) {
|
|
82
|
+
targetId = await ask('Target platform (migrate TO): ');
|
|
83
|
+
}
|
|
84
|
+
const targetAdapter = getAdapter(targetId);
|
|
85
|
+
if (!targetAdapter) {
|
|
86
|
+
console.log(chalk.red(`\n✗ Unknown platform: ${targetId}`));
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
const targetInfo = PLATFORM_INFO[targetId];
|
|
90
|
+
if (!targetInfo?.restore) {
|
|
91
|
+
console.log(chalk.yellow(`\n⚠ ${targetAdapter.name} has limited restore support`));
|
|
92
|
+
if (targetInfo?.note) {
|
|
93
|
+
console.log(chalk.dim(` ${targetInfo.note}`));
|
|
94
|
+
}
|
|
95
|
+
const proceed = await ask('Continue anyway? (yes/no): ');
|
|
96
|
+
if (proceed.toLowerCase() !== 'yes' && proceed.toLowerCase() !== 'y') {
|
|
97
|
+
console.log(chalk.yellow('\nMigration cancelled.'));
|
|
98
|
+
rl.close();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
console.log();
|
|
103
|
+
console.log(chalk.white.bold('Migration Plan:'));
|
|
104
|
+
console.log();
|
|
105
|
+
console.log(` ${chalk.cyan('From:')} ${sourceAdapter.name}`);
|
|
106
|
+
console.log(` ${chalk.cyan('To:')} ${targetAdapter.name}`);
|
|
107
|
+
console.log();
|
|
108
|
+
// Show what will be migrated
|
|
109
|
+
console.log(chalk.white.bold('What will be migrated:'));
|
|
110
|
+
console.log();
|
|
111
|
+
console.log(` ${chalk.green('✓')} Identity (personality, instructions, system prompts)`);
|
|
112
|
+
console.log(` ${chalk.green('✓')} Memory (learned facts, preferences)`);
|
|
113
|
+
console.log(` ${chalk.green('✓')} Configuration (settings, tool configs)`);
|
|
114
|
+
if (sourceId === 'chatgpt' || sourceId === 'claude-web') {
|
|
115
|
+
console.log(` ${chalk.yellow('⚠')} Conversations ${chalk.dim('(preserved in snapshot, may not import to target)')}`);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
console.log(` ${chalk.green('✓')} Conversations (if supported by target)`);
|
|
119
|
+
}
|
|
120
|
+
console.log();
|
|
121
|
+
// Specific migration notes
|
|
122
|
+
if (sourceId === 'chatgpt') {
|
|
123
|
+
console.log(chalk.yellow.bold('Note for ChatGPT migration:'));
|
|
124
|
+
console.log(chalk.yellow(' Your ChatGPT memories and custom instructions will be exported.'));
|
|
125
|
+
console.log(chalk.yellow(' Conversation history is preserved but may not import elsewhere.'));
|
|
126
|
+
console.log();
|
|
127
|
+
}
|
|
128
|
+
if (options.dryRun) {
|
|
129
|
+
console.log(chalk.cyan.bold('DRY RUN — no changes will be made'));
|
|
130
|
+
console.log();
|
|
131
|
+
rl.close();
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
// Confirm
|
|
135
|
+
const confirm = await ask('Proceed with migration? (yes/no): ');
|
|
136
|
+
if (confirm.toLowerCase() !== 'yes' && confirm.toLowerCase() !== 'y') {
|
|
137
|
+
console.log(chalk.yellow('\nMigration cancelled.'));
|
|
138
|
+
rl.close();
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
console.log();
|
|
142
|
+
// Step 4: Get passphrase
|
|
143
|
+
const passphrase = await getPassphrase();
|
|
144
|
+
// Step 5: Create snapshot from source
|
|
145
|
+
const spinner1 = ora(`Extracting from ${sourceAdapter.name}...`).start();
|
|
146
|
+
let snapshotId = options.snapshot;
|
|
147
|
+
if (!snapshotId) {
|
|
148
|
+
try {
|
|
149
|
+
const result = await createSnapshot(sourceAdapter, storage, passphrase, {
|
|
150
|
+
label: `migration-from-${sourceId}`,
|
|
151
|
+
tags: ['migration', `from:${sourceId}`, `to:${targetId}`],
|
|
152
|
+
});
|
|
153
|
+
snapshotId = result.snapshot.manifest.id;
|
|
154
|
+
spinner1.succeed(`Snapshot created: ${chalk.cyan(snapshotId)}`);
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
spinner1.fail('Failed to create snapshot');
|
|
158
|
+
console.error(chalk.red(err instanceof Error ? err.message : String(err)));
|
|
159
|
+
process.exit(1);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
spinner1.succeed(`Using existing snapshot: ${chalk.cyan(snapshotId)}`);
|
|
164
|
+
}
|
|
165
|
+
// Step 6: Restore to target
|
|
166
|
+
const spinner2 = ora(`Restoring to ${targetAdapter.name}...`).start();
|
|
167
|
+
try {
|
|
168
|
+
await restoreSnapshot(snapshotId, targetAdapter, storage, passphrase);
|
|
169
|
+
spinner2.succeed(`Migration complete!`);
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
spinner2.fail('Failed to restore');
|
|
173
|
+
console.error(chalk.red(err instanceof Error ? err.message : String(err)));
|
|
174
|
+
console.log();
|
|
175
|
+
console.log(chalk.dim(`Your snapshot is preserved: ${snapshotId}`));
|
|
176
|
+
console.log(chalk.dim(`You can retry with: savestate restore ${snapshotId} --to ${targetId}`));
|
|
177
|
+
process.exit(1);
|
|
178
|
+
}
|
|
179
|
+
// Success
|
|
180
|
+
console.log();
|
|
181
|
+
console.log(chalk.green.bold('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'));
|
|
182
|
+
console.log(chalk.green.bold(' ✓ Migration Successful!'));
|
|
183
|
+
console.log(chalk.green.bold('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'));
|
|
184
|
+
console.log();
|
|
185
|
+
console.log(` Your AI identity has been migrated from ${chalk.cyan(sourceAdapter.name)}`);
|
|
186
|
+
console.log(` to ${chalk.cyan(targetAdapter.name)}.`);
|
|
187
|
+
console.log();
|
|
188
|
+
console.log(chalk.dim(` Snapshot preserved: ${snapshotId}`));
|
|
189
|
+
console.log(chalk.dim(` You can restore again anytime with:`));
|
|
190
|
+
console.log(chalk.dim(` savestate restore ${snapshotId} --to <platform>`));
|
|
191
|
+
console.log();
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
rl.close();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
function showPlatforms() {
|
|
198
|
+
console.log(chalk.white.bold('Available Platforms:'));
|
|
199
|
+
console.log();
|
|
200
|
+
const adapterIds = listAdapters();
|
|
201
|
+
adapterIds.forEach(id => {
|
|
202
|
+
const adapter = getAdapter(id);
|
|
203
|
+
if (!adapter)
|
|
204
|
+
return;
|
|
205
|
+
const info = PLATFORM_INFO[id] || { extract: true, restore: true };
|
|
206
|
+
const extract = info.extract ? chalk.green('✓') : chalk.red('✗');
|
|
207
|
+
const restore = info.restore ? chalk.green('✓') : chalk.yellow('⚠');
|
|
208
|
+
let line = ` ${chalk.white(id.padEnd(20))} ${extract} extract ${restore} restore`;
|
|
209
|
+
if (info.note) {
|
|
210
|
+
line += chalk.dim(` (${info.note})`);
|
|
211
|
+
}
|
|
212
|
+
console.log(line);
|
|
213
|
+
});
|
|
214
|
+
console.log();
|
|
215
|
+
console.log(chalk.dim('Legend: ✓ = full support, ⚠ = partial/limited, ✗ = not supported'));
|
|
216
|
+
console.log();
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* savestate schedule — Configure automatic backup schedules
|
|
3
|
+
*
|
|
4
|
+
* Uses launchd (macOS) or systemd timers (Linux) for reliable scheduling.
|
|
5
|
+
* Requires Pro or Team tier for cloud-backed schedules.
|
|
6
|
+
*/
|
|
7
|
+
interface ScheduleOptions {
|
|
8
|
+
every?: string;
|
|
9
|
+
disable?: boolean;
|
|
10
|
+
status?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function scheduleCommand(options: ScheduleOptions): Promise<void>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=schedule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/commands/schedule.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,UAAU,eAAe;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAID,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB7E"}
|