@askalf/claude-sync 0.0.3 → 0.1.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
@@ -1,5 +1,7 @@
1
1
  # @askalf/claude-sync
2
2
 
3
+ > _claude-sync — own your sessions — move Claude Code sessions across machines. Part of **[Own Your Stack](https://github.com/askalf)** — own your AI infrastructure instead of renting it by the token._
4
+
3
5
  > Sync Claude Code sessions across machines. Pack a session into a portable `.ccsync` file, ship it via Dropbox / iCloud / Syncthing / a USB stick, unpack on the other side. Path-hash mismatches solved via git-remote-url as the canonical project key.
4
6
 
5
7
  ```bash
@@ -19,8 +21,8 @@ Claude Code stores sessions locally at `~/.claude/projects/<encoded-cwd>/<sessio
19
21
 
20
22
  `claude-sync` solves both:
21
23
 
22
- - **Canonical project key** = `git:<remote-url>`. Same logical repo → same key, regardless of where it's checked out. (Falls back to `name:<basename>` when no git remote.)
23
- - **Single-writer model.** You explicitly `push` from machine A, then `pull` on machine B. No background daemon racing files. 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.
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.
24
26
 
25
27
  ## Use it
26
28
 
@@ -57,12 +59,54 @@ claude --resume sess-abc123
57
59
 
58
60
  That's the whole loop.
59
61
 
62
+ ### Or let it run: watch mode
63
+
64
+ Tired of remembering to `push` and `pull`? Run a daemon per project:
65
+
66
+ ```bash
67
+ cd ~/code/myapp
68
+ claude-sync watch
69
+ # claude-sync watch — desktop
70
+ # project: git:github.com/you/myapp
71
+ # cwd: /Users/you/code/myapp
72
+ # syncDir: /Users/you/Dropbox/claude-sync
73
+ # every 10s · push most-recent changed session · pull all projects
74
+ # Ctrl-C to stop.
75
+ #
76
+ # ↑ pushed sess-abc123 (142 lines)
77
+ # Imported sess-def456 from laptop → …/sess-def456.jsonl
78
+ ```
79
+
80
+ Every interval (default 10s, `--interval <seconds>`) it pushes the active
81
+ session whenever it has grown and pulls anything newer from your other
82
+ machines. It watches the **most-recent** session by default; pass a session-id
83
+ to pin one, or `--all` to push every changed session in the project. `--once`
84
+ runs a single cycle and exits — handy from `cron`. Ctrl-C stops cleanly.
85
+
86
+ It's still poll-based, not real-time co-editing: don't run the *same* session
87
+ live on two machines at once (see [Concurrency](#concurrency)). Watch is for
88
+ "pick up where the other machine left off without thinking about it."
89
+
90
+ ### Starting on a fresh clone
91
+
92
+ `pull` can only deliver a session to a directory it knows about. On a machine
93
+ that has never had a session for this project yet, register the directory once:
94
+
95
+ ```bash
96
+ cd ~/code/myapp
97
+ claude-sync register # binds this cwd to the project key — no session needed
98
+ claude-sync pull # now resolves
99
+ ```
100
+
101
+ (`watch` registers automatically on start, and `import … --cwd <path>` registers
102
+ the target, so you usually only need `register` for a manual `pull`-first flow.)
103
+
60
104
  ## How path resolution works
61
105
 
62
106
  When you `push` from a project with a git remote, claude-sync:
63
107
 
64
108
  1. Reads `git remote get-url origin` from your cwd.
65
- 2. Builds a project key: `git:https://github.com/you/myapp.git`.
109
+ 2. Canonicalizes it into a project key: `git:github.com/you/myapp` (SSH and HTTPS remotes land on the same key).
66
110
  3. Registers the local cwd under that key in `~/.claude-sync/projects.json`.
67
111
  4. Writes the `.ccsync` into `<syncDir>/<encoded-key>/<session>-<machine>.ccsync`.
68
112
 
@@ -71,36 +115,36 @@ When you `pull`, the receiving machine:
71
115
  1. Scans `<syncDir>/` for project subdirs.
72
116
  2. For each, looks up the encoded key in its own `projects.json`.
73
117
  3. If a local cwd is registered for that key, installs the session there.
74
- 4. If not — claude-sync hasn't seen this project on this machine yet — it skips with a warning. You either `push` once from the right cwd to register it, or run `claude-sync import <file> --cwd <path>` explicitly.
118
+ 4. If not — claude-sync hasn't seen this project on this machine yet — it skips with a warning. Run `claude-sync register` in the cwd once (binds the key, no session needed), or `claude-sync import <file> --cwd <path>` to install a specific file (which also registers the directory).
75
119
 
76
- In practice: clone the repo on the new machine, `cd` in, run `claude-sync push` once with no real session (it'll error if there's no session — that's fine), then run `claude-sync pull` to fetch. The first push registers the cwd.
77
-
78
- A cleaner way: just run any `claude` command in the cwd once, then `claude-sync export` (which registers without pushing).
120
+ In practice: clone the repo on the new machine, `cd` in, `claude-sync register`, then `claude-sync pull`. Or just start `claude-sync watch`, which registers on launch.
79
121
 
80
122
  ## Concurrency
81
123
 
82
- There's no daemon and no automatic background sync. You decide when to push and when to pull. If you forget and edit the same session on both machines:
124
+ `watch` automates *when* to push and pull, but it's still poll-based, not a locking protocol. If two machines edit the **same** session concurrently:
83
125
 
84
126
  - Two `.ccsync` files end up in `<syncDir>/<project>/`, named with each machine's name.
85
127
  - The receiving `pull` skips files older or shorter than the local copy.
86
128
  - Newer/longer files install with `--overwrite`. The losing machine's edits become a `<session-id>-copy.jsonl` (you can manually inspect + reconcile).
87
129
 
88
- Future versions may add a watch-mode + lock-file protocol for "real-time" sync; v0.0.1 is deliberate-action only.
130
+ So: use `watch` to hand a project *back and forth* between machines hands-free; don't drive the same live session from two machines at once. A lock-file protocol for true real-time co-editing is a possible future addition.
89
131
 
90
132
  ## CLI reference
91
133
 
92
134
  ```text
93
135
  claude-sync init <syncDir> [--name <machine>]
94
136
  claude-sync list
137
+ claude-sync register [cwd]
95
138
  claude-sync export [session-id] [-o <file>]
96
139
  claude-sync import <file> [--cwd <path>] [--overwrite]
97
140
  claude-sync push [session-id]
98
141
  claude-sync pull
142
+ claude-sync watch [session-id] [--interval <seconds>] [--all] [--once]
99
143
  claude-sync doctor
100
144
  claude-sync --help / --version
101
145
  ```
102
146
 
103
- `doctor` prints config, machine name, registered projects, and warns if any registered cwd no longer exists on disk.
147
+ `doctor` prints config, machine name, registered projects, and transport peers — and warns if any registered cwd no longer exists on disk, or if every file in the transport carries this machine's own name (which makes `pull` a silent no-op — give each machine a distinct `--name`).
104
148
 
105
149
  ## File format
106
150
 
@@ -110,7 +154,7 @@ claude-sync --help / --version
110
154
  {
111
155
  "_schemaVersion": 1,
112
156
  "sessionId": "...",
113
- "projectKey": "git:https://github.com/you/myapp.git",
157
+ "projectKey": "git:github.com/you/myapp",
114
158
  "originalCwd": "C:\\Users\\you\\code\\myapp",
115
159
  "machineName": "desktop",
116
160
  "exportedAt": 1715380000000,
@@ -119,13 +163,12 @@ claude-sync --help / --version
119
163
  }
120
164
  ```
121
165
 
122
- Schema-versioned. Version 1 is the only thing v0.0.1 understands; importers refuse unknown versions explicitly rather than silently dropping fields.
166
+ Schema-versioned. Version 1 is the only thing the current release understands; importers refuse unknown versions explicitly rather than silently dropping fields.
123
167
 
124
168
  ## What it isn't
125
169
 
126
- - **Not a daemon.** Push and pull are explicit user actions. Run a watcher yourself if you want background sync.
127
- - **Not a relay service.** v0.0.1 ships only the filesystem transport — point it at any synced folder. SSH / S3 / gist / WebSocket transports would be straightforward additions; not in v0.0.1.
128
- - **Not real-time.** If both machines are CC-active simultaneously, the second to `pull` overwrites their in-progress session unless they noticed and stopped first. Use one machine at a time.
170
+ - **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.
129
172
  - **Not a CC re-implementation.** It just shuffles JSONL. CC's session schema can change without breaking claude-sync — we never parse the events.
130
173
 
131
174
  ## Library API
@@ -134,13 +177,15 @@ For embedders (custom transports, watch daemons, etc.):
134
177
 
135
178
  ```ts
136
179
  import {
137
- listSessions, readSession, writeSession,
180
+ listSessions, listSessionStats, countSessionLines, readSession, writeSession,
138
181
  buildCcsync, parseCcsync, readCcsyncFile, writeCcsyncFile,
139
- projectKey, registerProject, lookupCwd,
140
- pushToTransport, listTransport,
182
+ projectKey, normalizeGitRemote, registerProject, registerProjectKey, lookupCwd,
183
+ pushToTransport, listTransport, listTransportMachines,
141
184
  } from '@askalf/claude-sync';
142
185
  ```
143
186
 
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.
188
+
144
189
  See `src/index.ts` for the full surface. Zero runtime dependencies.
145
190
 
146
191
  ## Environment
@@ -153,27 +198,16 @@ See `src/index.ts` for the full surface. Zero runtime dependencies.
153
198
 
154
199
  MIT — see [LICENSE](LICENSE).
155
200
 
156
- ## Also by askalf
201
+ ## Own Your Stack
157
202
 
158
- | Project | What it does |
159
- |---------|-------------|
160
- | [arnie](https://github.com/askalf/arnie) | Portable IT troubleshooting companion. Networking, AD, Windows Update, package managers, log triage, hardware checks. |
161
- | [brio](https://github.com/askalf/brio) | Capability layer for AI workloads — semantic cache, cost tiering, policy. Sits in front of any Anthropic-compat endpoint. |
162
- | [browser-bridge](https://github.com/askalf/browser-bridge) | Stealth headless Chromium in a container. CDP on 9222 — Playwright/Puppeteer/MCP-compatible. |
163
- | [claude-bridge](https://github.com/askalf/claude-bridge) | Bridge Claude Code sessions to Discord. |
164
- | [dario](https://github.com/askalf/dario) | Local LLM router. Use your Claude Max/Pro subscription as an API. |
165
- | [deepdive](https://github.com/askalf/deepdive) | Local research agent. Plan → search → fetch → extract → synthesize. Cited answers. |
166
- | [git-providers](https://github.com/askalf/git-providers) | Unified GitHub + GitLab + Bitbucket Cloud REST clients behind one GitProvider interface. Plus a 44-entry api-key-provider taxonomy. |
167
- | [hands](https://github.com/askalf/hands) | Cross-platform computer-use agent. Mouse, keyboard, screen. |
168
- | [install-kit](https://github.com/askalf/install-kit) | curl-pipe-bash template for self-hosted Docker apps. |
169
- | [pgflex](https://github.com/askalf/pgflex) | One Postgres API. Two modes (real PG ↔ PGlite WASM). |
170
- | [redisflex](https://github.com/askalf/redisflex) | One Redis API. Two modes (ioredis ↔ in-process). |
203
+ Part of **[Own Your Stack](https://github.com/askalf)** — open tools for owning your AI infrastructure instead of renting it by the token. One subscription. Your box. Your terms.
171
204
 
205
+ - **[dario](https://github.com/askalf/dario)** — own your routing
206
+ - **[deepdive](https://github.com/askalf/deepdive)** — own your research
207
+ - **[hands](https://github.com/askalf/hands)** — own your computer-use
208
+ - **[agent](https://github.com/askalf/agent)** — own your fleet
209
+ - **[browser-bridge](https://github.com/askalf/browser-bridge)** — own your browser
210
+ - **claude-sync** — own your sessions _(you are here)_
172
211
 
173
212
  ---
174
-
175
- ## Built by Sprayberry Labs
176
-
177
- This is one of the open-source building blocks from **[Sprayberry Labs](https://sprayberrylabs.com)** — an independent studio (Atlanta, GA) that ships bespoke software and **fixed-price code & security audits**, delivered with the AI workforce these tools are part of.
178
-
179
- **Got a codebase that needs an expert read?** → **[Scan a repo — free mini-audit](https://sprayberrylabs.com)**, or see the **$1,500 fixed-price Audit** and build Sprints. · [sprayberrylabs.com](https://sprayberrylabs.com) · hello@sprayberrylabs.com
213
+ Part of **[Own Your Stack](https://github.com/askalf)** — own your AI infrastructure instead of renting it. Built by Thomas Sprayberry.
package/dist/cli.d.ts 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
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;GAiBG"}
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
@@ -19,10 +21,10 @@ import { existsSync } from 'node:fs';
19
21
  import { resolve } from 'node:path';
20
22
  import { VERSION } from './index.js';
21
23
  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';
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 { pushToTransport, listTransport, listProjectKeys, } from './transport.js';
27
+ import { pushToTransport, listTransport, listTransportMachines, listProjectKeys, } from './transport.js';
26
28
  const HELP = `claude-sync ${VERSION}
27
29
 
28
30
  Usage: claude-sync <command> [options]
@@ -37,6 +39,12 @@ Commands:
37
39
  List Claude Code sessions for the current working directory,
38
40
  sorted by recency.
39
41
 
42
+ register [cwd]
43
+ Register a directory's project key so \`pull\` can deliver peers'
44
+ sessions here — even before this machine has any session of its
45
+ own. Defaults to the current directory. Run this once on a fresh
46
+ clone, then \`pull\`.
47
+
40
48
  export [session-id] [-o <file>]
41
49
  Pack a session into a portable .ccsync file. Default session-id
42
50
  is the most recent one for the current cwd. Default output path
@@ -55,6 +63,14 @@ Commands:
55
63
  each into the matching local cwd. Skips sessions that already
56
64
  exist locally with the same line count (idempotent re-runs).
57
65
 
66
+ watch [session-id] [--interval <seconds>] [--all] [--once]
67
+ Run a sync daemon for the current directory: every <interval>
68
+ seconds (default 10), push the active session whenever it grows
69
+ and pull any newer sessions from peers. Watches the most-recent
70
+ session by default; pass a session-id to pin one, or --all to push
71
+ every changed session in this project. --once runs a single
72
+ push+pull cycle and exits. Ctrl-C to stop.
73
+
58
74
  doctor
59
75
  Print a health report: config, machine name, registered projects,
60
76
  Claude Code projects dir, and any obvious mismatches.
@@ -76,10 +92,12 @@ async function main(argv) {
76
92
  switch (cmd) {
77
93
  case 'init': return cmdInit(rest);
78
94
  case 'list': return cmdList(rest);
95
+ case 'register': return cmdRegister(rest);
79
96
  case 'export': return cmdExport(rest);
80
97
  case 'import': return cmdImport(rest);
81
98
  case 'push': return cmdPush(rest);
82
99
  case 'pull': return cmdPull(rest);
100
+ case 'watch': return cmdWatch(rest);
83
101
  case 'doctor': return cmdDoctor(rest);
84
102
  default:
85
103
  process.stderr.write(`Unknown command: ${cmd}\nRun \`claude-sync --help\` for usage.\n`);
@@ -126,6 +144,26 @@ function cmdList(_args) {
126
144
  }
127
145
  return 0;
128
146
  }
147
+ // ── register ───────────────────────────────────────────────────────
148
+ function cmdRegister(args) {
149
+ const arg = args[0];
150
+ const cwd = arg && !arg.startsWith('-') ? resolve(arg) : process.cwd();
151
+ if (!existsSync(cwd)) {
152
+ process.stderr.write(`Error: path does not exist: ${cwd}\n`);
153
+ return 1;
154
+ }
155
+ const { key } = registerProject(cwd);
156
+ const sessions = listSessions(cwd);
157
+ process.stdout.write(`Registered ${cwd}\n` +
158
+ ` project key: ${key}\n` +
159
+ ` local sessions: ${sessions.length}\n`);
160
+ if (sessions.length === 0) {
161
+ process.stdout.write(`\n No sessions here yet — that's fine. \`pull\` can now deliver peers'\n` +
162
+ ` work to this directory. \`push\`/\`export\` start working once you've\n` +
163
+ ` run a Claude Code session in this directory.\n`);
164
+ }
165
+ return 0;
166
+ }
129
167
  // ── export ─────────────────────────────────────────────────────────
130
168
  function cmdExport(args) {
131
169
  const cwd = process.cwd();
@@ -187,17 +225,7 @@ function cmdPush(args) {
187
225
  const session = pickSession(cwd, sessionId);
188
226
  if (!session)
189
227
  return 1;
190
- const { key } = registerProject(cwd);
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);
228
+ const written = exportToTransport(cfg, cwd, session);
201
229
  process.stdout.write(`Pushed ${session.id} → ${written}\n`);
202
230
  return 0;
203
231
  }
@@ -206,25 +234,40 @@ function cmdPull(_args) {
206
234
  const cfg = mustLoadConfig();
207
235
  if (!cfg)
208
236
  return 1;
209
- const reg = loadRegistry();
210
- const projectKeys = listProjectKeys(cfg.syncDir);
211
- if (projectKeys.length === 0) {
237
+ if (listProjectKeys(cfg.syncDir).length === 0) {
212
238
  process.stdout.write(`Nothing to pull — ${cfg.syncDir} is empty.\n`);
213
239
  return 0;
214
240
  }
241
+ const { imported, skipped } = runPull(cfg, {
242
+ onSkip: (msg) => process.stdout.write(` ${msg}\n`),
243
+ });
244
+ process.stdout.write(`\nDone — imported ${imported} session(s), skipped ${skipped}.\n`);
245
+ return 0;
246
+ }
247
+ /** Core of `pull`, shared with `watch`. Scans the transport across every
248
+ * project and imports any session newer (more lines) than the local
249
+ * copy. `onSkip` is called with a human message for each transport
250
+ * project key that has no resolvable local cwd — `pull` prints them;
251
+ * `watch` omits the callback to stay quiet. Genuine imports are always
252
+ * announced by `installCcsync` itself. Idempotent: a session already at
253
+ * or beyond the transport's line count is skipped, so repeated calls
254
+ * (every watch tick) do nothing once converged. */
255
+ function runPull(cfg, opts = {}) {
256
+ const reg = loadRegistry();
257
+ const projectKeys = listProjectKeys(cfg.syncDir);
215
258
  let imported = 0;
216
259
  let skipped = 0;
217
260
  for (const encodedKey of projectKeys) {
218
261
  // We have the encoded form; find the matching raw key in the registry.
219
262
  const rawKey = Object.keys(reg.projects).find((k) => encodeProjectDir(k) === encodedKey);
220
263
  if (!rawKey) {
221
- process.stdout.write(` skip ${encodedKey} (no local project registered for this key)\n`);
264
+ opts.onSkip?.(`skip ${encodedKey} (no local project registered for this key)`);
222
265
  skipped++;
223
266
  continue;
224
267
  }
225
268
  const cwd = lookupCwd(rawKey, reg);
226
269
  if (!cwd) {
227
- process.stdout.write(` skip ${encodedKey} (registered cwds no longer exist on disk)\n`);
270
+ opts.onSkip?.(`skip ${encodedKey} (registered cwds no longer exist on disk)`);
228
271
  skipped++;
229
272
  continue;
230
273
  }
@@ -244,9 +287,114 @@ function cmdPull(_args) {
244
287
  imported++;
245
288
  }
246
289
  }
247
- process.stdout.write(`\nDone imported ${imported} session(s), skipped ${skipped}.\n`);
290
+ return { imported, skipped };
291
+ }
292
+ // ── watch ──────────────────────────────────────────────────────────
293
+ async function cmdWatch(args) {
294
+ const cfg = mustLoadConfig();
295
+ if (!cfg)
296
+ return 1;
297
+ const once = args.includes('--once');
298
+ const pushAll = args.includes('--all');
299
+ let intervalSec = 10;
300
+ const intervalIdx = args.indexOf('--interval');
301
+ if (intervalIdx >= 0) {
302
+ const v = Number(args[intervalIdx + 1]);
303
+ if (!Number.isFinite(v) || v < 2) {
304
+ process.stderr.write('Error: --interval requires a number of seconds >= 2.\n');
305
+ return 1;
306
+ }
307
+ intervalSec = v;
308
+ }
309
+ const first = args[0];
310
+ const sessionId = first && !first.startsWith('-') ? first : undefined;
311
+ const cwd = process.cwd();
312
+ // Register up front so a fresh clone with zero sessions can still
313
+ // RECEIVE peers' work via the pull half of the loop while we watch.
314
+ const { key } = registerProject(cwd);
315
+ if (!once) {
316
+ const pushDesc = sessionId
317
+ ? `session ${sessionId}`
318
+ : pushAll ? 'every changed session' : 'most-recent changed session';
319
+ process.stdout.write(`claude-sync watch — ${cfg.machineName}\n` +
320
+ ` project: ${key}\n` +
321
+ ` cwd: ${cwd}\n` +
322
+ ` syncDir: ${cfg.syncDir}\n` +
323
+ ` every ${intervalSec}s · push ${pushDesc} · pull all projects\n` +
324
+ ` Ctrl-C to stop.\n\n`);
325
+ }
326
+ // sessionId -> mtimeMs at last push. Seeds empty, so the first tick
327
+ // pushes the current state once, then only on subsequent growth.
328
+ const lastPushed = new Map();
329
+ let stopping = false;
330
+ const onSignal = () => { stopping = true; };
331
+ process.on('SIGINT', onSignal);
332
+ process.on('SIGTERM', onSignal);
333
+ try {
334
+ do {
335
+ try {
336
+ watchPushTick(cfg, cwd, { sessionId, pushAll, lastPushed });
337
+ }
338
+ catch (err) {
339
+ process.stderr.write(` ! push error: ${err instanceof Error ? err.message : err}\n`);
340
+ }
341
+ try {
342
+ runPull(cfg);
343
+ }
344
+ catch (err) {
345
+ process.stderr.write(` ! pull error: ${err instanceof Error ? err.message : err}\n`);
346
+ }
347
+ if (once || stopping)
348
+ break;
349
+ await delay(intervalSec * 1000, () => stopping);
350
+ } while (!stopping);
351
+ }
352
+ finally {
353
+ process.off('SIGINT', onSignal);
354
+ process.off('SIGTERM', onSignal);
355
+ }
356
+ if (!once)
357
+ process.stdout.write(`\nStopped.\n`);
248
358
  return 0;
249
359
  }
360
+ /** One push half-cycle for watch: find sessions whose mtime grew since we
361
+ * last pushed them and ship each. Uses the stat-only listing (no line
362
+ * reads) for change detection, only counting lines for the few that
363
+ * actually changed. */
364
+ function watchPushTick(cfg, cwd, state) {
365
+ const stats = listSessionStats(cwd);
366
+ let candidates = stats;
367
+ if (state.sessionId) {
368
+ candidates = stats.filter((s) => s.id === state.sessionId);
369
+ }
370
+ else if (!state.pushAll) {
371
+ // Default: just the active (most-recent) session. `stats` is mtime-desc.
372
+ candidates = stats.slice(0, 1);
373
+ }
374
+ for (const s of candidates) {
375
+ const prev = state.lastPushed.get(s.id);
376
+ if (prev !== undefined && prev >= s.modifiedAt)
377
+ continue; // unchanged since last push
378
+ const lineCount = countSessionLines(s.path);
379
+ exportToTransport(cfg, cwd, { id: s.id, path: s.path, lineCount });
380
+ state.lastPushed.set(s.id, s.modifiedAt);
381
+ process.stdout.write(` ↑ pushed ${s.id} (${lineCount} lines)\n`);
382
+ }
383
+ }
384
+ /** Resolve after `ms`, or early as soon as `shouldStop()` flips true, so
385
+ * Ctrl-C interrupts the inter-tick sleep without waiting out the
386
+ * interval. Polls a coarse 200ms so a `watch` process doesn't busy-spin. */
387
+ function delay(ms, shouldStop) {
388
+ return new Promise((resolve) => {
389
+ const start = Date.now();
390
+ const id = setInterval(() => {
391
+ if (shouldStop() || Date.now() - start >= ms) {
392
+ clearInterval(id);
393
+ resolve();
394
+ }
395
+ }, 200);
396
+ });
397
+ }
250
398
  // ── doctor ─────────────────────────────────────────────────────────
251
399
  function cmdDoctor(_args) {
252
400
  const ok = (m) => { process.stdout.write(` ✓ ${m}\n`); };
@@ -255,8 +403,29 @@ function cmdDoctor(_args) {
255
403
  if (configExists()) {
256
404
  const cfg = loadConfig();
257
405
  ok(`config: ${cfg.machineName} → ${cfg.syncDir}`);
258
- if (!existsSync(cfg.syncDir))
406
+ if (!existsSync(cfg.syncDir)) {
259
407
  warn(`syncDir does not exist: ${cfg.syncDir}`);
408
+ }
409
+ else {
410
+ // Duplicate-machineName footgun: pull self-filters files whose
411
+ // machineName matches ours, so if every file in the transport
412
+ // 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)`);
426
+ }
427
+ }
428
+ }
260
429
  }
261
430
  else {
262
431
  warn(`no config (run \`claude-sync init <syncDir>\`)`);
@@ -286,6 +455,23 @@ function mustLoadConfig() {
286
455
  }
287
456
  return loadConfig();
288
457
  }
458
+ /** 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) {
463
+ const { key } = registerProject(cwd);
464
+ const ccsync = buildCcsync({
465
+ sessionId: session.id,
466
+ projectKey: key,
467
+ originalCwd: cwd,
468
+ machineName: cfg.machineName,
469
+ exportedAt: Date.now(),
470
+ lineCount: session.lineCount,
471
+ jsonl: readSession(session.path),
472
+ });
473
+ return pushToTransport(cfg.syncDir, ccsync);
474
+ }
289
475
  function pickSession(cwd, requestedId) {
290
476
  const sessions = listSessions(cwd);
291
477
  if (sessions.length === 0) {
@@ -321,6 +507,11 @@ function installCcsync(ccsync, explicitCwd, overwrite) {
321
507
  }
322
508
  try {
323
509
  const writtenTo = writeSession(targetCwd, sessionId, ccsync.jsonl, { overwrite });
510
+ // Bind the peer's project key to this local cwd so a later `pull`
511
+ // resolves it without a manual --cwd. This closes the first-contact
512
+ // gap: `import <file> --cwd <path>` now leaves the project registered.
513
+ // Idempotent — `pull` re-imports already register via this path too.
514
+ registerProjectKey(ccsync.projectKey, targetCwd);
324
515
  process.stdout.write(`Imported ${sessionId} from ${ccsync.machineName} → ${writtenTo}\n` +
325
516
  ` (${ccsync.lineCount} lines, project: ${ccsync.projectKey})\n`);
326
517
  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.js CHANGED
@@ -22,7 +22,7 @@
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
26
  const CONFIG_PATH = () => join(syncRoot(), 'config.json');
27
27
  export function configExists() {
28
28
  return existsSync(CONFIG_PATH());
@@ -32,7 +32,7 @@ export function loadConfig() {
32
32
  if (!existsSync(path)) {
33
33
  throw new Error(`No config found at ${path}. Run \`claude-sync init <syncDir>\` first.`);
34
34
  }
35
- const parsed = JSON.parse(readFileSync(path, 'utf-8'));
35
+ const parsed = JSON.parse(stripBom(readFileSync(path, 'utf-8')));
36
36
  if (parsed._schemaVersion !== 1) {
37
37
  throw new Error(`Unsupported config schema version: ${parsed._schemaVersion}`);
38
38
  }