From b36d98ac4caabc74f2d6f5eb8fede0366b757d2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=E2=88=8Er?= <140930+codekiln@users.noreply.github.com> Date: Tue, 6 Jan 2026 08:11:56 -0500 Subject: [PATCH 1/6] =?UTF-8?q?=E2=9C=A8=20feat(devcontainer):=20add=20mul?= =?UTF-8?q?ti-environment=20configs=20for=20VS=20Code,=20Codespaces,=20and?= =?UTF-8?q?=20JetBrains?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add three separate devcontainer configurations optimized for different development environments: - Default (.devcontainer/): VS Code local with bind mount and .env file - Codespaces (.devcontainer/codespaces/): No .env dependency, uses GitHub secrets only - JetBrains (.devcontainer/jetbrains/): Hybrid mount (named volume + .devcontainer bind) Key changes: - Add Codespaces config that works without .env file (gitignored, doesn't exist in cloud) - Add JetBrains config with hybrid mount for native inotify support - Add X11 libraries to Dockerfile for JetBrains Gateway compatibility - Update README with three-config architecture documentation - Mark override file approach as deprecated for JetBrains users Fixes #718 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .devcontainer/Dockerfile | 8 + .devcontainer/README.md | 142 ++++++++++++------ .devcontainer/codespaces/devcontainer.json | 53 +++++++ .devcontainer/codespaces/docker-compose.yml | 103 +++++++++++++ .../docker-compose.override.yml.template | 40 ++--- .devcontainer/jetbrains/devcontainer.json | 35 +++++ .devcontainer/jetbrains/docker-compose.yml | 112 ++++++++++++++ 7 files changed, 432 insertions(+), 61 deletions(-) create mode 100644 .devcontainer/codespaces/devcontainer.json create mode 100644 .devcontainer/codespaces/docker-compose.yml create mode 100644 .devcontainer/jetbrains/devcontainer.json create mode 100644 .devcontainer/jetbrains/docker-compose.yml diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 54952a69..f9be3fbb 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -26,6 +26,8 @@ ENV TZ="$TZ" ARG CLAUDE_CODE_VERSION=latest # Install basic development tools and iptables/ipset +# Note: X11 libraries (libxext6, libxrender1, etc.) are required for JetBrains Gateway +# https://www.jetbrains.com/help/rust/prerequisites-for-dev-containers.html RUN apt-get update && apt-get install -y --no-install-recommends \ less \ git \ @@ -46,6 +48,12 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ nano \ vim \ tmux \ + curl \ + libxext6 \ + libxrender1 \ + libxtst6 \ + libxi6 \ + libfreetype6 \ && apt-get clean && rm -rf /var/lib/apt/lists/* # Ensure default node user has access to /usr/local/share diff --git a/.devcontainer/README.md b/.devcontainer/README.md index 8747c252..dce43595 100644 --- a/.devcontainer/README.md +++ b/.devcontainer/README.md @@ -6,13 +6,21 @@ This directory contains the devcontainer configuration for the Langstar project. ## Overview -The devcontainer uses Docker Compose which provides **native `.env` file support**, solving environment variable management elegantly for both local and Codespaces environments. +The devcontainer uses Docker Compose with **three separate configurations** optimized for different development environments: -### Architecture +| Config | Location | Best For | Workspace | Secrets | +|--------|----------|----------|-----------|---------| +| **Default** | `.devcontainer/` | VS Code local | Bind mount | `.env` file | +| **Codespaces** | `.devcontainer/codespaces/` | GitHub Codespaces | Cloud-managed | GitHub secrets | +| **JetBrains** | `.devcontainer/jetbrains/` | RustRover, IntelliJ | Named volume | `.env` via bind mount | -- **Local Development**: Docker Compose automatically loads `.env` file -- **GitHub Codespaces**: Environment variables come from Codespaces secrets -- **Single Configuration**: No duplication, standard Docker Compose patterns +### Why Three Configurations? + +Each environment has unique requirements: + +- **VS Code Local**: Bind mounts project from host, uses local `.env` file +- **Codespaces**: Cloud-based, no local files - must use GitHub Codespaces secrets (`.env` is gitignored and doesn't exist in cloud) +- **JetBrains**: Needs named volume for native inotify support (avoids gRPC FUSE file watching issues), but also needs access to local `.env` file via hybrid mount ## Local Development Setup @@ -54,36 +62,55 @@ The devcontainer uses Docker Compose which provides **native `.env` file support ### Workspace Mount Configuration -By default, this devcontainer uses a **bind mount** (`..:/workspace:cached`) for maximum compatibility with VS Code, JetBrains, and GitHub Codespaces. +By default, this devcontainer uses a **bind mount** (`..:/workspace:cached`) which works well for VS Code. **Default behavior:** - Your local repository files are mounted directly into the container - Changes sync bidirectionally between host and container - Standard "Reopen in Container" workflow works seamlessly -#### Optional: Named Volume for JetBrains IDEs +## JetBrains Gateway Setup + +If you're using **RustRover, IntelliJ**, or other JetBrains IDEs, use the dedicated JetBrains configuration at `.devcontainer/jetbrains/`. + +This configuration uses a **hybrid mount approach** that provides: +- Native inotify support (no "External file changes sync might be slow" warnings) +- Access to your local `.env` file without baking secrets into the image + +### JetBrains Prerequisites -If you're using **RustRover, IntelliJ**, or other JetBrains IDEs and see the warning: -> "External file changes sync might be slow" +1. **Local checkout required**: Have a local checkout of the repo with `.devcontainer/.env` configured +2. **SSH agent**: Ensure SSH agent is running on your host machine -This occurs because Docker's bind mount on macOS uses gRPC FUSE, which doesn't provide full `inotify` support. +### JetBrains Setup Steps -**To fix this**, you can switch to a named Docker volume by editing `docker-compose.override.yml`: +1. Open JetBrains Gateway +2. Select **Remote Development > Dev Containers** +3. Click **Clone Repository** +4. Enter the repository URL +5. When prompted for devcontainer path, select: `.devcontainer/jetbrains/devcontainer.json` +6. Gateway will clone into a named volume and bind-mount your local `.devcontainer` for secrets + +### How the JetBrains Hybrid Mount Works + +``` +/workspace → Named volume (cloned by JetBrains, native inotify) +/workspace/.devcontainer → Bind mount from host (provides .env file) +``` -1. Copy the template: `cp docker-compose.override.yml.template docker-compose.override.yml` -2. Uncomment the volumes section for named volume -3. Rebuild the container -4. Clone the repo inside the container: `cd /workspace && git clone .` +This allows: +- Full inotify support for file watching (no gRPC FUSE) +- Access to your local `.env` file for secrets +- Code lives in the named volume (cloned separately by JetBrains) -**Trade-offs of named volume:** -| Aspect | Bind Mount (default) | Named Volume (optional) | -|--------|---------------------|------------------------| -| File watching | Limited (gRPC FUSE) | Full inotify support | -| File location | Host filesystem | Container volume | -| Setup workflow | Standard | Requires clone into container | -| Host editing | Supported | Not supported | +### JetBrains Trade-offs -See `docker-compose.override.yml.template` for detailed instructions. +| Aspect | VS Code (default) | JetBrains (hybrid) | +|--------|-------------------|-------------------| +| File watching | gRPC FUSE (limited) | Native inotify | +| Code location | Host filesystem | Named volume | +| Secrets | Direct from `.env` | `.env` via bind mount | +| Prerequisites | Just `.env` | Local checkout + `.env` | ### Files Created (Gitignored) @@ -94,9 +121,11 @@ These files are created locally and **will not be committed** to git: ## GitHub Codespaces Setup -### Configure Codespaces Secrets +For Codespaces, use the dedicated configuration at `.devcontainer/codespaces/`. + +**Why a separate config?** The `.env` file is gitignored and doesn't exist in Codespaces. The Codespaces config is designed to work exclusively with GitHub Codespaces secrets, with no `.env` file dependency. -Codespaces uses repository or organization secrets instead of local `.env` files. +### Configure Codespaces Secrets 1. **Go to your repository settings:** - Navigate to `Settings` → `Secrets and variables` → `Codespaces` @@ -117,30 +146,52 @@ Codespaces uses repository or organization secrets instead of local `.env` files - Click the green "Code" button - Select "Codespaces" tab - Click "Create codespace on main" (or your branch) + - When prompted, select: `.devcontainer/codespaces/devcontainer.json` -### How Codespaces Works +### How Codespaces Config Works -In Codespaces: -- The `devcontainer.json` uses Docker Compose configuration -- `docker-compose.yml` uses fallback syntax: `${GITHUB_PAT:-${GH_PAT}}` -- Environment variables come from Codespaces secrets (`GH_PAT`, `GH_USER`, etc.) -- No `.env` file is needed or used +The Codespaces configuration: +- Uses `docker-compose.yml` with direct secret references (`${GH_PAT}`, not fallback syntax) +- Has NO `env_file` directive (would fail since `.env` doesn't exist) +- All environment variables come from Codespaces secrets - `setup-github-auth.sh` configures git authentication using the provided variables ## Architecture +### Directory Structure + +``` +.devcontainer/ +├── devcontainer.json # VS Code local (default) +├── docker-compose.yml # VS Code compose (bind mount, .env) +├── Dockerfile # Shared container image +├── .env.default # Environment template +├── .env # Local secrets (gitignored) +├── post-create.sh # Shared setup script +├── setup-github-auth.sh # Shared auth script +├── codespaces/ # GitHub Codespaces config +│ ├── devcontainer.json # Codespaces-specific +│ └── docker-compose.yml # No .env dependency +└── jetbrains/ # JetBrains Gateway config + ├── devcontainer.json # JetBrains-specific + └── docker-compose.yml # Hybrid volume mount +``` + ### Configuration Files -| File | Purpose | Committed to Git | Environment | -|------|---------|------------------|-------------| -| `devcontainer.json` | Dev Container config (points to Docker Compose) | ✅ Yes | Both | -| `docker-compose.yml` | Docker Compose service definition | ✅ Yes | Both | -| `docker-compose.override.yml.template` | Template for local Docker overrides | ✅ Yes | Both | -| `docker-compose.override.yml` | Local Docker Compose overrides | ❌ No (gitignored) | Local only | -| `.env.default` | Environment variables template | ✅ Yes | Both | -| `.env` | Actual environment variables | ❌ No (gitignored) | Local only | -| `Dockerfile` | Container image definition | ✅ Yes | Both | -| `setup-github-auth.sh` | Git authentication setup | ✅ Yes | Both | +| File | Purpose | Committed | Used By | +|------|---------|-----------|---------| +| `devcontainer.json` | Default Dev Container config | ✅ Yes | VS Code local | +| `docker-compose.yml` | VS Code compose (bind mount) | ✅ Yes | VS Code local | +| `codespaces/devcontainer.json` | Codespaces config | ✅ Yes | GitHub Codespaces | +| `codespaces/docker-compose.yml` | Codespaces compose (no .env) | ✅ Yes | GitHub Codespaces | +| `jetbrains/devcontainer.json` | JetBrains config | ✅ Yes | RustRover, IntelliJ | +| `jetbrains/docker-compose.yml` | JetBrains compose (hybrid mount) | ✅ Yes | RustRover, IntelliJ | +| `Dockerfile` | Container image definition | ✅ Yes | All | +| `.env.default` | Environment variables template | ✅ Yes | VS Code, JetBrains | +| `.env` | Actual environment variables | ❌ No | VS Code, JetBrains | +| `docker-compose.override.yml.template` | Template for local overrides | ✅ Yes | Reference only | +| `docker-compose.override.yml` | Local overrides (deprecated) | ❌ No | Legacy | ### How Docker Compose Environment Variables Work @@ -250,7 +301,11 @@ services: **Problem:** Local overrides in `docker-compose.override.yml` aren't applied -**Solution:** +**Note:** The override file approach is deprecated. Use the dedicated configs instead: +- **JetBrains**: Use `.devcontainer/jetbrains/` instead +- **Codespaces**: Use `.devcontainer/codespaces/` instead + +**If you still need override files:** 1. Ensure file is named exactly `docker-compose.override.yml` (not `.template`) 2. Verify it's in `.devcontainer/` directory 3. Check YAML syntax is valid: `docker-compose config` @@ -340,6 +395,9 @@ docker-compose config | grep -A 10 environment: ## Related Issues +- [#718](https://github.com/codekiln/langstar/issues/718) - Multi-environment devcontainer setup (VS Code, Codespaces, JetBrains) +- [#711](https://github.com/codekiln/langstar/issues/711) - JetBrains OOM crash from gRPC FUSE +- [#712](https://github.com/codekiln/langstar/pull/712) - Named volume configuration for JetBrains - [#33](https://github.com/codekiln/langstar/issues/33) - Fix devcontainer .env file handling for Codespaces compatibility - [#23](https://github.com/codekiln/langstar/issues/23) - Refactor to use `GH_*` variables for Codespaces compatibility - [#26](https://github.com/codekiln/langstar/issues/26) - Removed problematic `env` section from `.claude/settings.json` diff --git a/.devcontainer/codespaces/devcontainer.json b/.devcontainer/codespaces/devcontainer.json new file mode 100644 index 00000000..d1b423e3 --- /dev/null +++ b/.devcontainer/codespaces/devcontainer.json @@ -0,0 +1,53 @@ +{ + "name": "langstar-codespaces", + // Use Docker Compose for container configuration + "dockerComposeFile": "docker-compose.yml", + "service": "langstar-dev", + "workspaceFolder": "/workspace", + + // Dev Container features (installed by VS Code, not Docker Compose) + "features": { + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers-extra/features/mise:1": {}, + "ghcr.io/devcontainers-extra/features/uv:1": {}, + "ghcr.io/devcontainers/features/rust:1": {}, + "ghcr.io/codekiln/langstar/langstar:1": { + "version": "2.1.2" + } + }, + + // VS Code customizations + "customizations": { + "vscode": { + "extensions": [ + "anthropic.claude-code", + // container tools for docker + "ms-azuretools.vscode-containers", + "ms-azuretools.vscode-docker", + // python language support + "ms-python.python" + ], + "settings": { + "files.autoSave": "afterDelay", + "editor.formatOnSave": true, + "terminal.integrated.defaultProfile.linux": "zsh", + "terminal.integrated.profiles.linux": { + "bash": { + "path": "bash", + "icon": "terminal-bash" + }, + "zsh": { + "path": "zsh" + } + } + } + } + }, + + "remoteUser": "node", + + // Lifecycle commands + // Note: Scripts are in parent directory, referenced via /workspace path + "postCreateCommand": "bash /workspace/.devcontainer/post-create.sh", + "postStartCommand": "bash /workspace/.devcontainer/setup-github-auth.sh" +} diff --git a/.devcontainer/codespaces/docker-compose.yml b/.devcontainer/codespaces/docker-compose.yml new file mode 100644 index 00000000..9e4c7098 --- /dev/null +++ b/.devcontainer/codespaces/docker-compose.yml @@ -0,0 +1,103 @@ +# Docker Compose configuration for GitHub Codespaces +# Compose file format: https://docs.docker.com/compose/compose-file/ +# +# IMPORTANT: This configuration is specifically designed for GitHub Codespaces. +# It does NOT depend on .env files (which are gitignored and don't exist in Codespaces). +# All environment variables come from GitHub Codespaces secrets. +# +# For local VS Code development, use the default config at ../.devcontainer/ +# For JetBrains Gateway, use .devcontainer/jetbrains/ + +services: + langstar-dev: + build: + context: .. + dockerfile: Dockerfile + # Build arguments with defaults (Codespaces secrets can override) + # https://docs.docker.com/compose/compose-file/build/#args + args: + TZ: ${TZ:-America/New_York} + CLAUDE_CODE_VERSION: ${CLAUDE_CODE_VERSION:-latest} + GIT_DELTA_VERSION: ${GIT_DELTA_VERSION:-0.18.2} + ZSH_IN_DOCKER_VERSION: ${ZSH_IN_DOCKER_VERSION:-1.2.1} + + # Add Linux capabilities for VPN/network tools + # https://docs.docker.com/compose/compose-file/compose-file-v3/#cap_add + cap_add: + - NET_ADMIN + - NET_RAW + + # Environment variables from GitHub Codespaces secrets + # https://docs.github.com/en/codespaces/managing-your-codespaces/managing-encrypted-secrets-for-your-codespaces + # + # IMPORTANT: NO fallback syntax (${VAR:-${OTHER}}) - Codespaces secrets only. + # The .env file does NOT exist in Codespaces (it's gitignored). + # All secrets must be configured in GitHub: Settings → Secrets → Codespaces + # + # Required Codespaces secrets: + # - GH_PAT: GitHub Personal Access Token + # - GH_USER: GitHub username + # - AWS_ACCESS_KEY_ID: AWS access key for Bedrock + # - AWS_SECRET_ACCESS_KEY: AWS secret key for Bedrock + # - LANGSMITH_API_KEY: LangSmith API key + environment: + # GitHub Authentication (from Codespaces secrets) + GITHUB_PAT: ${GH_PAT} + GITHUB_USER: ${GH_USER} + GITHUB_PROJECT_PAT: ${GH_PROJECT_PAT} + + # Anthropic/AWS Configuration (from Codespaces secrets) + AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} + AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} + ANTHROPIC_MODEL: ${ANTHROPIC_MODEL:-us.anthropic.claude-sonnet-4-5-20250929-v1:0} + ANTHROPIC_SMALL_FAST_MODEL: ${ANTHROPIC_SMALL_FAST_MODEL:-us.anthropic.claude-haiku-4-5-20251001-v1:0} + AWS_REGION: ${AWS_REGION:-us-east-1} + CLAUDE_CODE_USE_BEDROCK: ${CLAUDE_CODE_USE_BEDROCK:-1} + + # LangChain API Configuration (from Codespaces secrets) + LANGSMITH_API_KEY: ${LANGSMITH_API_KEY} + LANGSMITH_ORGANIZATION_NAME: ${LANGSMITH_ORGANIZATION_NAME} + LANGSMITH_ORGANIZATION_ID: ${LANGSMITH_ORGANIZATION_ID} + LANGSMITH_WORKSPACE_NAME: ${LANGSMITH_WORKSPACE_NAME} + LANGSMITH_WORKSPACE_ID: ${LANGSMITH_WORKSPACE_ID} + + # Test LangGraph Deployment (optional) + TEST_GRAPH_ID: ${TEST_GRAPH_ID} + TEST_DEPLOYMENT_ID: ${TEST_DEPLOYMENT_ID} + + # Container Environment (static values) + NODE_OPTIONS: --max-old-space-size=4096 + CLAUDE_CONFIG_DIR: /home/node/.claude + POWERLEVEL9K_DISABLE_GITSTATUS: "true" + + # tmux skill configuration + CLAUDE_TMUX_SOCKET_DIR: /tmp/claude-tmux-sockets + + # Claude Code Token Configuration + CLAUDE_CODE_MAX_OUTPUT_TOKENS: ${CLAUDE_CODE_MAX_OUTPUT_TOKENS:-4096} + MAX_THINKING_TOKENS: ${MAX_THINKING_TOKENS:-1024} + + # Legacy variables (optional) + GITHUB_TOKEN: ${GITHUB_TOKEN} + OPENAI_API_KEY: ${OPENAI_API_KEY} + + # Volume mounts + # https://docs.docker.com/compose/compose-file/compose-file-v3/#volumes + volumes: + # Bind mount workspace (Codespaces manages this in cloud) + - ..:/workspace:cached + + # Named volumes for persistent data across container rebuilds + - claude-code-bashhistory:/commandhistory + - claude-code-config:/home/node/.claude + + # Keep container running (required for devcontainers) + command: sleep infinity + + # Run container as 'node' user (matches Dockerfile USER directive) + user: node + +# Named volumes declaration +volumes: + claude-code-bashhistory: + claude-code-config: diff --git a/.devcontainer/docker-compose.override.yml.template b/.devcontainer/docker-compose.override.yml.template index e7534f42..167c4ec1 100644 --- a/.devcontainer/docker-compose.override.yml.template +++ b/.devcontainer/docker-compose.override.yml.template @@ -1,8 +1,15 @@ # Docker Compose Override Template # +# NOTE: For most use cases, dedicated configs are now available: +# - JetBrains (RustRover, IntelliJ): Use .devcontainer/jetbrains/ instead +# - GitHub Codespaces: Use .devcontainer/codespaces/ instead +# +# This override file is DEPRECATED for JetBrains users. The dedicated JetBrains +# config provides a proper hybrid mount setup that resolves gRPC FUSE issues. +# # This file is for LOCAL DEVELOPMENT ONLY and should NOT be committed to git. # -# SETUP INSTRUCTIONS: +# SETUP INSTRUCTIONS (if you still need custom overrides): # # 1. Copy this file to create your local override: # cp docker-compose.override.yml.template docker-compose.override.yml @@ -141,31 +148,26 @@ services: # - ~/my-local-data:/data # ============================================================================ - # OPTIONAL: Named volume for JetBrains IDEs (RustRover, IntelliJ) + # JETBRAINS USERS: Use the dedicated config instead! # ============================================================================ # - # If you're using JetBrains IDEs and see "External file changes sync might be - # slow" warning, you can switch to a named Docker volume for proper inotify - # support. This eliminates gRPC FUSE and provides native file watching. + # For JetBrains IDEs (RustRover, IntelliJ), use the dedicated configuration + # at .devcontainer/jetbrains/ which provides: + # - Named volume for workspace (native inotify support) + # - Bind mount for .devcontainer (access to local .env file) + # - Proper hybrid mount setup # - # TRADE-OFFS: - # + Proper inotify support - no more file watching warnings - # + Better I/O performance for large projects - # - Code lives inside container volume, not on host - # - Must clone repo into container after first setup - # - Can't edit files with host-based editors outside container + # See .devcontainer/README.md for setup instructions. # - # TO ENABLE NAMED VOLUME FOR JETBRAINS: - # 1. Uncomment the volumes section below - # 2. Rebuild container: Dev Containers: Rebuild Container - # 3. Clone repo inside container: cd /workspace && git clone . + # The manual override approach below is DEPRECATED and may not work properly + # with JetBrains Gateway due to how it handles docker-compose.override.yml. # - # volumes: - # - langstar-workspace:/workspace + # ============================================================================ + # LEGACY: Named volume for JetBrains IDEs (DEPRECATED) + # ============================================================================ # - # Also add to the top-level volumes section: # volumes: - # langstar-workspace: + # - langstar-workspace:/workspace # Example: Override specific environment variables for debugging # environment: diff --git a/.devcontainer/jetbrains/devcontainer.json b/.devcontainer/jetbrains/devcontainer.json new file mode 100644 index 00000000..e0d10e5f --- /dev/null +++ b/.devcontainer/jetbrains/devcontainer.json @@ -0,0 +1,35 @@ +{ + "name": "langstar-jetbrains", + // Use Docker Compose for container configuration + "dockerComposeFile": "docker-compose.yml", + "service": "langstar-dev", + "workspaceFolder": "/workspace", + + // Dev Container features + // Note: JetBrains Gateway applies these same features + "features": { + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers-extra/features/mise:1": {}, + "ghcr.io/devcontainers-extra/features/uv:1": {}, + "ghcr.io/devcontainers/features/rust:1": {}, + "ghcr.io/codekiln/langstar/langstar:1": { + "version": "2.1.2" + } + }, + + // JetBrains-specific customizations + // VS Code extensions are not applicable for JetBrains IDEs + "customizations": { + "jetbrains": { + // JetBrains Gateway settings can be added here + // See: https://www.jetbrains.com/help/idea/connect-to-devcontainer.html + } + }, + + "remoteUser": "node", + + // Lifecycle commands + // Note: Scripts are in parent directory, accessed via bind-mounted .devcontainer + "postCreateCommand": "bash /workspace/.devcontainer/post-create.sh", + "postStartCommand": "bash /workspace/.devcontainer/setup-github-auth.sh" +} diff --git a/.devcontainer/jetbrains/docker-compose.yml b/.devcontainer/jetbrains/docker-compose.yml new file mode 100644 index 00000000..76056613 --- /dev/null +++ b/.devcontainer/jetbrains/docker-compose.yml @@ -0,0 +1,112 @@ +# Docker Compose configuration for JetBrains Gateway (RustRover, IntelliJ) +# Compose file format: https://docs.docker.com/compose/compose-file/ +# +# This configuration uses a HYBRID VOLUME APPROACH: +# - Named volume for /workspace: Native inotify support (no gRPC FUSE warnings) +# - Bind mount for .devcontainer: Access to local .env file +# +# PREREQUISITES: +# 1. Have a local checkout of the repo on your host machine +# 2. Configure .devcontainer/.env in that local checkout with your secrets +# +# JetBrains Gateway will: +# 1. Clone the repo into the 'langstar-workspace' named volume +# 2. Overlay the .devcontainer folder from your local checkout (with .env) +# +# For local VS Code development, use the default config at ../.devcontainer/ +# For GitHub Codespaces, use .devcontainer/codespaces/ + +services: + langstar-dev: + build: + context: .. + dockerfile: Dockerfile + # Build arguments - can be overridden via environment + # https://docs.docker.com/compose/compose-file/build/#args + args: + TZ: ${TZ:-America/New_York} + CLAUDE_CODE_VERSION: ${CLAUDE_CODE_VERSION:-latest} + GIT_DELTA_VERSION: ${GIT_DELTA_VERSION:-0.18.2} + ZSH_IN_DOCKER_VERSION: ${ZSH_IN_DOCKER_VERSION:-1.2.1} + + # Add Linux capabilities for VPN/network tools + # https://docs.docker.com/compose/compose-file/compose-file-v3/#cap_add + cap_add: + - NET_ADMIN + - NET_RAW + + # Environment variables passed to the container + # Uses .env file from the bind-mounted .devcontainer folder + # https://docs.docker.com/compose/how-tos/environment-variables/variable-interpolation/ + environment: + # GitHub Authentication (from .env via bind mount) + GITHUB_PAT: ${GITHUB_PAT:-${GH_PAT}} + GITHUB_USER: ${GITHUB_USER:-${GH_USER}} + GITHUB_PROJECT_PAT: ${GITHUB_PROJECT_PAT:-${GH_PROJECT_PAT}} + + # Anthropic Configuration + AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} + AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} + ANTHROPIC_MODEL: ${ANTHROPIC_MODEL:-us.anthropic.claude-sonnet-4-5-20250929-v1:0} + ANTHROPIC_SMALL_FAST_MODEL: ${ANTHROPIC_SMALL_FAST_MODEL:-us.anthropic.claude-haiku-4-5-20251001-v1:0} + AWS_REGION: ${AWS_REGION:-us-east-1} + CLAUDE_CODE_USE_BEDROCK: ${CLAUDE_CODE_USE_BEDROCK:-1} + + # LangChain API Configuration + LANGSMITH_API_KEY: ${LANGSMITH_API_KEY} + LANGSMITH_ORGANIZATION_NAME: ${LANGSMITH_ORGANIZATION_NAME} + LANGSMITH_ORGANIZATION_ID: ${LANGSMITH_ORGANIZATION_ID} + LANGSMITH_WORKSPACE_NAME: ${LANGSMITH_WORKSPACE_NAME} + LANGSMITH_WORKSPACE_ID: ${LANGSMITH_WORKSPACE_ID} + + # Test LangGraph Deployment + TEST_GRAPH_ID: ${TEST_GRAPH_ID} + TEST_DEPLOYMENT_ID: ${TEST_DEPLOYMENT_ID} + + # Container Environment + NODE_OPTIONS: --max-old-space-size=4096 + CLAUDE_CONFIG_DIR: /home/node/.claude + POWERLEVEL9K_DISABLE_GITSTATUS: "true" + + # tmux skill configuration + CLAUDE_TMUX_SOCKET_DIR: /tmp/claude-tmux-sockets + + # Claude Code Token Configuration + CLAUDE_CODE_MAX_OUTPUT_TOKENS: ${CLAUDE_CODE_MAX_OUTPUT_TOKENS:-4096} + MAX_THINKING_TOKENS: ${MAX_THINKING_TOKENS:-1024} + + # Legacy variables + GITHUB_TOKEN: ${GITHUB_TOKEN:-${DEVCONTAINER_GITHUB_TOKEN}} + OPENAI_API_KEY: ${OPENAI_API_KEY:-${DEVCONTAINER_OPENAI_API_KEY}} + + # HYBRID VOLUME MOUNTS + # https://docs.docker.com/compose/compose-file/compose-file-v3/#volumes + volumes: + # Named volume for workspace - JetBrains clones here + # Provides native inotify support (no gRPC FUSE file watching issues) + - langstar-workspace:/workspace + + # Bind mount .devcontainer from host (overlays the named volume's .devcontainer) + # This provides access to the local .env file without baking secrets into image + # IMPORTANT: Requires local checkout with .devcontainer/.env configured + - ..:/workspace/.devcontainer + + # Named volumes for persistent data across container rebuilds + - claude-code-bashhistory:/commandhistory + - claude-code-config:/home/node/.claude + + # Keep container running (required for devcontainers) + command: sleep infinity + + # Run container as 'node' user (matches Dockerfile USER directive) + user: node + +# Named volumes declaration +# https://docs.docker.com/compose/compose-file/compose-file-v3/#volume-configuration-reference +volumes: + # Workspace volume - JetBrains clones repo here + langstar-workspace: + # Persistent bash history across container rebuilds + claude-code-bashhistory: + # Persistent Claude configuration across container rebuilds + claude-code-config: From e7b48e1f81cce3f6fc6114f45892f1cb6d78b114 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=E2=88=8Er?= <140930+codekiln@users.noreply.github.com> Date: Thu, 8 Jan 2026 07:01:17 -0500 Subject: [PATCH 2/6] =?UTF-8?q?=F0=9F=94=A7=20build:=20trigger=20CI=20re-r?= =?UTF-8?q?un=20after=20API=20key=20regeneration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 7664ec7f902b4e2fb54291b387b77163fda59d1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=E2=88=8Er?= <140930+codekiln@users.noreply.github.com> Date: Thu, 8 Jan 2026 07:04:42 -0500 Subject: [PATCH 3/6] =?UTF-8?q?=F0=9F=93=9A=20docs:=20add=20manual=20testi?= =?UTF-8?q?ng=20checklist=20for=20issue=20#718?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../issue-718-manual-test-checklist.md | 493 ++++++++++++++++++ 1 file changed, 493 insertions(+) create mode 100644 docs/implementation/issue-718-manual-test-checklist.md diff --git a/docs/implementation/issue-718-manual-test-checklist.md b/docs/implementation/issue-718-manual-test-checklist.md new file mode 100644 index 00000000..9eeca6cd --- /dev/null +++ b/docs/implementation/issue-718-manual-test-checklist.md @@ -0,0 +1,493 @@ +# Issue #718 Manual Testing Checklist + +**PR**: #721 - Multi-environment devcontainer setup +**Issue**: #718 - Create multi-environment devcontainer configs for VS Code, Codespaces, and JetBrains +**Branch**: `i718-multi-env-devcontainer` + +## Overview + +This PR adds three separate devcontainer configurations optimized for different development environments: +- **Default** (`.devcontainer/`) - VS Code local development +- **Codespaces** (`.devcontainer/codespaces/`) - GitHub Codespaces +- **JetBrains** (`.devcontainer/jetbrains/`) - RustRover, IntelliJ IDEA + +## Pre-Testing Setup + +- [ ] Ensure Docker Desktop is running (for local tests) +- [ ] Have GitHub Codespaces access configured (for Codespaces tests) +- [ ] Have JetBrains Gateway installed (for JetBrains tests) +- [ ] Have test credentials ready (API keys, PATs, etc.) + +--- + +## Test Suite 1: VS Code Local Development (Default Config) + +### 1.1 Initial Setup from Scratch + +- [ ] **Clone fresh repository** + ```bash + git clone https://github.com/codekiln/langstar.git test-langstar-vscode + cd test-langstar-vscode + git checkout i718-multi-env-devcontainer + ``` + +- [ ] **Create `.env` file** + ```bash + cd .devcontainer + cp .env.default .env + # Edit .env with real credentials + ``` + +- [ ] **Verify `.env` has actual values** (not placeholders) + - `GITHUB_PAT` starts with `ghp_` + - `LANGSMITH_API_KEY` starts with `lsv2_` + - `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` are populated + +### 1.2 Container Build and Startup + +- [ ] **Open in VS Code** + - Open the `test-langstar-vscode` folder in VS Code + +- [ ] **Reopen in Container** + - Press `Cmd+Shift+P` (Mac) or `Ctrl+Shift+P` (Windows/Linux) + - Select "Dev Containers: Reopen in Container" + - Wait for container to build (first time takes 3-5 minutes) + +- [ ] **Verify build completes without errors** + - Check VS Code Output panel for any build errors + - Confirm container starts successfully + +### 1.3 Environment Variable Verification + +- [ ] **Check environment variables are loaded** + ```bash + # In VS Code terminal inside container + echo "GITHUB_PAT: ${GITHUB_PAT:0:10}..." + echo "LANGSMITH_API_KEY: ${LANGSMITH_API_KEY:0:10}..." + echo "AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID:0:10}..." + printenv | grep -E 'GITHUB|LANGSMITH|AWS' | wc -l # Should show multiple vars + ``` + +- [ ] **Verify all required variables are set** + - `GITHUB_PAT` is defined + - `GITHUB_USER` is defined + - `LANGSMITH_API_KEY` is defined + - `AWS_ACCESS_KEY_ID` is defined + - `AWS_SECRET_ACCESS_KEY` is defined + +### 1.4 Git Authentication + +- [ ] **Test git operations** + ```bash + # Should show your GitHub username and email + git config user.name + git config user.email + + # Test authenticated fetch (should not prompt for credentials) + git fetch origin + ``` + +- [ ] **Verify git credential helper is configured** + ```bash + git config credential.helper # Should show 'store' + ``` + +### 1.5 Development Tools + +- [ ] **Verify Rust toolchain** + ```bash + rustc --version + cargo --version + cargo nextest --version + ``` + +- [ ] **Verify GitHub CLI** + ```bash + gh --version + gh auth status # Should show authenticated + ``` + +- [ ] **Verify langstar CLI is installed** + ```bash + langstar --version # Should show v2.1.2 or later + ``` + +- [ ] **Run cargo checks** + ```bash + cargo fmt --check + cargo check --workspace --all-features + cargo clippy --workspace --all-features -- -D warnings + cargo nextest run --profile ci --all-features --workspace + ``` + +### 1.6 File System and Volumes + +- [ ] **Verify workspace mount** + ```bash + ls -la /workspace # Should show repository files + touch /workspace/test-file.txt + # Check that test-file.txt appears in VS Code file explorer + rm /workspace/test-file.txt + ``` + +- [ ] **Verify persistent volumes** + ```bash + # Bash history should persist across container restarts + echo "test command" >> ~/.bash_history + + # Claude Code config should persist + ls -la ~/.claude + ``` + +- [ ] **Test bidirectional file sync** + - Edit a file in VS Code + - Verify changes appear immediately in terminal: `cat ` + - Edit a file in terminal: `echo "test" >> README.md` + - Verify changes appear immediately in VS Code + +### 1.7 Extensions and Settings + +- [ ] **Verify VS Code extensions are installed** + - `anthropic.claude-code` (Claude Code extension) + - `ms-azuretools.vscode-docker` (Docker extension) + - `ms-python.python` (Python extension) + +- [ ] **Verify VS Code settings** + - Auto-save is enabled: Check Settings > Files: Auto Save + - Format on save is enabled: Check Settings > Editor: Format On Save + - Default terminal is zsh: Open terminal and check shell + +### 1.8 Rebuild Test + +- [ ] **Test rebuild workflow** + - Press `Cmd+Shift+P` → "Dev Containers: Rebuild Container" + - Verify rebuild completes successfully + - Verify environment variables still work after rebuild + - Verify git authentication still works after rebuild + +--- + +## Test Suite 2: GitHub Codespaces + +### 2.1 Codespaces Secrets Configuration + +- [ ] **Configure Codespaces secrets** + - Go to repository Settings → Secrets and variables → Codespaces + - Verify the following secrets are set: + - `GH_PAT` (GitHub PAT) + - `GH_USER` (GitHub username) + - `GH_PROJECT_PAT` (GitHub project PAT) + - `AWS_ACCESS_KEY_ID` + - `AWS_SECRET_ACCESS_KEY` + - `LANGSMITH_API_KEY` + +### 2.2 Create Codespace + +- [ ] **Create a new Codespace** + - Go to repository on GitHub + - Click green "Code" button → Codespaces tab + - Click "Create codespace on i718-multi-env-devcontainer" + - When prompted for devcontainer configuration, select: `.devcontainer/codespaces/devcontainer.json` + +- [ ] **Wait for Codespace to build** + - First build takes 5-10 minutes + - Verify build completes without errors + +### 2.3 Environment Verification in Codespaces + +- [ ] **Verify NO `.env` file exists** + ```bash + ls -la /workspace/.devcontainer/.env # Should NOT exist + ``` + +- [ ] **Verify environment variables from secrets** + ```bash + echo "GH_PAT: ${GH_PAT:0:10}..." + echo "LANGSMITH_API_KEY: ${LANGSMITH_API_KEY:0:10}..." + printenv | grep -E 'GH_|LANGSMITH|AWS' | wc -l # Should show multiple vars + ``` + +- [ ] **Check all required variables** + - `GH_PAT` is defined + - `GH_USER` is defined + - `LANGSMITH_API_KEY` is defined + - `AWS_ACCESS_KEY_ID` is defined + - `AWS_SECRET_ACCESS_KEY` is defined + +### 2.4 Git and Development Tools in Codespaces + +- [ ] **Test git operations** + ```bash + git config user.name + git config user.email + git fetch origin # Should work without prompting + ``` + +- [ ] **Verify development tools** + ```bash + rustc --version + gh --version + langstar --version + ``` + +- [ ] **Run cargo checks** + ```bash + cargo fmt --check + cargo check --workspace --all-features + ``` + +### 2.5 Codespaces-Specific Features + +- [ ] **Test port forwarding** (if applicable) + - Run a local server + - Verify ports forward automatically in Codespaces + +- [ ] **Test VS Code extensions in Codespaces** + - Verify Claude Code extension is active + - Verify Docker extension is active + +### 2.6 Rebuild in Codespaces + +- [ ] **Test rebuild** + - Codespaces → Rebuild Container + - Verify rebuild succeeds + - Verify secrets still work after rebuild + +--- + +## Test Suite 3: JetBrains Gateway (RustRover/IntelliJ) + +### 3.1 Prerequisites Setup + +- [ ] **Prepare local checkout with `.env`** + ```bash + git clone https://github.com/codekiln/langstar.git test-langstar-jetbrains + cd test-langstar-jetbrains + git checkout i718-multi-env-devcontainer + cd .devcontainer + cp .env.default .env + # Edit .env with real credentials + ``` + +- [ ] **Verify SSH agent is running** + ```bash + ssh-add -l # Should list keys or show "The agent has no identities" + ``` + +### 3.2 JetBrains Gateway Setup + +- [ ] **Open JetBrains Gateway** + - Select "Remote Development" → "Dev Containers" + +- [ ] **Clone repository through Gateway** + - Click "Clone Repository" + - Enter repository URL: `https://github.com/codekiln/langstar.git` + - When prompted for devcontainer path, select: `.devcontainer/jetbrains/devcontainer.json` + - Wait for Gateway to clone and build (5-10 minutes first time) + +### 3.3 Verify Hybrid Mount Architecture + +- [ ] **Check workspace location** + ```bash + # Should be in named volume, not bind mount + df -h /workspace | grep -E 'workspace|volume' + ``` + +- [ ] **Verify `.devcontainer` bind mount** + ```bash + ls -la /workspace/.devcontainer/.env # Should exist (bind-mounted from host) + cat /workspace/.devcontainer/.env | head -n 3 # Should show actual values + ``` + +- [ ] **Confirm environment variables loaded from bind-mounted `.env`** + ```bash + echo "GITHUB_PAT: ${GITHUB_PAT:0:10}..." + echo "LANGSMITH_API_KEY: ${LANGSMITH_API_KEY:0:10}..." + ``` + +### 3.4 File Watching and inotify + +- [ ] **Test file watching** + - Edit a file in JetBrains IDE + - Verify changes appear immediately in terminal: `cat ` + - Check for NO warning: "External file changes sync might be slow" + +- [ ] **Verify native inotify support** + ```bash + # Should NOT show gRPC FUSE warnings + dmesg | grep -i fuse # Should be minimal or empty + ``` + +- [ ] **Test rapid file changes** + - Use Find & Replace across multiple files + - Verify IDE remains responsive + - Check for no OOM crashes or performance issues + +### 3.5 Development Workflow in JetBrains + +- [ ] **Run Rust build** + - Open Cargo.toml + - Click "Build" or use IDE build tools + - Verify build succeeds + +- [ ] **Run tests in IDE** + - Right-click on `tests/` directory + - Select "Run Tests" + - Verify tests execute successfully + +- [ ] **Use integrated terminal** + - Open terminal in IDE + - Run: `cargo check --workspace` + - Verify command completes successfully + +### 3.6 Git Integration in JetBrains + +- [ ] **Test git operations in IDE** + - VCS → Git → Fetch + - Should complete without authentication prompts + +- [ ] **Check git configuration** + - Terminal: `git config user.name` + - Should show your GitHub username + +### 3.7 JetBrains Gateway Reconnection + +- [ ] **Test disconnect/reconnect** + - Disconnect from the remote environment + - Reconnect to the same container + - Verify state is preserved (open files, terminal sessions, etc.) + - Verify environment variables still work + +--- + +## Test Suite 4: Cross-Configuration Validation + +### 4.1 Configuration Isolation + +- [ ] **Verify configs don't interfere** + - Default config uses `.devcontainer/docker-compose.yml` + - Codespaces config uses `.devcontainer/codespaces/docker-compose.yml` + - JetBrains config uses `.devcontainer/jetbrains/docker-compose.yml` + - Each should work independently + +### 4.2 Documentation Accuracy + +- [ ] **Verify README.md matches actual behavior** + - Re-read `.devcontainer/README.md` + - Check all commands work as documented + - Verify all troubleshooting steps are accurate + +- [ ] **Check getting-started.md (if exists)** + - Verify instructions match the new multi-config setup + +### 4.3 Template Files + +- [ ] **Verify `.env.default` is complete** + - Compare `.env.default` with actual `.env` used in testing + - Ensure all required variables are documented + +- [ ] **Check `docker-compose.override.yml.template`** + - Verify template syntax is valid + - Confirm deprecation notice is clear + +--- + +## Test Suite 5: Edge Cases and Error Scenarios + +### 5.1 Missing Credentials + +- [ ] **Test VS Code without `.env` file** + - Remove `.devcontainer/.env` + - Try to build container + - Verify clear error message about missing `.env` + +- [ ] **Test Codespaces without secrets** + - Remove one Codespaces secret (e.g., `GH_PAT`) + - Try to create Codespace + - Verify container starts but authentication fails gracefully + +### 5.2 Invalid Credentials + +- [ ] **Test with invalid API keys** + - Use fake/expired `LANGSMITH_API_KEY` + - Verify langstar CLI fails gracefully with clear error + - Verify container still starts + +- [ ] **Test with invalid GitHub PAT** + - Use expired/invalid `GITHUB_PAT` + - Verify git operations fail with clear error message + - Verify `setup-github-auth.sh` handles this gracefully + +### 5.3 Volume Cleanup + +- [ ] **Test volume persistence after container deletion** + - Note a value in bash history: `echo "test123" >> ~/.bash_history` + - Delete container: `Dev Containers: Rebuild Container` + - Verify bash history persists: `history | grep test123` + +- [ ] **Test clean slate rebuild** + - Delete all related volumes: `docker volume prune` + - Rebuild container + - Verify fresh environment + +--- + +## Test Suite 6: Regression Testing + +### 6.1 Existing Workflows Still Work + +- [ ] **Test legacy local setup** (if user had old config) + - Users with existing `.devcontainer/.env` should still work + - No breaking changes to existing local development workflow + +- [ ] **Test CI/CD integration** + - Verify GitHub Actions still work (check PR #721 status) + - Ensure CI doesn't depend on local `.env` files + +### 6.2 Feature Parity + +- [ ] **Verify all configs have same dev tools** + - Rust toolchain (rustc, cargo, nextest) + - GitHub CLI (gh) + - langstar CLI (v2.1.2+) + - Python (if needed) + +- [ ] **Verify all configs have same features** + - All devcontainer features are applied correctly + - No missing features in any configuration + +--- + +## Completion Checklist + +- [ ] All VS Code local tests pass (Suite 1) +- [ ] All Codespaces tests pass (Suite 2) +- [ ] All JetBrains tests pass (Suite 3) +- [ ] Cross-configuration tests pass (Suite 4) +- [ ] Edge cases handled correctly (Suite 5) +- [ ] No regressions detected (Suite 6) + +## Issues Found + +Document any issues discovered during testing: + +1. **Issue**: [Description] + - **Severity**: Critical / High / Medium / Low + - **Config Affected**: VS Code / Codespaces / JetBrains / All + - **Steps to Reproduce**: [Steps] + - **Expected**: [What should happen] + - **Actual**: [What actually happens] + +2. [Add more as needed] + +--- + +## Sign-off + +- [ ] I have completed all applicable test suites +- [ ] I have documented any issues found +- [ ] I recommend this PR for merge (or outline blocking issues) + +**Tester**: ________________________ +**Date**: ________________________ +**Notes**: ________________________ From 2f9204beed2ae91c72d9e295865a797dbcfdf826 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=E2=88=8Er?= <140930+codekiln@users.noreply.github.com> Date: Thu, 8 Jan 2026 07:06:04 -0500 Subject: [PATCH 4/6] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20rename=20t?= =?UTF-8?q?est=20checklist=20to=20follow=20docs/implementation=20naming=20?= =?UTF-8?q?convention?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ist.md => 718-multi-env-devcontainer-manual-test-checklist.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/implementation/{issue-718-manual-test-checklist.md => 718-multi-env-devcontainer-manual-test-checklist.md} (100%) diff --git a/docs/implementation/issue-718-manual-test-checklist.md b/docs/implementation/718-multi-env-devcontainer-manual-test-checklist.md similarity index 100% rename from docs/implementation/issue-718-manual-test-checklist.md rename to docs/implementation/718-multi-env-devcontainer-manual-test-checklist.md From c43a3b22c6fd713f63737d1ad79d3a640136b691 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Thu, 8 Jan 2026 07:41:08 -0500 Subject: [PATCH 5/6] =?UTF-8?q?=F0=9F=90=9B=20fix(codespaces):=20correct?= =?UTF-8?q?=20volume=20mount=20to=20repository=20root=20(#722)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Initial plan * 🐛 fix(codespaces): correct volume mount path to repository root Co-authored-by: codekiln <140930+codekiln@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: codekiln <140930+codekiln@users.noreply.github.com> --- .devcontainer/codespaces/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/codespaces/docker-compose.yml b/.devcontainer/codespaces/docker-compose.yml index 9e4c7098..0f2271a2 100644 --- a/.devcontainer/codespaces/docker-compose.yml +++ b/.devcontainer/codespaces/docker-compose.yml @@ -85,7 +85,7 @@ services: # https://docs.docker.com/compose/compose-file/compose-file-v3/#volumes volumes: # Bind mount workspace (Codespaces manages this in cloud) - - ..:/workspace:cached + - ../..:/workspace:cached # Named volumes for persistent data across container rebuilds - claude-code-bashhistory:/commandhistory From 5545f1f0275a0ad1c3cc40aaaa9329e4024f6d67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=E2=88=8Er?= <140930+codekiln@users.noreply.github.com> Date: Tue, 20 Jan 2026 07:14:36 -0500 Subject: [PATCH 6/6] =?UTF-8?q?=E2=9C=85=20docs:=20manual=20checklist=20ed?= =?UTF-8?q?its=20for=20PR=20#721,=20prepping=20for=20rebase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...-env-devcontainer-manual-test-checklist.md | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/docs/implementation/718-multi-env-devcontainer-manual-test-checklist.md b/docs/implementation/718-multi-env-devcontainer-manual-test-checklist.md index 9eeca6cd..8fe4b4f1 100644 --- a/docs/implementation/718-multi-env-devcontainer-manual-test-checklist.md +++ b/docs/implementation/718-multi-env-devcontainer-manual-test-checklist.md @@ -13,10 +13,10 @@ This PR adds three separate devcontainer configurations optimized for different ## Pre-Testing Setup -- [ ] Ensure Docker Desktop is running (for local tests) -- [ ] Have GitHub Codespaces access configured (for Codespaces tests) -- [ ] Have JetBrains Gateway installed (for JetBrains tests) -- [ ] Have test credentials ready (API keys, PATs, etc.) +- [x] Ensure Docker Desktop is running (for local tests) +- [x] Have GitHub Codespaces access configured (for Codespaces tests) +- [x] Have JetBrains Gateway installed (for JetBrains tests) +- [x] Have test credentials ready (API keys, PATs, etc.) --- @@ -24,21 +24,21 @@ This PR adds three separate devcontainer configurations optimized for different ### 1.1 Initial Setup from Scratch -- [ ] **Clone fresh repository** +- [x] **Clone fresh repository** ```bash git clone https://github.com/codekiln/langstar.git test-langstar-vscode cd test-langstar-vscode git checkout i718-multi-env-devcontainer ``` -- [ ] **Create `.env` file** +- [x] **Create `.env` file** ```bash cd .devcontainer cp .env.default .env # Edit .env with real credentials ``` -- [ ] **Verify `.env` has actual values** (not placeholders) +- [x] **Verify `.env` has actual values** (not placeholders) - `GITHUB_PAT` starts with `ghp_` - `LANGSMITH_API_KEY` starts with `lsv2_` - `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` are populated @@ -259,7 +259,8 @@ This PR adds three separate devcontainer configurations optimized for different ### 3.1 Prerequisites Setup -- [ ] **Prepare local checkout with `.env`** +NOTE - when I tested, I didn't do a separate checkout; I reused the existing one. +- [x] **Prepare local checkout with `.env`** ```bash git clone https://github.com/codekiln/langstar.git test-langstar-jetbrains cd test-langstar-jetbrains @@ -269,14 +270,14 @@ This PR adds three separate devcontainer configurations optimized for different # Edit .env with real credentials ``` -- [ ] **Verify SSH agent is running** +- [x] **Verify SSH agent is running** ```bash ssh-add -l # Should list keys or show "The agent has no identities" ``` ### 3.2 JetBrains Gateway Setup -- [ ] **Open JetBrains Gateway** +- [x] **Open JetBrains Gateway** - Select "Remote Development" → "Dev Containers" - [ ] **Clone repository through Gateway**