memoir-cli 2.2.0 ā 2.5.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 +91 -113
- package/bin/memoir.js +151 -12
- package/package.json +7 -3
- package/src/adapters/index.js +1 -1
- package/src/cloud/auth.js +112 -0
- package/src/cloud/constants.js +5 -0
- package/src/cloud/storage.js +212 -0
- package/src/commands/cloud.js +173 -0
- package/src/commands/diff.js +2 -2
- package/src/commands/doctor.js +2 -2
- package/src/commands/history.js +65 -0
- package/src/commands/login.js +93 -0
- package/src/commands/profile.js +199 -0
- package/src/commands/push.js +4 -2
- package/src/commands/restore.js +1 -1
- package/src/commands/resume.js +1 -1
- package/src/commands/snapshot.js +1 -1
- package/src/commands/status.js +2 -2
- package/src/commands/view.js +2 -2
- package/src/config.js +94 -7
- package/src/tools/chatgpt.js +24 -0
- package/src/tools/index.js +2 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
#
|
|
3
|
+
# memoir
|
|
4
4
|
**Your AI Remembers Everything. Sync It Everywhere.**
|
|
5
5
|
|
|
6
6
|
[](https://npmjs.org/package/memoir-cli)
|
|
@@ -14,186 +14,164 @@
|
|
|
14
14
|
|
|
15
15
|
---
|
|
16
16
|
|
|
17
|
-
##
|
|
17
|
+
## The Problem
|
|
18
18
|
|
|
19
|
-
You spend weeks teaching your
|
|
19
|
+
You spend weeks teaching your AI tools how you code ā your preferred patterns, project context, coding standards.
|
|
20
20
|
|
|
21
|
-
Then
|
|
21
|
+
Then you switch laptops. Or try a new AI tool. Or want your team on the same page.
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
All that context is trapped in hidden dotfiles on one machine.
|
|
24
24
|
|
|
25
|
-
##
|
|
25
|
+
## The Solution
|
|
26
26
|
|
|
27
|
-
`memoir`
|
|
28
|
-
|
|
29
|
-
No locked-in SaaS, no lost context, no complex shell scripts. Switch from Claude to Gemini in one command.
|
|
30
|
-
|
|
31
|
-
### Supported Integrations
|
|
32
|
-
- [x] **Gemini CLI**
|
|
33
|
-
- [x] **Claude Code**
|
|
34
|
-
- [x] **OpenAI Codex CLI**
|
|
35
|
-
- [x] **Cursor**
|
|
36
|
-
- [x] **GitHub Copilot**
|
|
37
|
-
- [x] **Windsurf**
|
|
38
|
-
- [x] **Aider**
|
|
39
|
-
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
## š ļø Installation
|
|
43
|
-
|
|
44
|
-
Install globally via npm so you can use it anywhere on your machine:
|
|
27
|
+
`memoir` extracts, backs up, restores, and **translates** your AI memory across any computer and any tool. One command to save. One command to restore. One command to translate between tools.
|
|
45
28
|
|
|
46
29
|
```bash
|
|
47
30
|
npm install -g memoir-cli
|
|
48
31
|
```
|
|
49
32
|
|
|
50
|
-
|
|
33
|
+
### Supported Tools (11)
|
|
34
|
+
| Tool | Config synced |
|
|
35
|
+
|------|--------------|
|
|
36
|
+
| **ChatGPT** | `CHATGPT.md` ā custom instructions, preferences |
|
|
37
|
+
| **Claude Code** | `~/.claude/` ā settings, projects, memory files |
|
|
38
|
+
| **Gemini CLI** | `~/.gemini/` ā settings, GEMINI.md |
|
|
39
|
+
| **OpenAI Codex** | `~/.codex/` ā config, instructions |
|
|
40
|
+
| **Cursor** | Settings, keybindings, rules |
|
|
41
|
+
| **GitHub Copilot** | Config, settings |
|
|
42
|
+
| **Windsurf** | Settings, keybindings, rules |
|
|
43
|
+
| **Zed** | Settings, keymap, tasks |
|
|
44
|
+
| **Cline** | Settings, rules |
|
|
45
|
+
| **Continue.dev** | Config, rules |
|
|
46
|
+
| **Aider** | `.aider.conf.yml`, system prompt |
|
|
47
|
+
|
|
48
|
+
Plus **per-project configs**: automatically finds `CLAUDE.md`, `GEMINI.md`, `CHATGPT.md`, `.cursorrules`, `AGENTS.md` across all your projects.
|
|
51
49
|
|
|
52
|
-
|
|
53
|
-
Run the setup wizard. We'll help you securely link a private GitHub repository or a local sync folder.
|
|
50
|
+
---
|
|
54
51
|
|
|
52
|
+
## Quick Start
|
|
53
|
+
|
|
54
|
+
### 1. Initialize
|
|
55
55
|
```bash
|
|
56
56
|
memoir init
|
|
57
|
+
# Walks you through setup ā GitHub repo or local folder
|
|
58
|
+
# Auto-creates a private repo if you have gh CLI
|
|
57
59
|
```
|
|
58
60
|
|
|
59
|
-
### 2.
|
|
60
|
-
Just had a great session? Save your AI's learned context to the cloud:
|
|
61
|
-
|
|
61
|
+
### 2. Back up your memory
|
|
62
62
|
```bash
|
|
63
63
|
memoir push
|
|
64
|
-
# or simply use the alias:
|
|
65
|
-
memoir remember
|
|
66
64
|
```
|
|
67
65
|
|
|
68
|
-
### 3. Restore
|
|
69
|
-
Got a new machine? Pull your brain down instantly:
|
|
70
|
-
|
|
66
|
+
### 3. Restore on a new machine
|
|
71
67
|
```bash
|
|
72
68
|
memoir restore
|
|
73
|
-
# or:
|
|
74
|
-
memoir pull
|
|
75
69
|
```
|
|
76
70
|
|
|
77
|
-
### 4. Translate
|
|
78
|
-
Switch AI tools without losing context. Memoir uses Gemini AI to intelligently rewrite your memory files for any supported tool:
|
|
79
|
-
|
|
71
|
+
### 4. Translate between tools
|
|
80
72
|
```bash
|
|
81
73
|
memoir migrate --from claude --to gemini
|
|
82
|
-
#
|
|
83
|
-
memoir migrate
|
|
74
|
+
# AI-powered translation ā not copy-paste, real rewriting
|
|
84
75
|
```
|
|
85
76
|
|
|
86
|
-
Your Claude instructions become a proper `GEMINI.md` ā not a copy-paste, but a real translation that follows each tool's conventions.
|
|
87
|
-
|
|
88
77
|
---
|
|
89
78
|
|
|
90
|
-
##
|
|
79
|
+
## All Commands
|
|
91
80
|
|
|
92
81
|
| Command | What it does |
|
|
93
82
|
|---------|-------------|
|
|
94
|
-
| `memoir init` | Setup wizard ā
|
|
95
|
-
| `memoir push` |
|
|
96
|
-
| `memoir restore` |
|
|
97
|
-
| `memoir status` | Show
|
|
98
|
-
| `memoir
|
|
99
|
-
| `memoir
|
|
83
|
+
| `memoir init` | Setup wizard ā GitHub or local, upload or download |
|
|
84
|
+
| `memoir push` | Back up all AI configs |
|
|
85
|
+
| `memoir restore` | Restore on a new machine (non-destructive) |
|
|
86
|
+
| `memoir status` | Show detected AI tools |
|
|
87
|
+
| `memoir doctor` | Diagnose issues, scan for secrets |
|
|
88
|
+
| `memoir view` | Preview what's in your backup |
|
|
89
|
+
| `memoir diff` | Show changes since last backup |
|
|
90
|
+
| `memoir migrate` | Translate memory between tools via AI |
|
|
91
|
+
| `memoir snapshot` | Capture current coding session |
|
|
92
|
+
| `memoir resume` | Pick up where you left off |
|
|
93
|
+
| `memoir profile` | Manage profiles (personal/work) |
|
|
94
|
+
| `memoir update` | Self-update to latest version |
|
|
100
95
|
|
|
101
96
|
---
|
|
102
97
|
|
|
103
|
-
##
|
|
98
|
+
## Profiles
|
|
99
|
+
|
|
100
|
+
Separate personal and work configs ā different repos, different tools.
|
|
104
101
|
|
|
105
|
-
### New laptop setup
|
|
106
102
|
```bash
|
|
107
|
-
#
|
|
108
|
-
memoir
|
|
103
|
+
memoir profile create work # set up work profile with its own repo
|
|
104
|
+
memoir profile create personal # personal side projects
|
|
109
105
|
|
|
110
|
-
#
|
|
111
|
-
memoir
|
|
112
|
-
# All your .claude/, .gemini/, .cursorrules configs restored in 30 seconds
|
|
113
|
-
```
|
|
106
|
+
memoir push --profile work # sync only work configs
|
|
107
|
+
memoir restore --profile personal
|
|
114
108
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
memoir migrate --from claude --to gemini
|
|
109
|
+
memoir profile list # see all profiles
|
|
110
|
+
memoir profile switch work # change default
|
|
118
111
|
```
|
|
119
|
-
Your CLAUDE.md + Claude memory files get intelligently rewritten as a proper GEMINI.md ā not a copy-paste, but a real translation that follows Gemini's conventions.
|
|
120
112
|
|
|
121
|
-
|
|
122
|
-
```bash
|
|
123
|
-
# Team lead writes CLAUDE.md, then generates for everyone else:
|
|
124
|
-
memoir migrate --from claude --to cursor
|
|
125
|
-
memoir migrate --from claude --to copilot
|
|
126
|
-
memoir migrate --from claude --to codex
|
|
127
|
-
```
|
|
113
|
+
Each profile can filter which tools to sync, so your personal side project memory never mixes with work.
|
|
128
114
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
memoir migrate --from claude --to codex
|
|
133
|
-
memoir migrate --from claude --to cursor
|
|
134
|
-
memoir migrate --from claude --to windsurf
|
|
135
|
-
memoir migrate --from claude --to aider
|
|
136
|
-
```
|
|
137
|
-
Use one tool as the source of truth, propagate to all others.
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Common Workflows
|
|
138
118
|
|
|
139
|
-
###
|
|
119
|
+
### New laptop setup
|
|
140
120
|
```bash
|
|
141
|
-
|
|
142
|
-
|
|
121
|
+
# Old machine
|
|
122
|
+
memoir push
|
|
123
|
+
|
|
124
|
+
# New machine
|
|
125
|
+
memoir init # ā Download ā same GitHub repo
|
|
126
|
+
memoir restore # All configs restored in seconds
|
|
143
127
|
```
|
|
144
128
|
|
|
145
|
-
###
|
|
129
|
+
### Translate between tools
|
|
146
130
|
```bash
|
|
147
|
-
memoir migrate --from
|
|
148
|
-
#
|
|
149
|
-
# ā Overwrite / Append / Skip
|
|
150
|
-
# Append adds a dated separator so you keep your existing instructions
|
|
131
|
+
memoir migrate --from chatgpt --to claude
|
|
132
|
+
# Your ChatGPT custom instructions become a proper CLAUDE.md
|
|
151
133
|
```
|
|
152
134
|
|
|
153
|
-
###
|
|
135
|
+
### Fan out to every tool
|
|
154
136
|
```bash
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
# Next morning, different machine
|
|
159
|
-
memoir pull
|
|
137
|
+
memoir migrate --from chatgpt --to all
|
|
138
|
+
# One source of truth, every tool gets its own format
|
|
160
139
|
```
|
|
161
140
|
|
|
162
|
-
###
|
|
141
|
+
### Daily sync
|
|
163
142
|
```bash
|
|
164
|
-
memoir
|
|
165
|
-
#
|
|
143
|
+
memoir push # end of day
|
|
144
|
+
memoir restore # next morning, different machine
|
|
166
145
|
```
|
|
167
146
|
|
|
168
147
|
---
|
|
169
148
|
|
|
170
|
-
##
|
|
149
|
+
## Security
|
|
171
150
|
|
|
172
|
-
|
|
151
|
+
Memoir **only** syncs config files, instructions, and memory markdown. It never touches credentials, API keys, `.env` files, or auth tokens.
|
|
173
152
|
|
|
174
|
-
|
|
153
|
+
Run `memoir doctor` to see exactly what would be synced and scan for accidental secrets before pushing.
|
|
175
154
|
|
|
176
155
|
---
|
|
177
156
|
|
|
178
|
-
##
|
|
157
|
+
## Roadmap
|
|
179
158
|
|
|
180
|
-
**
|
|
181
|
-
-
|
|
182
|
-
-
|
|
183
|
-
-
|
|
159
|
+
- **Universal format** ā write one `MEMOIR.md`, generate all tool-specific configs
|
|
160
|
+
- **Cloud sync** ā no GitHub needed, encrypted backups
|
|
161
|
+
- **Teams** ā shared coding standards across your whole team
|
|
162
|
+
- **Templates** ā community-shared AI tool configs
|
|
184
163
|
|
|
185
164
|
---
|
|
186
165
|
|
|
187
|
-
##
|
|
166
|
+
## Contributing
|
|
188
167
|
|
|
189
|
-
|
|
168
|
+
Contributions welcome ā especially new tool adapters and migration improvements.
|
|
190
169
|
|
|
191
|
-
1. Fork the
|
|
192
|
-
2. Create your
|
|
193
|
-
3. Commit
|
|
194
|
-
4.
|
|
195
|
-
5. Open a Pull Request
|
|
170
|
+
1. Fork the repo
|
|
171
|
+
2. Create your branch (`git checkout -b feature/my-feature`)
|
|
172
|
+
3. Commit and push
|
|
173
|
+
4. Open a PR
|
|
196
174
|
|
|
197
|
-
##
|
|
175
|
+
## License
|
|
198
176
|
|
|
199
|
-
|
|
177
|
+
MIT
|
package/bin/memoir.js
CHANGED
|
@@ -13,6 +13,10 @@ import { diffCommand } from '../src/commands/diff.js';
|
|
|
13
13
|
import { migrateCommand } from '../src/commands/migrate.js';
|
|
14
14
|
import { snapshotCommand } from '../src/commands/snapshot.js';
|
|
15
15
|
import { resumeCommand } from '../src/commands/resume.js';
|
|
16
|
+
import { profileListCommand, profileCreateCommand, profileSwitchCommand, profileDeleteCommand } from '../src/commands/profile.js';
|
|
17
|
+
import { loginCommand, logoutCommand } from '../src/commands/login.js';
|
|
18
|
+
import { cloudPushCommand, cloudRestoreCommand } from '../src/commands/cloud.js';
|
|
19
|
+
import { historyCommand } from '../src/commands/history.js';
|
|
16
20
|
import { createRequire } from 'module';
|
|
17
21
|
|
|
18
22
|
const require = createRequire(import.meta.url);
|
|
@@ -57,8 +61,14 @@ if (process.argv.length <= 2) {
|
|
|
57
61
|
chalk.cyan(' memoir snapshot ') + chalk.gray('ā capture your current session') + '\n' +
|
|
58
62
|
chalk.cyan(' memoir resume ') + chalk.gray('ā pick up where you left off') + '\n' +
|
|
59
63
|
chalk.cyan(' memoir status ') + chalk.gray('ā see detected AI tools') + '\n' +
|
|
64
|
+
chalk.cyan(' memoir profile ') + chalk.gray('ā manage profiles (personal/work)') + '\n' +
|
|
60
65
|
chalk.cyan(' memoir update ') + chalk.gray('ā update to latest version') + '\n\n' +
|
|
61
|
-
chalk.
|
|
66
|
+
chalk.white.bold('Cloud (Pro):') + '\n' +
|
|
67
|
+
chalk.cyan(' memoir login ') + chalk.gray('ā sign in to memoir cloud') + '\n' +
|
|
68
|
+
chalk.cyan(' memoir cloud push ') + chalk.gray('ā back up to the cloud') + '\n' +
|
|
69
|
+
chalk.cyan(' memoir cloud restore ') + chalk.gray('ā restore from cloud') + '\n' +
|
|
70
|
+
chalk.cyan(' memoir history ') + chalk.gray('ā view backup versions') + '\n\n' +
|
|
71
|
+
chalk.gray(' Tip: use --profile work to sync a specific profile') + '\n\n' +
|
|
62
72
|
chalk.gray(`v${VERSION}`),
|
|
63
73
|
{ padding: 1, borderStyle: 'round', borderColor: 'cyan', dimBorder: true }
|
|
64
74
|
) + '\n');
|
|
@@ -93,7 +103,8 @@ program
|
|
|
93
103
|
.command('push')
|
|
94
104
|
.alias('remember')
|
|
95
105
|
.description('Back up your AI memory to the cloud')
|
|
96
|
-
.option('--only <tools>', 'Only sync specific tools (comma-separated
|
|
106
|
+
.option('--only <tools>', 'Only sync specific tools (comma-separated)')
|
|
107
|
+
.option('-p, --profile <name>', 'Use a specific profile')
|
|
97
108
|
.action(async (options) => {
|
|
98
109
|
try {
|
|
99
110
|
await pushCommand(options);
|
|
@@ -107,8 +118,9 @@ program
|
|
|
107
118
|
.command('restore')
|
|
108
119
|
.alias('pull')
|
|
109
120
|
.description('Restore your AI memory on this machine')
|
|
110
|
-
.option('--only <tools>', 'Only restore specific tools (comma-separated
|
|
121
|
+
.option('--only <tools>', 'Only restore specific tools (comma-separated)')
|
|
111
122
|
.option('-y, --yes', 'Skip confirmation prompts (restore all)')
|
|
123
|
+
.option('-p, --profile <name>', 'Use a specific profile')
|
|
112
124
|
.action(async (options) => {
|
|
113
125
|
try {
|
|
114
126
|
await restoreCommand(options);
|
|
@@ -121,9 +133,10 @@ program
|
|
|
121
133
|
program
|
|
122
134
|
.command('status')
|
|
123
135
|
.description('See what AI tools are on this machine')
|
|
124
|
-
.
|
|
136
|
+
.option('-p, --profile <name>', 'Use a specific profile')
|
|
137
|
+
.action(async (options) => {
|
|
125
138
|
try {
|
|
126
|
-
await statusCommand();
|
|
139
|
+
await statusCommand(options);
|
|
127
140
|
} catch (err) {
|
|
128
141
|
console.error(chalk.red('\nā Error:'), err.message);
|
|
129
142
|
process.exit(1);
|
|
@@ -134,9 +147,10 @@ program
|
|
|
134
147
|
.command('doctor')
|
|
135
148
|
.alias('diagnose')
|
|
136
149
|
.description('Diagnose common issues with your memoir setup')
|
|
137
|
-
.
|
|
150
|
+
.option('-p, --profile <name>', 'Use a specific profile')
|
|
151
|
+
.action(async (options) => {
|
|
138
152
|
try {
|
|
139
|
-
await doctorCommand();
|
|
153
|
+
await doctorCommand(options);
|
|
140
154
|
} catch (err) {
|
|
141
155
|
console.error(chalk.red('\nā Error:'), err.message);
|
|
142
156
|
process.exit(1);
|
|
@@ -147,9 +161,10 @@ program
|
|
|
147
161
|
.command('view')
|
|
148
162
|
.alias('ls')
|
|
149
163
|
.description('Preview what files are in your backup')
|
|
150
|
-
.
|
|
164
|
+
.option('-p, --profile <name>', 'Use a specific profile')
|
|
165
|
+
.action(async (options) => {
|
|
151
166
|
try {
|
|
152
|
-
await viewCommand();
|
|
167
|
+
await viewCommand(options);
|
|
153
168
|
} catch (err) {
|
|
154
169
|
console.error(chalk.red('\nā Error:'), err.message);
|
|
155
170
|
process.exit(1);
|
|
@@ -160,9 +175,10 @@ program
|
|
|
160
175
|
.command('diff')
|
|
161
176
|
.alias('changes')
|
|
162
177
|
.description('Show what changed since your last backup')
|
|
163
|
-
.
|
|
178
|
+
.option('-p, --profile <name>', 'Use a specific profile')
|
|
179
|
+
.action(async (options) => {
|
|
164
180
|
try {
|
|
165
|
-
await diffCommand();
|
|
181
|
+
await diffCommand(options);
|
|
166
182
|
} catch (err) {
|
|
167
183
|
console.error(chalk.red('\nā Error:'), err.message);
|
|
168
184
|
process.exit(1);
|
|
@@ -175,6 +191,7 @@ program
|
|
|
175
191
|
.description('Capture your current coding session for handoff')
|
|
176
192
|
.option('--smart', 'Use AI to generate a better summary (requires Gemini API key)')
|
|
177
193
|
.option('--goal <goal>', 'What you want to do next (goal-directed handoff)')
|
|
194
|
+
.option('-p, --profile <name>', 'Use a specific profile')
|
|
178
195
|
.action(async (options) => {
|
|
179
196
|
try {
|
|
180
197
|
await snapshotCommand(options);
|
|
@@ -189,6 +206,7 @@ program
|
|
|
189
206
|
.description('Pick up where you left off on another machine')
|
|
190
207
|
.option('--inject', 'Write the handoff where your AI tool will read it')
|
|
191
208
|
.option('--to <tool>', 'Target tool for injection (claude, gemini, cursor, codex)')
|
|
209
|
+
.option('-p, --profile <name>', 'Use a specific profile')
|
|
192
210
|
.action(async (options) => {
|
|
193
211
|
try {
|
|
194
212
|
await resumeCommand(options);
|
|
@@ -220,7 +238,6 @@ program
|
|
|
220
238
|
console.log('\n' + chalk.cyan(`Updating memoir ${VERSION} ā ${chalk.green.bold(latest)}...`) + '\n');
|
|
221
239
|
|
|
222
240
|
const { execSync } = await import('child_process');
|
|
223
|
-
// Detect package manager ā prefer the one that installed memoir
|
|
224
241
|
const execPath = process.argv[1] || '';
|
|
225
242
|
const useBun = execPath.includes('.bun') || process.env.BUN_INSTALL;
|
|
226
243
|
const cmd = useBun ? 'bun install -g memoir-cli' : 'npm install -g memoir-cli';
|
|
@@ -254,6 +271,128 @@ program
|
|
|
254
271
|
}
|
|
255
272
|
});
|
|
256
273
|
|
|
274
|
+
// Cloud auth
|
|
275
|
+
program
|
|
276
|
+
.command('login')
|
|
277
|
+
.description('Sign in to memoir cloud')
|
|
278
|
+
.action(async () => {
|
|
279
|
+
try {
|
|
280
|
+
await loginCommand();
|
|
281
|
+
} catch (err) {
|
|
282
|
+
console.error(chalk.red('\nā Error:'), err.message);
|
|
283
|
+
process.exit(1);
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
program
|
|
288
|
+
.command('logout')
|
|
289
|
+
.description('Sign out of memoir cloud')
|
|
290
|
+
.action(async () => {
|
|
291
|
+
try {
|
|
292
|
+
await logoutCommand();
|
|
293
|
+
} catch (err) {
|
|
294
|
+
console.error(chalk.red('\nā Error:'), err.message);
|
|
295
|
+
process.exit(1);
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
// Cloud sync
|
|
300
|
+
const cloud = program.command('cloud').description('Cloud backup and restore (Pro)');
|
|
301
|
+
|
|
302
|
+
cloud
|
|
303
|
+
.command('push')
|
|
304
|
+
.description('Back up your AI memory to the cloud')
|
|
305
|
+
.option('--only <tools>', 'Only sync specific tools (comma-separated)')
|
|
306
|
+
.action(async (options) => {
|
|
307
|
+
try {
|
|
308
|
+
await cloudPushCommand(options);
|
|
309
|
+
} catch (err) {
|
|
310
|
+
console.error(chalk.red('\nā Error:'), err.message);
|
|
311
|
+
process.exit(1);
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
cloud
|
|
316
|
+
.command('restore')
|
|
317
|
+
.description('Restore your AI memory from the cloud')
|
|
318
|
+
.option('--only <tools>', 'Only restore specific tools (comma-separated)')
|
|
319
|
+
.option('-y, --yes', 'Skip confirmation prompts')
|
|
320
|
+
.option('--version <number>', 'Restore a specific version')
|
|
321
|
+
.action(async (options) => {
|
|
322
|
+
try {
|
|
323
|
+
await cloudRestoreCommand(options);
|
|
324
|
+
} catch (err) {
|
|
325
|
+
console.error(chalk.red('\nā Error:'), err.message);
|
|
326
|
+
process.exit(1);
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
program
|
|
331
|
+
.command('history')
|
|
332
|
+
.description('View your cloud backup history')
|
|
333
|
+
.action(async () => {
|
|
334
|
+
try {
|
|
335
|
+
await historyCommand();
|
|
336
|
+
} catch (err) {
|
|
337
|
+
console.error(chalk.red('\nā Error:'), err.message);
|
|
338
|
+
process.exit(1);
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
// Profile management
|
|
343
|
+
const profile = program.command('profile').description('Manage profiles (personal, work, etc.)');
|
|
344
|
+
|
|
345
|
+
profile
|
|
346
|
+
.command('list')
|
|
347
|
+
.alias('ls')
|
|
348
|
+
.description('List all profiles')
|
|
349
|
+
.action(async () => {
|
|
350
|
+
try {
|
|
351
|
+
await profileListCommand();
|
|
352
|
+
} catch (err) {
|
|
353
|
+
console.error(chalk.red('\nā Error:'), err.message);
|
|
354
|
+
process.exit(1);
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
profile
|
|
359
|
+
.command('create <name>')
|
|
360
|
+
.description('Create a new profile')
|
|
361
|
+
.action(async (name) => {
|
|
362
|
+
try {
|
|
363
|
+
await profileCreateCommand(name);
|
|
364
|
+
} catch (err) {
|
|
365
|
+
console.error(chalk.red('\nā Error:'), err.message);
|
|
366
|
+
process.exit(1);
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
profile
|
|
371
|
+
.command('switch <name>')
|
|
372
|
+
.alias('use')
|
|
373
|
+
.description('Switch to a profile')
|
|
374
|
+
.action(async (name) => {
|
|
375
|
+
try {
|
|
376
|
+
await profileSwitchCommand(name);
|
|
377
|
+
} catch (err) {
|
|
378
|
+
console.error(chalk.red('\nā Error:'), err.message);
|
|
379
|
+
process.exit(1);
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
profile
|
|
384
|
+
.command('delete <name>')
|
|
385
|
+
.alias('rm')
|
|
386
|
+
.description('Delete a profile')
|
|
387
|
+
.action(async (name) => {
|
|
388
|
+
try {
|
|
389
|
+
await profileDeleteCommand(name);
|
|
390
|
+
} catch (err) {
|
|
391
|
+
console.error(chalk.red('\nā Error:'), err.message);
|
|
392
|
+
process.exit(1);
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
|
|
257
396
|
program.hook('postAction', async () => {
|
|
258
397
|
await checkForUpdate();
|
|
259
398
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "memoir-cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"description": "Sync AI memory across devices. Back up and restore Claude, Gemini, Codex, Cursor, Copilot, Windsurf configs. Snapshot coding sessions and resume on another machine. Migrate instructions between AI assistants.",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -35,6 +35,10 @@
|
|
|
35
35
|
"copilot",
|
|
36
36
|
"windsurf",
|
|
37
37
|
"aider",
|
|
38
|
+
"zed",
|
|
39
|
+
"cline",
|
|
40
|
+
"continue-dev",
|
|
41
|
+
"profiles",
|
|
38
42
|
"ai-memory",
|
|
39
43
|
"ai-tools",
|
|
40
44
|
"dotfiles",
|
|
@@ -42,6 +46,7 @@
|
|
|
42
46
|
"claude-code",
|
|
43
47
|
"gemini-cli",
|
|
44
48
|
"openai",
|
|
49
|
+
"chatgpt",
|
|
45
50
|
"ai-assistant",
|
|
46
51
|
"coding-assistant",
|
|
47
52
|
"context-sync",
|
|
@@ -58,7 +63,6 @@
|
|
|
58
63
|
"fs-extra": "^11.2.0",
|
|
59
64
|
"gradient-string": "^3.0.0",
|
|
60
65
|
"inquirer": "^9.2.15",
|
|
61
|
-
|
|
62
|
-
"ora": "^7.0.1"
|
|
66
|
+
"ora": "^7.0.1"
|
|
63
67
|
}
|
|
64
68
|
}
|
package/src/adapters/index.js
CHANGED
|
@@ -298,7 +298,7 @@ export async function extractMemories(stagingDir, spinner, onlyFilter = null) {
|
|
|
298
298
|
spinner.text = `š Scanning for project-level AI configs...`;
|
|
299
299
|
|
|
300
300
|
const projectFiles = [
|
|
301
|
-
'CLAUDE.md', 'GEMINI.md', 'AGENTS.md', '.cursorrules',
|
|
301
|
+
'CLAUDE.md', 'GEMINI.md', 'CHATGPT.md', 'AGENTS.md', '.cursorrules',
|
|
302
302
|
'.github/copilot-instructions.md', '.windsurfrules',
|
|
303
303
|
'.aider.conf.yml', '.clinerules'
|
|
304
304
|
];
|