Refactor devcontainer setup with MCP servers and dynamic config

Ajout d'une configuration DevContainer complète avec MCP Servers (LSP multi-langages, GitHub/Gitea), scripts de setup automatisés (crazycoder-setup.sh, setup-devcontainer.sh), et optimisation de l’image Docker (rustup/cargo-binstall, nettoyage des artefacts). Mise à jour du README avec documentation MCP et gestion dynamique des variables d’environnement (.env généré automatiquement selon la forge détectée). Simplification des entrypoints et postStartCommand pour une initialisation plus fiable.
This commit is contained in:
2026-03-11 22:18:02 +01:00
parent d6fb4e33e5
commit 6556c84e29
9 changed files with 405 additions and 184 deletions

View File

@@ -46,6 +46,7 @@ mkdir -p "$DEVCONTAINER_DIR/config/cargo-bin"
mkdir -p "$DEVCONTAINER_DIR/config/go-cache"
mkdir -p "$DEVCONTAINER_DIR/config/go-bin"
mkdir -p "$DEVCONTAINER_DIR/config/python-local"
mkdir -p "$DEVCONTAINER_DIR/config/zed"
mkdir -p "$DEVCONTAINER_DIR/config/npm-cache"
mkdir -p "$DEVCONTAINER_DIR/config/r-libs"
@@ -55,8 +56,13 @@ if [[ -f "$DEVCONTAINER_JSON" ]]; then
warning "devcontainer.json already exists, skipping"
else
fetch ".devcontainer/devcontainer.json" "$DEVCONTAINER_JSON"
# Rename the service name to match the project
sed -i.bak "s/\"name\": \"PMOCrazyCoder\"/\"name\": \"$(basename "$PROJECT_DIR")\"/" "$DEVCONTAINER_JSON"
PROJECT_NAME="$(basename "$PROJECT_DIR")"
SERVICE_NAME="crazycoder-${PROJECT_NAME}"
# Patch display name and service reference
sed -i.bak \
-e "s/\"name\": \"PMOCrazyCoder\"/\"name\": \"${PROJECT_NAME}\"/" \
-e "s/\"service\": \"pmocrazycoder\"/\"service\": \"${SERVICE_NAME}\"/" \
"$DEVCONTAINER_JSON"
rm -f "$DEVCONTAINER_JSON.bak"
info "Created devcontainer.json"
fi
@@ -67,33 +73,97 @@ if [[ -f "$COMPOSE_FILE" ]]; then
warning "docker-compose.yml already exists, skipping"
else
fetch ".devcontainer/docker-compose.yml" "$COMPOSE_FILE"
PROJECT_NAME="$(basename "$PROJECT_DIR")"
SERVICE_NAME="crazycoder-${PROJECT_NAME}"
# Rename the service to avoid collision with project's own Docker services
sed -i.bak "s/^ pmocrazycoder:/ ${SERVICE_NAME}:/" "$COMPOSE_FILE"
# Patch LOCAL_LLM_API if overridden
if [[ "$LOCAL_LLM_API" != "http://host.docker.internal:1248/v1" ]]; then
sed -i.bak "s|http://host.docker.internal:1248/v1|${LOCAL_LLM_API}|g" "$COMPOSE_FILE"
rm -f "$COMPOSE_FILE.bak"
fi
rm -f "$COMPOSE_FILE.bak"
info "Created docker-compose.yml"
fi
# --- .env ---
ENV_FILE="$DEVCONTAINER_DIR/.env"
if [[ -f "$ENV_FILE" ]]; then
warning ".env already exists, skipping"
else
# Détecter la forge depuis l'origin git du projet
DETECTED_GITEA_URL=""
IS_GITHUB=false
if command -v git >/dev/null && git -C "$PROJECT_DIR" rev-parse --git-dir &>/dev/null; then
ORIGIN_URL=$(git -C "$PROJECT_DIR" remote get-url origin 2>/dev/null || true)
if [[ -n "$ORIGIN_URL" ]]; then
# Extraire scheme + host (supporte https://host/... et git@host:...)
if [[ "$ORIGIN_URL" =~ ^(https?://[^/]+) ]]; then
ORIGIN_HOST="${BASH_REMATCH[1]}"
elif [[ "$ORIGIN_URL" =~ ^git@([^:]+): ]]; then
ORIGIN_HOST="https://${BASH_REMATCH[1]}"
fi
if [[ "${ORIGIN_HOST:-}" == *"github.com"* ]]; then
IS_GITHUB=true
info "Forge détectée : GitHub"
elif [[ -n "${ORIGIN_HOST:-}" ]]; then
# Tester si c'est un Gitea/Forgejo via son API
if curl -fsSL --max-time 5 "${ORIGIN_HOST}/api/v1/version" 2>/dev/null | grep -q '"version"'; then
DETECTED_GITEA_URL="$ORIGIN_HOST"
info "Forge détectée : Gitea/Forgejo ($DETECTED_GITEA_URL)"
else
warning "Forge non reconnue pour $ORIGIN_HOST (ni GitHub ni Gitea/Forgejo)"
fi
fi
fi
fi
{
echo "# Secrets du devcontainer — ne pas committer"
echo ""
if $IS_GITHUB; then
echo "# GitHub"
echo "GITHUB_TOKEN="
else
echo "# GitHub (non détecté pour ce projet)"
echo "# GITHUB_TOKEN="
fi
echo ""
if [[ -n "$DETECTED_GITEA_URL" ]]; then
echo "# Gitea"
echo "GITEA_URL=${DETECTED_GITEA_URL}"
echo "GITEA_TOKEN="
else
echo "# Gitea (non détecté pour ce projet)"
echo "# GITEA_URL="
echo "# GITEA_TOKEN="
fi
} > "$ENV_FILE"
info "Created .env"
fi
# --- .gitignore ---
GITIGNORE="$PROJECT_DIR/.gitignore"
if [[ -f "$GITIGNORE" ]]; then
if grep -q "\.devcontainer/config/" "$GITIGNORE"; then
warning ".gitignore already contains .devcontainer/config/, skipping"
else
printf '\n# PMOCrazyCoder devcontainer runtime config\n.devcontainer/config/\n' >> "$GITIGNORE"
printf '\n# PMOCrazyCoder devcontainer runtime config\n.devcontainer/config/\n.devcontainer/.env\n' >> "$GITIGNORE"
info "Updated .gitignore"
fi
else
printf '# PMOCrazyCoder devcontainer runtime config\n.devcontainer/config/\n' > "$GITIGNORE"
printf '# PMOCrazyCoder devcontainer runtime config\n.devcontainer/config/\n.devcontainer/.env\n' > "$GITIGNORE"
info "Created .gitignore"
fi
echo
info "Done. Next steps:"
echo " 1. Open the project in VS Code / Zed / Cursor"
echo " 2. Reopen in container (the image will be pulled from the registry)"
echo " 3. Run /login in the Claude Agent panel to authenticate"
echo " 1. Renseigner les tokens dans .devcontainer/.env"
echo " 2. Open the project in VS Code / Zed / Cursor"
echo " 3. Reopen in container (the image will be pulled from the registry)"
echo " 4. Run /login in the Claude Agent panel to authenticate"
echo
info "To use a different local LLM API endpoint:"
echo " LOCAL_LLM_API=http://myserver:1248/v1 bash setup-devcontainer.sh"