@askalf/claude-sync 0.0.3 → 0.2.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 +105 -38
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +332 -35
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +31 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +12 -2
- package/dist/config.js.map +1 -1
- package/dist/format.d.ts.map +1 -1
- package/dist/format.js +2 -1
- package/dist/format.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/project.d.ts +39 -8
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +98 -15
- package/dist/project.js.map +1 -1
- package/dist/session.d.ts +17 -5
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +25 -12
- package/dist/session.js.map +1 -1
- package/dist/ssh.d.ts +66 -0
- package/dist/ssh.d.ts.map +1 -0
- package/dist/ssh.js +216 -0
- package/dist/ssh.js.map +1 -0
- package/dist/transport.d.ts +40 -0
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +63 -0
- package/dist/transport.js.map +1 -1
- package/package.json +3 -3
package/dist/cli.js
CHANGED
|
@@ -5,10 +5,12 @@
|
|
|
5
5
|
* Subcommands:
|
|
6
6
|
* init <syncDir> [--name <machine>] scaffold ~/.claude-sync/config.json
|
|
7
7
|
* list list local CC sessions for the cwd
|
|
8
|
+
* register [cwd] register a cwd's project key (no session needed)
|
|
8
9
|
* export [session-id] [-o <file>] pack a session into a .ccsync file
|
|
9
10
|
* import <file> [--cwd <path>] install a .ccsync file locally
|
|
10
11
|
* push [session-id] export + ship to configured syncDir
|
|
11
12
|
* pull import any newer .ccsync files
|
|
13
|
+
* watch [session-id] [--interval <s>] daemon: auto-push changes + auto-pull peers
|
|
12
14
|
* doctor diagnose config + registry health
|
|
13
15
|
*
|
|
14
16
|
* Common flags: --help, --version. No external arg-parser dep — the
|
|
@@ -18,25 +20,34 @@
|
|
|
18
20
|
import { existsSync } from 'node:fs';
|
|
19
21
|
import { resolve } from 'node:path';
|
|
20
22
|
import { VERSION } from './index.js';
|
|
21
|
-
import { loadConfig, saveConfig, configExists, buildDefaultConfig, } from './config.js';
|
|
22
|
-
import { encodeProjectDir, registerProject, loadRegistry, lookupCwd, claudeProjectsRoot, } from './project.js';
|
|
23
|
-
import { listSessions, readSession, writeSession, assignFreshId, } from './session.js';
|
|
23
|
+
import { loadConfig, saveConfig, configExists, buildDefaultConfig, defaultMachineName, resolveTransportConfig, } from './config.js';
|
|
24
|
+
import { encodeProjectDir, registerProject, registerProjectKey, loadRegistry, lookupCwd, claudeProjectsRoot, } from './project.js';
|
|
25
|
+
import { listSessions, listSessionStats, countSessionLines, readSession, writeSession, assignFreshId, } from './session.js';
|
|
24
26
|
import { buildCcsync, readCcsyncFile, writeCcsyncFile, } from './format.js';
|
|
25
|
-
import {
|
|
27
|
+
import { createTransport, } from './transport.js';
|
|
26
28
|
const HELP = `claude-sync ${VERSION}
|
|
27
29
|
|
|
28
30
|
Usage: claude-sync <command> [options]
|
|
29
31
|
|
|
30
32
|
Commands:
|
|
31
33
|
init <syncDir> [--name <machine>]
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
init --ssh <[user@]host:/path> [--port <n>] [--identity <keyfile>] [--name <machine>]
|
|
35
|
+
Scaffold ~/.claude-sync/config.json. The first form syncs through a
|
|
36
|
+
local <syncDir> mirrored across machines (Dropbox, iCloud, Syncthing,
|
|
37
|
+
a USB drive). The --ssh form syncs to a directory on a remote host
|
|
38
|
+
over SSH (a dev box) — handy when you run Claude Code on a server and
|
|
39
|
+
a laptop. --name defaults to your hostname.
|
|
35
40
|
|
|
36
41
|
list
|
|
37
42
|
List Claude Code sessions for the current working directory,
|
|
38
43
|
sorted by recency.
|
|
39
44
|
|
|
45
|
+
register [cwd]
|
|
46
|
+
Register a directory's project key so \`pull\` can deliver peers'
|
|
47
|
+
sessions here — even before this machine has any session of its
|
|
48
|
+
own. Defaults to the current directory. Run this once on a fresh
|
|
49
|
+
clone, then \`pull\`.
|
|
50
|
+
|
|
40
51
|
export [session-id] [-o <file>]
|
|
41
52
|
Pack a session into a portable .ccsync file. Default session-id
|
|
42
53
|
is the most recent one for the current cwd. Default output path
|
|
@@ -55,6 +66,14 @@ Commands:
|
|
|
55
66
|
each into the matching local cwd. Skips sessions that already
|
|
56
67
|
exist locally with the same line count (idempotent re-runs).
|
|
57
68
|
|
|
69
|
+
watch [session-id] [--interval <seconds>] [--all] [--once]
|
|
70
|
+
Run a sync daemon for the current directory: every <interval>
|
|
71
|
+
seconds (default 10), push the active session whenever it grows
|
|
72
|
+
and pull any newer sessions from peers. Watches the most-recent
|
|
73
|
+
session by default; pass a session-id to pin one, or --all to push
|
|
74
|
+
every changed session in this project. --once runs a single
|
|
75
|
+
push+pull cycle and exits. Ctrl-C to stop.
|
|
76
|
+
|
|
58
77
|
doctor
|
|
59
78
|
Print a health report: config, machine name, registered projects,
|
|
60
79
|
Claude Code projects dir, and any obvious mismatches.
|
|
@@ -76,10 +95,12 @@ async function main(argv) {
|
|
|
76
95
|
switch (cmd) {
|
|
77
96
|
case 'init': return cmdInit(rest);
|
|
78
97
|
case 'list': return cmdList(rest);
|
|
98
|
+
case 'register': return cmdRegister(rest);
|
|
79
99
|
case 'export': return cmdExport(rest);
|
|
80
100
|
case 'import': return cmdImport(rest);
|
|
81
101
|
case 'push': return cmdPush(rest);
|
|
82
102
|
case 'pull': return cmdPull(rest);
|
|
103
|
+
case 'watch': return cmdWatch(rest);
|
|
83
104
|
case 'doctor': return cmdDoctor(rest);
|
|
84
105
|
default:
|
|
85
106
|
process.stderr.write(`Unknown command: ${cmd}\nRun \`claude-sync --help\` for usage.\n`);
|
|
@@ -88,17 +109,88 @@ async function main(argv) {
|
|
|
88
109
|
}
|
|
89
110
|
// ── init ───────────────────────────────────────────────────────────
|
|
90
111
|
function cmdInit(args) {
|
|
112
|
+
const nameIdx = args.indexOf('--name');
|
|
113
|
+
const machineName = nameIdx >= 0 ? args[nameIdx + 1] : undefined;
|
|
114
|
+
if (nameIdx >= 0 && (!machineName || machineName.startsWith('--'))) {
|
|
115
|
+
process.stderr.write('Error: --name requires a value.\n');
|
|
116
|
+
return 1;
|
|
117
|
+
}
|
|
118
|
+
// Validate the invocation BEFORE checking for an existing config, so a
|
|
119
|
+
// malformed `init` always reports the usage error, never "config exists".
|
|
120
|
+
const exists = () => {
|
|
121
|
+
if (configExists()) {
|
|
122
|
+
process.stderr.write('Config already exists at ~/.claude-sync/config.json. Edit it manually to change settings.\n');
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
return false;
|
|
126
|
+
};
|
|
127
|
+
// ── SSH transport ──
|
|
128
|
+
const sshIdx = args.indexOf('--ssh');
|
|
129
|
+
if (sshIdx >= 0) {
|
|
130
|
+
const target = args[sshIdx + 1];
|
|
131
|
+
if (!target || target.startsWith('--')) {
|
|
132
|
+
process.stderr.write('Error: --ssh requires a target: <[user@]host:/path>\n');
|
|
133
|
+
return 1;
|
|
134
|
+
}
|
|
135
|
+
const m = /^(?:([^@]+)@)?([^@:]+):(.+)$/.exec(target);
|
|
136
|
+
const user = m?.[1];
|
|
137
|
+
const host = m?.[2];
|
|
138
|
+
const dir = m?.[3];
|
|
139
|
+
if (!m || !host || !dir) {
|
|
140
|
+
process.stderr.write('Error: --ssh target must look like [user@]host:/path (IPv6 literals not supported).\n');
|
|
141
|
+
return 1;
|
|
142
|
+
}
|
|
143
|
+
let port;
|
|
144
|
+
const portIdx = args.indexOf('--port');
|
|
145
|
+
if (portIdx >= 0) {
|
|
146
|
+
const pv = Number(args[portIdx + 1]);
|
|
147
|
+
if (!Number.isInteger(pv) || pv < 1 || pv > 65535) {
|
|
148
|
+
process.stderr.write('Error: --port must be an integer 1–65535.\n');
|
|
149
|
+
return 1;
|
|
150
|
+
}
|
|
151
|
+
port = pv;
|
|
152
|
+
}
|
|
153
|
+
const idIdx = args.indexOf('--identity');
|
|
154
|
+
const identityFile = idIdx >= 0 ? args[idIdx + 1] : undefined;
|
|
155
|
+
if (idIdx >= 0 && (!identityFile || identityFile.startsWith('--'))) {
|
|
156
|
+
process.stderr.write('Error: --identity requires a path to a private key.\n');
|
|
157
|
+
return 1;
|
|
158
|
+
}
|
|
159
|
+
if (exists())
|
|
160
|
+
return 1;
|
|
161
|
+
const transport = {
|
|
162
|
+
type: 'ssh',
|
|
163
|
+
host,
|
|
164
|
+
dir,
|
|
165
|
+
...(user ? { user } : {}),
|
|
166
|
+
...(port !== undefined ? { port } : {}),
|
|
167
|
+
...(identityFile ? { identityFile } : {}),
|
|
168
|
+
};
|
|
169
|
+
const cfg = {
|
|
170
|
+
_schemaVersion: 1,
|
|
171
|
+
machineName: machineName ?? defaultMachineName(),
|
|
172
|
+
transport,
|
|
173
|
+
};
|
|
174
|
+
saveConfig(cfg);
|
|
175
|
+
process.stdout.write(`Created ~/.claude-sync/config.json\n` +
|
|
176
|
+
` transport: ssh ${user ? `${user}@` : ''}${host}${port ? `:${port}` : ''} ${dir}\n` +
|
|
177
|
+
` machineName: ${cfg.machineName}\n\n` +
|
|
178
|
+
`Next steps:\n` +
|
|
179
|
+
` 1. Check connectivity: \`claude-sync doctor\`.\n` +
|
|
180
|
+
` 2. Run \`claude-sync push\` (or \`watch\`) to ship a session to the remote box.\n` +
|
|
181
|
+
` 3. On the remote box: \`claude-sync init <that-path>\` (filesystem, different --name), then \`pull\`.\n`);
|
|
182
|
+
return 0;
|
|
183
|
+
}
|
|
184
|
+
// ── Filesystem transport ──
|
|
91
185
|
const syncDir = args[0];
|
|
92
186
|
if (!syncDir || syncDir.startsWith('--')) {
|
|
93
|
-
process.stderr.write('Error: <syncDir> is required.\
|
|
187
|
+
process.stderr.write('Error: <syncDir> is required.\n' +
|
|
188
|
+
'Usage: claude-sync init <syncDir> [--name <machine>]\n' +
|
|
189
|
+
' or: claude-sync init --ssh <[user@]host:/path> [--port <n>] [--identity <keyfile>] [--name <machine>]\n');
|
|
94
190
|
return 1;
|
|
95
191
|
}
|
|
96
|
-
|
|
97
|
-
const machineName = nameIdx >= 0 ? args[nameIdx + 1] : undefined;
|
|
98
|
-
if (configExists()) {
|
|
99
|
-
process.stderr.write('Config already exists at ~/.claude-sync/config.json. Edit it manually to change settings.\n');
|
|
192
|
+
if (exists())
|
|
100
193
|
return 1;
|
|
101
|
-
}
|
|
102
194
|
const cfg = buildDefaultConfig(resolve(syncDir), machineName);
|
|
103
195
|
saveConfig(cfg);
|
|
104
196
|
process.stdout.write(`Created ~/.claude-sync/config.json\n` +
|
|
@@ -126,6 +218,26 @@ function cmdList(_args) {
|
|
|
126
218
|
}
|
|
127
219
|
return 0;
|
|
128
220
|
}
|
|
221
|
+
// ── register ───────────────────────────────────────────────────────
|
|
222
|
+
function cmdRegister(args) {
|
|
223
|
+
const arg = args[0];
|
|
224
|
+
const cwd = arg && !arg.startsWith('-') ? resolve(arg) : process.cwd();
|
|
225
|
+
if (!existsSync(cwd)) {
|
|
226
|
+
process.stderr.write(`Error: path does not exist: ${cwd}\n`);
|
|
227
|
+
return 1;
|
|
228
|
+
}
|
|
229
|
+
const { key } = registerProject(cwd);
|
|
230
|
+
const sessions = listSessions(cwd);
|
|
231
|
+
process.stdout.write(`Registered ${cwd}\n` +
|
|
232
|
+
` project key: ${key}\n` +
|
|
233
|
+
` local sessions: ${sessions.length}\n`);
|
|
234
|
+
if (sessions.length === 0) {
|
|
235
|
+
process.stdout.write(`\n No sessions here yet — that's fine. \`pull\` can now deliver peers'\n` +
|
|
236
|
+
` work to this directory. \`push\`/\`export\` start working once you've\n` +
|
|
237
|
+
` run a Claude Code session in this directory.\n`);
|
|
238
|
+
}
|
|
239
|
+
return 0;
|
|
240
|
+
}
|
|
129
241
|
// ── export ─────────────────────────────────────────────────────────
|
|
130
242
|
function cmdExport(args) {
|
|
131
243
|
const cwd = process.cwd();
|
|
@@ -182,22 +294,15 @@ function cmdPush(args) {
|
|
|
182
294
|
const cfg = mustLoadConfig();
|
|
183
295
|
if (!cfg)
|
|
184
296
|
return 1;
|
|
297
|
+
const transport = mustResolveTransport(cfg);
|
|
298
|
+
if (!transport)
|
|
299
|
+
return 1;
|
|
185
300
|
const cwd = process.cwd();
|
|
186
301
|
const sessionId = args[0] && !args[0].startsWith('-') ? args[0] : undefined;
|
|
187
302
|
const session = pickSession(cwd, sessionId);
|
|
188
303
|
if (!session)
|
|
189
304
|
return 1;
|
|
190
|
-
const
|
|
191
|
-
const ccsync = buildCcsync({
|
|
192
|
-
sessionId: session.id,
|
|
193
|
-
projectKey: key,
|
|
194
|
-
originalCwd: cwd,
|
|
195
|
-
machineName: cfg.machineName,
|
|
196
|
-
exportedAt: Date.now(),
|
|
197
|
-
lineCount: session.lineCount,
|
|
198
|
-
jsonl: readSession(session.path),
|
|
199
|
-
});
|
|
200
|
-
const written = pushToTransport(cfg.syncDir, ccsync);
|
|
305
|
+
const written = exportToTransport(transport, cwd, cfg.machineName, session);
|
|
201
306
|
process.stdout.write(`Pushed ${session.id} → ${written}\n`);
|
|
202
307
|
return 0;
|
|
203
308
|
}
|
|
@@ -206,31 +311,49 @@ function cmdPull(_args) {
|
|
|
206
311
|
const cfg = mustLoadConfig();
|
|
207
312
|
if (!cfg)
|
|
208
313
|
return 1;
|
|
209
|
-
const
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
314
|
+
const transport = mustResolveTransport(cfg);
|
|
315
|
+
if (!transport)
|
|
316
|
+
return 1;
|
|
317
|
+
if (transport.listProjectKeys().length === 0) {
|
|
318
|
+
process.stdout.write(`Nothing to pull — ${transport.describe()} is empty.\n`);
|
|
213
319
|
return 0;
|
|
214
320
|
}
|
|
321
|
+
const { imported, skipped } = runPull(transport, cfg.machineName, {
|
|
322
|
+
onSkip: (msg) => process.stdout.write(` ${msg}\n`),
|
|
323
|
+
});
|
|
324
|
+
process.stdout.write(`\nDone — imported ${imported} session(s), skipped ${skipped}.\n`);
|
|
325
|
+
return 0;
|
|
326
|
+
}
|
|
327
|
+
/** Core of `pull`, shared with `watch`. Scans the transport across every
|
|
328
|
+
* project and imports any session newer (more lines) than the local
|
|
329
|
+
* copy. `onSkip` is called with a human message for each transport
|
|
330
|
+
* project key that has no resolvable local cwd — `pull` prints them;
|
|
331
|
+
* `watch` omits the callback to stay quiet. Genuine imports are always
|
|
332
|
+
* announced by `installCcsync` itself. Idempotent: a session already at
|
|
333
|
+
* or beyond the transport's line count is skipped, so repeated calls
|
|
334
|
+
* (every watch tick) do nothing once converged. */
|
|
335
|
+
function runPull(transport, machineName, opts = {}) {
|
|
336
|
+
const reg = loadRegistry();
|
|
337
|
+
const projectKeys = transport.listProjectKeys();
|
|
215
338
|
let imported = 0;
|
|
216
339
|
let skipped = 0;
|
|
217
340
|
for (const encodedKey of projectKeys) {
|
|
218
341
|
// We have the encoded form; find the matching raw key in the registry.
|
|
219
342
|
const rawKey = Object.keys(reg.projects).find((k) => encodeProjectDir(k) === encodedKey);
|
|
220
343
|
if (!rawKey) {
|
|
221
|
-
|
|
344
|
+
opts.onSkip?.(`skip ${encodedKey} (no local project registered for this key)`);
|
|
222
345
|
skipped++;
|
|
223
346
|
continue;
|
|
224
347
|
}
|
|
225
348
|
const cwd = lookupCwd(rawKey, reg);
|
|
226
349
|
if (!cwd) {
|
|
227
|
-
|
|
350
|
+
opts.onSkip?.(`skip ${encodedKey} (registered cwds no longer exist on disk)`);
|
|
228
351
|
skipped++;
|
|
229
352
|
continue;
|
|
230
353
|
}
|
|
231
354
|
// Per-session: take the freshest entry that's newer than what we
|
|
232
355
|
// already have locally.
|
|
233
|
-
const entries =
|
|
356
|
+
const entries = transport.listEntries(rawKey, machineName);
|
|
234
357
|
const localSessions = new Map(listSessions(cwd).map((s) => [s.id, s]));
|
|
235
358
|
for (const entry of entries) {
|
|
236
359
|
const local = localSessions.get(entry.file.sessionId);
|
|
@@ -244,9 +367,117 @@ function cmdPull(_args) {
|
|
|
244
367
|
imported++;
|
|
245
368
|
}
|
|
246
369
|
}
|
|
247
|
-
|
|
370
|
+
return { imported, skipped };
|
|
371
|
+
}
|
|
372
|
+
// ── watch ──────────────────────────────────────────────────────────
|
|
373
|
+
async function cmdWatch(args) {
|
|
374
|
+
const cfg = mustLoadConfig();
|
|
375
|
+
if (!cfg)
|
|
376
|
+
return 1;
|
|
377
|
+
const transport = mustResolveTransport(cfg);
|
|
378
|
+
if (!transport)
|
|
379
|
+
return 1;
|
|
380
|
+
const once = args.includes('--once');
|
|
381
|
+
const pushAll = args.includes('--all');
|
|
382
|
+
let intervalSec = 10;
|
|
383
|
+
const intervalIdx = args.indexOf('--interval');
|
|
384
|
+
if (intervalIdx >= 0) {
|
|
385
|
+
const v = Number(args[intervalIdx + 1]);
|
|
386
|
+
if (!Number.isFinite(v) || v < 2) {
|
|
387
|
+
process.stderr.write('Error: --interval requires a number of seconds >= 2.\n');
|
|
388
|
+
return 1;
|
|
389
|
+
}
|
|
390
|
+
intervalSec = v;
|
|
391
|
+
}
|
|
392
|
+
const first = args[0];
|
|
393
|
+
const sessionId = first && !first.startsWith('-') ? first : undefined;
|
|
394
|
+
const cwd = process.cwd();
|
|
395
|
+
// Register up front so a fresh clone with zero sessions can still
|
|
396
|
+
// RECEIVE peers' work via the pull half of the loop while we watch.
|
|
397
|
+
const { key } = registerProject(cwd);
|
|
398
|
+
if (!once) {
|
|
399
|
+
const pushDesc = sessionId
|
|
400
|
+
? `session ${sessionId}`
|
|
401
|
+
: pushAll ? 'every changed session' : 'most-recent changed session';
|
|
402
|
+
process.stdout.write(`claude-sync watch — ${cfg.machineName}\n` +
|
|
403
|
+
` project: ${key}\n` +
|
|
404
|
+
` cwd: ${cwd}\n` +
|
|
405
|
+
` transport: ${transport.describe()}\n` +
|
|
406
|
+
` every ${intervalSec}s · push ${pushDesc} · pull all projects\n` +
|
|
407
|
+
` Ctrl-C to stop.\n\n`);
|
|
408
|
+
}
|
|
409
|
+
// sessionId -> mtimeMs at last push. Seeds empty, so the first tick
|
|
410
|
+
// pushes the current state once, then only on subsequent growth.
|
|
411
|
+
const lastPushed = new Map();
|
|
412
|
+
let stopping = false;
|
|
413
|
+
const onSignal = () => { stopping = true; };
|
|
414
|
+
process.on('SIGINT', onSignal);
|
|
415
|
+
process.on('SIGTERM', onSignal);
|
|
416
|
+
try {
|
|
417
|
+
do {
|
|
418
|
+
try {
|
|
419
|
+
watchPushTick(transport, cwd, cfg.machineName, { sessionId, pushAll, lastPushed });
|
|
420
|
+
}
|
|
421
|
+
catch (err) {
|
|
422
|
+
process.stderr.write(` ! push error: ${err instanceof Error ? err.message : err}\n`);
|
|
423
|
+
}
|
|
424
|
+
try {
|
|
425
|
+
runPull(transport, cfg.machineName);
|
|
426
|
+
}
|
|
427
|
+
catch (err) {
|
|
428
|
+
process.stderr.write(` ! pull error: ${err instanceof Error ? err.message : err}\n`);
|
|
429
|
+
}
|
|
430
|
+
if (once || stopping)
|
|
431
|
+
break;
|
|
432
|
+
await delay(intervalSec * 1000, () => stopping);
|
|
433
|
+
} while (!stopping);
|
|
434
|
+
}
|
|
435
|
+
finally {
|
|
436
|
+
process.off('SIGINT', onSignal);
|
|
437
|
+
process.off('SIGTERM', onSignal);
|
|
438
|
+
}
|
|
439
|
+
if (!once)
|
|
440
|
+
process.stdout.write(`\nStopped.\n`);
|
|
248
441
|
return 0;
|
|
249
442
|
}
|
|
443
|
+
/** One push half-cycle for watch: find sessions whose mtime grew since we
|
|
444
|
+
* last pushed them and ship each. Uses the stat-only listing (no line
|
|
445
|
+
* reads) for change detection, only counting lines for the few that
|
|
446
|
+
* actually changed. */
|
|
447
|
+
function watchPushTick(transport, cwd, machineName, state) {
|
|
448
|
+
const stats = listSessionStats(cwd);
|
|
449
|
+
let candidates = stats;
|
|
450
|
+
if (state.sessionId) {
|
|
451
|
+
candidates = stats.filter((s) => s.id === state.sessionId);
|
|
452
|
+
}
|
|
453
|
+
else if (!state.pushAll) {
|
|
454
|
+
// Default: just the active (most-recent) session. `stats` is mtime-desc.
|
|
455
|
+
candidates = stats.slice(0, 1);
|
|
456
|
+
}
|
|
457
|
+
for (const s of candidates) {
|
|
458
|
+
const prev = state.lastPushed.get(s.id);
|
|
459
|
+
if (prev !== undefined && prev >= s.modifiedAt)
|
|
460
|
+
continue; // unchanged since last push
|
|
461
|
+
const lineCount = countSessionLines(s.path);
|
|
462
|
+
exportToTransport(transport, cwd, machineName, { id: s.id, path: s.path, lineCount });
|
|
463
|
+
state.lastPushed.set(s.id, s.modifiedAt);
|
|
464
|
+
process.stdout.write(` ↑ pushed ${s.id} (${lineCount} lines)\n`);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
/** Resolve after `ms`, or early as soon as `shouldStop()` flips true, so
|
|
468
|
+
* Ctrl-C interrupts the inter-tick sleep without waiting out the
|
|
469
|
+
* interval. Polls a coarse 200ms so a `watch` process doesn't busy-spin. */
|
|
470
|
+
function delay(ms, shouldStop) {
|
|
471
|
+
return new Promise((resolve) => {
|
|
472
|
+
const start = Date.now();
|
|
473
|
+
const id = setInterval(() => {
|
|
474
|
+
if (shouldStop() || Date.now() - start >= ms) {
|
|
475
|
+
clearInterval(id);
|
|
476
|
+
resolve();
|
|
477
|
+
}
|
|
478
|
+
}, 200);
|
|
479
|
+
});
|
|
480
|
+
}
|
|
250
481
|
// ── doctor ─────────────────────────────────────────────────────────
|
|
251
482
|
function cmdDoctor(_args) {
|
|
252
483
|
const ok = (m) => { process.stdout.write(` ✓ ${m}\n`); };
|
|
@@ -254,9 +485,42 @@ function cmdDoctor(_args) {
|
|
|
254
485
|
process.stdout.write(`claude-sync ${VERSION}\n\n`);
|
|
255
486
|
if (configExists()) {
|
|
256
487
|
const cfg = loadConfig();
|
|
257
|
-
ok(`config:
|
|
258
|
-
|
|
259
|
-
|
|
488
|
+
ok(`config: machineName ${cfg.machineName}`);
|
|
489
|
+
let transport = null;
|
|
490
|
+
try {
|
|
491
|
+
transport = createTransport(resolveTransportConfig(cfg));
|
|
492
|
+
}
|
|
493
|
+
catch (err) {
|
|
494
|
+
warn(`transport: ${err instanceof Error ? err.message : err}`);
|
|
495
|
+
}
|
|
496
|
+
if (transport) {
|
|
497
|
+
const h = transport.health();
|
|
498
|
+
if (h.ok)
|
|
499
|
+
ok(`transport: ${h.detail}`);
|
|
500
|
+
else
|
|
501
|
+
warn(`transport: ${h.detail}`);
|
|
502
|
+
// Duplicate-machineName footgun: pull self-filters files whose
|
|
503
|
+
// machineName matches ours, so if every file in the transport
|
|
504
|
+
// carries this machine's name (two machines sharing a hostname),
|
|
505
|
+
// pull silently imports nothing. Only scan when the transport is
|
|
506
|
+
// reachable (avoids a confusing second error on an unreachable host).
|
|
507
|
+
if (h.ok) {
|
|
508
|
+
const machines = transport.listMachines();
|
|
509
|
+
const total = [...machines.values()].reduce((acc, n) => acc + n, 0);
|
|
510
|
+
if (total > 0) {
|
|
511
|
+
const peers = [...machines.keys()].filter((m) => m !== cfg.machineName);
|
|
512
|
+
if (peers.length === 0) {
|
|
513
|
+
warn(`all ${total} file(s) in the transport use machineName "${cfg.machineName}" — ` +
|
|
514
|
+
`the same as this machine. \`pull\` self-filters these, so it imports nothing. ` +
|
|
515
|
+
`Give each machine a distinct name: re-run \`init --name <name>\` on a fresh ` +
|
|
516
|
+
`machine, or edit machineName in ~/.claude-sync/config.json.`);
|
|
517
|
+
}
|
|
518
|
+
else {
|
|
519
|
+
ok(`transport peers: ${peers.sort().join(', ')} (${total} file(s) total)`);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
}
|
|
260
524
|
}
|
|
261
525
|
else {
|
|
262
526
|
warn(`no config (run \`claude-sync init <syncDir>\`)`);
|
|
@@ -286,6 +550,34 @@ function mustLoadConfig() {
|
|
|
286
550
|
}
|
|
287
551
|
return loadConfig();
|
|
288
552
|
}
|
|
553
|
+
/** Resolve the configured transport (fs or ssh), printing a helpful error
|
|
554
|
+
* and returning null if the config has none. */
|
|
555
|
+
function mustResolveTransport(cfg) {
|
|
556
|
+
try {
|
|
557
|
+
return createTransport(resolveTransportConfig(cfg));
|
|
558
|
+
}
|
|
559
|
+
catch (err) {
|
|
560
|
+
process.stderr.write(`${err instanceof Error ? err.message : err}\n`);
|
|
561
|
+
return null;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
/** Build a `.ccsync` for `session` (in `cwd`) and write it to the
|
|
565
|
+
* transport, returning the written location. Registers the cwd's project
|
|
566
|
+
* key as a side effect, so pushing from a never-before-seen directory
|
|
567
|
+
* self-registers. Shared by `push` and `watch`. */
|
|
568
|
+
function exportToTransport(transport, cwd, machineName, session) {
|
|
569
|
+
const { key } = registerProject(cwd);
|
|
570
|
+
const ccsync = buildCcsync({
|
|
571
|
+
sessionId: session.id,
|
|
572
|
+
projectKey: key,
|
|
573
|
+
originalCwd: cwd,
|
|
574
|
+
machineName,
|
|
575
|
+
exportedAt: Date.now(),
|
|
576
|
+
lineCount: session.lineCount,
|
|
577
|
+
jsonl: readSession(session.path),
|
|
578
|
+
});
|
|
579
|
+
return transport.push(ccsync);
|
|
580
|
+
}
|
|
289
581
|
function pickSession(cwd, requestedId) {
|
|
290
582
|
const sessions = listSessions(cwd);
|
|
291
583
|
if (sessions.length === 0) {
|
|
@@ -321,6 +613,11 @@ function installCcsync(ccsync, explicitCwd, overwrite) {
|
|
|
321
613
|
}
|
|
322
614
|
try {
|
|
323
615
|
const writtenTo = writeSession(targetCwd, sessionId, ccsync.jsonl, { overwrite });
|
|
616
|
+
// Bind the peer's project key to this local cwd so a later `pull`
|
|
617
|
+
// resolves it without a manual --cwd. This closes the first-contact
|
|
618
|
+
// gap: `import <file> --cwd <path>` now leaves the project registered.
|
|
619
|
+
// Idempotent — `pull` re-imports already register via this path too.
|
|
620
|
+
registerProjectKey(ccsync.projectKey, targetCwd);
|
|
324
621
|
process.stdout.write(`Imported ${sessionId} from ${ccsync.machineName} → ${writtenTo}\n` +
|
|
325
622
|
` (${ccsync.lineCount} lines, project: ${ccsync.projectKey})\n`);
|
|
326
623
|
return 0;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -19,16 +19,43 @@
|
|
|
19
19
|
* overwriting each other (machineName disambiguates)
|
|
20
20
|
* - `pull` can list project subdirs and import the freshest file
|
|
21
21
|
*/
|
|
22
|
+
/** Where `.ccsync` files are shuttled. Two backends:
|
|
23
|
+
* - `fs` — a local directory (Dropbox / iCloud / Syncthing / USB).
|
|
24
|
+
* - `ssh` — a directory on a remote host reached over SSH (a dev box).
|
|
25
|
+
* The optional `ssh` fields default sensibly (current user, port 22,
|
|
26
|
+
* ssh's default identity). */
|
|
27
|
+
export type TransportConfig = {
|
|
28
|
+
type: 'fs';
|
|
29
|
+
dir: string;
|
|
30
|
+
} | {
|
|
31
|
+
type: 'ssh';
|
|
32
|
+
/** Remote hostname or IP. */
|
|
33
|
+
host: string;
|
|
34
|
+
/** Absolute (or ~-relative) directory on the remote host. */
|
|
35
|
+
dir: string;
|
|
36
|
+
/** SSH user. Defaults to ssh's own default (current user / ssh_config). */
|
|
37
|
+
user?: string;
|
|
38
|
+
/** SSH port. Defaults to 22. */
|
|
39
|
+
port?: number;
|
|
40
|
+
/** Path to a private key (`ssh -i`). Defaults to ssh's default keys. */
|
|
41
|
+
identityFile?: string;
|
|
42
|
+
};
|
|
22
43
|
export interface Config {
|
|
23
44
|
_schemaVersion: 1;
|
|
24
|
-
/** Path to the sync directory. Anything that ends up here gets
|
|
25
|
-
* picked up by `claude-sync pull` on the other side. The user
|
|
26
|
-
* points this at a Dropbox / iCloud / Syncthing-mirrored path. */
|
|
27
|
-
syncDir: string;
|
|
28
45
|
/** Machine name used in .ccsync metadata. Defaults to `os.hostname()`
|
|
29
46
|
* at init time; can be changed manually. */
|
|
30
47
|
machineName: string;
|
|
48
|
+
/** Legacy filesystem sync directory. Still honored for back-compat —
|
|
49
|
+
* a config with only `syncDir` is treated as `transport: {type:'fs'}`.
|
|
50
|
+
* New configs written by `init` use `transport` instead. */
|
|
51
|
+
syncDir?: string;
|
|
52
|
+
/** Explicit transport backend. When present, takes precedence over the
|
|
53
|
+
* legacy `syncDir`. */
|
|
54
|
+
transport?: TransportConfig;
|
|
31
55
|
}
|
|
56
|
+
/** Resolve the effective transport from a (possibly legacy) config.
|
|
57
|
+
* Precedence: explicit `transport` → legacy `syncDir` (as `fs`) → error. */
|
|
58
|
+
export declare function resolveTransportConfig(cfg: Config): TransportConfig;
|
|
32
59
|
export declare function configExists(): boolean;
|
|
33
60
|
export declare function loadConfig(): Config;
|
|
34
61
|
export declare function saveConfig(cfg: Config): void;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH,MAAM,WAAW,MAAM;IACrB,cAAc,EAAE,CAAC,CAAC;IAClB;;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH;;;;+BAI+B;AAC/B,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC3B;IACE,IAAI,EAAE,KAAK,CAAC;IACZ,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,GAAG,EAAE,MAAM,CAAC;IACZ,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEN,MAAM,WAAW,MAAM;IACrB,cAAc,EAAE,CAAC,CAAC;IAClB;iDAC6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB;;iEAE6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;4BACwB;IACxB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAED;6EAC6E;AAC7E,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAOnE;AAID,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAYnC;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAI5C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAI3C;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAMhF"}
|
package/dist/config.js
CHANGED
|
@@ -22,7 +22,17 @@
|
|
|
22
22
|
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
23
23
|
import { dirname, join } from 'node:path';
|
|
24
24
|
import { hostname } from 'node:os';
|
|
25
|
-
import { syncRoot } from './project.js';
|
|
25
|
+
import { syncRoot, stripBom } from './project.js';
|
|
26
|
+
/** Resolve the effective transport from a (possibly legacy) config.
|
|
27
|
+
* Precedence: explicit `transport` → legacy `syncDir` (as `fs`) → error. */
|
|
28
|
+
export function resolveTransportConfig(cfg) {
|
|
29
|
+
if (cfg.transport)
|
|
30
|
+
return cfg.transport;
|
|
31
|
+
if (cfg.syncDir)
|
|
32
|
+
return { type: 'fs', dir: cfg.syncDir };
|
|
33
|
+
throw new Error('Config has no transport configured. Re-run `claude-sync init <syncDir>` ' +
|
|
34
|
+
'or `claude-sync init --ssh <[user@]host:/path>`.');
|
|
35
|
+
}
|
|
26
36
|
const CONFIG_PATH = () => join(syncRoot(), 'config.json');
|
|
27
37
|
export function configExists() {
|
|
28
38
|
return existsSync(CONFIG_PATH());
|
|
@@ -32,7 +42,7 @@ export function loadConfig() {
|
|
|
32
42
|
if (!existsSync(path)) {
|
|
33
43
|
throw new Error(`No config found at ${path}. Run \`claude-sync init <syncDir>\` first.`);
|
|
34
44
|
}
|
|
35
|
-
const parsed = JSON.parse(readFileSync(path, 'utf-8'));
|
|
45
|
+
const parsed = JSON.parse(stripBom(readFileSync(path, 'utf-8')));
|
|
36
46
|
if (parsed._schemaVersion !== 1) {
|
|
37
47
|
throw new Error(`Unsupported config schema version: ${parsed._schemaVersion}`);
|
|
38
48
|
}
|