diff --git a/.devcontainer/.bashrc b/.devcontainer/.bashrc deleted file mode 100644 index 769149f81..000000000 --- a/.devcontainer/.bashrc +++ /dev/null @@ -1,69 +0,0 @@ -# Sim Development Environment Bashrc -# This gets sourced by post-create.sh - -# Enhanced prompt with git branch info -parse_git_branch() { - git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' -} - -export PS1="\[\033[01;32m\]\u@simstudio\[\033[00m\]:\[\033[01;34m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\]\$ " - -# Helpful aliases -alias ll="ls -la" -alias ..="cd .." -alias ...="cd ../.." - -# Database aliases -alias pgc="PGPASSWORD=postgres psql -h db -U postgres -d simstudio" -alias check-db="PGPASSWORD=postgres psql -h db -U postgres -c '\l'" - -# Sim specific aliases -alias logs="cd /workspace/apps/sim && tail -f logs/*.log 2>/dev/null || echo 'No log files found'" -alias sim-start="cd /workspace && bun run dev" -alias sim-migrate="cd /workspace/apps/sim && bunx drizzle-kit push" -alias sim-generate="cd /workspace/apps/sim && bunx drizzle-kit generate" -alias sim-rebuild="cd /workspace && bun run build && bun run start" -alias docs-dev="cd /workspace/apps/docs && bun run dev" - -# Turbo related commands -alias turbo-build="cd /workspace && bunx turbo run build" -alias turbo-dev="cd /workspace && bunx turbo run dev" -alias turbo-test="cd /workspace && bunx turbo run test" - -# Bun specific commands -alias bun-update="cd /workspace && bun update" -alias bun-add="cd /workspace && bun add" -alias bun-pm="cd /workspace && bun pm" -alias bun-canary="bun upgrade --canary" - -# Default to workspace directory -cd /workspace 2>/dev/null || true - -# Welcome message - only show once per session -if [ -z "$SIM_WELCOME_SHOWN" ]; then - export SIM_WELCOME_SHOWN=1 - - echo "" - echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - echo "🚀 Welcome to Sim development environment!" - echo "" - echo "Available commands:" - echo " sim-start - Start all apps in development mode" - echo " sim-migrate - Push schema changes to the database for sim app" - echo " sim-generate - Generate new migrations for sim app" - echo " sim-rebuild - Build and start all apps" - echo " docs-dev - Start only the docs app in development mode" - echo "" - echo "Turbo commands:" - echo " turbo-build - Build all apps using Turborepo" - echo " turbo-dev - Start development mode for all apps" - echo " turbo-test - Run tests for all packages" - echo "" - echo "Bun commands:" - echo " bun-update - Update dependencies" - echo " bun-add - Add a new dependency" - echo " bun-pm - Manage dependencies" - echo " bun-canary - Upgrade to the latest canary version of Bun" - echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - echo "" -fi \ No newline at end of file diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 55662afb8..7fdfb7bca 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,38 +1,43 @@ -# Use the latest Bun canary image for development -FROM oven/bun:canary - -# Avoid warnings by switching to noninteractive -ENV DEBIAN_FRONTEND=noninteractive +FROM oven/bun:1.2.22-alpine # Install necessary packages for development -RUN apt-get update \ - && apt-get -y install --no-install-recommends \ - git curl wget jq sudo postgresql-client vim nano \ - bash-completion ca-certificates lsb-release gnupg \ - && apt-get clean -y \ - && rm -rf /var/lib/apt/lists/* +RUN apk add --no-cache \ + git \ + curl \ + wget \ + jq \ + sudo \ + postgresql-client \ + vim \ + nano \ + bash \ + bash-completion \ + zsh \ + zsh-vcs \ + ca-certificates \ + shadow -# Create a non-root user +# Create a non-root user with matching UID/GID ARG USERNAME=bun ARG USER_UID=1000 ARG USER_GID=$USER_UID +# Create user group if it doesn't exist +RUN if ! getent group $USER_GID >/dev/null; then \ + addgroup -g $USER_GID $USERNAME; \ + fi + +# Create user if it doesn't exist +RUN if ! getent passwd $USER_UID >/dev/null; then \ + adduser -D -u $USER_UID -G $(getent group $USER_GID | cut -d: -f1) $USERNAME; \ + fi + # Add sudo support RUN echo "$USERNAME ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/$USERNAME \ && chmod 0440 /etc/sudoers.d/$USERNAME -# Install global packages for development -RUN bun install -g turbo drizzle-kit typescript @types/node - -# Install bun completions -RUN bun completions > /etc/bash_completion.d/bun - # Set up shell environment -RUN echo "export PATH=$PATH:/home/$USERNAME/.bun/bin" >> /etc/profile -RUN echo "source /etc/profile" >> /etc/bash.bashrc - -# Switch back to dialog for any ad-hoc use of apt-get -ENV DEBIAN_FRONTEND=dialog +RUN echo "export PATH=\$PATH:/home/$USERNAME/.bun/bin" >> /etc/profile WORKDIR /workspace diff --git a/.devcontainer/README.md b/.devcontainer/README.md index f57127c3c..10e684d3d 100644 --- a/.devcontainer/README.md +++ b/.devcontainer/README.md @@ -1,78 +1,75 @@ # Sim Development Container -This directory contains configuration files for Visual Studio Code Dev Containers / GitHub Codespaces. Dev containers provide a consistent, isolated development environment for this project. +Development container configuration for VS Code Dev Containers and GitHub Codespaces. -## Contents - -- `devcontainer.json` - The main configuration file that defines the development container settings -- `Dockerfile` - Defines the container image and development environment -- `docker-compose.yml` - Sets up the application and database containers -- `post-create.sh` - Script that runs when the container is created -- `.bashrc` - Custom shell configuration with helpful aliases - -## Usage - -### Prerequisites +## Prerequisites - Visual Studio Code -- Docker installation: - - Docker Desktop (Windows/macOS) - - Docker Engine (Linux) -- VS Code Remote - Containers extension +- Docker Desktop or Podman Desktop +- VS Code Dev Containers extension -### Getting Started +## Getting Started -1. Open this project in Visual Studio Code -2. When prompted, click "Reopen in Container" - - Alternatively, press `F1` and select "Remote-Containers: Reopen in Container" +1. Open this project in VS Code +2. Click "Reopen in Container" when prompted (or press `F1` → "Dev Containers: Reopen in Container") 3. Wait for the container to build and initialize -4. The post-creation script will automatically: +4. Start developing with `sim-start` - - Install dependencies - - Set up environment variables - - Run database migrations - - Configure helpful aliases +The setup script will automatically install dependencies and run migrations. -5. Start the application with `sim-start` (alias for `bun run dev`) +## Development Commands -### Development Commands +### Running Services -The development environment includes these helpful aliases: +You have two options for running the development environment: + +**Option 1: Run everything together (recommended for most development)** +```bash +sim-start # Runs both app and socket server using concurrently +``` + +**Option 2: Run services separately (useful for debugging individual services)** +- In the **app** container terminal: `sim-app` (starts Next.js app on port 3000) +- In the **realtime** container terminal: `sim-sockets` (starts socket server on port 3002) + +### Other Commands -- `sim-start` - Start the development server - `sim-migrate` - Push schema changes to the database - `sim-generate` - Generate new migrations -- `sim-rebuild` - Build and start the production version -- `pgc` - Connect to the PostgreSQL database -- `check-db` - List all databases - -### Using GitHub Codespaces - -This project is also configured for GitHub Codespaces. To use it: - -1. Go to the GitHub repository -2. Click the "Code" button -3. Select the "Codespaces" tab -4. Click "Create codespace on main" - -This will start a new Codespace with the development environment already set up. - -## Customization - -You can customize the development environment by: - -- Modifying `devcontainer.json` to add VS Code extensions or settings -- Updating the `Dockerfile` to install additional packages -- Editing `docker-compose.yml` to add services or change configuration -- Modifying `.bashrc` to add custom aliases or configurations +- `build` - Build the application +- `pgc` - Connect to PostgreSQL database ## Troubleshooting -If you encounter issues: +**Build errors**: Rebuild the container with `F1` → "Dev Containers: Rebuild Container" -1. Rebuild the container: `F1` → "Remote-Containers: Rebuild Container" -2. Check Docker logs for build errors -3. Verify Docker Desktop is running -4. Ensure all prerequisites are installed +**Port conflicts**: Ensure ports 3000, 3002, and 5432 are available -For more information, see the [VS Code Remote Development documentation](https://code.visualstudio.com/docs/remote/containers). +**Container runtime issues**: Verify Docker Desktop or Podman Desktop is running + +## Technical Details + +Services: +- **App container** (8GB memory limit) - Main Next.js application +- **Realtime container** (4GB memory limit) - Socket.io server for real-time features +- **Database** - PostgreSQL with pgvector extension +- **Migrations** - Runs automatically on container creation + +You can develop with services running together or independently. + +### Personalization + +**Project commands** (`sim-start`, `sim-app`, etc.) are automatically available via `/workspace/.devcontainer/sim-commands.sh`. + +**Personal shell customization** (aliases, prompts, etc.) should use VS Code's dotfiles feature: +1. Create a dotfiles repository (e.g., `github.com/youruser/dotfiles`) +2. Add your `.bashrc`, `.zshrc`, or other configs +3. Configure in VS Code Settings: + ```json + { + "dotfiles.repository": "youruser/dotfiles", + "dotfiles.installCommand": "install.sh" + } + ``` + +This separates project-specific commands from personal preferences, following VS Code best practices. diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index e196efc8f..99bd1b3a4 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -13,13 +13,6 @@ "source.fixAll.biome": "explicit", "source.organizeImports.biome": "explicit" }, - "terminal.integrated.defaultProfile.linux": "bash", - "terminal.integrated.profiles.linux": { - "bash": { - "path": "/bin/bash", - "args": ["--login"] - } - }, "terminal.integrated.shellIntegration.enabled": true }, "extensions": [ @@ -36,18 +29,9 @@ } }, - "forwardPorts": [3000, 5432], + "forwardPorts": [3000, 3002, 5432], "postCreateCommand": "bash -c 'bash .devcontainer/post-create.sh || true'", - "postStartCommand": "bash -c 'if [ ! -f ~/.bashrc ] || ! grep -q \"sim-start\" ~/.bashrc; then cp .devcontainer/.bashrc ~/.bashrc; fi'", - - "remoteUser": "bun", - - "features": { - "ghcr.io/devcontainers/features/git:1": {}, - "ghcr.io/prulloac/devcontainer-features/bun:1": { - "version": "latest" - } - } + "remoteUser": "bun" } diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 790d1da0d..c107e30d3 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -7,52 +7,56 @@ services: - ..:/workspace:cached - bun-cache:/home/bun/.bun/cache:delegated command: sleep infinity + deploy: + resources: + limits: + memory: 8G environment: - NODE_ENV=development - DATABASE_URL=postgresql://postgres:postgres@db:5432/simstudio - BETTER_AUTH_URL=http://localhost:3000 - NEXT_PUBLIC_APP_URL=http://localhost:3000 + - BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET:-your_auth_secret_here} + - ENCRYPTION_KEY=${ENCRYPTION_KEY:-your_encryption_key_here} + - COPILOT_API_KEY=${COPILOT_API_KEY} + - SIM_AGENT_API_URL=${SIM_AGENT_API_URL} + - OLLAMA_URL=${OLLAMA_URL:-http://localhost:11434} + - NEXT_PUBLIC_SOCKET_URL=${NEXT_PUBLIC_SOCKET_URL:-http://localhost:3002} - BUN_INSTALL_CACHE_DIR=/home/bun/.bun/cache depends_on: db: condition: service_healthy - realtime: - condition: service_healthy migrations: condition: service_completed_successfully ports: - "3000:3000" - "3001:3001" working_dir: /workspace - healthcheck: - test: ['CMD', 'wget', '--spider', '--quiet', 'http://127.0.0.1:3000'] - interval: 90s - timeout: 5s - retries: 3 - start_period: 10s realtime: build: context: .. dockerfile: .devcontainer/Dockerfile + volumes: + - ..:/workspace:cached + - bun-cache:/home/bun/.bun/cache:delegated command: sleep infinity + deploy: + resources: + limits: + memory: 4G environment: - NODE_ENV=development - DATABASE_URL=postgresql://postgres:postgres@db:5432/simstudio - BETTER_AUTH_URL=http://localhost:3000 - NEXT_PUBLIC_APP_URL=http://localhost:3000 + - BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET:-your_auth_secret_here} depends_on: db: condition: service_healthy ports: - "3002:3002" working_dir: /workspace - healthcheck: - test: ['CMD', 'wget', '--spider', '--quiet', 'http://127.0.0.1:3002'] - interval: 90s - timeout: 5s - retries: 3 - start_period: 10s migrations: build: diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh index ffff4395a..f77473f3a 100755 --- a/.devcontainer/post-create.sh +++ b/.devcontainer/post-create.sh @@ -8,11 +8,43 @@ echo "🔧 Setting up Sim development environment..." # Change to the workspace root directory cd /workspace -# Setup .bashrc -echo "📄 Setting up .bashrc with aliases..." -cp /workspace/.devcontainer/.bashrc ~/.bashrc -# Add to .profile to ensure .bashrc is sourced in non-interactive shells -echo 'if [ -f ~/.bashrc ]; then . ~/.bashrc; fi' >> ~/.profile +# Install global packages for development (done at runtime, not build time) +echo "📦 Installing global development tools..." +bun install -g turbo drizzle-kit typescript @types/node 2>/dev/null || { + echo "⚠️ Some global packages may already be installed, continuing..." +} + +# Set up bun completions (with proper shell detection) +echo "🔧 Setting up shell completions..." +if [ -n "$SHELL" ] && [ -f "$SHELL" ]; then + SHELL=/bin/bash bun completions 2>/dev/null | sudo tee /etc/bash_completion.d/bun > /dev/null || { + echo "⚠️ Could not install bun completions, but continuing..." + } +fi + +# Add project commands to shell profile +echo "📄 Setting up project commands..." +# Add sourcing of sim-commands.sh to user's shell config files if they exist +for rcfile in ~/.bashrc ~/.zshrc; do + if [ -f "$rcfile" ]; then + # Check if already added + if ! grep -q "sim-commands.sh" "$rcfile"; then + echo "" >> "$rcfile" + echo "# Sim project commands" >> "$rcfile" + echo "if [ -f /workspace/.devcontainer/sim-commands.sh ]; then" >> "$rcfile" + echo " source /workspace/.devcontainer/sim-commands.sh" >> "$rcfile" + echo "fi" >> "$rcfile" + fi + fi +done + +# If no rc files exist yet, create a minimal one +if [ ! -f ~/.bashrc ] && [ ! -f ~/.zshrc ]; then + echo "# Source Sim project commands" > ~/.bashrc + echo "if [ -f /workspace/.devcontainer/sim-commands.sh ]; then" >> ~/.bashrc + echo " source /workspace/.devcontainer/sim-commands.sh" >> ~/.bashrc + echo "fi" >> ~/.bashrc +fi # Clean and reinstall dependencies to ensure platform compatibility echo "📦 Cleaning and reinstalling dependencies..." @@ -29,18 +61,12 @@ chmod 700 ~/.bun ~/.bun/cache # Install dependencies with platform-specific binaries echo "Installing dependencies with Bun..." -bun install || { - echo "⚠️ bun install had issues but continuing setup..." -} +bun install # Check for native dependencies echo "Checking for native dependencies compatibility..." -NATIVE_DEPS=$(grep '"trustedDependencies"' apps/sim/package.json || echo "") -if [ ! -z "$NATIVE_DEPS" ]; then - echo "⚠️ Native dependencies detected. Ensuring compatibility with Bun..." - for pkg in $(echo $NATIVE_DEPS | grep -oP '"[^"]*"' | tr -d '"' | grep -v "trustedDependencies"); do - echo "Checking compatibility for $pkg..." - done +if grep -q '"trustedDependencies"' apps/sim/package.json 2>/dev/null; then + echo "⚠️ Native dependencies detected. Bun will handle compatibility during install." fi # Set up environment variables if .env doesn't exist for the sim app @@ -82,23 +108,6 @@ echo "Waiting for database to be ready..." fi ) || echo "⚠️ Database setup had issues but continuing..." -# Add additional helpful aliases to .bashrc -cat << EOF >> ~/.bashrc - -# Additional Sim Development Aliases -alias migrate="cd /workspace/apps/sim && DATABASE_URL=postgresql://postgres:postgres@db:5432/simstudio bunx drizzle-kit push" -alias generate="cd /workspace/apps/sim && bunx drizzle-kit generate" -alias dev="cd /workspace && bun run dev" -alias build="cd /workspace && bun run build" -alias start="cd /workspace && bun run dev" -alias lint="cd /workspace/apps/sim && bun run lint" -alias test="cd /workspace && bun run test" -alias bun-update="cd /workspace && bun update" -EOF - -# Source the .bashrc to make aliases available immediately -. ~/.bashrc - # Clear the welcome message flag to ensure it shows after setup unset SIM_WELCOME_SHOWN diff --git a/.devcontainer/sim-commands.sh b/.devcontainer/sim-commands.sh new file mode 100755 index 000000000..640feb2f9 --- /dev/null +++ b/.devcontainer/sim-commands.sh @@ -0,0 +1,42 @@ +#!/bin/bash +# Sim Project Commands +# Source this file to add project-specific commands to your shell +# Add to your ~/.bashrc or ~/.zshrc: source /workspace/.devcontainer/sim-commands.sh + +# Project-specific aliases for Sim development +alias sim-start="cd /workspace && bun run dev:full" +alias sim-app="cd /workspace && bun run dev" +alias sim-sockets="cd /workspace && bun run dev:sockets" +alias sim-migrate="cd /workspace/apps/sim && bunx drizzle-kit push" +alias sim-generate="cd /workspace/apps/sim && bunx drizzle-kit generate" +alias sim-rebuild="cd /workspace && bun run build && bun run start" +alias docs-dev="cd /workspace/apps/docs && bun run dev" + +# Database connection helpers +alias pgc="PGPASSWORD=postgres psql -h db -U postgres -d simstudio" +alias check-db="PGPASSWORD=postgres psql -h db -U postgres -c '\l'" + +# Default to workspace directory +cd /workspace 2>/dev/null || true + +# Welcome message - show once per session +if [ -z "$SIM_WELCOME_SHOWN" ]; then + export SIM_WELCOME_SHOWN=1 + + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "🚀 Sim Development Environment" + echo "" + echo "Project commands:" + echo " sim-start - Start app + socket server" + echo " sim-app - Start only main app" + echo " sim-sockets - Start only socket server" + echo " sim-migrate - Push schema changes" + echo " sim-generate - Generate migrations" + echo "" + echo "Database:" + echo " pgc - Connect to PostgreSQL" + echo " check-db - List databases" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "" +fi