memoir-cli 1.5.0 → 1.5.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/package.json +2 -2
- package/src/adapters/index.js +42 -10
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "memoir-cli",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.1",
|
|
4
4
|
"description": "Sync and translate AI memory across devices and tools. Back up Claude, Gemini, Codex, Cursor, Copilot, Windsurf, and Aider configs. Migrate instructions between AI coding assistants with one command.",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"fs-extra": "^11.2.0",
|
|
56
56
|
"gradient-string": "^3.0.0",
|
|
57
57
|
"inquirer": "^9.2.15",
|
|
58
|
-
|
|
58
|
+
|
|
59
59
|
"open": "^11.0.0",
|
|
60
60
|
"ora": "^7.0.1"
|
|
61
61
|
}
|
package/src/adapters/index.js
CHANGED
|
@@ -15,9 +15,13 @@ export const adapters = [
|
|
|
15
15
|
icon: '🔵',
|
|
16
16
|
source: path.join(home, '.gemini'),
|
|
17
17
|
filter: (src) => {
|
|
18
|
+
const geminiDir = path.join(home, '.gemini');
|
|
19
|
+
const rel = path.relative(geminiDir, src);
|
|
20
|
+
if (src === geminiDir) return true;
|
|
21
|
+
// Only sync config/settings files — skip caches, history, auth, sandbox, etc.
|
|
22
|
+
const allowed = ['settings.json', 'projects.json', 'state.json', 'installation_id', 'trustedFolders.json', '.gitignore', 'GEMINI.md'];
|
|
18
23
|
const basename = path.basename(src);
|
|
19
|
-
|
|
20
|
-
return !ignored.includes(basename);
|
|
24
|
+
return allowed.includes(basename) && !rel.includes(path.sep);
|
|
21
25
|
}
|
|
22
26
|
},
|
|
23
27
|
{
|
|
@@ -54,9 +58,13 @@ export const adapters = [
|
|
|
54
58
|
icon: '🟢',
|
|
55
59
|
source: path.join(home, '.codex'),
|
|
56
60
|
filter: (src) => {
|
|
61
|
+
const codexDir = path.join(home, '.codex');
|
|
62
|
+
const rel = path.relative(codexDir, src);
|
|
63
|
+
if (src === codexDir) return true;
|
|
57
64
|
const basename = path.basename(src);
|
|
58
|
-
|
|
59
|
-
|
|
65
|
+
// Only sync config files
|
|
66
|
+
const allowed = ['config.json', 'settings.json', 'instructions.md'];
|
|
67
|
+
return allowed.includes(basename) && !rel.includes(path.sep);
|
|
60
68
|
}
|
|
61
69
|
},
|
|
62
70
|
{
|
|
@@ -66,9 +74,19 @@ export const adapters = [
|
|
|
66
74
|
? path.join(appData, 'Cursor', 'User')
|
|
67
75
|
: path.join(home, 'Library', 'Application Support', 'Cursor', 'User'),
|
|
68
76
|
filter: (src) => {
|
|
77
|
+
const cursorDir = isWin
|
|
78
|
+
? path.join(appData, 'Cursor', 'User')
|
|
79
|
+
: path.join(home, 'Library', 'Application Support', 'Cursor', 'User');
|
|
80
|
+
const rel = path.relative(cursorDir, src);
|
|
81
|
+
if (src === cursorDir) return true;
|
|
69
82
|
const basename = path.basename(src);
|
|
70
|
-
|
|
71
|
-
|
|
83
|
+
// Only sync settings and keybindings — not extensions, cache, storage
|
|
84
|
+
const allowed = ['settings.json', 'keybindings.json', 'rules'];
|
|
85
|
+
const topDir = rel.split(path.sep)[0];
|
|
86
|
+
if (allowed.includes(basename) && !rel.includes(path.sep)) return true;
|
|
87
|
+
// Allow rules directory (cursor rules)
|
|
88
|
+
if (topDir === 'rules') return true;
|
|
89
|
+
return false;
|
|
72
90
|
}
|
|
73
91
|
},
|
|
74
92
|
{
|
|
@@ -78,9 +96,14 @@ export const adapters = [
|
|
|
78
96
|
? path.join(appData, 'GitHub Copilot')
|
|
79
97
|
: path.join(home, '.config', 'github-copilot'),
|
|
80
98
|
filter: (src) => {
|
|
99
|
+
const copilotDir = isWin
|
|
100
|
+
? path.join(appData, 'GitHub Copilot')
|
|
101
|
+
: path.join(home, '.config', 'github-copilot');
|
|
102
|
+
if (src === copilotDir) return true;
|
|
81
103
|
const basename = path.basename(src);
|
|
82
|
-
|
|
83
|
-
|
|
104
|
+
// Only sync config — skip auth tokens and version files
|
|
105
|
+
const allowed = ['settings.json', 'config.json'];
|
|
106
|
+
return allowed.includes(basename);
|
|
84
107
|
}
|
|
85
108
|
},
|
|
86
109
|
{
|
|
@@ -90,9 +113,18 @@ export const adapters = [
|
|
|
90
113
|
? path.join(appData, 'Windsurf', 'User')
|
|
91
114
|
: path.join(home, 'Library', 'Application Support', 'Windsurf', 'User'),
|
|
92
115
|
filter: (src) => {
|
|
116
|
+
const windsurfDir = isWin
|
|
117
|
+
? path.join(appData, 'Windsurf', 'User')
|
|
118
|
+
: path.join(home, 'Library', 'Application Support', 'Windsurf', 'User');
|
|
119
|
+
const rel = path.relative(windsurfDir, src);
|
|
120
|
+
if (src === windsurfDir) return true;
|
|
93
121
|
const basename = path.basename(src);
|
|
94
|
-
|
|
95
|
-
|
|
122
|
+
// Only sync settings and keybindings
|
|
123
|
+
const allowed = ['settings.json', 'keybindings.json', 'rules'];
|
|
124
|
+
const topDir = rel.split(path.sep)[0];
|
|
125
|
+
if (allowed.includes(basename) && !rel.includes(path.sep)) return true;
|
|
126
|
+
if (topDir === 'rules') return true;
|
|
127
|
+
return false;
|
|
96
128
|
}
|
|
97
129
|
},
|
|
98
130
|
{
|