diff --git a/Dockerfile b/Dockerfile index a0eaa752f..f40b1287e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -102,6 +102,12 @@ RUN curl https://cursor.com/install -fsS | bash && \ ls -la /home/automaker/.local/bin/ && \ echo "=== PATH is: $PATH ===" && \ (which cursor-agent && cursor-agent --version) || echo "cursor-agent installed (may need auth setup)" + +# Install OpenCode CLI (for multi-provider AI model access) +RUN curl -fsSL https://opencode.ai/install | bash && \ + echo "=== Checking OpenCode CLI installation ===" && \ + ls -la /home/automaker/.local/bin/ && \ + (which opencode && opencode --version) || echo "opencode installed (may need auth setup)" USER root # Add PATH to profile so it's available in all interactive shells (for login shells) diff --git a/docker-compose.override.yml.example b/docker-compose.override.yml.example index b4ef6c47b..dfd74bd44 100644 --- a/docker-compose.override.yml.example +++ b/docker-compose.override.yml.example @@ -16,6 +16,11 @@ services: # This shares your 'cursor-agent login' OAuth session with the container # - ~/.cursor:/home/automaker/.cursor + # OpenCode CLI - mount your ~/.local/share/opencode directory + # This shares your 'opencode auth login' session with the container + # - ~/.local/share/opencode:/home/automaker/.local/share/opencode + # - ~/.config/opencode:/home/automaker/.config/opencode + environment: # Set root directory for all projects and file operations # Users can only create/open projects within this directory diff --git a/docker-compose.yml b/docker-compose.yml index 5e5d35135..3a7e17ed2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -83,6 +83,13 @@ services: # This allows 'cursor-agent login' authentication to persist between restarts - automaker-cursor-config:/home/automaker/.cursor + # Persist OpenCode CLI configuration and authentication across container restarts + # This allows 'opencode auth login' authentication to persist between restarts + - automaker-opencode-data:/home/automaker/.local/share/opencode + + # Persist OpenCode user configuration across container restarts + - automaker-opencode-config:/home/automaker/.config/opencode + # NO host directory mounts - container cannot access your laptop files # If you need to work on a project, create it INSIDE the container # or use a separate docker-compose override file @@ -106,3 +113,13 @@ volumes: name: automaker-cursor-config # Named volume for Cursor CLI configuration and authentication # Persists cursor-agent login authentication across container restarts + + automaker-opencode-data: + name: automaker-opencode-data + # Named volume for OpenCode CLI data and authentication (~/.local/share/opencode) + # Persists opencode auth login authentication across container restarts + + automaker-opencode-config: + name: automaker-opencode-config + # Named volume for OpenCode user configuration (~/.config/opencode) + # Persists user configuration across container restarts diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 017213dc4..9321ce37c 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -25,6 +25,21 @@ fi chown -R automaker:automaker /home/automaker/.cursor chmod -R 700 /home/automaker/.cursor +# Ensure OpenCode CLI config directory exists with correct permissions +# OpenCode stores config and auth in ~/.local/share/opencode/ +if [ ! -d "/home/automaker/.local/share/opencode" ]; then + mkdir -p /home/automaker/.local/share/opencode +fi +chown -R automaker:automaker /home/automaker/.local/share/opencode +chmod -R 700 /home/automaker/.local/share/opencode + +# OpenCode also uses ~/.config/opencode for configuration +if [ ! -d "/home/automaker/.config/opencode" ]; then + mkdir -p /home/automaker/.config/opencode +fi +chown -R automaker:automaker /home/automaker/.config/opencode +chmod -R 700 /home/automaker/.config/opencode + # If CURSOR_AUTH_TOKEN is set, write it to the cursor auth file # On Linux, cursor-agent uses ~/.config/cursor/auth.json for file-based credential storage # The env var CURSOR_AUTH_TOKEN is also checked directly by cursor-agent diff --git a/docs/docker-isolation.md b/docs/docker-isolation.md index df07daf20..ad7c712ae 100644 --- a/docs/docker-isolation.md +++ b/docs/docker-isolation.md @@ -94,6 +94,16 @@ echo "CURSOR_AUTH_TOKEN=$(./scripts/get-cursor-token.sh)" >> .env - **macOS**: Tokens are stored in Keychain (service: `cursor-access-token`) - **Linux**: Tokens are stored in `~/.config/cursor/auth.json` (not `~/.cursor`) +### OpenCode CLI + +OpenCode stores its configuration and auth at `~/.local/share/opencode/`. To share your host authentication with the container: + +```yaml +# In docker-compose.override.yml +volumes: + - ~/.local/share/opencode:/home/automaker/.local/share/opencode +``` + ### Apply to container ```bash @@ -121,6 +131,7 @@ echo "CURSOR_AUTH_TOKEN=$(jq -r '.accessToken' ~/.config/cursor/auth.json)" >> . volumes: - ~/.claude:/home/automaker/.claude - ~/.config/cursor:/home/automaker/.config/cursor + - ~/.local/share/opencode:/home/automaker/.local/share/opencode ``` ## Troubleshooting @@ -131,4 +142,6 @@ volumes: | Can't access web UI | Verify container is running with `docker ps \| grep automaker` | | Need a fresh start | Run `docker-compose down && docker volume rm automaker-data && docker-compose up -d --build` | | Cursor auth fails | Re-extract token with `./scripts/get-cursor-token.sh` - tokens expire periodically. Make sure you've run `cursor-agent login` on your host first. | +| OpenCode not detected | Mount `~/.local/share/opencode` to `/home/automaker/.local/share/opencode`. Make sure you've run `opencode auth login` on your host first. | | File permission errors | Rebuild with `UID=$(id -u) GID=$(id -g) docker-compose build` to match container user to your host user. See [Fixing File Permission Issues](#fixing-file-permission-issues). | +