{"_id":"@andrewjacop/pi-port","_rev":"7-88d70ec43e4fd1af1ef5a352bd7a74d3","name":"@andrewjacop/pi-port","dist-tags":{"latest":"0.2.5"},"versions":{"0.1.0":{"name":"@andrewjacop/pi-port","version":"0.1.0","keywords":["pi-package"],"author":{"name":"Andrew Jacop"},"license":"MIT","_id":"@andrewjacop/pi-port@0.1.0","maintainers":[{"name":"andrewjacop","email":"andrewjacop@ymail.com"}],"homepage":"https://github.com/andrewjacop/pi-port#readme","bugs":{"url":"https://github.com/andrewjacop/pi-port/issues"},"pi":{"extensions":["extensions"]},"dist":{"shasum":"49202ee09c14c362fd71a4278ab630be6eb8ba9c","tarball":"https://registry.npmjs.org/@andrewjacop/pi-port/-/pi-port-0.1.0.tgz","fileCount":10,"integrity":"sha512-s8K4GaTZaNrksv7W5BUUoYeGrSQh9HuKqGL/obFefSkP4O8AUF6JW9q2D4jY84JQmnHWd4J9Oz7qJ7PrHexDJQ==","signatures":[{"sig":"MEUCICKJLmFGLkXfR5oulBOsESnS0e2S4KRqkdzPX/z9Q7r9AiEA72dvS5xooEElvK198E70v835vt6IuZpQ+YSggMW857I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35673},"main":"extensions/pi-port.ts","gitHead":"c365fb939aa2ed291b2c9b9f721181a1de021137","scripts":{"test":"node --test --import tsx 'test/**/*.test.ts'"},"_npmUser":{"name":"andrewjacop","email":"andrewjacop@ymail.com"},"repository":{"url":"git+https://github.com/andrewjacop/pi-port.git","type":"git"},"_npmVersion":"11.16.0","description":"Export and import pi agent configuration between machines","directories":{},"_nodeVersion":"26.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","typescript":"^6.0.3","@types/node":"^22.0.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-port_0.1.0_1783324816110_0.3100857332028808","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@andrewjacop/pi-port","version":"0.2.0","keywords":["pi-package"],"author":{"name":"Andrew Jacop"},"license":"MIT","_id":"@andrewjacop/pi-port@0.2.0","maintainers":[{"name":"andrewjacop","email":"andrewjacop@ymail.com"}],"homepage":"https://github.com/andrewjacop/pi-port#readme","bugs":{"url":"https://github.com/andrewjacop/pi-port/issues"},"pi":{"extensions":["extensions"]},"dist":{"shasum":"d855b552f16287175eb37e9b2c22d37cc1a858eb","tarball":"https://registry.npmjs.org/@andrewjacop/pi-port/-/pi-port-0.2.0.tgz","fileCount":19,"integrity":"sha512-/+fwHyLkYVsB9eQrQiTiaQ+T0dPm5799bV7sGTtE5eY9BjEJj6mhbj0a2dALSatyZlNkf0lMvufSNIN2oCKwHQ==","signatures":[{"sig":"MEYCIQDE3lRIJ9AdzmQKLDiSvV7AcXyqyuahEcEWStpyFNYxWgIhAMDsMr9sDxBGpIOZO3j3THxFboLrvzx9BGPln1cgehtI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110727},"main":"extensions/pi-port.ts","gitHead":"5eee414aeb5105fc1b8c03e38dd3516f558ab588","scripts":{"test":"node --test --import tsx \"test/**/*.test.ts\""},"_npmUser":{"name":"andrewjacop","email":"andrewjacop@ymail.com"},"repository":{"url":"git+https://github.com/andrewjacop/pi-port.git","type":"git"},"_npmVersion":"11.13.0","description":"Export, import, and cloud-sync your pi agent configuration and sessions between machines","directories":{},"_nodeVersion":"26.1.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","typescript":"^6.0.3","@types/node":"^22.0.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-port_0.2.0_1787081123234_0.6022679671786093","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@andrewjacop/pi-port","version":"0.2.1","keywords":["pi-package"],"author":{"name":"Andrew Jacop"},"license":"MIT","_id":"@andrewjacop/pi-port@0.2.1","maintainers":[{"name":"andrewjacop","email":"andrewjacop@ymail.com"}],"homepage":"https://github.com/andrewjacop/pi-port#readme","bugs":{"url":"https://github.com/andrewjacop/pi-port/issues"},"pi":{"extensions":["extensions"]},"dist":{"shasum":"6185dac4202c976a0ce8e3031ef50817148417d2","tarball":"https://registry.npmjs.org/@andrewjacop/pi-port/-/pi-port-0.2.1.tgz","fileCount":19,"integrity":"sha512-jQDSTUjJeoT/ewB2UzGYBfep+0b8EXRGqxK+TAPQGgAzsZg1DVxo4eAdvbdCa6yR9/jgMqdJXp9qFbEN8VPuxA==","signatures":[{"sig":"MEYCIQCtjyC5MoRX5HmERK0lxPk6UJSBloHi+C2scVeVmshWLgIhAO9li5y7Hf+d6Vphy8W/CUI61ft9zbOqc6t6dolAdtYt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114261},"main":"extensions/pi-port.ts","gitHead":"b5acc34d0b204732687a83f4b5e5854a690c3cae","scripts":{"test":"node --test --import tsx \"test/**/*.test.ts\""},"_npmUser":{"name":"andrewjacop","email":"andrewjacop@ymail.com"},"repository":{"url":"git+https://github.com/andrewjacop/pi-port.git","type":"git"},"_npmVersion":"11.13.0","description":"Export, import, and cloud-sync your pi agent configuration and sessions between machines","directories":{},"_nodeVersion":"26.1.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","typescript":"^6.0.3","@types/node":"^22.0.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-port_0.2.1_1787082700747_0.36441161734546235","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@andrewjacop/pi-port","version":"0.2.2","keywords":["pi-package"],"author":{"name":"Andrew Jacop"},"license":"MIT","_id":"@andrewjacop/pi-port@0.2.2","maintainers":[{"name":"andrewjacop","email":"andrewjacop@ymail.com"}],"homepage":"https://github.com/andrewjacop/pi-port#readme","bugs":{"url":"https://github.com/andrewjacop/pi-port/issues"},"pi":{"extensions":["extensions"]},"dist":{"shasum":"22961f27544ded8f5b00ce8c722d46fe689c6c36","tarball":"https://registry.npmjs.org/@andrewjacop/pi-port/-/pi-port-0.2.2.tgz","fileCount":19,"integrity":"sha512-6MMGZmaIjbR1fR+Tk5rKSwebaq4dgHz5l3CD8fjA5LoxCL6EbmsF64kF1lvj6CTjZ7BNl8Desli5n94D+/fj3g==","signatures":[{"sig":"MEUCIF1F1XCiZM+A8/aidN/ieRtCOzHlTVP1vJ7SzQJeHNUVAiEAzJ8cTpXZsg7eXd0QTZt3juhE2NYIjBxy8vZIFugaW0A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115312},"main":"extensions/pi-port.ts","gitHead":"a79683e71510e06d53d97efedb8b4a5026bbd4aa","scripts":{"test":"node --test --import tsx \"test/**/*.test.ts\""},"_npmUser":{"name":"andrewjacop","email":"andrewjacop@ymail.com"},"repository":{"url":"git+https://github.com/andrewjacop/pi-port.git","type":"git"},"_npmVersion":"11.13.0","description":"Export, import, and cloud-sync your pi agent configuration and sessions between machines","directories":{},"_nodeVersion":"26.1.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","typescript":"^6.0.3","@types/node":"^22.0.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-port_0.2.2_1787156491437_0.5108728755343075","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@andrewjacop/pi-port","version":"0.2.3","keywords":["pi-package"],"author":{"name":"Andrew Jacop"},"license":"MIT","_id":"@andrewjacop/pi-port@0.2.3","maintainers":[{"name":"andrewjacop","email":"andrewjacop@ymail.com"}],"homepage":"https://github.com/andrewjacop/pi-port#readme","bugs":{"url":"https://github.com/andrewjacop/pi-port/issues"},"pi":{"extensions":["extensions"]},"dist":{"shasum":"dc49ec8fd18cd305be0474bf98170d33f3b9dfce","tarball":"https://registry.npmjs.org/@andrewjacop/pi-port/-/pi-port-0.2.3.tgz","fileCount":19,"integrity":"sha512-2ma+3MgEWeYzEM0YDZ5jBSn8ER8RfixLGEdt5nJiCsPVLyYOhTRJjXf1jF7XWnf2YB81W/wu5bSJkuWCTShlXw==","signatures":[{"sig":"MEYCIQDM0PofoRllKtPpA+3E/LQA1vpTeWH2ShRRaCVHRrxobQIhAId7V4XsOGK1VQk9nI6/eYsP1i0dGDLtqN7AgWKQu58n","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116605},"main":"extensions/pi-port.ts","gitHead":"756852781c75b8062bf59506f450a4a9e91031bc","scripts":{"test":"node --test --import tsx \"test/**/*.test.ts\""},"_npmUser":{"name":"andrewjacop","email":"andrewjacop@ymail.com"},"repository":{"url":"git+https://github.com/andrewjacop/pi-port.git","type":"git"},"_npmVersion":"11.13.0","description":"Export, import, and cloud-sync your pi agent configuration and sessions between machines","directories":{},"_nodeVersion":"26.1.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","typescript":"^6.0.3","@types/node":"^22.0.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-port_0.2.3_1788124059449_0.13165993629158623","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@andrewjacop/pi-port","version":"0.2.4","keywords":["pi-package"],"author":{"name":"Andrew Jacop"},"license":"MIT","_id":"@andrewjacop/pi-port@0.2.4","maintainers":[{"name":"andrewjacop","email":"andrewjacop@ymail.com"}],"homepage":"https://github.com/andrewjacop/pi-port#readme","bugs":{"url":"https://github.com/andrewjacop/pi-port/issues"},"pi":{"extensions":["extensions"]},"dist":{"shasum":"bf7ad92f23154bb0fa96019e1d8def255c6bc6d7","tarball":"https://registry.npmjs.org/@andrewjacop/pi-port/-/pi-port-0.2.4.tgz","fileCount":19,"integrity":"sha512-WrrYr7KSX+Lm2LX3eqN74aJSv3CamvAyOzwwOe/lMWT/dx24xD/tszBTYsaChIpLFNMgPhkMm5Z4w0tIBfbyrw==","signatures":[{"sig":"MEQCIHIlbGyUEY0Iq2dK+89DCGAJFl2nnsSDoThSYFOh5Ov9AiBNr5t1sp3Im29IXfe2Bz2usHl3h43O+MKWMC8wBskinQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":117973},"main":"extensions/pi-port.ts","gitHead":"9ad1cd79f9271364ab9b70720df5ee6aa13428ac","scripts":{"test":"node --test --import tsx \"test/**/*.test.ts\""},"_npmUser":{"name":"andrewjacop","email":"andrewjacop@ymail.com"},"repository":{"url":"git+https://github.com/andrewjacop/pi-port.git","type":"git"},"_npmVersion":"11.13.0","description":"Export, import, and cloud-sync your pi agent configuration and sessions between machines","directories":{},"_nodeVersion":"26.1.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","typescript":"^6.0.3","@types/node":"^22.0.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-port_0.2.4_1788124666097_0.66792098947501","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@andrewjacop/pi-port","version":"0.2.5","description":"Export, import, and cloud-sync your pi agent configuration and sessions between machines","keywords":["pi-package"],"license":"MIT","author":{"name":"Andrew Jacop"},"repository":{"type":"git","url":"git+https://github.com/andrewjacop/pi-port.git"},"homepage":"https://github.com/andrewjacop/pi-port#readme","main":"extensions/pi-port.ts","publishConfig":{"access":"public"},"scripts":{"test":"node --test --import tsx \"test/**/*.test.ts\""},"pi":{"extensions":["extensions"]},"peerDependencies":{"@earendil-works/pi-coding-agent":"*","typebox":"*"},"devDependencies":{"@types/node":"^22.0.0","tsx":"^4.19.0","typescript":"^6.0.3"},"gitHead":"e89e21768b8e7691fd62153ad35c8273f7e406fc","_id":"@andrewjacop/pi-port@0.2.5","bugs":{"url":"https://github.com/andrewjacop/pi-port/issues"},"_nodeVersion":"26.1.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-53dZlxF69v10hZjlZClkieUP4koBZQZpONCKLIBa2qiuXamokiWDFtBK4f9lZ/vPDtQ+HXV8LnZRjkf2zqz0Vw==","shasum":"b82c556a207a7bdca7a79b0146729086936b1958","tarball":"https://registry.npmjs.org/@andrewjacop/pi-port/-/pi-port-0.2.5.tgz","fileCount":19,"unpackedSize":120911,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC6rhNgmmq0xhNY+woMjscuogG683Iy1VtDR1R6PwUGcwIhAPmuPb4FnXq0/NDhU6ignyVXVkdvTfvugGR6vcQ9ddLn"}]},"_npmUser":{"name":"andrewjacop","email":"andrewjacop@ymail.com"},"directories":{},"maintainers":[{"name":"andrewjacop","email":"andrewjacop@ymail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-port_0.2.5_1788126565338_0.6579203890699161"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-06T08:00:15.933Z","modified":"2026-08-30T21:49:25.632Z","0.1.0":"2026-07-06T08:00:16.248Z","0.2.0":"2026-08-18T19:25:23.366Z","0.2.1":"2026-08-18T19:51:40.933Z","0.2.2":"2026-08-19T16:21:31.604Z","0.2.3":"2026-08-30T21:07:39.569Z","0.2.4":"2026-08-30T21:17:46.266Z","0.2.5":"2026-08-30T21:49:25.480Z"},"bugs":{"url":"https://github.com/andrewjacop/pi-port/issues"},"author":{"name":"Andrew Jacop"},"license":"MIT","homepage":"https://github.com/andrewjacop/pi-port#readme","keywords":["pi-package"],"repository":{"type":"git","url":"git+https://github.com/andrewjacop/pi-port.git"},"description":"Export, import, and cloud-sync your pi agent configuration and sessions between machines","maintainers":[{"name":"andrewjacop","email":"andrewjacop@ymail.com"}],"readme":"# Pi Port\n\nMove your [pi](https://pi.dev) agent setup between machines — two ways:\n\n- **Local archive** — `/pi-port-local-export` packs a portable `.pi-backup` file you carry yourself.\n- **Cloud sync** — `/pi-port-sync-conf` and `/pi-port-sync-sessions` sync your global config and per-project sessions through storage **you already own** (S3, SFTP, WebDAV, a private GitHub repo, or a local/synced folder) via the [`vsync`](https://www.npmjs.com/package/vasari-sync) CLI.\n\nThe npm package cache (`~/.pi/agent/npm/`, often 400MB+) is **never copied**: packages are recorded as a list in `settings.json` and reinstalled automatically on the target's first `pi` run. A typical backup is under 10MB.\n\n## Install\n\n```bash\npi install npm:@andrewjacop/pi-port\n# or\npi install git:github.com/andrewjacop/pi-port\n```\n\nAll commands load automatically.\n\n**Cloud sync prerequisite:** [`vsync`](https://www.npmjs.com/package/vasari-sync) ≥ 0.6.3 on your PATH:\n\n```bash\nnpm install -g vasari-sync\n```\n\npi-port keeps its own vsync config (`~/.pi/agent/pi-port-vsync.json`, passed via `vsync --config` on every call). If you already use vsync for your own projects, pi-port never reads or writes your `~/.vsync/config.json` — the two installations are fully isolated.\n\n## Usage\n\n### Local export\n\n```\n/pi-port-local-export [path]\n```\n\nInteractive wizard: resolves an output path (defaults to `~/pi-backups/pi-backup-<timestamp>.pi-backup`, remembers your last location), auto-detects which sections exist, and asks whether to include each one. `settings` is always included; `auth` (API keys) warns when toggled on.\n\n### Local import\n\n```\n/pi-port-local-import [path]\n```\n\nReads the archive's manifest, validates format and checksums, then walks you through selecting which sections to restore. Absolute paths under the source machine's home are automatically rewritten to the target home (e.g. `/Users/alice/...` → `/home/bob/...`). Paths outside the source home are left untouched. Before overwriting `settings.json`, the current file is backed up to `settings.json.preimport.bak`.\n\n### Cloud setup\n\n```\n/pi-port-setup\n```\n\nOne-time-per-machine backend configuration. Picks a backend (s3, sftp, webdav, github-repo, local-fs), prompts for its fields, and lets vsync test the connection — a failed test saves nothing. Secrets are passed to vsync via environment variables only; pi-port never persists them.\n\n**GitHub repo + `gh` CLI:** if the GitHub CLI is installed and authenticated, setup is nearly automatic — the repo owner is offered from your gh login (one keypress to accept), the repo field becomes a picker listing your actual repos (private ones marked), and the token can be left blank (vsync reuses the gh login). Without gh, everything falls back to typed input.\n\n### Config sync\n\n```\n/pi-port-sync-conf\n```\n\nBidirectional sync of the global pi config: `settings.json`, `keybindings.json`, `trust.json`, `skills/`, `prompts/`, `themes/`. The staging manifest is re-derived from the backend on every run, so files another machine pushed after this machine last synced are seen. Diff-first — shows exactly what differs (including files staged by an interrupted earlier run but never pushed), then asks the direction:\n\n- **Pull** — remote changes are applied with a `.preimport.bak` backup of everything overwritten; `settings.json` is *merged* over local (machine-local package paths are dropped), and paths are remapped between homes when they differ.\n- **Push** — local config is staged (`lastChangelogVersion` and machine-local package paths stripped), scanned for secrets, then uploaded.\n\n### Session sync\n\n```\n/pi-port-sync-sessions\n```\n\nSyncs sessions **for the project pi is opened in**. Because pi stores sessions under machine-specific absolute paths, each project gets a short **label** you choose once per project (suggested from the folder name); the label — not the path — is what travels through the cloud. First run in a project asks for its label; every other machine just works.\n\nSessions are diffed by session id, so nothing is duplicated and the usual flow is: work on machine A → push; sit down at machine B → pull → A's sessions appear in `/resume` immediately. A session changed on both machines (rare) resolves last-edited-wins. The diff is gated by the backend manifest (rebuilt from the cloud on every run), not by the local staging copy — a session counts as synced only once it is actually on the backend, so an interrupted or failed push can never silently masquerade as “already synced” on a later run.\n\nWhen the two sides differ you pick a direction:\n\n- **Push** — upload local-only and locally-newer sessions.\n- **Pull** — download remote-only and remotely-newer sessions.\n- **Reconcile** — both ways at once, newest-wins per session: pushes what's local-new/newer, pulls what's remote-new/newer. One keypress instead of two rounds.\n\n### What syncs where\n\n| | Local archive | Cloud sync |\n|---|---|---|\n| settings, keybindings, trust, skills, prompts, themes | ✅ | ✅ |\n| auth (API keys) | ⚠️ opt-in | ❌ never |\n| git packages, bin, memory, projects-memory, sessions | ✅ opt-in | sessions only (per project) |\n\n## Backup format\n\nA `.pi-backup` file is a gzip-compressed tar containing:\n\n```\nmanifest.json        # metadata, source machine, section list, sha256 checksums\nsettings.tar         # one inner tar per exported section\ntrust.tar\nskills.tar\n...\n```\n\n`manifest.json`:\n\n```json\n{\n  \"format\": \"pi-backup\",\n  \"version\": 1,\n  \"createdAt\": \"2026-07-06T09:55:00Z\",\n  \"source\": { \"os\": \"darwin\", \"username\": \"alice\", \"home\": \"/Users/alice\", \"hostname\": \"macbook\" },\n  \"sections\": [\"settings\", \"trust\", \"skills\"],\n  \"checksums\": { \"settings.tar\": \"sha256:...\" },\n  \"exportedBy\": \"pi-port@0.2.0\"\n}\n```\n\nThe format is versioned. Importing a backup made by a newer Pi Port than you have installed fails with a clear upgrade message.\n\n## Sections\n\n| Section | Source | Default in export |\n|---------|--------|-------------------|\n| `settings` | `settings.json` | ✅ always |\n| `auth` | `auth.json` | ⚠️ opt-in (contains API keys) |\n| `trust` | `trust.json` | ✅ |\n| `skills` | `skills/` | ✅ |\n| `git-packages` | `git/` | ✅ |\n| `bin` | `bin/` | ✅ |\n| `keybindings` | `keybindings.json` | ✅ |\n| `prompts` | `prompts/` | ✅ |\n| `themes` | `themes/` | ✅ |\n| `memory` | `pi-hermes-memory/` | ❌ opt-in (large) |\n| `projects-memory` | `projects-memory/` | ❌ opt-in |\n| `sessions` | `sessions/` | ❌ opt-in (large) |\n\n## Security\n\n- `auth.json` contains your API keys in plaintext (same as pi stores them). Export warns twice; import defaults to including it but asks explicitly. Cloud sync never touches it.\n- Backups are written with mode `0600`.\n- Checksums are verified on import; mismatches are reported.\n- Cloud sync pushes run a local secret scan (PEM keys, gh tokens, sk- keys, credential assignments); hits ask per file and are never remembered.\n- Cloud-sync secrets (backend credentials) are passed to vsync via environment variables only — pi-port never persists them anywhere.\n- **Cloud sync stores your sessions and config in plaintext in your own backend.** Use a private backend. Sessions can contain anything that appeared in them — treat the backend as sensitive.\n- No telemetry.\n\n## Platform support\n\n- **Cloud sync:** macOS, Linux, Windows (drives the `vsync` CLI).\n- **Local archive:** macOS and Linux (uses the system `tar` binary). Windows local export/import is not yet supported.\n\n## Development\n\n```bash\ngit clone https://github.com/andrewjacop/pi-port\ncd pi-port\nnpm install\nnpm test          # 57 unit tests (paths, staging, scan, vsync wrapper, remap)\nnpx tsc --noEmit  # typecheck\n```\n\nQuick test without installing:\n\n```bash\npi -e ./extensions/pi-port.ts\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}