opencodesync 0.1.5 → 0.1.6
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 +113 -239
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +34 -4
- package/dist/cli/commands/init.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,307 +1,181 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://img.shields.io/npm/v/opencodesync.svg?style=flat-square&color=blue" alt="npm version" />
|
|
3
|
+
<img src="https://img.shields.io/npm/dm/opencodesync.svg?style=flat-square&color=green" alt="downloads" />
|
|
4
|
+
<img src="https://img.shields.io/badge/license-MIT-yellow.svg?style=flat-square" alt="license" />
|
|
5
|
+
</p>
|
|
2
6
|
|
|
3
|
-
|
|
4
|
-
[](https://www.npmjs.com/package/opencodesync)
|
|
5
|
-
[](https://github.com/tctinh/opencode-sync/actions/workflows/ci.yml)
|
|
6
|
-
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
<h1 align="center">opencodesync</h1>
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
<p align="center">
|
|
10
|
+
<strong>Start coding on your laptop. Continue on your desktop. Never lose context.</strong>
|
|
11
|
+
</p>
|
|
9
12
|
|
|
10
|
-
|
|
13
|
+
<p align="center">
|
|
14
|
+
Seamlessly sync your OpenCode settings, custom agents, and AI session contexts across all your devices.
|
|
15
|
+
</p>
|
|
11
16
|
|
|
12
|
-
|
|
13
|
-
- **Context Export**: AI-powered session summarization with privacy safeguards
|
|
14
|
-
- **Context Import**: Resume work on any device with full context
|
|
15
|
-
- **Secure**: End-to-end encryption with AES-256-GCM
|
|
16
|
-
- **Private**: Uses private GitHub Gists for storage
|
|
17
|
+
---
|
|
17
18
|
|
|
18
|
-
##
|
|
19
|
+
## The Problem
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
npm install -g opencodesync
|
|
22
|
-
```
|
|
21
|
+
You're deep in a coding session on your work machine. You've built up context with your AI assistant - it understands your architecture, your decisions, your next steps. Then you need to switch to your home computer.
|
|
23
22
|
|
|
24
|
-
|
|
23
|
+
**Without opencodesync:** Start from scratch. Re-explain everything. Lose momentum.
|
|
25
24
|
|
|
26
|
-
|
|
25
|
+
**With opencodesync:** One command. Full context restored. Keep building.
|
|
27
26
|
|
|
28
|
-
|
|
29
|
-
opencodesync init
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
This will:
|
|
33
|
-
- Guide you through creating a GitHub Personal Access Token
|
|
34
|
-
- Set up your encryption passphrase
|
|
35
|
-
- Create your sync storage
|
|
27
|
+
---
|
|
36
28
|
|
|
37
|
-
|
|
29
|
+
## Quick Start
|
|
38
30
|
|
|
39
31
|
```bash
|
|
40
|
-
|
|
41
|
-
|
|
32
|
+
# Install globally
|
|
33
|
+
npm install -g opencodesync
|
|
42
34
|
|
|
43
|
-
|
|
35
|
+
# Set up on your first device
|
|
36
|
+
opencodesync init
|
|
44
37
|
|
|
45
|
-
|
|
46
|
-
opencodesync
|
|
47
|
-
opencodesync pull
|
|
38
|
+
# Push your settings
|
|
39
|
+
opencodesync push
|
|
48
40
|
```
|
|
49
41
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
### `opencodesync init`
|
|
53
|
-
|
|
54
|
-
Set up sync credentials (GitHub token and encryption passphrase).
|
|
55
|
-
|
|
42
|
+
On your second device:
|
|
56
43
|
```bash
|
|
57
|
-
opencodesync init
|
|
44
|
+
opencodesync init # Same credentials
|
|
45
|
+
opencodesync pull # Everything synced
|
|
58
46
|
```
|
|
59
47
|
|
|
60
|
-
|
|
61
|
-
- `--force`, `-f`: Overwrite existing credentials
|
|
48
|
+
That's it. Your configs, agents, commands, and contexts are now synced.
|
|
62
49
|
|
|
63
|
-
|
|
50
|
+
---
|
|
64
51
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
```bash
|
|
68
|
-
opencodesync push [--force] [--verbose]
|
|
69
|
-
```
|
|
52
|
+
## What You Get
|
|
70
53
|
|
|
71
|
-
|
|
72
|
-
- `--force`, `-f`: Push even if no changes detected
|
|
73
|
-
- `--verbose`, `-v`: Show detailed output
|
|
54
|
+
### Sync Your Entire Setup
|
|
74
55
|
|
|
75
|
-
|
|
56
|
+
| What | Synced |
|
|
57
|
+
|------|--------|
|
|
58
|
+
| Main config (`opencode.json`) | ✅ |
|
|
59
|
+
| Custom agents (`agent/*.md`) | ✅ |
|
|
60
|
+
| Custom commands (`command/*.md`) | ✅ |
|
|
61
|
+
| Global instructions (`AGENTS.md`) | ✅ |
|
|
62
|
+
| Plugin configs (`*.jsonc`, `oh-my-opencode.json`) | ✅ |
|
|
63
|
+
| Skills directory (`skills/**`) | ✅ |
|
|
64
|
+
| Session contexts | ✅ |
|
|
76
65
|
|
|
77
|
-
|
|
66
|
+
### Never Lose Your AI Context
|
|
78
67
|
|
|
79
|
-
|
|
80
|
-
opencodesync pull [--force] [--verbose]
|
|
68
|
+
Export your session before switching devices:
|
|
81
69
|
```
|
|
82
|
-
|
|
83
|
-
Options:
|
|
84
|
-
- `--force`, `-f`: Overwrite local files without confirmation
|
|
85
|
-
- `--verbose`, `-v`: Show detailed output
|
|
86
|
-
|
|
87
|
-
### `opencodesync status`
|
|
88
|
-
|
|
89
|
-
Show sync status and pending changes.
|
|
90
|
-
|
|
91
|
-
```bash
|
|
92
|
-
opencodesync status [--verbose]
|
|
70
|
+
/context-export "Auth Implementation" --guidance "focus on OAuth decisions"
|
|
93
71
|
```
|
|
94
72
|
|
|
95
|
-
|
|
96
|
-
- `--verbose`, `-v`: Show detailed file list
|
|
97
|
-
|
|
98
|
-
## Plugin Commands (in OpenCode)
|
|
99
|
-
|
|
100
|
-
### `/context-export`
|
|
101
|
-
|
|
102
|
-
Export current session as a privacy-safe context for cross-device sync.
|
|
103
|
-
|
|
73
|
+
Resume on any machine:
|
|
104
74
|
```
|
|
105
|
-
/context-
|
|
75
|
+
/context-import "Auth Implementation"
|
|
106
76
|
```
|
|
107
77
|
|
|
108
|
-
|
|
109
|
-
- `name`: Custom name for this context (optional, auto-generated if not provided)
|
|
110
|
-
- `--guidance`: What to focus on in the summary
|
|
78
|
+
Your AI picks up exactly where you left off.
|
|
111
79
|
|
|
112
|
-
|
|
113
|
-
```
|
|
114
|
-
/context-export "Auth Implementation" --guidance "focus on OAuth flow, skip database details"
|
|
115
|
-
```
|
|
80
|
+
### Bank-Grade Security
|
|
116
81
|
|
|
117
|
-
|
|
82
|
+
- **AES-256-GCM encryption** - Your data is encrypted before it leaves your machine
|
|
83
|
+
- **Private GitHub Gists** - Only you can access your sync storage
|
|
84
|
+
- **Zero plaintext** - Even if someone gets your Gist, they can't read it without your passphrase
|
|
118
85
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
```
|
|
122
|
-
/context-import [name...]
|
|
123
|
-
```
|
|
86
|
+
---
|
|
124
87
|
|
|
125
|
-
|
|
126
|
-
- `name...`: Context names or IDs to import (supports partial matching)
|
|
88
|
+
## Daily Workflow
|
|
127
89
|
|
|
128
|
-
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
|
|
90
|
+
**Morning at the office:**
|
|
91
|
+
```bash
|
|
92
|
+
opencodesync pull # Get latest from home
|
|
93
|
+
# ... work on features ...
|
|
94
|
+
/context-export "Feature Progress" # Save your context
|
|
95
|
+
opencodesync push # Sync to cloud
|
|
132
96
|
```
|
|
133
97
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
/context-list [--search query]
|
|
98
|
+
**Evening at home:**
|
|
99
|
+
```bash
|
|
100
|
+
opencodesync pull # Get settings + context
|
|
101
|
+
/context-import "Feature Progress" # Resume with full context
|
|
102
|
+
# ... continue seamlessly ...
|
|
140
103
|
```
|
|
141
104
|
|
|
142
|
-
|
|
105
|
+
---
|
|
143
106
|
|
|
144
|
-
|
|
107
|
+
## CLI Commands
|
|
145
108
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
109
|
+
| Command | What it does |
|
|
110
|
+
|---------|--------------|
|
|
111
|
+
| `opencodesync init` | Set up GitHub token and encryption passphrase |
|
|
112
|
+
| `opencodesync push` | Upload your settings to the cloud |
|
|
113
|
+
| `opencodesync pull` | Download settings from the cloud |
|
|
114
|
+
| `opencodesync status` | Check what's changed since last sync |
|
|
150
115
|
|
|
151
|
-
|
|
152
|
-
- `name`: Name or ID of context to delete
|
|
153
|
-
- `--all`: Delete all contexts (requires confirmation)
|
|
116
|
+
Use `--verbose` on any command for detailed output.
|
|
154
117
|
|
|
155
|
-
|
|
118
|
+
---
|
|
156
119
|
|
|
157
|
-
|
|
158
|
-
|------|--------|-------|
|
|
159
|
-
| `opencode.json` / `opencode.jsonc` | ✅ Yes | Main config file |
|
|
160
|
-
| Custom agents (`agent/*.md`) | ✅ Yes | Your custom agent definitions |
|
|
161
|
-
| Custom commands (`command/*.md`) | ✅ Yes | Your custom slash commands |
|
|
162
|
-
| `AGENTS.md` | ✅ Yes | Global instructions |
|
|
163
|
-
| Plugin configs (`*.jsonc`, `oh-my-opencode.json`) | ✅ Yes | Plugin ecosystem configurations |
|
|
164
|
-
| Skills directory (`skills/**`) | ✅ Yes | Skill files (symlinks resolved) |
|
|
165
|
-
| Session contexts | ✅ Yes | AI-generated summaries only |
|
|
166
|
-
| Auth tokens | ❌ **Never** | Security - never synced |
|
|
167
|
-
| Plugin source files | ❌ No | Install from config |
|
|
168
|
-
| Project configs (`.opencode/`) | ❌ No | Project-specific |
|
|
169
|
-
| Session raw data | ❌ No | Too large, contains sensitive data |
|
|
170
|
-
| Blocked files (`*.log`, `*.bak`, etc.) | ❌ No | Excluded by blocklist |
|
|
120
|
+
## Plugin Commands (inside OpenCode)
|
|
171
121
|
|
|
172
|
-
|
|
122
|
+
| Command | What it does |
|
|
123
|
+
|---------|--------------|
|
|
124
|
+
| `/context-export [name]` | Save current session as a portable context |
|
|
125
|
+
| `/context-import [name]` | Load a saved context into your session |
|
|
126
|
+
| `/context-list` | See all your saved contexts |
|
|
127
|
+
| `/context-prune <name>` | Delete old contexts |
|
|
173
128
|
|
|
174
|
-
|
|
129
|
+
---
|
|
175
130
|
|
|
176
|
-
|
|
177
|
-
- Encryption key derived from your passphrase using **PBKDF2** (100,000 iterations)
|
|
178
|
-
- Each sync uses a unique random salt and IV
|
|
179
|
-
- Your passphrase never leaves your device
|
|
131
|
+
## Privacy First
|
|
180
132
|
|
|
181
|
-
|
|
133
|
+
Context exports are **AI-generated summaries**, not raw data. They capture:
|
|
182
134
|
|
|
183
|
-
|
|
135
|
+
- Goals and objectives
|
|
136
|
+
- Technical approaches and decisions
|
|
137
|
+
- Progress and next steps
|
|
184
138
|
|
|
185
|
-
**
|
|
139
|
+
They **never** include:
|
|
186
140
|
- Code snippets or implementations
|
|
187
|
-
- API keys, tokens,
|
|
188
|
-
- Database
|
|
189
|
-
-
|
|
190
|
-
- File contents or raw data
|
|
141
|
+
- API keys, tokens, or secrets
|
|
142
|
+
- Database strings or internal URLs
|
|
143
|
+
- Raw file contents
|
|
191
144
|
|
|
192
|
-
|
|
193
|
-
- General goals and objectives
|
|
194
|
-
- High-level technical approaches
|
|
195
|
-
- Architectural decisions
|
|
196
|
-
- Progress and next steps (abstract)
|
|
145
|
+
Your intellectual property stays safe.
|
|
197
146
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
- Uses **private** GitHub Gists only
|
|
201
|
-
- GitHub token stored locally with encryption
|
|
202
|
-
- Gist URL not shared publicly
|
|
203
|
-
|
|
204
|
-
## Configuration Files
|
|
205
|
-
|
|
206
|
-
### Storage Locations
|
|
207
|
-
|
|
208
|
-
| Path | Purpose |
|
|
209
|
-
|------|---------|
|
|
210
|
-
| `~/.config/opencode/` | OpenCode config files |
|
|
211
|
-
| `~/.local/share/opencode/sync/` | Sync storage |
|
|
212
|
-
| `~/.local/share/opencode/sync/auth.json` | Encrypted credentials |
|
|
213
|
-
| `~/.local/share/opencode/sync/state.json` | Sync state |
|
|
214
|
-
| `~/.local/share/opencode/sync/contexts.json` | Saved contexts |
|
|
147
|
+
---
|
|
215
148
|
|
|
216
149
|
## Troubleshooting
|
|
217
150
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
Run `opencodesync init`
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
Make sure you're using the **same passphrase** as on your other devices. If you've forgotten it, you'll need to start fresh:
|
|
225
|
-
|
|
226
|
-
```bash
|
|
227
|
-
opencodesync init --force
|
|
228
|
-
opencodesync push --force
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
Then re-initialize your other devices with the new passphrase.
|
|
232
|
-
|
|
233
|
-
### "Invalid token" error
|
|
234
|
-
|
|
235
|
-
Your GitHub token may have expired or been revoked. Create a new one:
|
|
236
|
-
|
|
237
|
-
1. Go to https://github.com/settings/tokens/new
|
|
238
|
-
2. Create a token with the `gist` scope
|
|
239
|
-
3. Run `opencodesync init --force`
|
|
240
|
-
|
|
241
|
-
### "Rate limit" error
|
|
151
|
+
| Error | Solution |
|
|
152
|
+
|-------|----------|
|
|
153
|
+
| "Not configured" | Run `opencodesync init` |
|
|
154
|
+
| "Decryption failed" | Use the same passphrase as your other devices |
|
|
155
|
+
| "Invalid token" | Create a new GitHub token with `gist` scope |
|
|
242
156
|
|
|
243
|
-
|
|
157
|
+
Need to start fresh? `opencodesync init --force && opencodesync push --force`
|
|
244
158
|
|
|
245
|
-
|
|
159
|
+
---
|
|
246
160
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
```bash
|
|
250
|
-
# Morning: Start work
|
|
251
|
-
opencodesync pull # Get latest from home
|
|
252
|
-
|
|
253
|
-
# Work on feature...
|
|
254
|
-
|
|
255
|
-
# End of day: Save context
|
|
256
|
-
# In OpenCode:
|
|
257
|
-
/context-export "Feature X Progress" --guidance "focus on API design decisions"
|
|
258
|
-
|
|
259
|
-
# Push to sync
|
|
260
|
-
opencodesync push
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
### Machine B (Home)
|
|
264
|
-
|
|
265
|
-
```bash
|
|
266
|
-
# Evening: Continue work
|
|
267
|
-
opencodesync pull # Get settings + context from office
|
|
268
|
-
|
|
269
|
-
# In OpenCode:
|
|
270
|
-
/context-import "Feature X" # Resume with full context
|
|
271
|
-
|
|
272
|
-
# Continue working...
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
## API Usage (for plugin developers)
|
|
161
|
+
## For Plugin Developers
|
|
276
162
|
|
|
277
163
|
```typescript
|
|
278
|
-
import {
|
|
279
|
-
createPluginTools,
|
|
280
|
-
createEventHooks,
|
|
281
|
-
addContext,
|
|
282
|
-
getAllContexts,
|
|
283
|
-
paths,
|
|
284
|
-
} from "opencodesync";
|
|
285
|
-
|
|
286
|
-
// Create all tools
|
|
287
|
-
const tools = createPluginTools();
|
|
288
|
-
|
|
289
|
-
// Set up event hooks
|
|
290
|
-
const hooks = createEventHooks();
|
|
291
|
-
hooks.setToastHandler((options) => {
|
|
292
|
-
// Show toast notification in your UI
|
|
293
|
-
});
|
|
164
|
+
import { createPluginTools, addContext, getAllContexts } from "opencodesync";
|
|
294
165
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
});
|
|
299
|
-
|
|
300
|
-
// Direct context management
|
|
301
|
-
const context = addContext("My Context", "Summary text...");
|
|
302
|
-
const allContexts = getAllContexts();
|
|
166
|
+
const tools = createPluginTools();
|
|
167
|
+
const context = addContext("My Context", "Summary...");
|
|
168
|
+
const all = getAllContexts();
|
|
303
169
|
```
|
|
304
170
|
|
|
171
|
+
---
|
|
172
|
+
|
|
305
173
|
## License
|
|
306
174
|
|
|
307
175
|
MIT
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
<p align="center">
|
|
180
|
+
<strong>Stop context-switching. Start syncing.</strong>
|
|
181
|
+
</p>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkLrE"}
|
|
@@ -6,6 +6,8 @@ import { saveAuth, loadAuth, clearAuth } from "../../storage/auth.js";
|
|
|
6
6
|
import { validateToken, getUser, findSyncGist } from "../../core/gist.js";
|
|
7
7
|
import { generatePassphrase } from "../../core/crypto.js";
|
|
8
8
|
import { paths } from "../../utils/paths.js";
|
|
9
|
+
import { pushCommand } from "./push.js";
|
|
10
|
+
import { pullCommand } from "./pull.js";
|
|
9
11
|
export async function initCommand(options) {
|
|
10
12
|
console.log("\n🔧 OpenCode Sync Setup\n");
|
|
11
13
|
// Check existing credentials
|
|
@@ -123,14 +125,42 @@ export async function initCommand(options) {
|
|
|
123
125
|
// Summary
|
|
124
126
|
console.log("─".repeat(50));
|
|
125
127
|
console.log("Setup Complete!\n");
|
|
126
|
-
|
|
128
|
+
// Offer to pull or push based on whether using existing gist
|
|
127
129
|
if (gistId) {
|
|
128
|
-
|
|
130
|
+
const { shouldPull } = await inquirer.prompt([
|
|
131
|
+
{
|
|
132
|
+
type: "confirm",
|
|
133
|
+
name: "shouldPull",
|
|
134
|
+
message: "Do you want to pull your settings from this Gist now?",
|
|
135
|
+
default: true,
|
|
136
|
+
},
|
|
137
|
+
]);
|
|
138
|
+
if (shouldPull) {
|
|
139
|
+
console.log("\nPulling settings...\n");
|
|
140
|
+
await pullCommand({ verbose: false });
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
console.log("\nRun 'opencodesync pull' when you're ready to download your settings.");
|
|
144
|
+
}
|
|
129
145
|
}
|
|
130
146
|
else {
|
|
131
|
-
|
|
147
|
+
const { shouldPush } = await inquirer.prompt([
|
|
148
|
+
{
|
|
149
|
+
type: "confirm",
|
|
150
|
+
name: "shouldPush",
|
|
151
|
+
message: "Do you want to push your current settings now?",
|
|
152
|
+
default: true,
|
|
153
|
+
},
|
|
154
|
+
]);
|
|
155
|
+
if (shouldPush) {
|
|
156
|
+
console.log("\nPushing settings...\n");
|
|
157
|
+
await pushCommand({ verbose: false, force: false });
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
console.log("\nRun 'opencodesync push' when you're ready to upload your settings.");
|
|
161
|
+
}
|
|
132
162
|
}
|
|
133
|
-
console.log("
|
|
163
|
+
console.log("\nRun 'opencodesync status' to check sync status.\n");
|
|
134
164
|
console.log("⚠️ IMPORTANT: Remember your passphrase!");
|
|
135
165
|
console.log(" You'll need it to sync on other devices.\n");
|
|
136
166
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|