diff --git a/.devcontainer/README.md b/.devcontainer/README.md new file mode 100644 index 00000000..989fa527 --- /dev/null +++ b/.devcontainer/README.md @@ -0,0 +1,92 @@ +# Dev Container Setup + +This directory contains the VS Code dev container configuration for OpenSpec development. + +## What's Included + +- **Node.js 20 LTS** (>=20.19.0) - TypeScript/JavaScript runtime +- **pnpm** - Fast, disk space efficient package manager +- **Git + GitHub CLI** - Version control tools +- **VS Code Extensions**: + - ESLint & Prettier for code quality + - Vitest Explorer for running tests + - GitLens for enhanced git integration + - Error Lens for inline error highlighting + - Code Spell Checker + - Path IntelliSense + +## How to Use + +### First Time Setup + +1. **Install Prerequisites** (on your local machine): + - [VS Code](https://code.visualstudio.com/) + - [Docker Desktop](https://www.docker.com/products/docker-desktop) + - [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) + +2. **Open in Container**: + - Open this project in VS Code + - You'll see a notification: "Folder contains a Dev Container configuration file" + - Click "Reopen in Container" + + OR + + - Open Command Palette (`Cmd/Ctrl+Shift+P`) + - Type "Dev Containers: Reopen in Container" + - Press Enter + +3. **Wait for Setup**: + - The container will build (first time takes a few minutes) + - `pnpm install` runs automatically via `postCreateCommand` + - All extensions install automatically + +### Daily Development + +Once set up, the container preserves your development environment: + +```bash +# Run development build +pnpm run dev + +# Run CLI in development +pnpm run dev:cli + +# Run tests +pnpm test + +# Run tests in watch mode +pnpm test:watch + +# Build the project +pnpm run build +``` + +### SSH Keys + +Your SSH keys are mounted read-only from `~/.ssh`, so git operations work seamlessly with GitHub/GitLab. + +### Rebuilding the Container + +If you modify `.devcontainer/devcontainer.json`: +- Command Palette → "Dev Containers: Rebuild Container" + +## Benefits + +- No need to install Node.js or pnpm on your local machine +- Consistent development environment across team members +- Isolated from other Node.js projects on your machine +- All dependencies and tools containerized +- Easy onboarding for new developers + +## Troubleshooting + +**Container won't build:** +- Ensure Docker Desktop is running +- Check Docker has enough memory allocated (recommend 4GB+) + +**Extensions not appearing:** +- Rebuild the container: "Dev Containers: Rebuild Container" + +**Permission issues:** +- The container runs as the `node` user (non-root) +- Files created in the container are owned by this user diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..c381b61f --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,68 @@ +{ + "name": "OpenSpec Development", + "image": "mcr.microsoft.com/devcontainers/typescript-node:1-20-bookworm", + + // Additional tools and features + "features": { + "ghcr.io/devcontainers/features/git:1": { + "version": "latest", + "ppa": true + }, + "ghcr.io/devcontainers/features/github-cli:1": { + "version": "latest" + } + }, + + // Configure tool-specific properties + "customizations": { + "vscode": { + // Set default container specific settings + "settings": { + "typescript.tsdk": "node_modules/typescript/lib", + "typescript.enablePromptUseWorkspaceTsdk": true, + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.codeActionsOnSave": { + "source.fixAll": "explicit" + }, + "files.eol": "\n", + "terminal.integrated.defaultProfile.linux": "bash" + }, + + // Add extensions you want installed when the container is created + "extensions": [ + // TypeScript/JavaScript essentials + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + + // Testing + "vitest.explorer", + + // Git + "eamodio.gitlens", + + // Utilities + "streetsidesoftware.code-spell-checker", + "usernamehw.errorlens", + "christian-kohler.path-intellisense" + ] + } + }, + + // 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": "corepack enable && corepack prepare pnpm@latest --activate && pnpm install", + + // Configure mounts to preserve SSH keys for git operations + "mounts": [ + "source=${localEnv:HOME}${localEnv:USERPROFILE}/.ssh,target=/home/node/.ssh,readonly,type=bind,consistency=cached" + ], + + // Set the default user to 'node' (non-root user) + "remoteUser": "node", + + // Ensure git is properly configured + "initializeCommand": "echo 'Initializing dev container...'" +} diff --git a/.gitignore b/.gitignore index d8542ad4..5077cdaf 100644 --- a/.gitignore +++ b/.gitignore @@ -147,3 +147,6 @@ docs/ .claude/ CLAUDE.md .DS_Store + +# Pnpm +.pnpm-store/ \ No newline at end of file