@wuyaos/pi-sync
WebDAV archive backup and restore for Pi agent data, shared skills, and per-project sessions
Package details
Install @wuyaos/pi-sync from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@wuyaos/pi-sync- Package
@wuyaos/pi-sync- Version
1.2.2- Published
- Aug 21, 2026
- Downloads
- 487/mo · 285/wk
- Author
- wuyaos
- License
- MIT
- Types
- extension
- Size
- 111.5 KB
- Dependencies
- 0 dependencies · 2 peers
Pi manifest JSON
{
"extensions": [
"./extensions/sync"
],
"image": "https://img.shields.io/badge/pi-sync-WebDAV-blue"
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-sync
English | 简体中文
WebDAV archive backup and restore for Pi.
pi-sync creates versioned .tar.xz archives for Pi agent data, shared skills, and project sessions. It is intentionally archive-only: there are no live uploads, per-turn hooks, interval synchronization, or multi-machine merge conflicts.
Features
- Back up
~/.pi/agentdirectly without a staging copy - Exclude reinstallable or transient trees through a configurable blacklist
- Keep
~/.agents/skillsin an independent, optional archive - Archive sessions separately per project
- Automatically archive the current project when Pi exits
- Back up or restore every enabled category in one action
- English and Simplified Chinese
/syncmenus - Stream WebDAV uploads/downloads instead of buffering whole archives in memory
- Reject unsafe archive paths, symbolic links, special nodes, and unsafe restore destinations
Install
Install the package from npm:
pi install npm:@wuyaos/pi-sync
Or install the complete monorepo:
pi install git:github.com/wuyaos/pi-packages
Restart Pi or run /reload after installation.
Usage
Run /sync. The interactive menu contains:
- Back Up All / Restore All (latest)
- Upload or restore Pi Backup
- Upload or restore Skills Backup
- Upload or restore Sessions Archive
- Configure backup settings
- Switch the menu between English and Chinese
The first run opens a WebDAV setup wizard when the URL, username, or password is missing.
Archive model
Pi backup
The Pi archive packs ~/.pi/agent directly. Its default blacklist is:
["npm", "git", "sessions", "state", "tmp", "webui-rpc-supervisor", "vstack"]
This keeps configuration and extension state while excluding installed package sources, temporary extension caches, sessions (archived separately), workspace history, background-task state, and Web UI RPC runtime sockets. config/sync.json is included unless explicitly blacklisted.
Archive name:
backup/pi/pi_agent_<platform>_<timestamp>.tar.xz
Shared skills backup
~/.agents/skills is stored in a separate archive and is disabled by default.
backup/skills/agent_skills_<timestamp>.tar.xz
Session archives
Sessions are archived by project. There is no live synchronization or _latest.json marker.
backup/sessions/<projectDir>/sessions_<platform>_<timestamp>.tar.xz
Project selection supports:
- Whitelist: only listed projects are archived; an empty list means none.
- Blacklist: listed projects are excluded; an empty list means all projects.
When backupOnExit is enabled, Pi archives the current allowed project during session_shutdown. Manual session backup remains available from /sync.
WebDAV layout
<webdavUrl>/
└── backup/
├── pi/
│ └── pi_agent_<platform>_<timestamp>.tar.xz
├── skills/
│ └── agent_skills_<timestamp>.tar.xz
└── sessions/
└── <projectDir>/
└── sessions_<platform>_<timestamp>.tar.xz
maxBackups is enforced independently in each backup directory. 0 keeps every archive.
Configuration
Configuration is stored at ~/.pi/agent/config/sync.json:
{
"webdavUrl": "https://example.com/dav/pi",
"webdavUser": "user",
"webdavPass": "$PI_WEBDAV_PASS",
"language": "en",
"backupProviders": true,
"backupSessions": true,
"backupAgentSkills": false,
"piExcludePaths": ["npm", "git", "sessions", "state", "tmp", "webui-rpc-supervisor", "vstack"],
"backupOnExit": true,
"sessionProjectMode": "blacklist",
"sessionProjects": [],
"maxBackups": 10
}
The password may reference an environment variable ($PI_WEBDAV_PASS). When language is absent, pi-sync uses settings.json → piSwitch.language and falls back to English.
Restore behavior and safety
- Every archive path is checked for absolute paths and traversal.
- Symlinks and non-regular filesystem nodes are rejected before extraction.
- Archives are extracted to a temporary directory before merging.
- Restore refuses symbolic links or type conflicts in destination paths.
- Pi restore only touches files present in the archive; excluded directories remain unchanged.
- Skills restore moves the existing
~/.agents/skillsto a timestamped backup first. - Session restore merges files into
~/.pi/agent/sessions. - Pi restore shows a plan and offers
/reloadafterward.
Treat archives as sensitive: Pi backups may contain WebDAV credentials, API keys, provider settings, and other secrets.
New Windows machine
pi-bootstrap.ps1 downloads the latest archive from backup/pi/ and merges it into %USERPROFILE%\.pi\agent:
Trusted archives only: this bootstrap helper does not perform pi-sync's TypeScript path and link validation. Use
/syncrestore for normal recovery, and use the script only with a trusted WebDAV endpoint and archive.
$env:PI_WEBDAV_URL = "https://example.com/dav/pi"
$env:PI_WEBDAV_USER = "user"
$env:PI_WEBDAV_PASS = "app-password"
.\pi-bootstrap.ps1
The script is intended for trusted archives and new-machine bootstrap. Install/update packages afterward so excluded npm/ and git/ trees are rebuilt.
Troubleshooting
| Symptom | Fix |
|---|---|
| HTTP 401 / 403 | Verify the WebDAV URL and use an app-specific password. |
| PROPFIND fails | Ensure the server supports WebDAV PROPFIND with Depth: 1. |
| tar errors | Install a tar implementation with xz support. |
| Exit backup is skipped | Check backupOnExit, backupSessions, project mode/list, and WebDAV credentials. |
| Packages missing after Pi restore | Re-run pi update --extensions or reinstall packages from settings.json. |
Development
cd /mnt/d/work/project/person/pi-packages
node --import tsx --test pi-sync/extensions/sync/*.test.ts
npm run typecheck
The monorepo typecheck may report unrelated errors from other packages; pi-sync-specific errors are identified by paths beginning with pi-sync/.
WebDAV smoke test
The committed smoke harness creates uniquely named temporary Pi and session archives, uploads/list/downloads/validates them, then deletes them. It never prints credentials. It is intentionally write-protected:
cd /mnt/d/work/project/person/pi-packages
PI_SYNC_SMOKE_WRITE=1 bash --noprofile --norc pi-sync/scripts/verify.sh
verify.sh also runs the unit tests, strict pi-sync typecheck, extension-load check, package whitelist check, and diff check. It uses ~/.pi/agent/config/sync.json; optionally set PI_SYNC_SMOKE_PROJECT to a permitted local session directory name (such as --home-user--).
Changelog
v1.2.0
- Replace live synchronization with versioned archive-only backup/restore
- Add direct Pi-home tar backup with blacklist exclusions
- Separate Pi, shared skills, and per-project session archives
- Add exit-time session archiving and manual all-category backup/restore
- Add English/Chinese menu switching
- Add streamed WebDAV transfer, config caching, and archive/restore safety checks
- Remove live sync, interval sync, custom-path, memory, and legacy monolithic code
v1.1.1
- Cache WebDAV directory creation and loaded configuration to reduce repeated I/O
v1.0.0
- Initial WebDAV backup/restore release
License
MIT — see LICENSE.