The UNTRACKED count used 'git status --short | grep '^??' | wc -l | xargs'.
When the working tree is clean, grep exits 1 (no matches found). Combined
with 'set -euo pipefail' at the top of the script, that exit 1 killed the
script mid-preflight.
Fix: use 'grep -c' with '|| true' fallback. grep -c counts matches and
prints 0 if none; the fallback handles the exit code so set -e is happy.
deploy.sh:
Validated explicit-deploy workflow. Pre-flight checks (local build,
uncommitted changes, server reachability) run on Mac before touching
server. Code pushed to server via 'git push ssh://...' over the
existing SSH connection — no Mac SSH server required. Server does
git reset --hard to the pushed commit, reinstalls deps if
package.json changed, rebuilds dashboard, restarts services, verifies
health. Full troubleshooting guide in file header.
local-dev.sh:
Runs bridge (:3457) and dashboard (:3101) locally on Mac while
reaching Tiger via SSH. Separate ports + separate SQLite DB keep it
isolated from prod (still live on :3100/:3456). Hot-reload in both
layers. Clean Ctrl-C shutdown.
bridge remote mode:
Added TIGER_REMOTE=true support in bridge/src/tiger.ts and chat.ts.
When set, 'docker exec tiger-openclaw' calls are prefixed with
'ssh $TIGER_REMOTE_SSH'. Backward-compatible: VPS leaves TIGER_REMOTE
unset and runs docker locally as before.
Workflow moving forward:
• Edit locally on Mac
• ./local-dev.sh to test against real Tiger
• git commit small + often
• ./deploy.sh to push to production