diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 000000000000..ebc389b90dba --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,37 @@ +# Use the official Node.js image as base +FROM node:20.19.2-bookworm-slim + +# Install basic development tools +RUN apt-get update && apt-get install -y \ + git \ + curl \ + wget \ + ca-certificates \ + gnupg \ + lsb-release \ + # Clean up apt cache to reduce image size + && rm -rf /var/lib/apt/lists/* + +# Install pnpm globally with the exact version from package.json +RUN corepack enable && corepack prepare pnpm@10.8.1 --activate + +# Set pnpm store directory for better caching +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME:$PATH" + +# Create a non-root user for development +ARG USERNAME=node +ARG USER_UID=1000 +ARG USER_GID=$USER_UID + +# Ensure the node user has the correct UID/GID +RUN groupmod --gid $USER_GID $USERNAME \ + && usermod --uid $USER_UID --gid $USER_GID $USERNAME \ + && chown -R $USER_UID:$USER_GID /home/$USERNAME + +# Create pnpm directories with correct permissions +RUN mkdir -p /pnpm /workspace \ + && chown -R $USERNAME:$USERNAME /pnpm /workspace + +# Switch to non-root user +USER $USERNAME \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 000000000000..3e3704b450f3 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,70 @@ +{ + "name": "Roo Code Dev Container", + "dockerFile": "Dockerfile", + + // Features to add to the dev container + "features": { + "ghcr.io/devcontainers/features/git:1": {}, + "ghcr.io/devcontainers/features/github-cli:1": {} + }, + + // Configure tool-specific properties + "customizations": { + "vscode": { + // Add the extensions from .vscode/extensions.json + "extensions": [ + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "csstools.postcss", + "bradlc.vscode-tailwindcss", + "connor4312.esbuild-problem-matchers", + "yoavbls.pretty-ts-errors" + ], + "settings": { + "terminal.integrated.defaultProfile.linux": "bash", + "terminal.integrated.profiles.linux": { + "bash": { + "path": "/bin/bash", + "icon": "terminal-bash" + } + }, + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "eslint.validate": ["javascript", "javascriptreact", "typescript", "typescriptreact"], + "typescript.tsdk": "node_modules/typescript/lib" + } + } + }, + + // Use 'forwardPorts' to make a list of ports inside the container available locally + "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created + "postCreateCommand": "pnpm config set store-dir /pnpm/store && pnpm install --frozen-lockfile", + + // Use 'postStartCommand' to run commands after the container starts + "postStartCommand": "echo '🎉 Dev container is ready!'", + + // Configure mounts for better performance and caching + "mounts": [ + // Mount pnpm store as a volume for caching + "source=pnpm-store,target=/pnpm,type=volume", + // Mount root node_modules as volume for better performance + "source=node-modules,target=/workspace/node_modules,type=volume" + ], + + // Environment variables + "containerEnv": { + "PNPM_HOME": "/pnpm" + }, + + // Run as non-root user + "remoteUser": "node", + + // Uncomment to connect as root instead + // "remoteUser": "root", + + // Additional options + "updateRemoteUserUID": true, + "shutdownAction": "stopContainer" +}