cursor-history 0.6.0 → 0.9.1
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/LICENSE +7 -0
- package/README.md +371 -9
- package/dist/cli/commands/backup.d.ts +9 -0
- package/dist/cli/commands/backup.d.ts.map +1 -0
- package/dist/cli/commands/backup.js +168 -0
- package/dist/cli/commands/backup.js.map +1 -0
- package/dist/cli/commands/export.d.ts.map +1 -1
- package/dist/cli/commands/export.js +38 -6
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/list-backups.d.ts +9 -0
- package/dist/cli/commands/list-backups.d.ts.map +1 -0
- package/dist/cli/commands/list-backups.js +166 -0
- package/dist/cli/commands/list-backups.js.map +1 -0
- package/dist/cli/commands/list.d.ts.map +1 -1
- package/dist/cli/commands/list.js +44 -9
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/migrate-session.d.ts +12 -0
- package/dist/cli/commands/migrate-session.d.ts.map +1 -0
- package/dist/cli/commands/migrate-session.js +125 -0
- package/dist/cli/commands/migrate-session.js.map +1 -0
- package/dist/cli/commands/migrate.d.ts +13 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -0
- package/dist/cli/commands/migrate.js +122 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/cli/commands/restore.d.ts +9 -0
- package/dist/cli/commands/restore.d.ts.map +1 -0
- package/dist/cli/commands/restore.js +192 -0
- package/dist/cli/commands/restore.js.map +1 -0
- package/dist/cli/commands/search.d.ts.map +1 -1
- package/dist/cli/commands/search.js +30 -2
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/show.d.ts.map +1 -1
- package/dist/cli/commands/show.js +31 -3
- package/dist/cli/commands/show.js.map +1 -1
- package/dist/cli/index.js +10 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/backup.d.ts +86 -0
- package/dist/core/backup.d.ts.map +1 -0
- package/dist/core/backup.js +727 -0
- package/dist/core/backup.js.map +1 -0
- package/dist/core/database/debug.d.ts +12 -0
- package/dist/core/database/debug.d.ts.map +1 -0
- package/dist/core/database/debug.js +16 -0
- package/dist/core/database/debug.js.map +1 -0
- package/dist/core/database/drivers/better-sqlite3.d.ts +11 -0
- package/dist/core/database/drivers/better-sqlite3.d.ts.map +1 -0
- package/dist/core/database/drivers/better-sqlite3.js +93 -0
- package/dist/core/database/drivers/better-sqlite3.js.map +1 -0
- package/dist/core/database/drivers/node-sqlite.d.ts +15 -0
- package/dist/core/database/drivers/node-sqlite.d.ts.map +1 -0
- package/dist/core/database/drivers/node-sqlite.js +135 -0
- package/dist/core/database/drivers/node-sqlite.js.map +1 -0
- package/dist/core/database/errors.d.ts +24 -0
- package/dist/core/database/errors.d.ts.map +1 -0
- package/dist/core/database/errors.js +38 -0
- package/dist/core/database/errors.js.map +1 -0
- package/dist/core/database/index.d.ts +98 -0
- package/dist/core/database/index.d.ts.map +1 -0
- package/dist/core/database/index.js +125 -0
- package/dist/core/database/index.js.map +1 -0
- package/dist/core/database/registry.d.ts +81 -0
- package/dist/core/database/registry.d.ts.map +1 -0
- package/dist/core/database/registry.js +171 -0
- package/dist/core/database/registry.js.map +1 -0
- package/dist/core/database/types.d.ts +115 -0
- package/dist/core/database/types.d.ts.map +1 -0
- package/dist/core/database/types.js +8 -0
- package/dist/core/database/types.js.map +1 -0
- package/dist/core/migrate.d.ts +40 -0
- package/dist/core/migrate.d.ts.map +1 -0
- package/dist/core/migrate.js +586 -0
- package/dist/core/migrate.js.map +1 -0
- package/dist/core/storage.d.ts +84 -10
- package/dist/core/storage.d.ts.map +1 -1
- package/dist/core/storage.js +319 -33
- package/dist/core/storage.js.map +1 -1
- package/dist/core/types.d.ts +252 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/lib/backup.d.ts +98 -0
- package/dist/lib/backup.d.ts.map +1 -0
- package/dist/lib/backup.js +108 -0
- package/dist/lib/backup.js.map +1 -0
- package/dist/lib/config.d.ts +3 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +10 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/errors.d.ts +229 -0
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +361 -0
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/index.d.ts +133 -24
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +212 -49
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/platform.d.ts +11 -0
- package/dist/lib/platform.d.ts.map +1 -1
- package/dist/lib/platform.js +32 -0
- package/dist/lib/platform.js.map +1 -1
- package/dist/lib/types.d.ts +267 -0
- package/dist/lib/types.d.ts.map +1 -1
- package/package.json +23 -3
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Export command - export chat sessions to files
|
|
3
3
|
*/
|
|
4
|
+
import pc from 'picocolors';
|
|
4
5
|
import { writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
5
6
|
import { dirname, join } from 'node:path';
|
|
6
7
|
import { getSession, listSessions, findWorkspaces } from '../../core/storage.js';
|
|
8
|
+
import { validateBackup } from '../../core/backup.js';
|
|
7
9
|
import { exportToMarkdown, exportToJson } from '../../core/parser.js';
|
|
8
10
|
import { formatExportSuccess, formatExportResultJson } from '../formatters/index.js';
|
|
9
11
|
import { SessionNotFoundError, FileExistsError, handleError, CliError, ExitCode, } from '../errors.js';
|
|
@@ -19,11 +21,33 @@ export function registerExportCommand(program) {
|
|
|
19
21
|
.option('-f, --format <format>', 'Output format: md or json', 'md')
|
|
20
22
|
.option('--force', 'Overwrite existing files')
|
|
21
23
|
.option('-a, --all', 'Export all sessions')
|
|
24
|
+
.option('-b, --backup <path>', 'Export from backup file instead of live data')
|
|
22
25
|
.action(async (indexArg, options, command) => {
|
|
23
26
|
const globalOptions = command.parent?.opts();
|
|
24
27
|
const useJson = options.json ?? globalOptions?.json ?? false;
|
|
25
28
|
const customPath = options.dataPath ?? globalOptions?.dataPath;
|
|
26
29
|
const format = options.format === 'json' ? 'json' : 'md';
|
|
30
|
+
const backupPath = options.backup ? expandPath(options.backup) : undefined;
|
|
31
|
+
// T037: Validate backup if exporting from backup
|
|
32
|
+
if (backupPath) {
|
|
33
|
+
const validation = validateBackup(backupPath);
|
|
34
|
+
if (validation.status === 'invalid') {
|
|
35
|
+
if (useJson) {
|
|
36
|
+
console.log(JSON.stringify({ error: 'Invalid backup', errors: validation.errors }));
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
console.error(pc.red('Invalid backup file:'));
|
|
40
|
+
for (const err of validation.errors) {
|
|
41
|
+
console.error(pc.dim(` ${err}`));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
process.exit(3);
|
|
45
|
+
}
|
|
46
|
+
if (validation.status === 'warnings' && !useJson) {
|
|
47
|
+
console.error(pc.yellow(`Warning: Backup has integrity issues (${validation.corruptedFiles.length} corrupted files)`));
|
|
48
|
+
console.error(pc.dim('Continuing with intact files...\n'));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
27
51
|
try {
|
|
28
52
|
// Validate arguments
|
|
29
53
|
if (!options.all && !indexArg) {
|
|
@@ -32,7 +56,7 @@ export function registerExportCommand(program) {
|
|
|
32
56
|
const exported = [];
|
|
33
57
|
if (options.all) {
|
|
34
58
|
// Export all sessions
|
|
35
|
-
const sessions = listSessions({ limit: 0, all: true }, customPath ? expandPath(customPath) : undefined);
|
|
59
|
+
const sessions = await listSessions({ limit: 0, all: true }, customPath ? expandPath(customPath) : undefined, backupPath);
|
|
36
60
|
if (sessions.length === 0) {
|
|
37
61
|
throw new CliError('No sessions to export.', ExitCode.NOT_FOUND);
|
|
38
62
|
}
|
|
@@ -42,9 +66,13 @@ export function registerExportCommand(program) {
|
|
|
42
66
|
if (!existsSync(outputDir)) {
|
|
43
67
|
mkdirSync(outputDir, { recursive: true });
|
|
44
68
|
}
|
|
45
|
-
const workspaces = findWorkspaces(customPath ? expandPath(customPath) : undefined);
|
|
69
|
+
const workspaces = await findWorkspaces(customPath ? expandPath(customPath) : undefined, backupPath);
|
|
70
|
+
// Show backup source indicator if exporting from backup
|
|
71
|
+
if (backupPath && !useJson) {
|
|
72
|
+
console.log(pc.dim(`Exporting from backup: ${contractPath(backupPath)}\n`));
|
|
73
|
+
}
|
|
46
74
|
for (const summary of sessions) {
|
|
47
|
-
const session = getSession(summary.index, customPath ? expandPath(customPath) : undefined);
|
|
75
|
+
const session = await getSession(summary.index, customPath ? expandPath(customPath) : undefined, backupPath);
|
|
48
76
|
if (!session)
|
|
49
77
|
continue;
|
|
50
78
|
const workspace = workspaces.find((w) => w.id === session.workspaceId);
|
|
@@ -74,12 +102,12 @@ export function registerExportCommand(program) {
|
|
|
74
102
|
if (isNaN(index) || index < 1) {
|
|
75
103
|
throw new CliError(`Invalid index: ${indexArg}. Must be a positive number.`, ExitCode.USAGE_ERROR);
|
|
76
104
|
}
|
|
77
|
-
const session = getSession(index, customPath ? expandPath(customPath) : undefined);
|
|
105
|
+
const session = await getSession(index, customPath ? expandPath(customPath) : undefined, backupPath);
|
|
78
106
|
if (!session) {
|
|
79
|
-
const sessions = listSessions({ limit: 0, all: true }, customPath ? expandPath(customPath) : undefined);
|
|
107
|
+
const sessions = await listSessions({ limit: 0, all: true }, customPath ? expandPath(customPath) : undefined, backupPath);
|
|
80
108
|
throw new SessionNotFoundError(index, sessions.length);
|
|
81
109
|
}
|
|
82
|
-
const workspaces = findWorkspaces(customPath ? expandPath(customPath) : undefined);
|
|
110
|
+
const workspaces = await findWorkspaces(customPath ? expandPath(customPath) : undefined, backupPath);
|
|
83
111
|
const workspace = workspaces.find((w) => w.id === session.workspaceId);
|
|
84
112
|
const workspacePath = workspace?.path;
|
|
85
113
|
// Determine output path
|
|
@@ -103,6 +131,10 @@ export function registerExportCommand(program) {
|
|
|
103
131
|
if (dir !== '.' && !existsSync(dir)) {
|
|
104
132
|
mkdirSync(dir, { recursive: true });
|
|
105
133
|
}
|
|
134
|
+
// Show backup source indicator if exporting from backup
|
|
135
|
+
if (backupPath && !useJson) {
|
|
136
|
+
console.log(pc.dim(`Exporting from backup: ${contractPath(backupPath)}\n`));
|
|
137
|
+
}
|
|
106
138
|
// Export
|
|
107
139
|
const content = format === 'json'
|
|
108
140
|
? exportToJson(session, workspacePath)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/cli/commands/export.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,WAAW,EACX,QAAQ,EACR,QAAQ,GACT,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/cli/commands/export.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List-backups command - list available backup files
|
|
3
|
+
*/
|
|
4
|
+
import type { Command } from 'commander';
|
|
5
|
+
/**
|
|
6
|
+
* Register the list-backups command
|
|
7
|
+
*/
|
|
8
|
+
export declare function registerListBackupsCommand(program: Command): void;
|
|
9
|
+
//# sourceMappingURL=list-backups.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-backups.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/list-backups.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwHzC;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiEjE"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List-backups command - list available backup files
|
|
3
|
+
*/
|
|
4
|
+
import pc from 'picocolors';
|
|
5
|
+
import { existsSync } from 'node:fs';
|
|
6
|
+
import { listBackups, getDefaultBackupDir } from '../../core/backup.js';
|
|
7
|
+
import { handleError, ExitCode } from '../errors.js';
|
|
8
|
+
import { expandPath, contractPath } from '../../lib/platform.js';
|
|
9
|
+
/**
|
|
10
|
+
* Format file size for display
|
|
11
|
+
*/
|
|
12
|
+
function formatSize(bytes) {
|
|
13
|
+
if (bytes < 1024) {
|
|
14
|
+
return `${bytes} B`;
|
|
15
|
+
}
|
|
16
|
+
if (bytes < 1024 * 1024) {
|
|
17
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
18
|
+
}
|
|
19
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Format date for display
|
|
23
|
+
*/
|
|
24
|
+
function formatDate(date) {
|
|
25
|
+
return date.toISOString().replace('T', ' ').slice(0, 19);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* T062: Format backup list as a table
|
|
29
|
+
*/
|
|
30
|
+
function formatBackupsTable(backups) {
|
|
31
|
+
const lines = [];
|
|
32
|
+
// Header
|
|
33
|
+
lines.push(pc.dim(' #') +
|
|
34
|
+
' ' +
|
|
35
|
+
pc.dim('Filename'.padEnd(45)) +
|
|
36
|
+
pc.dim('Created'.padEnd(22)) +
|
|
37
|
+
pc.dim('Size'.padEnd(10)) +
|
|
38
|
+
pc.dim('Sessions'.padEnd(10)) +
|
|
39
|
+
pc.dim('Status'));
|
|
40
|
+
lines.push(pc.dim('─'.repeat(110)));
|
|
41
|
+
// Rows
|
|
42
|
+
for (let i = 0; i < backups.length; i++) {
|
|
43
|
+
const backup = backups[i];
|
|
44
|
+
const index = String(i + 1).padStart(3);
|
|
45
|
+
const filename = backup.filename.length > 44
|
|
46
|
+
? backup.filename.slice(0, 41) + '...'
|
|
47
|
+
: backup.filename.padEnd(45);
|
|
48
|
+
// Use manifest date if available, otherwise file modification time
|
|
49
|
+
const createdAt = backup.manifest?.createdAt
|
|
50
|
+
? formatDate(new Date(backup.manifest.createdAt))
|
|
51
|
+
: formatDate(backup.modifiedAt);
|
|
52
|
+
const size = formatSize(backup.fileSize).padEnd(10);
|
|
53
|
+
const sessions = backup.manifest
|
|
54
|
+
? String(backup.manifest.stats.sessionCount).padEnd(10)
|
|
55
|
+
: pc.dim('N/A'.padEnd(10));
|
|
56
|
+
// Status indicator
|
|
57
|
+
let status;
|
|
58
|
+
if (backup.error) {
|
|
59
|
+
status = pc.red('Invalid');
|
|
60
|
+
}
|
|
61
|
+
else if (backup.manifest) {
|
|
62
|
+
status = pc.green('Valid');
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
status = pc.yellow('Unknown');
|
|
66
|
+
}
|
|
67
|
+
lines.push(`${pc.dim(index)} ${filename}${createdAt.padEnd(22)}${size}${sessions}${status}`);
|
|
68
|
+
}
|
|
69
|
+
// Summary
|
|
70
|
+
lines.push('');
|
|
71
|
+
const invalidCount = backups.filter((b) => b.error).length;
|
|
72
|
+
lines.push(pc.dim(`Total: ${backups.length} backup(s)`) +
|
|
73
|
+
(invalidCount > 0 ? pc.dim(` (${invalidCount} invalid)`) : ''));
|
|
74
|
+
return lines.join('\n');
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Format backup list for JSON output
|
|
78
|
+
*/
|
|
79
|
+
function formatBackupsJson(backups, directory) {
|
|
80
|
+
return JSON.stringify({
|
|
81
|
+
directory,
|
|
82
|
+
count: backups.length,
|
|
83
|
+
backups: backups.map((backup) => ({
|
|
84
|
+
filename: backup.filename,
|
|
85
|
+
filePath: backup.filePath,
|
|
86
|
+
fileSize: backup.fileSize,
|
|
87
|
+
modifiedAt: backup.modifiedAt.toISOString(),
|
|
88
|
+
...(backup.manifest && {
|
|
89
|
+
createdAt: backup.manifest.createdAt,
|
|
90
|
+
sessionCount: backup.manifest.stats.sessionCount,
|
|
91
|
+
workspaceCount: backup.manifest.stats.workspaceCount,
|
|
92
|
+
totalSize: backup.manifest.stats.totalSize,
|
|
93
|
+
}),
|
|
94
|
+
...(backup.error && { error: backup.error }),
|
|
95
|
+
})),
|
|
96
|
+
}, null, 2);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Register the list-backups command
|
|
100
|
+
*/
|
|
101
|
+
export function registerListBackupsCommand(program) {
|
|
102
|
+
program
|
|
103
|
+
.command('list-backups')
|
|
104
|
+
.alias('backups')
|
|
105
|
+
.description('List available backup files')
|
|
106
|
+
.option('-d, --directory <path>', 'Directory to scan (default: ~/cursor-history-backups)')
|
|
107
|
+
.action((options, command) => {
|
|
108
|
+
const globalOptions = command.parent?.opts();
|
|
109
|
+
const useJson = options.json ?? globalOptions?.json ?? false;
|
|
110
|
+
try {
|
|
111
|
+
// Resolve directory path
|
|
112
|
+
const directory = options.directory
|
|
113
|
+
? expandPath(options.directory)
|
|
114
|
+
: getDefaultBackupDir();
|
|
115
|
+
// T064: Check if directory exists
|
|
116
|
+
if (!existsSync(directory)) {
|
|
117
|
+
if (useJson) {
|
|
118
|
+
console.log(JSON.stringify({
|
|
119
|
+
error: 'Directory not found',
|
|
120
|
+
directory,
|
|
121
|
+
count: 0,
|
|
122
|
+
backups: []
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
console.error(pc.yellow('Backup directory not found:'));
|
|
127
|
+
console.error(pc.dim(` ${contractPath(directory)}`));
|
|
128
|
+
console.error('');
|
|
129
|
+
console.error(pc.dim('Create a backup first with: cursor-history backup'));
|
|
130
|
+
}
|
|
131
|
+
process.exit(ExitCode.USAGE_ERROR);
|
|
132
|
+
}
|
|
133
|
+
// List backups
|
|
134
|
+
const backups = listBackups(directory);
|
|
135
|
+
// T063: Handle no backups found
|
|
136
|
+
if (backups.length === 0) {
|
|
137
|
+
if (useJson) {
|
|
138
|
+
console.log(JSON.stringify({
|
|
139
|
+
directory: contractPath(directory),
|
|
140
|
+
count: 0,
|
|
141
|
+
backups: []
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
console.log(pc.dim('No backups found in:'));
|
|
146
|
+
console.log(pc.dim(` ${contractPath(directory)}`));
|
|
147
|
+
console.log('');
|
|
148
|
+
console.log(pc.dim('Create a backup with: cursor-history backup'));
|
|
149
|
+
}
|
|
150
|
+
return; // Exit code 0 - this is informational, not an error
|
|
151
|
+
}
|
|
152
|
+
// Output results
|
|
153
|
+
if (useJson) {
|
|
154
|
+
console.log(formatBackupsJson(backups, contractPath(directory)));
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
console.log(pc.dim(`Backups in: ${contractPath(directory)}\n`));
|
|
158
|
+
console.log(formatBackupsTable(backups));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
handleError(error);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=list-backups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-backups.js","sourceRoot":"","sources":["../../../src/cli/commands/list-backups.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAExE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAOjE;;GAEG;AACH,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,KAAK,GAAG,IAAI,EAAE,CAAC;QACjB,OAAO,GAAG,KAAK,IAAI,CAAC;IACtB,CAAC;IACD,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;QACxB,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3C,CAAC;IACD,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,IAAU;IAC5B,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,OAAqB;IAC/C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,SAAS;IACT,KAAK,CAAC,IAAI,CACR,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;QACX,IAAI;QACJ,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7B,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5B,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzB,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7B,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CACnB,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAEpC,OAAO;IACP,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE;YAC1C,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK;YACtC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE/B,mEAAmE;QACnE,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,EAAE,SAAS;YAC1C,CAAC,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACjD,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAElC,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ;YAC9B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YACvD,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7B,mBAAmB;QACnB,IAAI,MAAc,CAAC;QACnB,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;aAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,QAAQ,GAAG,MAAM,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,UAAU;IACV,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IAC3D,KAAK,CAAC,IAAI,CACR,EAAE,CAAC,GAAG,CAAC,UAAU,OAAO,CAAC,MAAM,YAAY,CAAC;QAC1C,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,YAAY,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CACjE,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,OAAqB,EAAE,SAAiB;IACjE,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,SAAS;QACT,KAAK,EAAE,OAAO,CAAC,MAAM;QACrB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAChC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE;YAC3C,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI;gBACrB,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS;gBACpC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY;gBAChD,cAAc,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc;gBACpD,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS;aAC3C,CAAC;YACF,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;SAC7C,CAAC,CAAC;KACJ,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,OAAgB;IACzD,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,KAAK,CAAC,SAAS,CAAC;SAChB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,wBAAwB,EAAE,uDAAuD,CAAC;SACzF,MAAM,CAAC,CAAC,OAAkC,EAAE,OAAgB,EAAE,EAAE;QAC/D,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAwB,CAAC;QACnE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,aAAa,EAAE,IAAI,IAAI,KAAK,CAAC;QAE7D,IAAI,CAAC;YACH,yBAAyB;YACzB,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS;gBACjC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC;gBAC/B,CAAC,CAAC,mBAAmB,EAAE,CAAC;YAE1B,kCAAkC;YAClC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3B,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;wBACzB,KAAK,EAAE,qBAAqB;wBAC5B,SAAS;wBACT,KAAK,EAAE,CAAC;wBACR,OAAO,EAAE,EAAE;qBACZ,CAAC,CAAC,CAAC;gBACN,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC;oBACxD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;oBACtD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAClB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAC;gBAC7E,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACrC,CAAC;YAED,eAAe;YACf,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;YAEvC,gCAAgC;YAChC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;wBACzB,SAAS,EAAE,YAAY,CAAC,SAAS,CAAC;wBAClC,KAAK,EAAE,CAAC;wBACR,OAAO,EAAE,EAAE;qBACZ,CAAC,CAAC,CAAC;gBACN,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;oBAC5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;oBACpD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAChB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC,CAAC;gBACrE,CAAC;gBACD,OAAO,CAAC,oDAAoD;YAC9D,CAAC;YAED,iBAAiB;YACjB,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACnE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;gBAChE,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0BzC;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8G1D"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* List command - display chat sessions and workspaces
|
|
3
3
|
*/
|
|
4
|
+
import pc from 'picocolors';
|
|
4
5
|
import { listSessions, listWorkspaces } from '../../core/storage.js';
|
|
6
|
+
import { validateBackup } from '../../core/backup.js';
|
|
5
7
|
import { formatSessionsTable, formatSessionsJson, formatWorkspacesTable, formatWorkspacesJson, formatNoHistory, formatCursorNotFound, } from '../formatters/index.js';
|
|
6
|
-
import { getCursorDataPath, expandPath } from '../../lib/platform.js';
|
|
8
|
+
import { getCursorDataPath, expandPath, contractPath } from '../../lib/platform.js';
|
|
7
9
|
import { existsSync } from 'node:fs';
|
|
8
10
|
/**
|
|
9
11
|
* Register the list command
|
|
@@ -17,25 +19,50 @@ export function registerListCommand(program) {
|
|
|
17
19
|
.option('-a, --all', 'Show all sessions (ignore limit)')
|
|
18
20
|
.option('--workspaces', 'List workspaces instead of sessions')
|
|
19
21
|
.option('--ids', 'Show composer IDs (for external export tools)')
|
|
22
|
+
.option('-b, --backup <path>', 'Read from backup file instead of live data')
|
|
20
23
|
.action(async (options, command) => {
|
|
21
24
|
const globalOptions = command.parent?.opts();
|
|
22
25
|
const useJson = options.json ?? globalOptions?.json ?? false;
|
|
23
26
|
const customPath = options.dataPath ?? globalOptions?.dataPath;
|
|
24
27
|
const workspaceFilter = options.workspace ?? globalOptions?.workspace;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
const backupPath = options.backup ? expandPath(options.backup) : undefined;
|
|
29
|
+
// T034: Validate backup if reading from backup
|
|
30
|
+
if (backupPath) {
|
|
31
|
+
const validation = validateBackup(backupPath);
|
|
32
|
+
if (validation.status === 'invalid') {
|
|
29
33
|
if (useJson) {
|
|
30
|
-
console.log(JSON.stringify({ error: '
|
|
34
|
+
console.log(JSON.stringify({ error: 'Invalid backup', errors: validation.errors }));
|
|
31
35
|
}
|
|
32
36
|
else {
|
|
33
|
-
console.
|
|
37
|
+
console.error(pc.red('Invalid backup file:'));
|
|
38
|
+
for (const err of validation.errors) {
|
|
39
|
+
console.error(pc.dim(` ${err}`));
|
|
40
|
+
}
|
|
34
41
|
}
|
|
35
42
|
process.exit(3);
|
|
36
43
|
}
|
|
44
|
+
if (validation.status === 'warnings' && !useJson) {
|
|
45
|
+
console.error(pc.yellow(`Warning: Backup has integrity issues (${validation.corruptedFiles.length} corrupted files)`));
|
|
46
|
+
console.error(pc.dim('Continuing with intact files...\n'));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (options.workspaces) {
|
|
50
|
+
// For backup mode, skip Cursor data check - we read from backup
|
|
51
|
+
if (!backupPath) {
|
|
52
|
+
// Verify Cursor data exists for workspaces listing
|
|
53
|
+
const dataPath = getCursorDataPath(customPath ? expandPath(customPath) : undefined);
|
|
54
|
+
if (!existsSync(dataPath)) {
|
|
55
|
+
if (useJson) {
|
|
56
|
+
console.log(JSON.stringify({ error: 'Cursor data not found', path: dataPath }));
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
console.log(formatCursorNotFound(dataPath));
|
|
60
|
+
}
|
|
61
|
+
process.exit(3);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
37
64
|
// List workspaces
|
|
38
|
-
const workspaces = listWorkspaces(customPath ? expandPath(customPath) : undefined);
|
|
65
|
+
const workspaces = await listWorkspaces(customPath ? expandPath(customPath) : undefined, backupPath);
|
|
39
66
|
if (workspaces.length === 0) {
|
|
40
67
|
if (useJson) {
|
|
41
68
|
console.log(JSON.stringify({ count: 0, workspaces: [] }));
|
|
@@ -45,6 +72,10 @@ export function registerListCommand(program) {
|
|
|
45
72
|
}
|
|
46
73
|
return;
|
|
47
74
|
}
|
|
75
|
+
// Show backup source indicator if reading from backup
|
|
76
|
+
if (backupPath && !useJson) {
|
|
77
|
+
console.log(pc.dim(`Reading from backup: ${contractPath(backupPath)}\n`));
|
|
78
|
+
}
|
|
48
79
|
if (useJson) {
|
|
49
80
|
console.log(formatWorkspacesJson(workspaces));
|
|
50
81
|
}
|
|
@@ -55,7 +86,7 @@ export function registerListCommand(program) {
|
|
|
55
86
|
else {
|
|
56
87
|
// List sessions
|
|
57
88
|
const limit = options.all ? 0 : parseInt(options.limit ?? '20', 10);
|
|
58
|
-
const sessions = listSessions({ limit, all: options.all ?? false, workspacePath: workspaceFilter }, customPath ? expandPath(customPath) : undefined);
|
|
89
|
+
const sessions = await listSessions({ limit, all: options.all ?? false, workspacePath: workspaceFilter }, customPath ? expandPath(customPath) : undefined, backupPath);
|
|
59
90
|
if (sessions.length === 0) {
|
|
60
91
|
if (useJson) {
|
|
61
92
|
console.log(JSON.stringify({ count: 0, sessions: [] }));
|
|
@@ -65,6 +96,10 @@ export function registerListCommand(program) {
|
|
|
65
96
|
}
|
|
66
97
|
return;
|
|
67
98
|
}
|
|
99
|
+
// Show backup source indicator if reading from backup
|
|
100
|
+
if (backupPath && !useJson) {
|
|
101
|
+
console.log(pc.dim(`Reading from backup: ${contractPath(backupPath)}\n`));
|
|
102
|
+
}
|
|
68
103
|
if (useJson) {
|
|
69
104
|
console.log(formatSessionsJson(sessions));
|
|
70
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command for migrating individual sessions between workspaces
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* cursor-history migrate-session <session> <destination>
|
|
6
|
+
* cursor-history migrate-session 3 /path/to/new/project
|
|
7
|
+
* cursor-history migrate-session 1,3,5 /path/to/new/project
|
|
8
|
+
* cursor-history migrate-session --dry-run 3 /path/to/new/project
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
export declare function registerMigrateSessionCommand(program: Command): void;
|
|
12
|
+
//# sourceMappingURL=migrate-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-session.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/migrate-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyDpE"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command for migrating individual sessions between workspaces
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* cursor-history migrate-session <session> <destination>
|
|
6
|
+
* cursor-history migrate-session 3 /path/to/new/project
|
|
7
|
+
* cursor-history migrate-session 1,3,5 /path/to/new/project
|
|
8
|
+
* cursor-history migrate-session --dry-run 3 /path/to/new/project
|
|
9
|
+
*/
|
|
10
|
+
import pc from 'picocolors';
|
|
11
|
+
import { resolveSessionIdentifiers } from '../../core/storage.js';
|
|
12
|
+
import { migrateSessions } from '../../core/migrate.js';
|
|
13
|
+
import { expandPath } from '../../lib/platform.js';
|
|
14
|
+
import { isSessionNotFoundError, isWorkspaceNotFoundError, isSameWorkspaceError, isNestedPathError, } from '../../lib/errors.js';
|
|
15
|
+
export function registerMigrateSessionCommand(program) {
|
|
16
|
+
program
|
|
17
|
+
.command('migrate-session')
|
|
18
|
+
.description('Move or copy sessions to a different workspace')
|
|
19
|
+
.argument('<session>', 'Session index or ID (comma-separated for multiple)')
|
|
20
|
+
.argument('<destination>', 'Destination workspace path')
|
|
21
|
+
.option('--dry-run', 'Preview migration without making changes')
|
|
22
|
+
.option('--copy', 'Copy sessions instead of moving (keeps originals)')
|
|
23
|
+
.option('-f, --force', 'Proceed even if destination has existing sessions')
|
|
24
|
+
.option('--debug', 'Show detailed path transformation logs')
|
|
25
|
+
.action(async (sessionArg, destinationArg, options) => {
|
|
26
|
+
const globalOptions = program.opts();
|
|
27
|
+
const dataPath = globalOptions.dataPath;
|
|
28
|
+
const jsonOutput = globalOptions.json || options.json;
|
|
29
|
+
try {
|
|
30
|
+
// Expand ~ in destination path
|
|
31
|
+
const destination = expandPath(destinationArg);
|
|
32
|
+
// Resolve session identifiers to IDs
|
|
33
|
+
const sessionIds = await resolveSessionIdentifiers(sessionArg, dataPath);
|
|
34
|
+
// Determine mode
|
|
35
|
+
const mode = options.copy ? 'copy' : 'move';
|
|
36
|
+
// Perform migration
|
|
37
|
+
const results = await migrateSessions({
|
|
38
|
+
sessionIds,
|
|
39
|
+
destination,
|
|
40
|
+
mode,
|
|
41
|
+
dryRun: options.dryRun ?? false,
|
|
42
|
+
force: options.force ?? false,
|
|
43
|
+
dataPath,
|
|
44
|
+
debug: options.debug ?? false,
|
|
45
|
+
});
|
|
46
|
+
// Output results
|
|
47
|
+
if (jsonOutput) {
|
|
48
|
+
console.log(JSON.stringify(results, null, 2));
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
outputResults(results, options.dryRun ?? false);
|
|
52
|
+
}
|
|
53
|
+
// Exit with error code if any failures
|
|
54
|
+
const hasFailures = results.some((r) => !r.success);
|
|
55
|
+
if (hasFailures) {
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
if (jsonOutput) {
|
|
61
|
+
console.log(JSON.stringify({ error: formatError(error) }, null, 2));
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
console.error(pc.red(formatError(error)));
|
|
65
|
+
}
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
function outputResults(results, isDryRun) {
|
|
71
|
+
if (isDryRun) {
|
|
72
|
+
console.log(pc.yellow('Dry run - no changes made\n'));
|
|
73
|
+
}
|
|
74
|
+
const successful = results.filter((r) => r.success);
|
|
75
|
+
const failed = results.filter((r) => !r.success);
|
|
76
|
+
if (successful.length > 0) {
|
|
77
|
+
const action = isDryRun ? 'Would migrate' : 'Migrated';
|
|
78
|
+
console.log(pc.green(`${action} ${successful.length} session(s):\n`));
|
|
79
|
+
for (const result of successful) {
|
|
80
|
+
const modeLabel = result.mode === 'copy' ? 'copied' : 'moved';
|
|
81
|
+
const actionLabel = isDryRun ? `would be ${modeLabel}` : modeLabel;
|
|
82
|
+
console.log(` ${pc.cyan(result.sessionId.slice(0, 8))}...`);
|
|
83
|
+
console.log(` From: ${result.sourceWorkspace}`);
|
|
84
|
+
console.log(` To: ${result.destinationWorkspace}`);
|
|
85
|
+
if (isDryRun && result.pathsWillBeUpdated) {
|
|
86
|
+
console.log(` ${pc.blue('File paths will be updated to destination workspace')}`);
|
|
87
|
+
}
|
|
88
|
+
console.log(` ${pc.dim(`(${actionLabel})`)}\n`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (failed.length > 0) {
|
|
92
|
+
console.log(pc.red(`Failed to migrate ${failed.length} session(s):\n`));
|
|
93
|
+
for (const result of failed) {
|
|
94
|
+
console.log(` ${pc.red('✗')} ${pc.cyan(result.sessionId.slice(0, 8))}...`);
|
|
95
|
+
console.log(` ${pc.red(result.error ?? 'Unknown error')}\n`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Summary
|
|
99
|
+
if (results.length > 1) {
|
|
100
|
+
console.log(pc.dim(`Summary: ${successful.length} succeeded, ${failed.length} failed`));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function formatError(error) {
|
|
104
|
+
if (isSessionNotFoundError(error)) {
|
|
105
|
+
return `Session not found: ${error.identifier}\nRun 'cursor-history list' to see available sessions.`;
|
|
106
|
+
}
|
|
107
|
+
if (isWorkspaceNotFoundError(error)) {
|
|
108
|
+
return `Workspace not found: ${error.path}\nPlease open the project in Cursor first to create the workspace.`;
|
|
109
|
+
}
|
|
110
|
+
if (isSameWorkspaceError(error)) {
|
|
111
|
+
return `Source and destination are the same: ${error.path}\nSpecify a different destination path.`;
|
|
112
|
+
}
|
|
113
|
+
if (isNestedPathError(error)) {
|
|
114
|
+
return `Destination is nested within source: ${error.destination} is inside ${error.source}\nThis would cause infinite path replacement loops. Choose a different destination.`;
|
|
115
|
+
}
|
|
116
|
+
if (error instanceof Error) {
|
|
117
|
+
// Check for database lock error
|
|
118
|
+
if (error.message.includes('SQLITE_BUSY') || error.message.includes('database is locked')) {
|
|
119
|
+
return 'Database is locked. Please close Cursor and try again.';
|
|
120
|
+
}
|
|
121
|
+
return error.message;
|
|
122
|
+
}
|
|
123
|
+
return String(error);
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=migrate-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-session.js","sourceRoot":"","sources":["../../../src/cli/commands/migrate-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command for migrating all sessions between workspaces
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* cursor-history migrate <source> <destination>
|
|
6
|
+
* cursor-history migrate /old/project /new/project
|
|
7
|
+
* cursor-history migrate --copy /project /backup/project
|
|
8
|
+
* cursor-history migrate --dry-run /old/path /new/path
|
|
9
|
+
* cursor-history migrate --force /old/path /existing/path
|
|
10
|
+
*/
|
|
11
|
+
import { Command } from 'commander';
|
|
12
|
+
export declare function registerMigrateCommand(program: Command): void;
|
|
13
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsD7D"}
|