@askalf/claude-sync 0.1.0 → 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 CHANGED
@@ -22,7 +22,7 @@ Claude Code stores sessions locally at `~/.claude/projects/<encoded-cwd>/<sessio
22
22
  `claude-sync` solves both:
23
23
 
24
24
  - **Canonical project key** = `git:<host>/<owner>/<repo>`, derived from the git remote. Same logical repo → same key, regardless of where it's checked out or which protocol you cloned with — SSH and HTTPS remotes normalize to the same key. (Falls back to `name:<basename>` when there's no git remote.)
25
- - **You choose the cadence.** `push` from machine A and `pull` on machine B by hand, or run `claude-sync watch` to push-on-change and pull-on-interval automatically. The transport is a directory you nominate (Dropbox / iCloud / Syncthing / a USB stick); each machine writes its own file under its own machine name, so two machines pushing the same session don't collide.
25
+ - **You choose the cadence.** `push` from machine A and `pull` on machine B by hand, or run `claude-sync watch` to push-on-change and pull-on-interval automatically. The transport is either a local directory you nominate (Dropbox / iCloud / Syncthing / a USB stick) **or a directory on a remote host over SSH** (a dev box). Each machine writes its own file under its own machine name, so two machines pushing the same session don't collide.
26
26
 
27
27
  ## Use it
28
28
 
@@ -87,6 +87,32 @@ It's still poll-based, not real-time co-editing: don't run the *same* session
87
87
  live on two machines at once (see [Concurrency](#concurrency)). Watch is for
88
88
  "pick up where the other machine left off without thinking about it."
89
89
 
90
+ ### Sync over SSH (no Dropbox needed)
91
+
92
+ If you run Claude Code on a **dev server** and on a **laptop**, point the
93
+ transport straight at a directory on the server — no third-party sync folder in
94
+ the middle:
95
+
96
+ ```bash
97
+ # On the laptop: the syncDir lives on the remote box, reached over SSH.
98
+ claude-sync init --ssh me@devbox:/home/me/claude-sync --name laptop
99
+ claude-sync doctor # live connectivity + remote-dir check
100
+
101
+ # On the server: a plain filesystem transport pointed at the same dir.
102
+ claude-sync init /home/me/claude-sync --name devbox
103
+ ```
104
+
105
+ Now `push` / `pull` / `watch` on the laptop shuttle sessions to and from the
106
+ server with no manual `scp`. Options: `--port <n>`, `--identity <keyfile>`.
107
+ It uses your system `ssh`, honors your `~/.ssh/config`, runs in `BatchMode`
108
+ (so it fails fast instead of prompting), and multiplexes connections on
109
+ macOS/Linux so a `pull`'s round-trips share one SSH session.
110
+
111
+ > The remote layout is identical to the filesystem transport, so the server's
112
+ > `fs` transport and the laptop's `ssh` transport — both pointed at
113
+ > `/home/me/claude-sync` — interoperate. The remote host needs a POSIX shell
114
+ > with `find`/`tar` (any Linux box).
115
+
90
116
  ### Starting on a fresh clone
91
117
 
92
118
  `pull` can only deliver a session to a directory it knows about. On a machine
@@ -133,6 +159,7 @@ So: use `watch` to hand a project *back and forth* between machines hands-free;
133
159
 
134
160
  ```text
135
161
  claude-sync init <syncDir> [--name <machine>]
162
+ claude-sync init --ssh <[user@]host:/path> [--port <n>] [--identity <keyfile>] [--name <machine>]
136
163
  claude-sync list
137
164
  claude-sync register [cwd]
138
165
  claude-sync export [session-id] [-o <file>]
@@ -168,7 +195,7 @@ Schema-versioned. Version 1 is the only thing the current release understands; i
168
195
  ## What it isn't
169
196
 
170
197
  - **Not real-time co-editing.** `watch` polls on an interval; it isn't a locking protocol. If both machines drive the *same* session simultaneously, the second to sync overwrites the other's in-progress copy (the loser is kept as `<id>-copy.jsonl`). Use it to hand a project between machines, not to co-edit one session live.
171
- - **Not a relay service.** The current release ships only the filesystem transport point it at any synced folder. SSH / S3 / gist / WebSocket transports would be straightforward additions; not shipped yet.
198
+ - **Not a relay service.** Two transports ship a local synced folder and a remote directory over SSH. There's no hosted relay; S3 / gist / WebSocket transports would be straightforward additions on the `Transport` interface, but aren't shipped yet.
172
199
  - **Not a CC re-implementation.** It just shuffles JSONL. CC's session schema can change without breaking claude-sync — we never parse the events.
173
200
 
174
201
  ## Library API
@@ -180,11 +207,17 @@ import {
180
207
  listSessions, listSessionStats, countSessionLines, readSession, writeSession,
181
208
  buildCcsync, parseCcsync, readCcsyncFile, writeCcsyncFile,
182
209
  projectKey, normalizeGitRemote, registerProject, registerProjectKey, lookupCwd,
183
- pushToTransport, listTransport, listTransportMachines,
210
+ // Transports: the abstraction + both backends.
211
+ createTransport, resolveTransportConfig, FsTransport, SshTransport,
212
+ type Transport, type TransportConfig,
184
213
  } from '@askalf/claude-sync';
185
214
  ```
186
215
 
187
- The `watch` command itself is built entirely on these exports — `listSessionStats` for cheap change detection, `pushToTransport` + `listTransport` for the sync, `registerProject` for first-contact — so a custom daemon or transport has everything it needs.
216
+ Everything is built on these exports — `listSessionStats` for cheap change
217
+ detection, the `Transport` interface (`push` / `listEntries` / …) for the sync,
218
+ `registerProject` for first-contact. A custom transport is one class
219
+ implementing `Transport`; `SshTransport` takes an injectable `SshExecutor`, so
220
+ you can wrap it or swap the wire entirely.
188
221
 
189
222
  See `src/index.ts` for the full surface. Zero runtime dependencies.
190
223
 
package/dist/cli.js CHANGED
@@ -20,20 +20,23 @@
20
20
  import { existsSync } from 'node:fs';
21
21
  import { resolve } from 'node:path';
22
22
  import { VERSION } from './index.js';
23
- import { loadConfig, saveConfig, configExists, buildDefaultConfig, } from './config.js';
23
+ import { loadConfig, saveConfig, configExists, buildDefaultConfig, defaultMachineName, resolveTransportConfig, } from './config.js';
24
24
  import { encodeProjectDir, registerProject, registerProjectKey, loadRegistry, lookupCwd, claudeProjectsRoot, } from './project.js';
25
25
  import { listSessions, listSessionStats, countSessionLines, readSession, writeSession, assignFreshId, } from './session.js';
26
26
  import { buildCcsync, readCcsyncFile, writeCcsyncFile, } from './format.js';
27
- import { pushToTransport, listTransport, listTransportMachines, listProjectKeys, } from './transport.js';
27
+ import { createTransport, } from './transport.js';
28
28
  const HELP = `claude-sync ${VERSION}
29
29
 
30
30
  Usage: claude-sync <command> [options]
31
31
 
32
32
  Commands:
33
33
  init <syncDir> [--name <machine>]
34
- Scaffold ~/.claude-sync/config.json. <syncDir> is a directory
35
- that's mirrored across your machines (Dropbox, iCloud, Syncthing,
36
- a USB drive). --name defaults to your hostname.
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.
37
40
 
38
41
  list
39
42
  List Claude Code sessions for the current working directory,
@@ -106,17 +109,88 @@ async function main(argv) {
106
109
  }
107
110
  // ── init ───────────────────────────────────────────────────────────
108
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 ──
109
185
  const syncDir = args[0];
110
186
  if (!syncDir || syncDir.startsWith('--')) {
111
- process.stderr.write('Error: <syncDir> is required.\nUsage: claude-sync init <syncDir> [--name <machine>]\n');
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');
112
190
  return 1;
113
191
  }
114
- const nameIdx = args.indexOf('--name');
115
- const machineName = nameIdx >= 0 ? args[nameIdx + 1] : undefined;
116
- if (configExists()) {
117
- process.stderr.write('Config already exists at ~/.claude-sync/config.json. Edit it manually to change settings.\n');
192
+ if (exists())
118
193
  return 1;
119
- }
120
194
  const cfg = buildDefaultConfig(resolve(syncDir), machineName);
121
195
  saveConfig(cfg);
122
196
  process.stdout.write(`Created ~/.claude-sync/config.json\n` +
@@ -220,12 +294,15 @@ function cmdPush(args) {
220
294
  const cfg = mustLoadConfig();
221
295
  if (!cfg)
222
296
  return 1;
297
+ const transport = mustResolveTransport(cfg);
298
+ if (!transport)
299
+ return 1;
223
300
  const cwd = process.cwd();
224
301
  const sessionId = args[0] && !args[0].startsWith('-') ? args[0] : undefined;
225
302
  const session = pickSession(cwd, sessionId);
226
303
  if (!session)
227
304
  return 1;
228
- const written = exportToTransport(cfg, cwd, session);
305
+ const written = exportToTransport(transport, cwd, cfg.machineName, session);
229
306
  process.stdout.write(`Pushed ${session.id} → ${written}\n`);
230
307
  return 0;
231
308
  }
@@ -234,11 +311,14 @@ function cmdPull(_args) {
234
311
  const cfg = mustLoadConfig();
235
312
  if (!cfg)
236
313
  return 1;
237
- if (listProjectKeys(cfg.syncDir).length === 0) {
238
- process.stdout.write(`Nothing to pull — ${cfg.syncDir} is empty.\n`);
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`);
239
319
  return 0;
240
320
  }
241
- const { imported, skipped } = runPull(cfg, {
321
+ const { imported, skipped } = runPull(transport, cfg.machineName, {
242
322
  onSkip: (msg) => process.stdout.write(` ${msg}\n`),
243
323
  });
244
324
  process.stdout.write(`\nDone — imported ${imported} session(s), skipped ${skipped}.\n`);
@@ -252,9 +332,9 @@ function cmdPull(_args) {
252
332
  * announced by `installCcsync` itself. Idempotent: a session already at
253
333
  * or beyond the transport's line count is skipped, so repeated calls
254
334
  * (every watch tick) do nothing once converged. */
255
- function runPull(cfg, opts = {}) {
335
+ function runPull(transport, machineName, opts = {}) {
256
336
  const reg = loadRegistry();
257
- const projectKeys = listProjectKeys(cfg.syncDir);
337
+ const projectKeys = transport.listProjectKeys();
258
338
  let imported = 0;
259
339
  let skipped = 0;
260
340
  for (const encodedKey of projectKeys) {
@@ -273,7 +353,7 @@ function runPull(cfg, opts = {}) {
273
353
  }
274
354
  // Per-session: take the freshest entry that's newer than what we
275
355
  // already have locally.
276
- const entries = listTransport(cfg.syncDir, rawKey, cfg.machineName);
356
+ const entries = transport.listEntries(rawKey, machineName);
277
357
  const localSessions = new Map(listSessions(cwd).map((s) => [s.id, s]));
278
358
  for (const entry of entries) {
279
359
  const local = localSessions.get(entry.file.sessionId);
@@ -294,6 +374,9 @@ async function cmdWatch(args) {
294
374
  const cfg = mustLoadConfig();
295
375
  if (!cfg)
296
376
  return 1;
377
+ const transport = mustResolveTransport(cfg);
378
+ if (!transport)
379
+ return 1;
297
380
  const once = args.includes('--once');
298
381
  const pushAll = args.includes('--all');
299
382
  let intervalSec = 10;
@@ -317,9 +400,9 @@ async function cmdWatch(args) {
317
400
  ? `session ${sessionId}`
318
401
  : pushAll ? 'every changed session' : 'most-recent changed session';
319
402
  process.stdout.write(`claude-sync watch — ${cfg.machineName}\n` +
320
- ` project: ${key}\n` +
321
- ` cwd: ${cwd}\n` +
322
- ` syncDir: ${cfg.syncDir}\n` +
403
+ ` project: ${key}\n` +
404
+ ` cwd: ${cwd}\n` +
405
+ ` transport: ${transport.describe()}\n` +
323
406
  ` every ${intervalSec}s · push ${pushDesc} · pull all projects\n` +
324
407
  ` Ctrl-C to stop.\n\n`);
325
408
  }
@@ -333,13 +416,13 @@ async function cmdWatch(args) {
333
416
  try {
334
417
  do {
335
418
  try {
336
- watchPushTick(cfg, cwd, { sessionId, pushAll, lastPushed });
419
+ watchPushTick(transport, cwd, cfg.machineName, { sessionId, pushAll, lastPushed });
337
420
  }
338
421
  catch (err) {
339
422
  process.stderr.write(` ! push error: ${err instanceof Error ? err.message : err}\n`);
340
423
  }
341
424
  try {
342
- runPull(cfg);
425
+ runPull(transport, cfg.machineName);
343
426
  }
344
427
  catch (err) {
345
428
  process.stderr.write(` ! pull error: ${err instanceof Error ? err.message : err}\n`);
@@ -361,7 +444,7 @@ async function cmdWatch(args) {
361
444
  * last pushed them and ship each. Uses the stat-only listing (no line
362
445
  * reads) for change detection, only counting lines for the few that
363
446
  * actually changed. */
364
- function watchPushTick(cfg, cwd, state) {
447
+ function watchPushTick(transport, cwd, machineName, state) {
365
448
  const stats = listSessionStats(cwd);
366
449
  let candidates = stats;
367
450
  if (state.sessionId) {
@@ -376,7 +459,7 @@ function watchPushTick(cfg, cwd, state) {
376
459
  if (prev !== undefined && prev >= s.modifiedAt)
377
460
  continue; // unchanged since last push
378
461
  const lineCount = countSessionLines(s.path);
379
- exportToTransport(cfg, cwd, { id: s.id, path: s.path, lineCount });
462
+ exportToTransport(transport, cwd, machineName, { id: s.id, path: s.path, lineCount });
380
463
  state.lastPushed.set(s.id, s.modifiedAt);
381
464
  process.stdout.write(` ↑ pushed ${s.id} (${lineCount} lines)\n`);
382
465
  }
@@ -402,27 +485,39 @@ function cmdDoctor(_args) {
402
485
  process.stdout.write(`claude-sync ${VERSION}\n\n`);
403
486
  if (configExists()) {
404
487
  const cfg = loadConfig();
405
- ok(`config: ${cfg.machineName} ${cfg.syncDir}`);
406
- if (!existsSync(cfg.syncDir)) {
407
- warn(`syncDir does not exist: ${cfg.syncDir}`);
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}`);
408
495
  }
409
- else {
496
+ if (transport) {
497
+ const h = transport.health();
498
+ if (h.ok)
499
+ ok(`transport: ${h.detail}`);
500
+ else
501
+ warn(`transport: ${h.detail}`);
410
502
  // Duplicate-machineName footgun: pull self-filters files whose
411
503
  // machineName matches ours, so if every file in the transport
412
504
  // carries this machine's name (two machines sharing a hostname),
413
- // pull silently imports nothing.
414
- const machines = listTransportMachines(cfg.syncDir);
415
- const total = [...machines.values()].reduce((acc, n) => acc + n, 0);
416
- if (total > 0) {
417
- const peers = [...machines.keys()].filter((m) => m !== cfg.machineName);
418
- if (peers.length === 0) {
419
- warn(`all ${total} file(s) in the transport use machineName "${cfg.machineName}" — ` +
420
- `the same as this machine. \`pull\` self-filters these, so it imports nothing. ` +
421
- `Give each machine a distinct name: re-run \`init --name <name>\` on a fresh ` +
422
- `machine, or edit machineName in ~/.claude-sync/config.json.`);
423
- }
424
- else {
425
- ok(`transport peers: ${peers.sort().join(', ')} (${total} file(s) total)`);
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
+ }
426
521
  }
427
522
  }
428
523
  }
@@ -455,22 +550,33 @@ function mustLoadConfig() {
455
550
  }
456
551
  return loadConfig();
457
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
+ }
458
564
  /** Build a `.ccsync` for `session` (in `cwd`) and write it to the
459
- * configured transport, returning the written path. Registers the cwd's
460
- * project key as a side effect, so pushing from a never-before-seen
461
- * directory self-registers. Shared by `push` and `watch`. */
462
- function exportToTransport(cfg, cwd, session) {
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) {
463
569
  const { key } = registerProject(cwd);
464
570
  const ccsync = buildCcsync({
465
571
  sessionId: session.id,
466
572
  projectKey: key,
467
573
  originalCwd: cwd,
468
- machineName: cfg.machineName,
574
+ machineName,
469
575
  exportedAt: Date.now(),
470
576
  lineCount: session.lineCount,
471
577
  jsonl: readSession(session.path),
472
578
  });
473
- return pushToTransport(cfg.syncDir, ccsync);
579
+ return transport.push(ccsync);
474
580
  }
475
581
  function pickSession(cwd, requestedId) {
476
582
  const sessions = listSessions(cwd);
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":";AACA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EACL,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAC5E,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,YAAY,EAAE,SAAS,EAC9E,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,WAAW,EAAE,YAAY,EAC5E,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,WAAW,EAAE,cAAc,EAAE,eAAe,GAC7C,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,MAAM,IAAI,GAAG,eAAe,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwDlC,CAAC;AAEF,KAAK,UAAU,IAAI,CAAC,IAAuB;IACzC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAE5B,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,MAAM,CAAC,CAAO,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,KAAK,MAAM,CAAC,CAAO,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,KAAK,UAAU,CAAC,CAAG,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5C,KAAK,QAAQ,CAAC,CAAK,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QAC1C,KAAK,QAAQ,CAAC,CAAK,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QAC1C,KAAK,MAAM,CAAC,CAAO,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,KAAK,MAAM,CAAC,CAAO,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,KAAK,OAAO,CAAC,CAAM,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzC,KAAK,QAAQ,CAAC,CAAK,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QAC1C;YACE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,GAAG,2CAA2C,CAAC,CAAC;YACzF,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC;AAED,sEAAsE;AAEtE,SAAS,OAAO,CAAC,IAAuB;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjE,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,IAAI,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC1D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,uEAAuE;IACvE,0EAA0E;IAC1E,MAAM,MAAM,GAAG,GAAY,EAAE;QAC3B,IAAI,YAAY,EAAE,EAAE,CAAC;YACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6FAA6F,CAAC,CAAC;YACpH,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,sBAAsB;IACtB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC9E,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,CAAC,GAAG,8BAA8B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uFAAuF,CAAC,CAAC;YAC9G,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IAAI,IAAwB,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;YACjB,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC;gBAClD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;gBACpE,OAAO,CAAC,CAAC;YACX,CAAC;YACD,IAAI,GAAG,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,YAAY,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC9E,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IAAI,MAAM,EAAE;YAAE,OAAO,CAAC,CAAC;QAEvB,MAAM,SAAS,GAAoB;YACjC,IAAI,EAAE,KAAK;YACX,IAAI;YACJ,GAAG;YACH,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C,CAAC;QACF,MAAM,GAAG,GAAW;YAClB,cAAc,EAAE,CAAC;YACjB,WAAW,EAAE,WAAW,IAAI,kBAAkB,EAAE;YAChD,SAAS;SACV,CAAC;QACF,UAAU,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sCAAsC;YACtC,sBAAsB,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI;YACvF,kBAAkB,GAAG,CAAC,WAAW,MAAM;YACvC,eAAe;YACf,oDAAoD;YACpD,qFAAqF;YACrF,2GAA2G,CAC5G,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,6BAA6B;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,iCAAiC;YACjC,wDAAwD;YACxD,4GAA4G,CAC7G,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,MAAM,EAAE;QAAE,OAAO,CAAC,CAAC;IAEvB,MAAM,GAAG,GAAG,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC;IAC9D,UAAU,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sCAAsC;QACtC,kBAAkB,GAAG,CAAC,OAAO,IAAI;QACjC,kBAAkB,GAAG,CAAC,WAAW,MAAM;QACvC,eAAe;QACf,oEAAoE;QACpE,qHAAqH;QACrH,2CAA2C,CAC5C,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,sEAAsE;AAEtE,SAAS,OAAO,CAAC,KAAwB;IACvC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,GAAG,IAAI,CAAC,CAAC;QACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,kBAAkB,EAAE,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1F,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,SAAS,WAAW,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,sEAAsE;AAEtE,SAAS,WAAW,CAAC,IAAuB;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACvE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,GAAG,IAAI,CAAC,CAAC;QAC7D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,cAAc,GAAG,IAAI;QACrB,qBAAqB,GAAG,IAAI;QAC5B,qBAAqB,QAAQ,CAAC,MAAM,IAAI,CACzC,CAAC;IACF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,2EAA2E;YAC3E,2EAA2E;YAC3E,kDAAkD,CACnD,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,sEAAsE;AAEtE,SAAS,SAAS,CAAC,IAAuB;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5E,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC;IAEvB,MAAM,EAAE,GAAG,EAAE,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACjD,MAAM,WAAW,GAAG,GAAG,EAAE,WAAW,IAAI,SAAS,CAAC;IAElD,MAAM,MAAM,GAAG,WAAW,CAAC;QACzB,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,UAAU,EAAE,GAAG;QACf,WAAW,EAAE,GAAG;QAChB,WAAW;QACX,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;QACtB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;KACjC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,OAAO,IAAI,GAAG,OAAO,CAAC,EAAE,SAAS,CAAC;IAC/C,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,EAAE,MAAM,IAAI,QAAQ,OAAO,CAAC,SAAS,oBAAoB,GAAG,KAAK,CAAC,CAAC;IAC5G,OAAO,CAAC,CAAC;AACX,CAAC;AAED,sEAAsE;AAEtE,SAAS,SAAS,CAAC,IAAuB;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6FAA6F,CAAC,CAAC;QACpH,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,QAAQ,IAAI,CAAC,CAAC;QAC7D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;YACjE,OAAO,CAAC,CAAC;QACX,CAAC;QACD,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAE/C,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AACvD,CAAC;AAED,sEAAsE;AAEtE,SAAS,OAAO,CAAC,IAAuB;IACtC,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,IAAI,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC;IACnB,MAAM,SAAS,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,CAAC,SAAS;QAAE,OAAO,CAAC,CAAC;IAEzB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC;IAEvB,MAAM,OAAO,GAAG,iBAAiB,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC5E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,CAAC,EAAE,MAAM,OAAO,IAAI,CAAC,CAAC;IAC5D,OAAO,CAAC,CAAC;AACX,CAAC;AAED,sEAAsE;AAEtE,SAAS,OAAO,CAAC,KAAwB;IACvC,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,IAAI,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC;IACnB,MAAM,SAAS,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,CAAC,SAAS;QAAE,OAAO,CAAC,CAAC;IAEzB,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,SAAS,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC9E,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;QAChE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;KACpD,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,QAAQ,wBAAwB,OAAO,KAAK,CAAC,CAAC;IACxF,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;oDAOoD;AACpD,SAAS,OAAO,CACd,SAAoB,EACpB,WAAmB,EACnB,OAA2C,EAAE;IAE7C,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,MAAM,WAAW,GAAG,SAAS,CAAC,eAAe,EAAE,CAAC;IAEhD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,uEAAuE;QACvE,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC;QACzF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,UAAU,6CAA6C,CAAC,CAAC;YAC/E,OAAO,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,UAAU,4CAA4C,CAAC,CAAC;YAC9E,OAAO,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QAED,iEAAiE;QACjE,wBAAwB;QACxB,MAAM,OAAO,GAAG,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC3D,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtD,IAAI,KAAK,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACrD,+DAA+D;gBAC/D,iCAAiC;gBACjC,SAAS;YACX,CAAC;YACD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;YAClE,IAAI,MAAM,KAAK,CAAC;gBAAE,QAAQ,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED,sEAAsE;AAEtE,KAAK,UAAU,QAAQ,CAAC,IAAuB;IAC7C,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,IAAI,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC;IACnB,MAAM,SAAS,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,CAAC,SAAS;QAAE,OAAO,CAAC,CAAC;IAEzB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAEvC,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/C,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;YAC/E,OAAO,CAAC,CAAC;QACX,CAAC;QACD,WAAW,GAAG,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,SAAS,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAEtE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,kEAAkE;IAClE,oEAAoE;IACpE,MAAM,EAAE,GAAG,EAAE,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAErC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,QAAQ,GAAG,SAAS;YACxB,CAAC,CAAC,WAAW,SAAS,EAAE;YACxB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,6BAA6B,CAAC;QACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uBAAuB,GAAG,CAAC,WAAW,IAAI;YAC1C,gBAAgB,GAAG,IAAI;YACvB,gBAAgB,GAAG,IAAI;YACvB,gBAAgB,SAAS,CAAC,QAAQ,EAAE,IAAI;YACxC,WAAW,WAAW,YAAY,QAAQ,wBAAwB;YAClE,uBAAuB,CACxB,CAAC;IACJ,CAAC;IAED,oEAAoE;IACpE,iEAAiE;IACjE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE7C,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,QAAQ,GAAG,GAAS,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,IAAI,CAAC;QACH,GAAG,CAAC;YACF,IAAI,CAAC;gBACH,aAAa,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;YACrF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YACxF,CAAC;YACD,IAAI,CAAC;gBACH,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YACxF,CAAC;YAED,IAAI,IAAI,IAAI,QAAQ;gBAAE,MAAM;YAC5B,MAAM,KAAK,CAAC,WAAW,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC,QAAQ,CAAC,QAAQ,EAAE;IACtB,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAChD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;wBAGwB;AACxB,SAAS,aAAa,CACpB,SAAoB,EACpB,GAAW,EACX,WAAmB,EACnB,KAA2F;IAE3F,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7D,CAAC;SAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QAC1B,yEAAyE;QACzE,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,IAAI,CAAC,CAAC,UAAU;YAAE,SAAS,CAAC,4BAA4B;QACtF,MAAM,SAAS,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5C,iBAAiB,CAAC,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACtF,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;QACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,SAAS,WAAW,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED;;6EAE6E;AAC7E,SAAS,KAAK,CAAC,EAAU,EAAE,UAAyB;IAClD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE;YAC1B,IAAI,UAAU,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,EAAE,EAAE,CAAC;gBAC7C,aAAa,CAAC,EAAE,CAAC,CAAC;gBAClB,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC,CAAC,CAAC;AACL,CAAC;AAED,sEAAsE;AAEtE,SAAS,SAAS,CAAC,KAAwB;IACzC,MAAM,EAAE,GAAG,CAAC,CAAS,EAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,CAAC,CAAS,EAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,OAAO,MAAM,CAAC,CAAC;IAEnD,IAAI,YAAY,EAAE,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,EAAE,CAAC,uBAAuB,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QAE7C,IAAI,SAAS,GAAqB,IAAI,CAAC;QACvC,IAAI,CAAC;YACH,SAAS,GAAG,eAAe,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,cAAc,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;YAC7B,IAAI,CAAC,CAAC,EAAE;gBAAE,EAAE,CAAC,cAAc,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;;gBAClC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAEpC,+DAA+D;YAC/D,8DAA8D;YAC9D,iEAAiE;YACjE,iEAAiE;YACjE,sEAAsE;YACtE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;gBACT,MAAM,QAAQ,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC;gBAC1C,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBACpE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;oBACd,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,WAAW,CAAC,CAAC;oBACxE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACvB,IAAI,CACF,OAAO,KAAK,8CAA8C,GAAG,CAAC,WAAW,MAAM;4BAC/E,gFAAgF;4BAChF,8EAA8E;4BAC9E,6DAA6D,CAC9D,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,EAAE,CAAC,oBAAoB,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,iBAAiB,CAAC,CAAC;oBAC7E,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,gDAAgD,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,uCAAuC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IACtE,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,6BAA6B,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACtF,EAAE,CAAC,wBAAwB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,UAAU,KAAK,OAAO,CAAC,CAAC;IACnF,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC;QACvG,CAAC;IACH,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAED,sEAAsE;AAEtE,SAAS,cAAc;IACrB,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED;iDACiD;AACjD,SAAS,oBAAoB,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,OAAO,eAAe,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;oDAGoD;AACpD,SAAS,iBAAiB,CACxB,SAAoB,EACpB,GAAW,EACX,WAAmB,EACnB,OAAwD;IAExD,MAAM,EAAE,GAAG,EAAE,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,WAAW,CAAC;QACzB,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,UAAU,EAAE,GAAG;QACf,WAAW,EAAE,GAAG;QAChB,WAAW;QACX,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;QACtB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;KACjC,CAAC,CAAC;IACH,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,WAA+B;IAC/D,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,GAAG,KAAK,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,WAAW,iBAAiB,GAAG,oDAAoD,CAAC,CAAC;YACrH,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,0BAA0B;IAC1B,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC7B,CAAC;AAED,SAAS,aAAa,CAAC,MAAkB,EAAE,WAA0B,EAAE,SAAkB;IACvF,IAAI,SAAS,GAAG,WAAW,CAAC;IAC5B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sDAAsD,MAAM,CAAC,UAAU,IAAI;YAC3E,WAAW;YACX,gEAAgE;YAChE,wGAAwG,CACzG,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACjC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAClF,kEAAkE;QAClE,oEAAoE;QACpE,uEAAuE;QACvE,qEAAqE;QACrE,kBAAkB,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,YAAY,SAAS,SAAS,MAAM,CAAC,WAAW,MAAM,SAAS,IAAI;YACnE,MAAM,MAAM,CAAC,SAAS,oBAAoB,MAAM,CAAC,UAAU,KAAK,CACjE,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACxF,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,IAAI,CAAC,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC;IAC9B,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1D,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AAC9C,CAAC;AAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAC9B,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAC5B,CAAC,GAAU,EAAE,EAAE;IACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CACF,CAAC"}
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;
@@ -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;;uEAEmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB;iDAC6C;IAC7C,WAAW,EAAE,MAAM,CAAC;CACrB;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"}
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
@@ -23,6 +23,16 @@ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
23
23
  import { dirname, join } from 'node:path';
24
24
  import { hostname } from 'node:os';
25
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());
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAalD,MAAM,WAAW,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,CAAC,CAAC;AAElE,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,6CAA6C,CACxE,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAW,CAAC;IAC3E,IAAI,MAAM,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAAE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9E,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,oEAAoE;IACpE,4CAA4C;IAC5C,OAAO,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,WAAoB;IACtE,OAAO;QACL,cAAc,EAAE,CAAC;QACjB,OAAO;QACP,WAAW,EAAE,WAAW,IAAI,kBAAkB,EAAE;KACjD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAqClD;6EAC6E;AAC7E,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,IAAI,GAAG,CAAC,SAAS;QAAE,OAAO,GAAG,CAAC,SAAS,CAAC;IACxC,IAAI,GAAG,CAAC,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;IACzD,MAAM,IAAI,KAAK,CACb,0EAA0E;QAC1E,kDAAkD,CACnD,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,CAAC,CAAC;AAElE,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,6CAA6C,CACxE,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAW,CAAC;IAC3E,IAAI,MAAM,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAAE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9E,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,oEAAoE;IACpE,4CAA4C;IAC5C,OAAO,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,WAAoB;IACtE,OAAO;QACL,cAAc,EAAE,CAAC;QACjB,OAAO;QACP,WAAW,EAAE,WAAW,IAAI,kBAAkB,EAAE;KACjD,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -10,8 +10,9 @@
10
10
  export { encodeProjectDir, stripBom, claudeProjectsRoot, syncRoot, gitRemoteUrl, normalizeGitRemote, projectKey, loadRegistry, saveRegistry, registerProject, registerProjectKey, lookupCwd, type ProjectRegistry, } from './project.js';
11
11
  export { listSessions, listSessionStats, countSessionLines, readSession, writeSession, assignFreshId, type SessionMetadata, type SessionStat, } from './session.js';
12
12
  export { buildCcsync, serializeCcsync, parseCcsync, readCcsyncFile, writeCcsyncFile, CURRENT_SCHEMA_VERSION, type CcsyncFile, } from './format.js';
13
- export { loadConfig, saveConfig, configExists, defaultMachineName, buildDefaultConfig, type Config, } from './config.js';
14
- export { projectSubdir, pushToTransport, listTransport, listTransportMachines, listProjectKeys, type TransportEntry, } from './transport.js';
13
+ export { loadConfig, saveConfig, configExists, defaultMachineName, buildDefaultConfig, resolveTransportConfig, type Config, type TransportConfig, } from './config.js';
14
+ export { projectSubdir, pushToTransport, listTransport, listTransportMachines, listProjectKeys, createTransport, FsTransport, type Transport, type TransportEntry, type TransportHealth, } from './transport.js';
15
+ export { SshTransport, realSshExecutor, buildSshArgs, shQuote, posixJoin, type SshExecutor, type SshExecResult, type SshConfig, } from './ssh.js';
15
16
  /** Single source of truth: read the version straight from package.json
16
17
  * so the published version can never drift from the runtime/CLI banner.
17
18
  * dist layout is `dist/index.js`, so `../package.json` resolves to the
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,kBAAkB,EAClB,QAAQ,EACR,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,SAAS,EACT,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,KAAK,eAAe,EACpB,KAAK,WAAW,GACjB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,WAAW,EACX,eAAe,EACf,WAAW,EACX,cAAc,EACd,eAAe,EACf,sBAAsB,EACtB,KAAK,UAAU,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,MAAM,GACZ,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,aAAa,EACb,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,KAAK,cAAc,GACpB,MAAM,gBAAgB,CAAC;AAExB;;;8CAG8C;AAC9C,eAAO,MAAM,OAAO,EAAE,MAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,kBAAkB,EAClB,QAAQ,EACR,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,SAAS,EACT,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,KAAK,eAAe,EACpB,KAAK,WAAW,GACjB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,WAAW,EACX,eAAe,EACf,WAAW,EACX,cAAc,EACd,eAAe,EACf,sBAAsB,EACtB,KAAK,UAAU,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,KAAK,MAAM,EACX,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,aAAa,EACb,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,WAAW,EACX,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,OAAO,EACP,SAAS,EACT,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,SAAS,GACf,MAAM,UAAU,CAAC;AAElB;;;8CAG8C;AAC9C,eAAO,MAAM,OAAO,EAAE,MAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -11,8 +11,9 @@ import pkg from '../package.json' with { type: 'json' };
11
11
  export { encodeProjectDir, stripBom, claudeProjectsRoot, syncRoot, gitRemoteUrl, normalizeGitRemote, projectKey, loadRegistry, saveRegistry, registerProject, registerProjectKey, lookupCwd, } from './project.js';
12
12
  export { listSessions, listSessionStats, countSessionLines, readSession, writeSession, assignFreshId, } from './session.js';
13
13
  export { buildCcsync, serializeCcsync, parseCcsync, readCcsyncFile, writeCcsyncFile, CURRENT_SCHEMA_VERSION, } from './format.js';
14
- export { loadConfig, saveConfig, configExists, defaultMachineName, buildDefaultConfig, } from './config.js';
15
- export { projectSubdir, pushToTransport, listTransport, listTransportMachines, listProjectKeys, } from './transport.js';
14
+ export { loadConfig, saveConfig, configExists, defaultMachineName, buildDefaultConfig, resolveTransportConfig, } from './config.js';
15
+ export { projectSubdir, pushToTransport, listTransport, listTransportMachines, listProjectKeys, createTransport, FsTransport, } from './transport.js';
16
+ export { SshTransport, realSshExecutor, buildSshArgs, shQuote, posixJoin, } from './ssh.js';
16
17
  /** Single source of truth: read the version straight from package.json
17
18
  * so the published version can never drift from the runtime/CLI banner.
18
19
  * dist layout is `dist/index.js`, so `../package.json` resolves to the
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAExD,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,kBAAkB,EAClB,QAAQ,EACR,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,SAAS,GAEV,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,aAAa,GAGd,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,WAAW,EACX,eAAe,EACf,WAAW,EACX,cAAc,EACd,eAAe,EACf,sBAAsB,GAEvB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,GAEnB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,aAAa,EACb,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,eAAe,GAEhB,MAAM,gBAAgB,CAAC;AAExB;;;8CAG8C;AAC9C,MAAM,CAAC,MAAM,OAAO,GAAW,GAAG,CAAC,OAAO,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAExD,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,kBAAkB,EAClB,QAAQ,EACR,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,SAAS,GAEV,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,aAAa,GAGd,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,WAAW,EACX,eAAe,EACf,WAAW,EACX,cAAc,EACd,eAAe,EACf,sBAAsB,GAEvB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,GAGvB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,aAAa,EACb,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,WAAW,GAIZ,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,OAAO,EACP,SAAS,GAIV,MAAM,UAAU,CAAC;AAElB;;;8CAG8C;AAC9C,MAAM,CAAC,MAAM,OAAO,GAAW,GAAG,CAAC,OAAO,CAAC"}
package/dist/ssh.d.ts ADDED
@@ -0,0 +1,66 @@
1
+ /**
2
+ * SSH transport — `.ccsync` files live in a directory on a remote host,
3
+ * reached over SSH. The target audience is "I run Claude Code on a dev
4
+ * server AND on my laptop"; the round-trip validation showed manual `scp`
5
+ * shuttling was the real friction, so this makes the remote box a
6
+ * first-class transport.
7
+ *
8
+ * Mechanics: every operation is one (or a few) `ssh host <command>` calls,
9
+ * where <command> is a small POSIX shell pipeline (mkdir / cat / mv /
10
+ * find). The remote layout is identical to the filesystem transport —
11
+ * `<dir>/<encoded-project-key>/<sessionId>-<machine>.ccsync` — so the two
12
+ * backends are wire-compatible (a server on `fs` and a laptop on `ssh`
13
+ * pointed at the same dir sync cleanly).
14
+ *
15
+ * Quoting: ssh concatenates its command args with spaces and hands the
16
+ * result to the remote login shell, which re-parses it. So every
17
+ * interpolated value is POSIX single-quoted via `shQuote`; file *lists*
18
+ * are never interpolated (we `find` them remotely and read by path).
19
+ *
20
+ * Testability: the actual `ssh` invocation sits behind `SshExecutor`.
21
+ * Tests inject a fake executor (to assert command construction) or a
22
+ * local-shell executor (to run the real pipelines against a temp dir
23
+ * without an sshd). `realSshExecutor` is the production one.
24
+ */
25
+ import { type CcsyncFile } from './format.js';
26
+ import type { Transport, TransportEntry, TransportHealth } from './transport.js';
27
+ import type { TransportConfig } from './config.js';
28
+ /** The `ssh` member of the transport-config union. */
29
+ export type SshConfig = Extract<TransportConfig, {
30
+ type: 'ssh';
31
+ }>;
32
+ export interface SshExecResult {
33
+ status: number;
34
+ stdout: string;
35
+ stderr: string;
36
+ }
37
+ /** Runs a single command on the remote host, optionally piping `input` to
38
+ * its stdin, and returns the captured result. The production impl shells
39
+ * out to `ssh`; tests inject fakes. */
40
+ export interface SshExecutor {
41
+ run(remoteCommand: string, input?: string): SshExecResult;
42
+ }
43
+ /** POSIX single-quote `s` for safe interpolation into a remote shell
44
+ * command: wrap in '…' and rewrite each embedded ' as '\'' . */
45
+ export declare function shQuote(s: string): string;
46
+ /** Join remote (POSIX) path segments with `/`, trimming stray slashes but
47
+ * preserving a leading `/` on the first segment (absolute remote dirs). */
48
+ export declare function posixJoin(...parts: string[]): string;
49
+ /** Build the `ssh` argv (everything before the remote command). Pure +
50
+ * exported so it can be unit-tested without spawning. */
51
+ export declare function buildSshArgs(cfg: SshConfig, controlPath?: string): string[];
52
+ /** Production executor: shells out to the system `ssh`. */
53
+ export declare function realSshExecutor(cfg: SshConfig): SshExecutor;
54
+ export declare class SshTransport implements Transport {
55
+ private readonly cfg;
56
+ private readonly exec;
57
+ constructor(cfg: SshConfig, exec?: SshExecutor);
58
+ describe(): string;
59
+ push(file: CcsyncFile): string;
60
+ listProjectKeys(): string[];
61
+ listEntries(projectKey: string, selfMachineName: string): TransportEntry[];
62
+ listMachines(): Map<string, number>;
63
+ health(): TransportHealth;
64
+ private readFile;
65
+ }
66
+ //# sourceMappingURL=ssh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../src/ssh.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAOH,OAAO,EAAgC,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,sDAAsD;AACtD,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,eAAe,EAAE;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC,CAAC;AAElE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;wCAEwC;AACxC,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;CAC3D;AAED;iEACiE;AACjE,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzC;AAaD;4EAC4E;AAC5E,wBAAgB,SAAS,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAKpD;AAMD;0DAC0D;AAC1D,wBAAgB,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAkB3E;AAcD,2DAA2D;AAC3D,wBAAgB,eAAe,CAAC,GAAG,EAAE,SAAS,GAAG,WAAW,CAa3D;AAiBD,qBAAa,YAAa,YAAW,SAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;gBAEvB,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,WAAW;IAK9C,QAAQ,IAAI,MAAM;IAMlB,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAgB9B,eAAe,IAAI,MAAM,EAAE;IAO3B,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,cAAc,EAAE;IAyB1E,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAmBnC,MAAM,IAAI,eAAe;IAYzB,OAAO,CAAC,QAAQ;CAIjB"}
package/dist/ssh.js ADDED
@@ -0,0 +1,216 @@
1
+ /**
2
+ * SSH transport — `.ccsync` files live in a directory on a remote host,
3
+ * reached over SSH. The target audience is "I run Claude Code on a dev
4
+ * server AND on my laptop"; the round-trip validation showed manual `scp`
5
+ * shuttling was the real friction, so this makes the remote box a
6
+ * first-class transport.
7
+ *
8
+ * Mechanics: every operation is one (or a few) `ssh host <command>` calls,
9
+ * where <command> is a small POSIX shell pipeline (mkdir / cat / mv /
10
+ * find). The remote layout is identical to the filesystem transport —
11
+ * `<dir>/<encoded-project-key>/<sessionId>-<machine>.ccsync` — so the two
12
+ * backends are wire-compatible (a server on `fs` and a laptop on `ssh`
13
+ * pointed at the same dir sync cleanly).
14
+ *
15
+ * Quoting: ssh concatenates its command args with spaces and hands the
16
+ * result to the remote login shell, which re-parses it. So every
17
+ * interpolated value is POSIX single-quoted via `shQuote`; file *lists*
18
+ * are never interpolated (we `find` them remotely and read by path).
19
+ *
20
+ * Testability: the actual `ssh` invocation sits behind `SshExecutor`.
21
+ * Tests inject a fake executor (to assert command construction) or a
22
+ * local-shell executor (to run the real pipelines against a temp dir
23
+ * without an sshd). `realSshExecutor` is the production one.
24
+ */
25
+ import { spawnSync } from 'node:child_process';
26
+ import { createHash } from 'node:crypto';
27
+ import { tmpdir, homedir } from 'node:os';
28
+ import { join } from 'node:path';
29
+ import { encodeProjectDir } from './project.js';
30
+ import { parseCcsync, serializeCcsync } from './format.js';
31
+ /** POSIX single-quote `s` for safe interpolation into a remote shell
32
+ * command: wrap in '…' and rewrite each embedded ' as '\'' . */
33
+ export function shQuote(s) {
34
+ return `'${s.split("'").join("'\\''")}'`;
35
+ }
36
+ /** Strip leading and/or trailing `/` with a linear two-pointer scan — NOT
37
+ * `/\/+$/`, which is a polynomial-ReDoS vector on the config-derived path
38
+ * (CodeQL flags it). */
39
+ function trimSlashes(s, leading, trailing) {
40
+ let lo = 0;
41
+ let hi = s.length;
42
+ if (leading)
43
+ while (lo < hi && s[lo] === '/')
44
+ lo++;
45
+ if (trailing)
46
+ while (hi > lo && s[hi - 1] === '/')
47
+ hi--;
48
+ return s.slice(lo, hi);
49
+ }
50
+ /** Join remote (POSIX) path segments with `/`, trimming stray slashes but
51
+ * preserving a leading `/` on the first segment (absolute remote dirs). */
52
+ export function posixJoin(...parts) {
53
+ return parts
54
+ .map((p, i) => (i === 0 ? trimSlashes(p, false, true) : trimSlashes(p, true, true)))
55
+ .filter((p) => p.length > 0)
56
+ .join('/');
57
+ }
58
+ function expandHome(p) {
59
+ return p === '~' || p.startsWith('~/') ? join(homedir(), p.slice(1)) : p;
60
+ }
61
+ /** Build the `ssh` argv (everything before the remote command). Pure +
62
+ * exported so it can be unit-tested without spawning. */
63
+ export function buildSshArgs(cfg, controlPath) {
64
+ const args = [];
65
+ if (cfg.port)
66
+ args.push('-p', String(cfg.port));
67
+ if (cfg.identityFile)
68
+ args.push('-i', expandHome(cfg.identityFile));
69
+ // BatchMode: never block on a password/passphrase prompt — fail fast so
70
+ // `watch` / scripts don't hang. ConnectTimeout bounds an unreachable host.
71
+ args.push('-o', 'BatchMode=yes', '-o', 'ConnectTimeout=10');
72
+ if (controlPath) {
73
+ // Multiplex over one connection so the many small round-trips a single
74
+ // pull makes don't each pay a full TCP+auth handshake.
75
+ args.push('-o', 'ControlMaster=auto', '-o', `ControlPath=${controlPath}`, '-o', 'ControlPersist=60');
76
+ }
77
+ args.push(cfg.user ? `${cfg.user}@${cfg.host}` : cfg.host);
78
+ return args;
79
+ }
80
+ /** ControlMaster socket path for connection reuse — POSIX only (Windows
81
+ * OpenSSH historically lacks Unix-socket multiplexing, so we skip it and
82
+ * pay per-call connection cost there). */
83
+ function controlPathFor(cfg) {
84
+ if (process.platform === 'win32')
85
+ return undefined;
86
+ const id = createHash('sha256')
87
+ .update(`${cfg.user ?? ''}@${cfg.host}:${cfg.port ?? 22}`)
88
+ .digest('hex')
89
+ .slice(0, 12);
90
+ return join(tmpdir(), `cs-ssh-${id}`);
91
+ }
92
+ /** Production executor: shells out to the system `ssh`. */
93
+ export function realSshExecutor(cfg) {
94
+ const baseArgs = buildSshArgs(cfg, controlPathFor(cfg));
95
+ return {
96
+ run(remoteCommand, input) {
97
+ const r = spawnSync('ssh', [...baseArgs, remoteCommand], {
98
+ input,
99
+ encoding: 'utf-8',
100
+ maxBuffer: 64 * 1024 * 1024,
101
+ });
102
+ if (r.error)
103
+ return { status: 1, stdout: '', stderr: r.error.message };
104
+ return { status: r.status ?? 1, stdout: r.stdout ?? '', stderr: r.stderr ?? '' };
105
+ },
106
+ };
107
+ }
108
+ /** Parse `find -printf '%T@\t%f\n'` output into {mtimeMs, name} rows. */
109
+ function parseFindRows(out) {
110
+ const rows = [];
111
+ for (const line of out.split('\n')) {
112
+ if (!line)
113
+ continue;
114
+ const tab = line.indexOf('\t');
115
+ if (tab < 0)
116
+ continue;
117
+ const mt = parseFloat(line.slice(0, tab));
118
+ const name = line.slice(tab + 1);
119
+ if (!name || !Number.isFinite(mt))
120
+ continue;
121
+ rows.push({ mtimeMs: mt * 1000, name });
122
+ }
123
+ return rows;
124
+ }
125
+ export class SshTransport {
126
+ cfg;
127
+ exec;
128
+ constructor(cfg, exec) {
129
+ this.cfg = cfg;
130
+ this.exec = exec ?? realSshExecutor(cfg);
131
+ }
132
+ describe() {
133
+ const who = this.cfg.user ? `${this.cfg.user}@${this.cfg.host}` : this.cfg.host;
134
+ const port = this.cfg.port && this.cfg.port !== 22 ? `:${this.cfg.port}` : '';
135
+ return `ssh ${who}${port} ${this.cfg.dir}`;
136
+ }
137
+ push(file) {
138
+ const enc = encodeProjectDir(file.projectKey);
139
+ const dir = posixJoin(this.cfg.dir, enc);
140
+ const name = `${file.sessionId}-${file.machineName}.ccsync`;
141
+ const path = posixJoin(dir, name);
142
+ const tmp = `${path}.tmp`;
143
+ // mkdir -p, stream content to a tmp file via stdin, atomic rename.
144
+ const cmd = `mkdir -p ${shQuote(dir)} && cat > ${shQuote(tmp)} && mv -f ${shQuote(tmp)} ${shQuote(path)}`;
145
+ const r = this.exec.run(cmd, serializeCcsync(file));
146
+ if (r.status !== 0) {
147
+ throw new Error(`ssh push failed (${this.describe()}): ${r.stderr.trim() || `exit ${r.status}`}`);
148
+ }
149
+ return `${this.describe()} → ${enc}/${name}`;
150
+ }
151
+ listProjectKeys() {
152
+ const cmd = `find ${shQuote(this.cfg.dir)} -mindepth 1 -maxdepth 1 -type d -printf '%f\\n' 2>/dev/null`;
153
+ const r = this.exec.run(cmd);
154
+ return r.stdout.split('\n').map((s) => s.trim()).filter(Boolean).sort();
155
+ }
156
+ listEntries(projectKey, selfMachineName) {
157
+ const enc = encodeProjectDir(projectKey);
158
+ const dir = posixJoin(this.cfg.dir, enc);
159
+ const listCmd = `find ${shQuote(dir)} -mindepth 1 -maxdepth 1 -type f -name '*.ccsync' ` +
160
+ `-printf '%T@\\t%f\\n' 2>/dev/null`;
161
+ const rows = parseFindRows(this.exec.run(listCmd).stdout);
162
+ const entries = [];
163
+ for (const row of rows) {
164
+ const content = this.readFile(posixJoin(dir, row.name));
165
+ if (content == null)
166
+ continue;
167
+ let file;
168
+ try {
169
+ file = parseCcsync(content);
170
+ }
171
+ catch {
172
+ continue; // malformed / mid-write — skip quietly, like the fs transport
173
+ }
174
+ if (file.machineName === selfMachineName)
175
+ continue;
176
+ entries.push({ path: `${this.describe()}/${enc}/${row.name}`, file, mtime: row.mtimeMs });
177
+ }
178
+ entries.sort((a, b) => b.mtime - a.mtime);
179
+ return entries;
180
+ }
181
+ listMachines() {
182
+ const counts = new Map();
183
+ // Files live exactly two levels under the root: <dir>/<key>/<file>.
184
+ const listCmd = `find ${shQuote(this.cfg.dir)} -mindepth 2 -maxdepth 2 -type f -name '*.ccsync' 2>/dev/null`;
185
+ const paths = this.exec.run(listCmd).stdout.split('\n').map((s) => s.trim()).filter(Boolean);
186
+ for (const p of paths) {
187
+ const content = this.readFile(p);
188
+ if (content == null)
189
+ continue;
190
+ try {
191
+ const file = parseCcsync(content);
192
+ counts.set(file.machineName, (counts.get(file.machineName) ?? 0) + 1);
193
+ }
194
+ catch {
195
+ // skip malformed
196
+ }
197
+ }
198
+ return counts;
199
+ }
200
+ health() {
201
+ const cmd = `test -d ${shQuote(this.cfg.dir)} && echo DIR_OK || echo DIR_MISSING`;
202
+ const r = this.exec.run(cmd);
203
+ if (!r.stdout.includes('DIR_OK') && !r.stdout.includes('DIR_MISSING')) {
204
+ return { ok: false, detail: `unreachable: ${r.stderr.trim() || `ssh exit ${r.status}`}` };
205
+ }
206
+ if (r.stdout.includes('DIR_MISSING')) {
207
+ return { ok: true, detail: `${this.describe()} (remote dir absent — created on first push)` };
208
+ }
209
+ return { ok: true, detail: this.describe() };
210
+ }
211
+ readFile(remotePath) {
212
+ const r = this.exec.run(`cat -- ${shQuote(remotePath)} 2>/dev/null`);
213
+ return r.status === 0 ? r.stdout : null;
214
+ }
215
+ }
216
+ //# sourceMappingURL=ssh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh.js","sourceRoot":"","sources":["../src/ssh.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,7 @@
18
18
  * `pull` picks the newest non-self file per session id.
19
19
  */
20
20
  import type { CcsyncFile } from './format.js';
21
+ import type { TransportConfig } from './config.js';
21
22
  export declare function projectSubdir(syncDir: string, projectKey: string): string;
22
23
  /** Write a .ccsync file into the project's transport subdir. The
23
24
  * filename includes the machine name so the receiver can tell who
@@ -41,6 +42,38 @@ export declare function listTransport(syncDir: string, projectKey: string, selfM
41
42
  * e.g. both defaulted to the same hostname — pull silently imports
42
43
  * nothing. Malformed files are skipped quietly. */
43
44
  export declare function listTransportMachines(syncDir: string): Map<string, number>;
45
+ export interface TransportHealth {
46
+ ok: boolean;
47
+ detail: string;
48
+ }
49
+ export interface Transport {
50
+ /** Write a .ccsync into the transport; return a human-readable location. */
51
+ push(file: CcsyncFile): string;
52
+ /** Newest-first entries for a project key, excluding self-authored files. */
53
+ listEntries(projectKey: string, selfMachineName: string): TransportEntry[];
54
+ /** All project keys (encoded form) present in the transport. */
55
+ listProjectKeys(): string[];
56
+ /** machineName → file count across the whole transport. */
57
+ listMachines(): Map<string, number>;
58
+ /** One-line description for banners / doctor. */
59
+ describe(): string;
60
+ /** Reachability + presence check for `doctor`. */
61
+ health(): TransportHealth;
62
+ }
63
+ /** Filesystem transport — thin object wrapper over the functions above so
64
+ * it satisfies the `Transport` interface. */
65
+ export declare class FsTransport implements Transport {
66
+ private readonly dir;
67
+ constructor(dir: string);
68
+ push(file: CcsyncFile): string;
69
+ listEntries(projectKey: string, selfMachineName: string): TransportEntry[];
70
+ listProjectKeys(): string[];
71
+ listMachines(): Map<string, number>;
72
+ describe(): string;
73
+ health(): TransportHealth;
74
+ }
75
+ /** Build the concrete transport for a resolved config. */
76
+ export declare function createTransport(tc: TransportConfig): Transport;
44
77
  /** List all project keys present in the transport. Used by the CLI's
45
78
  * `pull` (no args) form to fan out across every known project. */
46
79
  export declare function listProjectKeys(syncDir: string): string[];
@@ -1 +1 @@
1
- {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED;;;gBAGgB;AAChB,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAWzE;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;4CAG4C;AAC5C,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,GACtB,cAAc,EAAE,CA0BlB;AAED;;;;;oDAKoD;AACpD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAkB1E;AAED;mEACmE;AACnE,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAWzD"}
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED;;;gBAGgB;AAChB,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAWzE;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;4CAG4C;AAC5C,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,GACtB,cAAc,EAAE,CA0BlB;AAED;;;;;oDAKoD;AACpD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAkB1E;AAQD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,4EAA4E;IAC5E,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC;IAC/B,6EAA6E;IAC7E,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,cAAc,EAAE,CAAC;IAC3E,gEAAgE;IAChE,eAAe,IAAI,MAAM,EAAE,CAAC;IAC5B,2DAA2D;IAC3D,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,iDAAiD;IACjD,QAAQ,IAAI,MAAM,CAAC;IACnB,kDAAkD;IAClD,MAAM,IAAI,eAAe,CAAC;CAC3B;AAED;8CAC8C;AAC9C,qBAAa,WAAY,YAAW,SAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,MAAM;IAExC,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAG9B,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,cAAc,EAAE;IAG1E,eAAe,IAAI,MAAM,EAAE;IAG3B,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAGnC,QAAQ,IAAI,MAAM;IAGlB,MAAM,IAAI,eAAe;CAK1B;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,CAAC,EAAE,EAAE,eAAe,GAAG,SAAS,CAG9D;AAED;mEACmE;AACnE,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAWzD"}
package/dist/transport.js CHANGED
@@ -21,6 +21,7 @@ import { existsSync, mkdirSync, readdirSync, statSync, writeFileSync, readFileSy
21
21
  import { join } from 'node:path';
22
22
  import { encodeProjectDir } from './project.js';
23
23
  import { parseCcsync, serializeCcsync } from './format.js';
24
+ import { SshTransport } from './ssh.js';
24
25
  export function projectSubdir(syncDir, projectKey) {
25
26
  return join(syncDir, encodeProjectDir(projectKey));
26
27
  }
@@ -101,6 +102,40 @@ export function listTransportMachines(syncDir) {
101
102
  }
102
103
  return counts;
103
104
  }
105
+ /** Filesystem transport — thin object wrapper over the functions above so
106
+ * it satisfies the `Transport` interface. */
107
+ export class FsTransport {
108
+ dir;
109
+ constructor(dir) {
110
+ this.dir = dir;
111
+ }
112
+ push(file) {
113
+ return pushToTransport(this.dir, file);
114
+ }
115
+ listEntries(projectKey, selfMachineName) {
116
+ return listTransport(this.dir, projectKey, selfMachineName);
117
+ }
118
+ listProjectKeys() {
119
+ return listProjectKeys(this.dir);
120
+ }
121
+ listMachines() {
122
+ return listTransportMachines(this.dir);
123
+ }
124
+ describe() {
125
+ return this.dir;
126
+ }
127
+ health() {
128
+ return existsSync(this.dir)
129
+ ? { ok: true, detail: this.dir }
130
+ : { ok: false, detail: `directory does not exist: ${this.dir}` };
131
+ }
132
+ }
133
+ /** Build the concrete transport for a resolved config. */
134
+ export function createTransport(tc) {
135
+ if (tc.type === 'ssh')
136
+ return new SshTransport(tc);
137
+ return new FsTransport(tc.dir);
138
+ }
104
139
  /** List all project keys present in the transport. Used by the CLI's
105
140
  * `pull` (no args) form to fan out across every known project. */
106
141
  export function listProjectKeys(syncDir) {
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EACL,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EACzE,UAAU,GACX,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,UAAkB;IAC/D,OAAO,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;AACrD,CAAC;AAED;;;gBAGgB;AAChB,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,IAAgB;IAC/D,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,SAAS,CAAC;IAChE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjC,qEAAqE;IACrE,6DAA6D;IAC7D,MAAM,GAAG,GAAG,GAAG,IAAI,MAAM,CAAC;IAC1B,aAAa,CAAC,GAAG,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtB,OAAO,IAAI,CAAC;AACd,CAAC;AAQD;;;4CAG4C;AAC5C,MAAM,UAAU,aAAa,CAC3B,OAAe,EACf,UAAkB,EAClB,eAAuB;IAEvB,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAEhC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAqB,EAAE,CAAC;IAEpC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,SAAS;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,IAAgB,CAAC;QACrB,IAAI,CAAC;YACH,IAAI,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,kEAAkE;YAClE,4DAA4D;YAC5D,kCAAkC;YAClC,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,KAAK,eAAe;YAAE,SAAS;QACnD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;oDAKoD;AACpD,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC;IAExC,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAChE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE;YAAE,SAAS;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC9D,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAAE,SAAS;YACjE,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;gBACvE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACxE,CAAC;YAAC,MAAM,CAAC;gBACP,4DAA4D;YAC9D,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;mEACmE;AACnE,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACnB,gEAAgE;QAChE,8DAA8D;QAC9D,iEAAiE;QACjE,gDAAgD;SAC/C,IAAI,EAAE,CAAC;AACZ,CAAC"}
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@askalf/claude-sync",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "own your sessions — move Claude Code sessions across machines. Part of Own Your Stack.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -21,7 +21,7 @@
21
21
  ],
22
22
  "scripts": {
23
23
  "build": "tsc",
24
- "test": "node --test test/project.test.mjs test/format.test.mjs test/session.test.mjs test/transport.test.mjs test/cli.test.mjs test/watch.test.mjs test/version.test.mjs",
24
+ "test": "node --test test/project.test.mjs test/format.test.mjs test/session.test.mjs test/transport.test.mjs test/config.test.mjs test/ssh.test.mjs test/cli.test.mjs test/watch.test.mjs test/version.test.mjs",
25
25
  "typecheck": "tsc --noEmit",
26
26
  "audit": "npm audit --production --audit-level=high",
27
27
  "prepublishOnly": "npm run build",