obsyncd 1.0.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 +920 -0
- package/dist/cli/commands/init.d.ts +8 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +104 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/status.d.ts +8 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +117 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +13 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +225 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/prompts/conflictPrompt.d.ts +10 -0
- package/dist/cli/prompts/conflictPrompt.d.ts.map +1 -0
- package/dist/cli/prompts/conflictPrompt.js +51 -0
- package/dist/cli/prompts/conflictPrompt.js.map +1 -0
- package/dist/cli/prompts/fileBrowser.d.ts +6 -0
- package/dist/cli/prompts/fileBrowser.d.ts.map +1 -0
- package/dist/cli/prompts/fileBrowser.js +91 -0
- package/dist/cli/prompts/fileBrowser.js.map +1 -0
- package/dist/cli/prompts/vaultSelector.d.ts +13 -0
- package/dist/cli/prompts/vaultSelector.d.ts.map +1 -0
- package/dist/cli/prompts/vaultSelector.js +63 -0
- package/dist/cli/prompts/vaultSelector.js.map +1 -0
- package/dist/cli/ui/colors.d.ts +50 -0
- package/dist/cli/ui/colors.d.ts.map +1 -0
- package/dist/cli/ui/colors.js +62 -0
- package/dist/cli/ui/colors.js.map +1 -0
- package/dist/cli/ui/output.d.ts +45 -0
- package/dist/cli/ui/output.d.ts.map +1 -0
- package/dist/cli/ui/output.js +116 -0
- package/dist/cli/ui/output.js.map +1 -0
- package/dist/cli/ui/spinner.d.ts +29 -0
- package/dist/cli/ui/spinner.d.ts.map +1 -0
- package/dist/cli/ui/spinner.js +80 -0
- package/dist/cli/ui/spinner.js.map +1 -0
- package/dist/cli/ui/table.d.ts +28 -0
- package/dist/cli/ui/table.d.ts.map +1 -0
- package/dist/cli/ui/table.js +123 -0
- package/dist/cli/ui/table.js.map +1 -0
- package/dist/cli/utils/terminal.d.ts +21 -0
- package/dist/cli/utils/terminal.d.ts.map +1 -0
- package/dist/cli/utils/terminal.js +59 -0
- package/dist/cli/utils/terminal.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +32 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/index.d.ts +45 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +112 -0
- package/dist/config/index.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/storage/index.d.ts +35 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +97 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/sync/changeDetector.d.ts +29 -0
- package/dist/sync/changeDetector.d.ts.map +1 -0
- package/dist/sync/changeDetector.js +259 -0
- package/dist/sync/changeDetector.js.map +1 -0
- package/dist/sync/conflictResolver.d.ts +29 -0
- package/dist/sync/conflictResolver.d.ts.map +1 -0
- package/dist/sync/conflictResolver.js +116 -0
- package/dist/sync/conflictResolver.js.map +1 -0
- package/dist/sync/directoryLister.d.ts +18 -0
- package/dist/sync/directoryLister.d.ts.map +1 -0
- package/dist/sync/directoryLister.js +39 -0
- package/dist/sync/directoryLister.js.map +1 -0
- package/dist/sync/index.d.ts +29 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +212 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/manifest.d.ts +48 -0
- package/dist/sync/manifest.d.ts.map +1 -0
- package/dist/sync/manifest.js +137 -0
- package/dist/sync/manifest.js.map +1 -0
- package/dist/sync/types.d.ts +109 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +5 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/sync/watchMode.d.ts +84 -0
- package/dist/sync/watchMode.d.ts.map +1 -0
- package/dist/sync/watchMode.js +364 -0
- package/dist/sync/watchMode.js.map +1 -0
- package/dist/sync/watcher.d.ts +114 -0
- package/dist/sync/watcher.d.ts.map +1 -0
- package/dist/sync/watcher.js +293 -0
- package/dist/sync/watcher.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +25 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/vault/index.d.ts +38 -0
- package/dist/vault/index.d.ts.map +1 -0
- package/dist/vault/index.js +106 -0
- package/dist/vault/index.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuGlF"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { confirm } from '@inquirer/prompts';
|
|
3
|
+
import { ObsidianVault } from '../../vault/index.js';
|
|
4
|
+
import { ConfigManager } from '../../config/index.js';
|
|
5
|
+
import { ManifestManager } from '../../sync/manifest.js';
|
|
6
|
+
import { isInteractive } from '../utils/terminal.js';
|
|
7
|
+
import { logError, logInfo, logBlank, exitWithError, } from '../ui/output.js';
|
|
8
|
+
import { theme, formatPath, symbols } from '../ui/colors.js';
|
|
9
|
+
import { startSpinner } from '../ui/spinner.js';
|
|
10
|
+
import { browseForDirectory } from '../prompts/fileBrowser.js';
|
|
11
|
+
/**
|
|
12
|
+
* Handle the init command
|
|
13
|
+
*/
|
|
14
|
+
export async function handleInitCommand(options) {
|
|
15
|
+
let vaultPath = options.path ? path.resolve(options.path) : undefined;
|
|
16
|
+
// Interactive mode: offer to browse for vault
|
|
17
|
+
if (isInteractive() && !vaultPath) {
|
|
18
|
+
console.log(theme.bold('\nInitialize obsync'));
|
|
19
|
+
console.log(theme.muted('Set up sync configuration for an Obsidian vault\n'));
|
|
20
|
+
const useBrowser = await confirm({
|
|
21
|
+
message: 'Would you like to browse for the vault folder?',
|
|
22
|
+
default: true,
|
|
23
|
+
});
|
|
24
|
+
if (useBrowser) {
|
|
25
|
+
vaultPath = await browseForDirectory(process.cwd());
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
vaultPath = process.cwd();
|
|
29
|
+
logInfo(`Using current directory: ${formatPath(vaultPath)}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Default to current directory
|
|
33
|
+
if (!vaultPath) {
|
|
34
|
+
vaultPath = process.cwd();
|
|
35
|
+
}
|
|
36
|
+
vaultPath = path.resolve(vaultPath);
|
|
37
|
+
logBlank();
|
|
38
|
+
console.log(`${theme.dim('Vault path:')} ${formatPath(vaultPath)}`);
|
|
39
|
+
logBlank();
|
|
40
|
+
// Check if it's a valid Obsidian vault
|
|
41
|
+
const vault = new ObsidianVault({ vaultPath });
|
|
42
|
+
const isVault = await vault.isObsidianVault(vaultPath);
|
|
43
|
+
if (!isVault) {
|
|
44
|
+
if (isInteractive()) {
|
|
45
|
+
logError(`${vaultPath} is not an Obsidian vault (no .obsidian directory found)`);
|
|
46
|
+
const createAnyway = await confirm({
|
|
47
|
+
message: 'Initialize obsync anyway?',
|
|
48
|
+
default: false,
|
|
49
|
+
});
|
|
50
|
+
if (!createAnyway) {
|
|
51
|
+
exitWithError('Initialization cancelled');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
exitWithError(`${vaultPath} is not an Obsidian vault (no .obsidian directory found)`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Check if already initialized
|
|
59
|
+
const configManager = new ConfigManager();
|
|
60
|
+
const alreadyConfigured = await configManager.exists(vaultPath);
|
|
61
|
+
if (alreadyConfigured) {
|
|
62
|
+
if (isInteractive()) {
|
|
63
|
+
const overwrite = await confirm({
|
|
64
|
+
message: 'obsync is already configured for this vault. Reinitialize?',
|
|
65
|
+
default: false,
|
|
66
|
+
});
|
|
67
|
+
if (!overwrite) {
|
|
68
|
+
logInfo('Keeping existing configuration');
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
logInfo('Vault already initialized, updating configuration...');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Initialize with spinner
|
|
77
|
+
const spinner = startSpinner('Initializing obsync...');
|
|
78
|
+
try {
|
|
79
|
+
// Create default config
|
|
80
|
+
const config = configManager.getDefaultConfig();
|
|
81
|
+
await configManager.save(vaultPath, config);
|
|
82
|
+
// Create empty manifest
|
|
83
|
+
const manifestManager = new ManifestManager(vaultPath);
|
|
84
|
+
const manifest = manifestManager.createEmptyManifest();
|
|
85
|
+
await manifestManager.save(manifest);
|
|
86
|
+
spinner.succeed('Initialization complete!');
|
|
87
|
+
// Show what was created
|
|
88
|
+
logBlank();
|
|
89
|
+
console.log(theme.bold('Created files:'));
|
|
90
|
+
console.log(` ${symbols.success} ${formatPath('.obsync.json')} ${theme.muted('(configuration)')}`);
|
|
91
|
+
console.log(` ${symbols.success} ${formatPath('.obsync/sync-manifest.json')} ${theme.muted('(sync state)')}`);
|
|
92
|
+
logBlank();
|
|
93
|
+
console.log(`${theme.dim('Sync ID:')} ${theme.highlight(manifest.syncId)}`);
|
|
94
|
+
logBlank();
|
|
95
|
+
logInfo(`Run ${theme.highlight('obsync sync')} to start syncing`);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
spinner.fail('Initialization failed');
|
|
99
|
+
logBlank();
|
|
100
|
+
logError(error instanceof Error ? error.message : String(error));
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsHtF"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { ObsidianVault } from '../../vault/index.js';
|
|
3
|
+
import { ConfigManager } from '../../config/index.js';
|
|
4
|
+
import { ManifestManager } from '../../sync/manifest.js';
|
|
5
|
+
import { formatBytes } from '../../utils/index.js';
|
|
6
|
+
import { isInteractive } from '../utils/terminal.js';
|
|
7
|
+
import { logError, logInfo, logWarning, logBlank, exitWithError, } from '../ui/output.js';
|
|
8
|
+
import { theme, symbols, formatPath, header } from '../ui/colors.js';
|
|
9
|
+
import { formatVaultInfoTable, formatSyncStatusTable } from '../ui/table.js';
|
|
10
|
+
import { browseForDirectory } from '../prompts/fileBrowser.js';
|
|
11
|
+
import { confirm } from '@inquirer/prompts';
|
|
12
|
+
/**
|
|
13
|
+
* Handle the status command
|
|
14
|
+
*/
|
|
15
|
+
export async function handleStatusCommand(options) {
|
|
16
|
+
let vaultPath = options.path ? path.resolve(options.path) : undefined;
|
|
17
|
+
// Interactive mode: offer to browse for vault
|
|
18
|
+
if (isInteractive() && !vaultPath) {
|
|
19
|
+
const useBrowser = await confirm({
|
|
20
|
+
message: 'Would you like to browse for the vault folder?',
|
|
21
|
+
default: false,
|
|
22
|
+
});
|
|
23
|
+
if (useBrowser) {
|
|
24
|
+
vaultPath = await browseForDirectory(process.cwd());
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
vaultPath = process.cwd();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Default to current directory
|
|
31
|
+
if (!vaultPath) {
|
|
32
|
+
vaultPath = process.cwd();
|
|
33
|
+
}
|
|
34
|
+
vaultPath = path.resolve(vaultPath);
|
|
35
|
+
// Check if it's a valid Obsidian vault
|
|
36
|
+
const vault = new ObsidianVault({ vaultPath });
|
|
37
|
+
const isVault = await vault.isObsidianVault(vaultPath);
|
|
38
|
+
if (!isVault) {
|
|
39
|
+
exitWithError(`${vaultPath} is not an Obsidian vault (no .obsidian directory found)`);
|
|
40
|
+
}
|
|
41
|
+
// Display vault header
|
|
42
|
+
logBlank();
|
|
43
|
+
console.log(header('Vault Status'));
|
|
44
|
+
console.log(formatPath(vaultPath));
|
|
45
|
+
logBlank();
|
|
46
|
+
// Get and display vault metadata
|
|
47
|
+
try {
|
|
48
|
+
const metadata = await vault.getMetadata();
|
|
49
|
+
console.log(theme.bold(`${symbols.vault} Vault Info`));
|
|
50
|
+
logBlank();
|
|
51
|
+
console.log(formatVaultInfoTable({
|
|
52
|
+
name: metadata.name,
|
|
53
|
+
path: metadata.path,
|
|
54
|
+
fileCount: metadata.fileCount,
|
|
55
|
+
totalSize: formatBytes(metadata.totalSize),
|
|
56
|
+
lastModified: metadata.lastModified.toLocaleString(),
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
logError(`Failed to read vault metadata: ${error instanceof Error ? error.message : String(error)}`);
|
|
61
|
+
}
|
|
62
|
+
// Check for manifest and display sync status
|
|
63
|
+
const manifestManager = new ManifestManager(vaultPath);
|
|
64
|
+
const manifestExists = await manifestManager.exists();
|
|
65
|
+
logBlank();
|
|
66
|
+
console.log(theme.bold(`${symbols.info} Sync Status`));
|
|
67
|
+
logBlank();
|
|
68
|
+
if (manifestExists) {
|
|
69
|
+
try {
|
|
70
|
+
const manifest = await manifestManager.load();
|
|
71
|
+
if (manifest) {
|
|
72
|
+
console.log(formatSyncStatusTable({
|
|
73
|
+
syncId: manifest.syncId,
|
|
74
|
+
lastSync: manifest.lastSync
|
|
75
|
+
? new Date(manifest.lastSync).toLocaleString()
|
|
76
|
+
: 'Never',
|
|
77
|
+
trackedFiles: Object.keys(manifest.files || {}).length,
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
logError(`Failed to read sync manifest: ${error instanceof Error ? error.message : String(error)}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
logWarning('Not initialized');
|
|
87
|
+
logInfo(`Run ${theme.highlight('obsync init')} to set up syncing`);
|
|
88
|
+
}
|
|
89
|
+
// Check for config
|
|
90
|
+
const configManager = new ConfigManager();
|
|
91
|
+
const configExists = await configManager.exists(vaultPath);
|
|
92
|
+
logBlank();
|
|
93
|
+
console.log(theme.bold(`${symbols.bullet} Configuration`));
|
|
94
|
+
logBlank();
|
|
95
|
+
if (configExists) {
|
|
96
|
+
try {
|
|
97
|
+
const config = await configManager.load(vaultPath);
|
|
98
|
+
console.log(` ${theme.dim('Sync strategy:')} ${config.defaultSyncStrategy}`);
|
|
99
|
+
console.log(` ${theme.dim('Conflict resolution:')} ${config.conflictResolution}`);
|
|
100
|
+
console.log(` ${theme.dim('Exclude patterns:')} ${config.excludePatterns.length} patterns`);
|
|
101
|
+
if (config.excludePatterns.length > 0 && config.excludePatterns.length <= 5) {
|
|
102
|
+
for (const pattern of config.excludePatterns) {
|
|
103
|
+
console.log(` ${symbols.bullet} ${theme.muted(pattern)}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
logError(`Failed to read configuration: ${error instanceof Error ? error.message : String(error)}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
logWarning('Not configured');
|
|
113
|
+
logInfo(`Run ${theme.highlight('obsync init')} to create configuration`);
|
|
114
|
+
}
|
|
115
|
+
logBlank();
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface SyncCommandOptions {
|
|
2
|
+
source?: string;
|
|
3
|
+
destination?: string;
|
|
4
|
+
conflict?: string;
|
|
5
|
+
dryRun?: boolean;
|
|
6
|
+
watch?: boolean;
|
|
7
|
+
remote?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Handle the sync command
|
|
11
|
+
*/
|
|
12
|
+
export declare function handleSyncCommand(options: SyncCommandOptions): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuFlF"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { SyncEngine, WatchModeSync } from '../../sync/index.js';
|
|
3
|
+
import { isInteractive } from '../utils/terminal.js';
|
|
4
|
+
import { logError, logWarning, logSuccess, logInfo, logBlank, exitWithError, } from '../ui/output.js';
|
|
5
|
+
import { theme, symbols, formatPath } from '../ui/colors.js';
|
|
6
|
+
import { startSpinner } from '../ui/spinner.js';
|
|
7
|
+
import { formatSyncResultTable, formatFileList } from '../ui/table.js';
|
|
8
|
+
import { promptForSourceVault, promptForDestinationVault } from '../prompts/vaultSelector.js';
|
|
9
|
+
import { promptForConflictStrategy, getStrategyDescription } from '../prompts/conflictPrompt.js';
|
|
10
|
+
/**
|
|
11
|
+
* Handle the sync command
|
|
12
|
+
*/
|
|
13
|
+
export async function handleSyncCommand(options) {
|
|
14
|
+
let sourcePath = options.source ? path.resolve(options.source) : undefined;
|
|
15
|
+
let destPath = options.destination ? path.resolve(options.destination) : undefined;
|
|
16
|
+
let conflictStrategy = (options.conflict || 'newest');
|
|
17
|
+
// Interactive mode: prompt for missing options
|
|
18
|
+
if (isInteractive()) {
|
|
19
|
+
if (!sourcePath) {
|
|
20
|
+
sourcePath = await promptForSourceVault();
|
|
21
|
+
}
|
|
22
|
+
if (!destPath) {
|
|
23
|
+
destPath = await promptForDestinationVault();
|
|
24
|
+
}
|
|
25
|
+
// Only prompt for conflict strategy if not provided
|
|
26
|
+
if (!options.conflict) {
|
|
27
|
+
conflictStrategy = await promptForConflictStrategy();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// Non-interactive mode: require all options
|
|
32
|
+
if (!sourcePath) {
|
|
33
|
+
exitWithError('--source is required in non-interactive mode');
|
|
34
|
+
}
|
|
35
|
+
if (!destPath) {
|
|
36
|
+
exitWithError('--destination is required in non-interactive mode');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Display sync configuration
|
|
40
|
+
logBlank();
|
|
41
|
+
console.log(theme.bold('Sync Configuration'));
|
|
42
|
+
console.log(` ${theme.dim('Source:')} ${formatPath(sourcePath)}`);
|
|
43
|
+
console.log(` ${theme.dim('Destination:')} ${formatPath(destPath)}`);
|
|
44
|
+
console.log(` ${theme.dim('Conflicts:')} ${conflictStrategy} ${theme.muted(`(${getStrategyDescription(conflictStrategy)})`)}`);
|
|
45
|
+
if (options.dryRun) {
|
|
46
|
+
logBlank();
|
|
47
|
+
logWarning('DRY RUN MODE - No changes will be made');
|
|
48
|
+
}
|
|
49
|
+
if (options.watch) {
|
|
50
|
+
logBlank();
|
|
51
|
+
logInfo('WATCH MODE - Continuously monitoring for changes');
|
|
52
|
+
}
|
|
53
|
+
if (options.remote) {
|
|
54
|
+
logBlank();
|
|
55
|
+
logInfo('REMOTE MODE - Destination does not need to be an Obsidian vault');
|
|
56
|
+
}
|
|
57
|
+
logBlank();
|
|
58
|
+
// Handle watch mode
|
|
59
|
+
if (options.watch) {
|
|
60
|
+
await handleWatchMode(sourcePath, destPath, conflictStrategy, options.remote);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// One-time sync
|
|
64
|
+
const spinner = startSpinner('Syncing vault...');
|
|
65
|
+
try {
|
|
66
|
+
const engine = new SyncEngine();
|
|
67
|
+
const result = await engine.sync({
|
|
68
|
+
source: sourcePath,
|
|
69
|
+
destination: destPath,
|
|
70
|
+
conflictResolution: conflictStrategy,
|
|
71
|
+
dryRun: options.dryRun || false,
|
|
72
|
+
remoteMode: options.remote || false,
|
|
73
|
+
});
|
|
74
|
+
spinner.succeed('Sync complete!');
|
|
75
|
+
// Display results
|
|
76
|
+
displaySyncResults(result, options.dryRun);
|
|
77
|
+
// Exit with error code if there were errors
|
|
78
|
+
if (result.errors.length > 0) {
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
spinner.fail('Sync failed');
|
|
84
|
+
logBlank();
|
|
85
|
+
logError(error instanceof Error ? error.message : String(error));
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Handle watch mode synchronization
|
|
91
|
+
*/
|
|
92
|
+
async function handleWatchMode(sourcePath, destPath, conflictStrategy, remoteMode) {
|
|
93
|
+
const watchMode = new WatchModeSync({
|
|
94
|
+
source: sourcePath,
|
|
95
|
+
destination: destPath,
|
|
96
|
+
conflictResolution: conflictStrategy,
|
|
97
|
+
remoteMode: remoteMode || false,
|
|
98
|
+
initialSync: true,
|
|
99
|
+
onSync: (result) => {
|
|
100
|
+
logBlank();
|
|
101
|
+
displaySyncResults(result);
|
|
102
|
+
},
|
|
103
|
+
onError: (error) => {
|
|
104
|
+
logBlank();
|
|
105
|
+
logError(`Sync error: ${error.message}`);
|
|
106
|
+
},
|
|
107
|
+
onStatusChange: (status) => {
|
|
108
|
+
displayWatchStatus(status);
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
// Set up signal handlers for graceful shutdown
|
|
112
|
+
let isShuttingDown = false;
|
|
113
|
+
const shutdown = async () => {
|
|
114
|
+
if (isShuttingDown)
|
|
115
|
+
return;
|
|
116
|
+
isShuttingDown = true;
|
|
117
|
+
logBlank();
|
|
118
|
+
logInfo('Stopping watch mode...');
|
|
119
|
+
try {
|
|
120
|
+
await watchMode.stop();
|
|
121
|
+
const session = watchMode.getSession();
|
|
122
|
+
logBlank();
|
|
123
|
+
console.log(theme.bold('Watch Session Summary'));
|
|
124
|
+
if (session) {
|
|
125
|
+
const duration = session.endTime
|
|
126
|
+
? session.endTime.getTime() - session.startTime.getTime()
|
|
127
|
+
: Date.now() - session.startTime.getTime();
|
|
128
|
+
console.log(` ${theme.dim('Duration:')} ${formatDuration(duration)}`);
|
|
129
|
+
console.log(` ${theme.dim('Total syncs:')} ${session.syncCount}`);
|
|
130
|
+
console.log(` ${theme.dim('Errors:')} ${session.errorCount}`);
|
|
131
|
+
}
|
|
132
|
+
logBlank();
|
|
133
|
+
logSuccess('Watch mode stopped.');
|
|
134
|
+
process.exit(0);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
logError(`Error stopping watch mode: ${error instanceof Error ? error.message : String(error)}`);
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
process.on('SIGINT', shutdown);
|
|
142
|
+
process.on('SIGTERM', shutdown);
|
|
143
|
+
// Start watch mode
|
|
144
|
+
const spinner = startSpinner('Starting watch mode...');
|
|
145
|
+
try {
|
|
146
|
+
await watchMode.start();
|
|
147
|
+
spinner.succeed('Watch mode started!');
|
|
148
|
+
logBlank();
|
|
149
|
+
console.log(theme.bold('Watching for changes...'));
|
|
150
|
+
console.log(` ${theme.dim('Press')} ${theme.cyan('Ctrl+C')} ${theme.dim('to stop')}`);
|
|
151
|
+
logBlank();
|
|
152
|
+
// Keep the process running
|
|
153
|
+
await new Promise(() => {
|
|
154
|
+
// This promise never resolves - we wait for SIGINT/SIGTERM
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
spinner.fail('Failed to start watch mode');
|
|
159
|
+
logBlank();
|
|
160
|
+
logError(error instanceof Error ? error.message : String(error));
|
|
161
|
+
process.exit(1);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Display watch mode status updates
|
|
166
|
+
*/
|
|
167
|
+
function displayWatchStatus(status) {
|
|
168
|
+
// Only log status when there are pending changes or state changes
|
|
169
|
+
if (status.state === 'syncing') {
|
|
170
|
+
console.log(`${symbols.info} ${theme.dim('Syncing')} ${theme.cyan(`(${status.pendingChanges} pending)`)}`);
|
|
171
|
+
}
|
|
172
|
+
else if (status.state === 'error') {
|
|
173
|
+
console.log(`${symbols.error} ${theme.error('Error:')} ${status.currentError?.message || 'Unknown error'}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Display sync results in a formatted way
|
|
178
|
+
*/
|
|
179
|
+
function displaySyncResults(result, isDryRun) {
|
|
180
|
+
logBlank();
|
|
181
|
+
if (isDryRun) {
|
|
182
|
+
console.log(theme.bold('What would be synced:'));
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
console.log(theme.bold('Sync Results:'));
|
|
186
|
+
}
|
|
187
|
+
logBlank();
|
|
188
|
+
console.log(formatSyncResultTable(result));
|
|
189
|
+
// Show conflicts if any
|
|
190
|
+
if (result.conflicts.length > 0) {
|
|
191
|
+
logBlank();
|
|
192
|
+
const conflictList = formatFileList(result.conflicts.map((c) => c.path), `${symbols.warning} Conflicts:`, 5);
|
|
193
|
+
console.log(conflictList);
|
|
194
|
+
}
|
|
195
|
+
// Show skipped files if any
|
|
196
|
+
if (result.skipped.length > 0) {
|
|
197
|
+
logBlank();
|
|
198
|
+
const skippedList = formatFileList(result.skipped, `${symbols.info} Skipped:`, 5);
|
|
199
|
+
console.log(skippedList);
|
|
200
|
+
}
|
|
201
|
+
// Show errors if any
|
|
202
|
+
if (result.errors.length > 0) {
|
|
203
|
+
logBlank();
|
|
204
|
+
const errorList = formatFileList(result.errors, `${symbols.error} Errors:`, 10);
|
|
205
|
+
console.log(errorList);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Format a duration in milliseconds to a human-readable string
|
|
210
|
+
*/
|
|
211
|
+
function formatDuration(ms) {
|
|
212
|
+
const seconds = Math.floor(ms / 1000);
|
|
213
|
+
const minutes = Math.floor(seconds / 60);
|
|
214
|
+
const hours = Math.floor(minutes / 60);
|
|
215
|
+
if (hours > 0) {
|
|
216
|
+
return `${hours}h ${minutes % 60}m ${seconds % 60}s`;
|
|
217
|
+
}
|
|
218
|
+
else if (minutes > 0) {
|
|
219
|
+
return `${minutes}m ${seconds % 60}s`;
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
return `${seconds}s`;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EACL,QAAQ,EACR,UAAU,EACV,UAAU,EACV,OAAO,EACP,QAAQ,EACR,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAC9F,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAYjG;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAA2B;IACjE,IAAI,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3E,IAAI,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnF,IAAI,gBAAgB,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAqB,CAAC;IAE1E,+CAA+C;IAC/C,IAAI,aAAa,EAAE,EAAE,CAAC;QACpB,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,UAAU,GAAG,MAAM,oBAAoB,EAAE,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,MAAM,yBAAyB,EAAE,CAAC;QAC/C,CAAC;QAED,oDAAoD;QACpD,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACtB,gBAAgB,GAAG,MAAM,yBAAyB,EAAE,CAAC;QACvD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,4CAA4C;QAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,aAAa,CAAC,8CAA8C,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,aAAa,CAAC,mDAAmD,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,QAAQ,EAAE,CAAC;IACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,UAAU,CAAC,UAAW,CAAC,EAAE,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,QAAS,CAAC,EAAE,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,gBAAgB,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,sBAAsB,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAElI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,QAAQ,EAAE,CAAC;QACX,UAAU,CAAC,wCAAwC,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,kDAAkD,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,iEAAiE,CAAC,CAAC;IAC7E,CAAC;IAED,QAAQ,EAAE,CAAC;IAEX,oBAAoB;IACpB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,eAAe,CAAC,UAAW,EAAE,QAAS,EAAE,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAChF,OAAO;IACT,CAAC;IAED,gBAAgB;IAChB,MAAM,OAAO,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;IAEjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;YAC/B,MAAM,EAAE,UAAW;YACnB,WAAW,EAAE,QAAS;YACtB,kBAAkB,EAAE,gBAAgB;YACpC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;YAC/B,UAAU,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;SACpC,CAAC,CAAC;QAEH,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAElC,kBAAkB;QAClB,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAE3C,4CAA4C;QAC5C,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5B,QAAQ,EAAE,CAAC;QACX,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAC5B,UAAkB,EAClB,QAAgB,EAChB,gBAAkC,EAClC,UAAoB;IAEpB,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC;QAClC,MAAM,EAAE,UAAU;QAClB,WAAW,EAAE,QAAQ;QACrB,kBAAkB,EAAE,gBAAgB;QACpC,UAAU,EAAE,UAAU,IAAI,KAAK;QAC/B,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;YACjB,QAAQ,EAAE,CAAC;YACX,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,QAAQ,EAAE,CAAC;YACX,QAAQ,CAAC,eAAe,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE;YACzB,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC;KACF,CAAC,CAAC;IAEH,+CAA+C;IAC/C,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,IAAI,cAAc;YAAE,OAAO;QAC3B,cAAc,GAAG,IAAI,CAAC;QAEtB,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAElC,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC;YAEvC,QAAQ,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;YACjD,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO;oBAC9B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE;oBACzD,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;gBACnE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;YACtE,CAAC;YAED,QAAQ,EAAE,CAAC;YACX,UAAU,CAAC,qBAAqB,CAAC,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACjG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,mBAAmB;IACnB,MAAM,OAAO,GAAG,YAAY,CAAC,wBAAwB,CAAC,CAAC;IAEvD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;QACxB,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAEvC,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACvF,QAAQ,EAAE,CAAC;QAEX,2BAA2B;QAC3B,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE;YACrB,2DAA2D;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC3C,QAAQ,EAAE,CAAC;QACX,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,MAAuB;IACjD,kEAAkE;IAClE,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,cAAc,WAAW,CAAC,EAAE,CAAC,CAAC;IAC7G,CAAC;SAAM,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,YAAY,EAAE,OAAO,IAAI,eAAe,EAAE,CAAC,CAAC;IAC9G,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,MAAkB,EAAE,QAAkB;IAChE,QAAQ,EAAE,CAAC;IAEX,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,QAAQ,EAAE,CAAC;IACX,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC;IAE3C,wBAAwB;IACxB,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,QAAQ,EAAE,CAAC;QACX,MAAM,YAAY,GAAG,cAAc,CACjC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EACnC,GAAG,OAAO,CAAC,OAAO,aAAa,EAC/B,CAAC,CACF,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC;IAED,4BAA4B;IAC5B,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,QAAQ,EAAE,CAAC;QACX,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC3B,CAAC;IAED,qBAAqB;IACrB,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,QAAQ,EAAE,CAAC;QACX,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,UAAU,EAAE,EAAE,CAAC,CAAC;QAChF,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,EAAU;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IAEvC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,GAAG,KAAK,KAAK,OAAO,GAAG,EAAE,KAAK,OAAO,GAAG,EAAE,GAAG,CAAC;IACvD,CAAC;SAAM,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,OAAO,KAAK,OAAO,GAAG,EAAE,GAAG,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,OAAO,GAAG,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ConflictStrategy } from '../../sync/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Prompt user to select a conflict resolution strategy
|
|
4
|
+
*/
|
|
5
|
+
export declare function promptForConflictStrategy(): Promise<ConflictStrategy>;
|
|
6
|
+
/**
|
|
7
|
+
* Get a human-readable description of a conflict strategy
|
|
8
|
+
*/
|
|
9
|
+
export declare function getStrategyDescription(strategy: ConflictStrategy): string;
|
|
10
|
+
//# sourceMappingURL=conflictPrompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflictPrompt.d.ts","sourceRoot":"","sources":["../../../src/cli/prompts/conflictPrompt.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AA4B5D;;GAEG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAgB3E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAGzE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { select } from '@inquirer/prompts';
|
|
2
|
+
import { theme } from '../ui/colors.js';
|
|
3
|
+
/**
|
|
4
|
+
* Conflict resolution strategy options with descriptions
|
|
5
|
+
*/
|
|
6
|
+
const conflictStrategies = [
|
|
7
|
+
{
|
|
8
|
+
value: 'newest',
|
|
9
|
+
name: `${theme.highlight('newest')} - Use the most recently modified version`,
|
|
10
|
+
description: 'Automatically keeps whichever file was modified last',
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
value: 'source',
|
|
14
|
+
name: `${theme.highlight('source')} - Always use source version`,
|
|
15
|
+
description: 'Source vault wins all conflicts',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
value: 'destination',
|
|
19
|
+
name: `${theme.highlight('destination')} - Always use destination version`,
|
|
20
|
+
description: 'Destination vault wins all conflicts',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
value: 'skip',
|
|
24
|
+
name: `${theme.highlight('skip')} - Skip conflicting files`,
|
|
25
|
+
description: 'Leave conflicts unchanged for manual review',
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
/**
|
|
29
|
+
* Prompt user to select a conflict resolution strategy
|
|
30
|
+
*/
|
|
31
|
+
export async function promptForConflictStrategy() {
|
|
32
|
+
console.log(theme.bold('\nConflict Resolution Strategy'));
|
|
33
|
+
console.log(theme.muted('How should conflicts be handled when both versions have changed?\n'));
|
|
34
|
+
const strategy = await select({
|
|
35
|
+
message: 'Select strategy:',
|
|
36
|
+
choices: conflictStrategies.map((s) => ({
|
|
37
|
+
value: s.value,
|
|
38
|
+
name: s.name,
|
|
39
|
+
})),
|
|
40
|
+
default: 'newest',
|
|
41
|
+
});
|
|
42
|
+
return strategy;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get a human-readable description of a conflict strategy
|
|
46
|
+
*/
|
|
47
|
+
export function getStrategyDescription(strategy) {
|
|
48
|
+
const found = conflictStrategies.find((s) => s.value === strategy);
|
|
49
|
+
return found?.description || strategy;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=conflictPrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflictPrompt.js","sourceRoot":"","sources":["../../../src/cli/prompts/conflictPrompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAGxC;;GAEG;AACH,MAAM,kBAAkB,GAAG;IACzB;QACE,KAAK,EAAE,QAA4B;QACnC,IAAI,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,2CAA2C;QAC7E,WAAW,EAAE,sDAAsD;KACpE;IACD;QACE,KAAK,EAAE,QAA4B;QACnC,IAAI,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,8BAA8B;QAChE,WAAW,EAAE,iCAAiC;KAC/C;IACD;QACE,KAAK,EAAE,aAAiC;QACxC,IAAI,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,mCAAmC;QAC1E,WAAW,EAAE,sCAAsC;KACpD;IACD;QACE,KAAK,EAAE,MAA0B;QACjC,IAAI,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,2BAA2B;QAC3D,WAAW,EAAE,6CAA6C;KAC3D;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAClF,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC;QAC5B,OAAO,EAAE,kBAAkB;QAC3B,OAAO,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC,CAAC;QACH,OAAO,EAAE,QAAQ;KAClB,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAA0B;IAC/D,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC;IACnE,OAAO,KAAK,EAAE,WAAW,IAAI,QAAQ,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileBrowser.d.ts","sourceRoot":"","sources":["../../../src/cli/prompts/fileBrowser.ts"],"names":[],"mappings":"AAkCA;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkE3E"}
|