scripts/roll-ship (see PR) covers shipping today from the terminal. The native step makes it a button.
Spec
- Rust command
ship_pack(pack_id) in src-tauri (reqwest): POST /api/v1/packs with the manifest → PUT each file to the presigned URLs (stream from disk, emit roll://ship-progress events per file with bytes sent) → POST complete → poll show until ready/failed, emitting status. NOTE from the script's battle scars: presigned URLs may sign no Content-Type — don't send one that wasn't signed.
- Device token: mint via POST /api/v1/device/token on first ship (small login sheet), store in the macOS Keychain (NOT a config file — the script's ~/.config/roll/edator-token is interim only).
- UI: a Ship button per pack in the library + status chip (uploading n%, perceiving, ready ✂, failed + error). Auto-ship-on-stop as a setting, default off.
- Contract: edator-cloud docs/PACK-API.md. The server verifies every declared object on complete, so a half-shipped pack is safe to re-ship (it creates a new pack id).
scripts/roll-ship(see PR) covers shipping today from the terminal. The native step makes it a button.Spec
ship_pack(pack_id)in src-tauri (reqwest): POST /api/v1/packs with the manifest → PUT each file to the presigned URLs (stream from disk, emitroll://ship-progressevents per file with bytes sent) → POST complete → poll show until ready/failed, emitting status. NOTE from the script's battle scars: presigned URLs may sign no Content-Type — don't send one that wasn't signed.