mirror of
https://github.com/NVIDIA/OpenShell.git
synced 2026-11-07 08:55:37 +08:00
Closes #20, #36, #46 ## Summary - Replace the external `rsync` dependency with built-in tar-over-SSH for file synchronization, using the `tar` crate to stream archives through the existing SSH proxy tunnel - Add a new `nav sandbox sync` subcommand supporting bidirectional file transfer (`--up` to push local files, `--down` to pull sandbox files) - Add sync workflow example in `examples/sync-files.md` ## Changes | File | Change | |---|---| | `crates/navigator-cli/Cargo.toml` | Add `tar = "0.4"` dependency | | `crates/navigator-cli/src/ssh.rs` | Remove `sandbox_rsync()`, add `sandbox_sync_up()`, `sandbox_sync_down()`, `sandbox_sync_up_files()` | | `crates/navigator-cli/src/run.rs` | Add `sandbox_sync_command()` dispatcher, update re-exports, update `--sync` call site | | `crates/navigator-cli/src/main.rs` | Add `Sync` variant to `SandboxCommands` with `--up`/`--down` flags | | `architecture/sandbox-connect.md` | Rewrite File Sync section for tar-over-SSH and new command | | `examples/sync-files.md` | New example walkthrough for sync workflows | ## New UX ```bash # Push local files up to sandbox nav sandbox sync my-sandbox --up ./src /sandbox/src # Pull sandbox files down to local nav sandbox sync my-sandbox --down /sandbox/output ./output # Existing --sync flag on create still works (now uses tar internally) nav sandbox create --sync -- python main.py ``` ## Design - **No new host dependencies**: `tar` crate handles archive creation/extraction in Rust; `ssh` is already required. The sandbox side uses the `tar` binary from the base image. - **No new server-side infrastructure**: reuses the existing SSH tunnel, no new gRPC RPCs or gateway changes. - **Bidirectional**: the same tar-pipe pattern works for both push and pull by reversing which side produces and which consumes the archive. - **No compression** for v1 — the SSH tunnel is local-network; can add gzip via `flate2` later. ## Test Plan - All existing tests pass (`mise run pre-commit` green: fmt, clippy, 206 Rust tests, 6 Python tests) - Manual e2e testing required for actual sandbox sync operations
76 lines
1.9 KiB
Markdown
76 lines
1.9 KiB
Markdown
# Syncing Files To and From a Sandbox
|
|
|
|
Move code, data, and artifacts between your local machine and a Navigator
|
|
sandbox using `navigator sandbox sync`.
|
|
|
|
## Push local files into a sandbox
|
|
|
|
Upload your current project directory into `/sandbox` on the sandbox:
|
|
|
|
```bash
|
|
navigator sandbox sync my-sandbox --up .
|
|
```
|
|
|
|
Push a specific directory to a custom destination:
|
|
|
|
```bash
|
|
navigator sandbox sync my-sandbox --up ./src /sandbox/src
|
|
```
|
|
|
|
Push a single file:
|
|
|
|
```bash
|
|
navigator sandbox sync my-sandbox --up ./config.yaml /sandbox/config.yaml
|
|
```
|
|
|
|
## Pull files from a sandbox
|
|
|
|
Download sandbox output to your local machine:
|
|
|
|
```bash
|
|
navigator sandbox sync my-sandbox --down /sandbox/output ./output
|
|
```
|
|
|
|
Pull results to the current directory:
|
|
|
|
```bash
|
|
navigator sandbox sync my-sandbox --down /sandbox/results
|
|
```
|
|
|
|
## Sync on create
|
|
|
|
Push all git-tracked files into a new sandbox automatically:
|
|
|
|
```bash
|
|
navigator sandbox create --sync -- python main.py
|
|
```
|
|
|
|
This collects tracked and untracked (non-ignored) files via
|
|
`git ls-files` and streams them into `/sandbox` before the command runs.
|
|
|
|
## Workflow: iterate on code in a sandbox
|
|
|
|
```bash
|
|
# Create a sandbox and sync your repo
|
|
navigator sandbox create --name dev --sync --keep
|
|
|
|
# Make local changes, then push them
|
|
navigator sandbox sync dev --up ./src /sandbox/src
|
|
|
|
# Run tests inside the sandbox
|
|
navigator sandbox connect dev
|
|
# (inside sandbox) pytest
|
|
|
|
# Pull test artifacts back
|
|
navigator sandbox sync dev --down /sandbox/coverage ./coverage
|
|
```
|
|
|
|
## How it works
|
|
|
|
File sync uses **tar-over-SSH**. The CLI streams a tar archive through the
|
|
existing SSH proxy tunnel -- no `rsync` or other external tools required on
|
|
your machine. The sandbox base image provides GNU `tar` for extraction.
|
|
|
|
- **Push**: `tar::Builder` (Rust) -> stdin | `ssh <proxy> sandbox "tar xf - -C <dest>"`
|
|
- **Pull**: `ssh <proxy> sandbox "tar cf - -C <dir> <path>"` | stdout -> `tar::Archive` (Rust)
|