diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..fa30c2e --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,15 @@ +# Use Ubuntu 24.04 as base image to match the current environment +FROM mcr.microsoft.com/devcontainers/base:ubuntu-24.04 + +# Install system dependencies +# Note: Python and Git are installed via devcontainer features +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ + && apt-get -y install --no-install-recommends \ + build-essential \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Set working directory +WORKDIR /workspaces/seclab-taskflow-agent + +# The rest of the setup will be done in post-create script diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..f4634da --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,54 @@ +{ + "name": "Seclab Taskflow Agent", + "build": { + "dockerfile": "Dockerfile", + "context": ".." + }, + // Features to add to the dev container + "features": { + "ghcr.io/devcontainers/features/python:1": { + "version": "3.11", + "installTools": true + }, + "ghcr.io/devcontainers/features/git:1": { + "version": "latest" + }, + "ghcr.io/devcontainers/features/github-cli:1": { + "version": "latest" + } + }, + // Configure tool-specific properties + "customizations": { + "vscode": { + "extensions": [ + "ms-python.python", + "ms-python.vscode-pylance", + "redhat.vscode-yaml", + "GitHub.copilot", + "GitHub.copilot-chat", + "ms-azuretools.vscode-docker" + ], + "settings": { + "python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python", + "python.terminal.activateEnvironment": true + } + } + }, + // 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": "bash .devcontainer/post-create.sh", + // Use 'postStartCommand' to run commands when the container starts + // "postStartCommand": "", + // Environment variables + "containerEnv": { + "PYTHONUNBUFFERED": "1" + }, + // Set the user to use in the container (non-root) + "remoteUser": "vscode", + // Grant the container access to the host's Docker daemon + "runArgs": [ + "--privileged", + "--init" + ] +} \ No newline at end of file diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh new file mode 100644 index 0000000..02f7c1a --- /dev/null +++ b/.devcontainer/post-create.sh @@ -0,0 +1,49 @@ +#!/bin/bash +set -e + +echo "🚀 Setting up Seclab Taskflow Agent development environment..." + +# Create Python virtual environment +echo "📦 Creating Python virtual environment..." +python3 -m venv .venv + +# Activate virtual environment and install dependencies +echo "📥 Installing Python dependencies..." +source .venv/bin/activate +python -m pip install --upgrade pip +python -m pip install -r requirements.txt + +# If running in Codespaces, check for necessary secrets and print error if missing +if [ -n "$CODESPACES" ]; then + echo "🔐 Running in Codespaces - injecting secrets from Codespaces settings..." + if [ -n "$COPILOT_TOKEN" ]; then + echo "Running in Codespaces - please add COPILOT_TOKEN to your Codespaces secrets" + fi + if [ -n "$GITHUB_AUTH_HEADER" ]; then + echo "Running in Codespaces - please add GITHUB_AUTH_HEADER to your Codespaces secrets" + fi +fi + +# Create .env file if it doesn't exist +if [ ! -f .env ]; then + echo "📝 Creating .env template..." + cat > .env << 'EOF' + +# Optional: CodeQL database base path +CODEQL_DBS_BASE_PATH=/workspaces/seclab-taskflow-agent/my_data + +EOF + echo "⚠️ Please configure the enviroment or your .env file with required tokens!" +fi + +# Create logs directory if it doesn't exist +mkdir -p logs + +# Create optional data directories +mkdir -p my_data + +echo "✅ Development environment setup complete!" +echo "" +echo "📋 Next steps:" +echo "Configure your environment with COPILOT_TOKEN and GITHUB_AUTH_HEADER as needed." +echo "💡 Remember to activate the virtual environment: source .venv/bin/activate"