The dev panel runs in a container with no sshd, so every rsync at it died with
"Connection refused" and the fix had to be docker cp'd by hand.
Transport is now behind remotecmd/remoteopen: ssh+rsync as before, or docker
exec + docker cp when the target is a container. Pass --container=NAME or set
DEV_CONTAINER; a target that matches a running container's name or IP is
detected without either.
A mode-dropping deploy left new parent directories tar had to create owned by
root, so PHP-FPM (running as xc_vm) could not traverse into them and the include
500'd (Permission denied). chown the copied files AND their parent dirs to
xc_vm:xc_vm, and extract with --no-same-owner.
Deploys the files changed by a git commit range from src/ to a running XC_VM box (src/ maps 1:1 to /home/xc_vm/): full-file tar-over-ssh, status-aware copy/delete/rename, ownership fixup, optional settings-cache rebuild and panel restart. All SSH multiplexes over one ControlMaster socket to stay fail2ban-safe. Developer convenience only — no versions, DB migrations, binaries, or per-server config; use the release archive for real upgrades. Ships a full man-style --help. Ignore the local .dev-sync-state watermark.