elesync 1.1.2__tar.gz → 1.2.0__tar.gz

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.
Files changed (35) hide show
  1. {elesync-1.1.2 → elesync-1.2.0}/PKG-INFO +60 -5
  2. {elesync-1.1.2 → elesync-1.2.0}/README.md +59 -4
  3. {elesync-1.1.2 → elesync-1.2.0}/elesync/__init__.py +12 -12
  4. {elesync-1.1.2 → elesync-1.2.0}/elesync/cli.py +804 -642
  5. {elesync-1.1.2 → elesync-1.2.0}/elesync/summary.py +4 -1
  6. elesync-1.2.0/elesync/usb.py +620 -0
  7. {elesync-1.1.2 → elesync-1.2.0}/elesync/watch.py +48 -35
  8. {elesync-1.1.2 → elesync-1.2.0}/elesync.egg-info/PKG-INFO +60 -5
  9. {elesync-1.1.2 → elesync-1.2.0}/elesync.egg-info/SOURCES.txt +2 -0
  10. {elesync-1.1.2 → elesync-1.2.0}/pyproject.toml +63 -63
  11. elesync-1.2.0/tests/test_usb.py +386 -0
  12. {elesync-1.1.2 → elesync-1.2.0}/LICENSE +0 -0
  13. {elesync-1.1.2 → elesync-1.2.0}/elesync/conflicts.py +0 -0
  14. {elesync-1.1.2 → elesync-1.2.0}/elesync/crypto.py +0 -0
  15. {elesync-1.1.2 → elesync-1.2.0}/elesync/embeddings.py +0 -0
  16. {elesync-1.1.2 → elesync-1.2.0}/elesync/mcp_server.py +0 -0
  17. {elesync-1.1.2 → elesync-1.2.0}/elesync/models.py +0 -0
  18. {elesync-1.1.2 → elesync-1.2.0}/elesync/normalize.py +0 -0
  19. {elesync-1.1.2 → elesync-1.2.0}/elesync/onboarding.py +0 -0
  20. {elesync-1.1.2 → elesync-1.2.0}/elesync/scopes.py +0 -0
  21. {elesync-1.1.2 → elesync-1.2.0}/elesync/service.py +0 -0
  22. {elesync-1.1.2 → elesync-1.2.0}/elesync/store.py +0 -0
  23. {elesync-1.1.2 → elesync-1.2.0}/elesync.egg-info/dependency_links.txt +0 -0
  24. {elesync-1.1.2 → elesync-1.2.0}/elesync.egg-info/entry_points.txt +0 -0
  25. {elesync-1.1.2 → elesync-1.2.0}/elesync.egg-info/requires.txt +0 -0
  26. {elesync-1.1.2 → elesync-1.2.0}/elesync.egg-info/top_level.txt +0 -0
  27. {elesync-1.1.2 → elesync-1.2.0}/setup.cfg +0 -0
  28. {elesync-1.1.2 → elesync-1.2.0}/tests/test_conflicts.py +0 -0
  29. {elesync-1.1.2 → elesync-1.2.0}/tests/test_encryption.py +0 -0
  30. {elesync-1.1.2 → elesync-1.2.0}/tests/test_scopes.py +0 -0
  31. {elesync-1.1.2 → elesync-1.2.0}/tests/test_semantic.py +0 -0
  32. {elesync-1.1.2 → elesync-1.2.0}/tests/test_service.py +0 -0
  33. {elesync-1.1.2 → elesync-1.2.0}/tests/test_summary.py +0 -0
  34. {elesync-1.1.2 → elesync-1.2.0}/tests/test_vault.py +0 -0
  35. {elesync-1.1.2 → elesync-1.2.0}/tests/test_watch.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: elesync
3
- Version: 1.1.2
3
+ Version: 1.2.0
4
4
  Summary: Local-first, MCP-native unified memory vault — your AI memory as files you own, shared across every model.
5
5
  Author: Alphanymous
6
6
  License: MIT
@@ -44,9 +44,9 @@ Dynamic: license-file
44
44
 
45
45
  # 🐘 EleSync
46
46
 
47
- ### Stop re-explaining yourself to every AI. One memory, every model.
47
+ ### Tired of re-explaining yourself to every AI? I bet you are, that's why we created EleSync, a One command setup memory vault, nicely encrypted, accessible to continue your conversations without repeating yourself to every model.
48
48
 
49
- 🔰 **Not a developer?** Read the [plain-English setup guide](SETUP.md) — no coding knowledge needed, ~10 minutes.
49
+ 🔰 **You're not a developer?** Perfect — EleSync is designed for regular people first. Read the **[plain-English setup guide](SETUP.md)**covers everything from first install to USB vault, step by step. ~10 minutes, no coding knowledge needed.
50
50
 
51
51
  <p align="center">
52
52
  <img src="Elesyncdemo.gif" alt="EleSync demo" width="640">
@@ -84,7 +84,7 @@ pip install "elesync[watch]"
84
84
  ele watch --autostart # runs in the background from now on
85
85
  ```
86
86
 
87
- **Stable at v1.0** — a 134-test suite, CI across Python 3.10–3.14 (including a dev-extras job
87
+ **Stable at v1.2** — a 134-test suite, CI across Python 3.10–3.14 (including a dev-extras job
88
88
  covering encryption and real-model semantic recall) plus ruff lint/format and mypy type-checking,
89
89
  and a public surface (CLI commands, MCP tools, vault layout, export format) you can build on
90
90
  without breakage inside 1.x. See the [CHANGELOG](CHANGELOG.md) for the full history.
@@ -128,7 +128,7 @@ leave open is the wedge here:
128
128
  | Live read **+ write back** | within app | ✗ static file | ✓ |
129
129
  | Infrastructure | crypto/wallet | browser only | ✓ zero — files + SQLite |
130
130
 
131
- "Eco-friendly and easy" = no server, no database to run, no crypto. Markdown + SQLite.
131
+ "Eco-friendly and easy" = no server, no database to run, no blockchain/wallet. Markdown + SQLite.
132
132
 
133
133
  ## Architecture
134
134
 
@@ -388,6 +388,59 @@ ele conflicts
388
388
  `fact`s that look like they're about the same thing but differ — so treat results as *candidates to
389
389
  review*, not verdicts. EleSync only ever **surfaces**; you resolve with `ele forget <id>`.
390
390
 
391
+ ## Portable USB vault (carry your memory anywhere)
392
+
393
+ Plug in a USB drive, run one command, and your encrypted AI memory goes with you everywhere.
394
+ On any machine with Python, `python RUN_ME.py` installs EleSync and connects it to Claude — no
395
+ prior knowledge needed.
396
+
397
+ ```bash
398
+ pip install "elesync[mcp,encryption]"
399
+
400
+ # One-time setup on your USB drive
401
+ ele usb install /Volumes/MyUSB # macOS
402
+ ele usb install E:\\ # Windows
403
+ ele usb install /media/myusb # Linux
404
+ # Enter a passphrase when prompted — this encrypts everything on the drive
405
+
406
+ # Later: import your AI memories onto the drive
407
+ ele --vault /Volumes/MyUSB/EleSyncVault import chatgpt_memory.json --source chatgpt
408
+ ele --vault /Volumes/MyUSB/EleSyncVault import claude_export.json --source claude
409
+ ele --vault /Volumes/MyUSB/EleSyncVault import gemini_memory.json --source gemini
410
+
411
+ # Connect to Claude Desktop (on any machine)
412
+ ele usb attach /Volumes/MyUSB # prompts for passphrase, wires Claude Desktop
413
+ # → Fully quit and reopen Claude Desktop
414
+
415
+ # Before unplugging
416
+ ele usb detach /Volumes/MyUSB # removes Claude Desktop entry
417
+ ele usb eject /Volumes/MyUSB # safe-eject
418
+
419
+ # Other commands
420
+ ele usb list # see all removable drives
421
+ ele usb status /Volumes/MyUSB # check vault health & memory count
422
+ ```
423
+
424
+ **On a new machine** — plug in the drive and run:
425
+
426
+ ```bash
427
+ python /Volumes/MyUSB/RUN_ME.py
428
+ ```
429
+
430
+ That's it. `RUN_ME.py` is a self-contained script the drive carries with it: it installs
431
+ EleSync via pip (if needed) and wires the USB vault into Claude Desktop — no prior knowledge
432
+ of pip or MCP required.
433
+
434
+ **Security model** — USB vaults are *always* encrypted (unlike the main vault where encryption
435
+ is opt-in). Your passphrase is the only thing that unlocks the vault; a lost or stolen drive
436
+ exposed nothing without it. The same XSalsa20-Poly1305 + argon2id encryption used by
437
+ `ele encrypt` is applied automatically at install time.
438
+
439
+ > The USB vault is a standard EleSync vault at `<drive>/EleSyncVault`. You can run any normal
440
+ > `ele` command against it by passing `--vault <drive>/EleSyncVault`. Nothing is synced
441
+ > automatically between the USB vault and your main vault — use `ele export` + `ele import` to
442
+ > move memories between them.
443
+
391
444
  ## Sync across devices
392
445
 
393
446
  Your vault is **just a folder** (`notes/*.md` + a small `vault.json`), so sync it however you
@@ -508,6 +561,8 @@ file into your own vault sidesteps that entirely.
508
561
 
509
562
  ## Roadmap (the honest next 20%)
510
563
 
564
+ <!-- NOTE: USB portable vault landed in v1.2.0 — removed from roadmap -->
565
+
511
566
  1. **Semantic recall** — ✅ landed (optional `[semantic]` extra: local ONNX embeddings,
512
567
  hybrid keyword+vector ranking — see above). Next: semantic *dedup* (near-duplicate
513
568
  detection), and pgvector/sqlite-vec if a vault ever outgrows brute-force cosine.
@@ -4,9 +4,9 @@
4
4
 
5
5
  # 🐘 EleSync
6
6
 
7
- ### Stop re-explaining yourself to every AI. One memory, every model.
7
+ ### Tired of re-explaining yourself to every AI? I bet you are, that's why we created EleSync, a One command setup memory vault, nicely encrypted, accessible to continue your conversations without repeating yourself to every model.
8
8
 
9
- 🔰 **Not a developer?** Read the [plain-English setup guide](SETUP.md) — no coding knowledge needed, ~10 minutes.
9
+ 🔰 **You're not a developer?** Perfect — EleSync is designed for regular people first. Read the **[plain-English setup guide](SETUP.md)**covers everything from first install to USB vault, step by step. ~10 minutes, no coding knowledge needed.
10
10
 
11
11
  <p align="center">
12
12
  <img src="Elesyncdemo.gif" alt="EleSync demo" width="640">
@@ -44,7 +44,7 @@ pip install "elesync[watch]"
44
44
  ele watch --autostart # runs in the background from now on
45
45
  ```
46
46
 
47
- **Stable at v1.0** — a 134-test suite, CI across Python 3.10–3.14 (including a dev-extras job
47
+ **Stable at v1.2** — a 134-test suite, CI across Python 3.10–3.14 (including a dev-extras job
48
48
  covering encryption and real-model semantic recall) plus ruff lint/format and mypy type-checking,
49
49
  and a public surface (CLI commands, MCP tools, vault layout, export format) you can build on
50
50
  without breakage inside 1.x. See the [CHANGELOG](CHANGELOG.md) for the full history.
@@ -88,7 +88,7 @@ leave open is the wedge here:
88
88
  | Live read **+ write back** | within app | ✗ static file | ✓ |
89
89
  | Infrastructure | crypto/wallet | browser only | ✓ zero — files + SQLite |
90
90
 
91
- "Eco-friendly and easy" = no server, no database to run, no crypto. Markdown + SQLite.
91
+ "Eco-friendly and easy" = no server, no database to run, no blockchain/wallet. Markdown + SQLite.
92
92
 
93
93
  ## Architecture
94
94
 
@@ -348,6 +348,59 @@ ele conflicts
348
348
  `fact`s that look like they're about the same thing but differ — so treat results as *candidates to
349
349
  review*, not verdicts. EleSync only ever **surfaces**; you resolve with `ele forget <id>`.
350
350
 
351
+ ## Portable USB vault (carry your memory anywhere)
352
+
353
+ Plug in a USB drive, run one command, and your encrypted AI memory goes with you everywhere.
354
+ On any machine with Python, `python RUN_ME.py` installs EleSync and connects it to Claude — no
355
+ prior knowledge needed.
356
+
357
+ ```bash
358
+ pip install "elesync[mcp,encryption]"
359
+
360
+ # One-time setup on your USB drive
361
+ ele usb install /Volumes/MyUSB # macOS
362
+ ele usb install E:\\ # Windows
363
+ ele usb install /media/myusb # Linux
364
+ # Enter a passphrase when prompted — this encrypts everything on the drive
365
+
366
+ # Later: import your AI memories onto the drive
367
+ ele --vault /Volumes/MyUSB/EleSyncVault import chatgpt_memory.json --source chatgpt
368
+ ele --vault /Volumes/MyUSB/EleSyncVault import claude_export.json --source claude
369
+ ele --vault /Volumes/MyUSB/EleSyncVault import gemini_memory.json --source gemini
370
+
371
+ # Connect to Claude Desktop (on any machine)
372
+ ele usb attach /Volumes/MyUSB # prompts for passphrase, wires Claude Desktop
373
+ # → Fully quit and reopen Claude Desktop
374
+
375
+ # Before unplugging
376
+ ele usb detach /Volumes/MyUSB # removes Claude Desktop entry
377
+ ele usb eject /Volumes/MyUSB # safe-eject
378
+
379
+ # Other commands
380
+ ele usb list # see all removable drives
381
+ ele usb status /Volumes/MyUSB # check vault health & memory count
382
+ ```
383
+
384
+ **On a new machine** — plug in the drive and run:
385
+
386
+ ```bash
387
+ python /Volumes/MyUSB/RUN_ME.py
388
+ ```
389
+
390
+ That's it. `RUN_ME.py` is a self-contained script the drive carries with it: it installs
391
+ EleSync via pip (if needed) and wires the USB vault into Claude Desktop — no prior knowledge
392
+ of pip or MCP required.
393
+
394
+ **Security model** — USB vaults are *always* encrypted (unlike the main vault where encryption
395
+ is opt-in). Your passphrase is the only thing that unlocks the vault; a lost or stolen drive
396
+ exposed nothing without it. The same XSalsa20-Poly1305 + argon2id encryption used by
397
+ `ele encrypt` is applied automatically at install time.
398
+
399
+ > The USB vault is a standard EleSync vault at `<drive>/EleSyncVault`. You can run any normal
400
+ > `ele` command against it by passing `--vault <drive>/EleSyncVault`. Nothing is synced
401
+ > automatically between the USB vault and your main vault — use `ele export` + `ele import` to
402
+ > move memories between them.
403
+
351
404
  ## Sync across devices
352
405
 
353
406
  Your vault is **just a folder** (`notes/*.md` + a small `vault.json`), so sync it however you
@@ -468,6 +521,8 @@ file into your own vault sidesteps that entirely.
468
521
 
469
522
  ## Roadmap (the honest next 20%)
470
523
 
524
+ <!-- NOTE: USB portable vault landed in v1.2.0 — removed from roadmap -->
525
+
471
526
  1. **Semantic recall** — ✅ landed (optional `[semantic]` extra: local ONNX embeddings,
472
527
  hybrid keyword+vector ranking — see above). Next: semantic *dedup* (near-duplicate
473
528
  detection), and pgvector/sqlite-vec if a vault ever outgrows brute-force cosine.
@@ -1,12 +1,12 @@
1
- """elesync — a local-first, MCP-native unified elesync.
2
-
3
- One vault on your disk. Every AI reads from and writes to it over MCP.
4
- """
5
-
6
- from . import normalize
7
- from .models import MEMORY_TYPES, MemoryItem
8
- from .service import MemoryService
9
- from .store import MemoryStore
10
-
11
- __all__ = ["MemoryItem", "MEMORY_TYPES", "MemoryStore", "MemoryService", "normalize"]
12
- __version__ = "1.1.2"
1
+ """elesync — a local-first, MCP-native unified elesync.
2
+
3
+ One vault on your disk. Every AI reads from and writes to it over MCP.
4
+ """
5
+
6
+ from . import normalize
7
+ from .models import MEMORY_TYPES, MemoryItem
8
+ from .service import MemoryService
9
+ from .store import MemoryStore
10
+
11
+ __all__ = ["MemoryItem", "MEMORY_TYPES", "MemoryStore", "MemoryService", "normalize"]
12
+ __version__ = "1.2.0"