From 4c57ee3134d076a03572bc5e2f5c941f90659818 Mon Sep 17 00:00:00 2001 From: brettheap Date: Sun, 12 Jul 2026 16:58:43 -0700 Subject: [PATCH 1/3] feat: mount Claude account profiles --- .devcontainer/devcontainer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 4a8e656..6db5df3 100755 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -91,6 +91,7 @@ "source=${localEnv:HOME}/.agents,target=/home/${localEnv:USER}/.agents,type=bind,consistency=cached", "source=${localEnv:HOME}/.claude,target=/home/${localEnv:USER}/.claude,type=bind,consistency=cached", "source=${localEnv:HOME}/.claude.json,target=/home/${localEnv:USER}/.claude.json,type=bind,consistency=cached", + "source=${localEnv:HOME}/.claude-profiles,target=/home/${localEnv:USER}/.claude-profiles,type=bind,consistency=cached", "source=${localEnv:HOME}/.codex,target=/home/${localEnv:USER}/.codex,type=bind,consistency=cached", "source=${localEnv:HOME}/.pi,target=/home/${localEnv:USER}/.pi,type=bind,consistency=cached", "source=${localEnv:HOME}/.config/sonarqube,target=/home/${localEnv:USER}/.config/sonarqube,type=bind,readonly", From 6c8cd98184215225f4594f700f8a86188ada2328 Mon Sep 17 00:00:00 2001 From: brettheap Date: Sun, 12 Jul 2026 16:59:14 -0700 Subject: [PATCH 2/3] feat: keep VS Code extensions current --- .devcontainer/devcontainer.json | 9 +- scripts/ensure-latest-vscode-extension.sh | 140 ++++++++++++++++++++++ 2 files changed, 146 insertions(+), 3 deletions(-) create mode 100755 scripts/ensure-latest-vscode-extension.sh diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 6db5df3..136043d 100755 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,6 +1,7 @@ { "name": "devBenches / flutterBench", "initializeCommand": "bash ${localWorkspaceFolder}/../scripts/ensure-sonarqube-mcp.sh && bash ${localWorkspaceFolder}/scripts/ensure-images.sh", + "postAttachCommand": "bash /workspace/projects/workBenches/devBenches/flutterBench/scripts/ensure-latest-vscode-extension.sh --background", "dockerComposeFile": "docker-compose.yml", "service": "flutter-bench", "shutdownAction": "stopCompose", @@ -46,9 +47,11 @@ "dart.hotReloadOnSave": "allIfDirty", "dart.showTodos": true, "flutter.experimentalRefactors": true, - "flutter.showWebRecorderButton": true, - "sonarlint.pathToNodeExecutable": "/usr/bin/node", - "files.associations": { + "flutter.showWebRecorderButton": true, + "sonarlint.pathToNodeExecutable": "/usr/bin/node", + "extensions.autoCheckUpdates": true, + "extensions.autoUpdate": true, + "files.associations": { "*.dart": "dart" } } diff --git a/scripts/ensure-latest-vscode-extension.sh b/scripts/ensure-latest-vscode-extension.sh new file mode 100755 index 0000000..293e431 --- /dev/null +++ b/scripts/ensure-latest-vscode-extension.sh @@ -0,0 +1,140 @@ +#!/usr/bin/env bash +# Best-effort update for VS Code remote extensions. +# +# Dev Containers installs extension IDs listed in devcontainer.json, but a +# reused remote server can keep an older installed extension or cache entry. +# This script forces Marketplace reinstalls without blocking container attach if +# the Marketplace is temporarily unavailable. With no extension IDs, it reads the +# Flutter bench devcontainer extension list. Use --background from devcontainer +# lifecycle hooks so VS Code attach is not held by slow Marketplace downloads. + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +DEVBENCH_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)" +DEVCONTAINER_FILE="${DEVCONTAINER_FILE:-${DEVBENCH_DIR}/.devcontainer/devcontainer.json}" +EXTENSIONS_DIR="${HOME}/.vscode-server/extensions" +EXTENSIONS_CACHE_DIR="${HOME}/.vscode-server/extensionsCache" +EXTENSION_UPDATE_TIMEOUT_SECONDS="${EXTENSION_UPDATE_TIMEOUT_SECONDS:-180}" +BACKGROUND=false +LIST_ONLY=false + +case "${1:-}" in + --background) + BACKGROUND=true + shift + ;; + --worker) + shift + ;; + --list) + LIST_ONLY=true + shift + ;; +esac + +find_code_cli() { + if command -v code >/dev/null 2>&1; then + command -v code + return 0 + fi + + find "${HOME}/.vscode-server/bin" \ + -mindepth 3 \ + -maxdepth 3 \ + -type f \ + -path "*/bin/code-server" \ + -executable \ + -printf '%T@ %p\n' 2>/dev/null \ + | sort -nr \ + | awk 'NR == 1 { print $2 }' +} + +load_devcontainer_extensions() { + if [[ ! -f "$DEVCONTAINER_FILE" ]]; then + return 1 + fi + + awk ' + found && /\]/ { exit } + found { print } + /"extensions"[[:space:]]*:[[:space:]]*\[/ { found = 1 } + ' "$DEVCONTAINER_FILE" \ + | sed -E 's,//.*$,,' \ + | sed -nE 's/^[[:space:]]*"([^"]+)".*$/\1/p' +} + +CODE_CLI="$(find_code_cli || true)" +if [[ -z "$CODE_CLI" ]]; then + echo "ensure-latest-vscode-extension: VS Code Server CLI not found; skipping extension updates" >&2 + exit 0 +fi + +if [[ "$#" -gt 0 ]]; then + EXTENSION_IDS=("$@") +else + mapfile -t EXTENSION_IDS < <(load_devcontainer_extensions || true) +fi + +if [[ "${#EXTENSION_IDS[@]}" -eq 0 ]]; then + echo "ensure-latest-vscode-extension: no extensions found to update" + exit 0 +fi + +if [[ "$LIST_ONLY" == true ]]; then + printf '%s\n' "${EXTENSION_IDS[@]}" + exit 0 +fi + +if [[ "$BACKGROUND" == true ]]; then + LOG_DIR="${HOME}/.vscode-server/data/logs/flutterbench-extension-updates" + mkdir -p "$LOG_DIR" + LOG_FILE="${LOG_DIR}/$(date +%Y%m%dT%H%M%S).log" + nohup bash "$0" --worker "$@" >"$LOG_FILE" 2>&1 & + echo "ensure-latest-vscode-extension: update started in background: ${LOG_FILE}" + exit 0 +fi + +LOCK_PARENT="${HOME}/.vscode-server/data/Machine" +LOCK_DIR="${LOCK_PARENT}/flutterbench-extension-update.lock" +mkdir -p "$LOCK_PARENT" +if mkdir "$LOCK_DIR" 2>/dev/null; then + trap 'rm -rf "$LOCK_DIR"' EXIT +else + echo "ensure-latest-vscode-extension: another extension update is already running; skipping" + exit 0 +fi + +for extension_id in "${EXTENSION_IDS[@]}"; do + [[ -n "$extension_id" ]] || continue + extension_prefix="${extension_id}-" + + echo "ensure-latest-vscode-extension: updating ${extension_id}" + if [[ -d "$EXTENSIONS_CACHE_DIR" ]]; then + find "$EXTENSIONS_CACHE_DIR" -maxdepth 1 -iname "${extension_prefix}*" -exec rm -rf {} + 2>/dev/null || true + fi + + install_cmd=("$CODE_CLI" --install-extension "$extension_id" --force) + if command -v timeout >/dev/null 2>&1; then + install_cmd=(timeout "${EXTENSION_UPDATE_TIMEOUT_SECONDS}s" "${install_cmd[@]}") + fi + + if "${install_cmd[@]}"; then + : + else + status=$? + if [[ "$status" -eq 124 ]]; then + echo "ensure-latest-vscode-extension: timed out updating ${extension_id} after ${EXTENSION_UPDATE_TIMEOUT_SECONDS}s; continuing" >&2 + else + echo "ensure-latest-vscode-extension: failed to update ${extension_id}; continuing" >&2 + fi + continue + fi + + if [[ -d "$EXTENSIONS_DIR" ]]; then + find "$EXTENSIONS_DIR" -maxdepth 1 -type d -iname "${extension_prefix}*" -printf '%f\n' \ + | sort -V \ + | tail -1 \ + | sed 's/^/ensure-latest-vscode-extension: installed /' + fi +done From faad77fceb0c6be59c85c13882e5c5cc8cda5920 Mon Sep 17 00:00:00 2001 From: brettheap Date: Sun, 12 Jul 2026 16:59:14 -0700 Subject: [PATCH 3/3] build: make Flutter and Android downloads resilient --- CONTAINER_COMPARISON.md | 4 +- Dockerfile.layer2 | 157 +++++++++++++----- README.md | 2 +- docs/CONTAINER_COMPARISON.md | 4 +- docs/centralized-configuration-guide.md | 6 +- docs/env-file-docker-compose-guide.md | 30 ++-- docs/template-configuration-guide.md | 6 +- docs/vscode-tasks-snippets.md | 2 +- env-file-docker-compose-guide.md | 30 ++-- scripts/new-flutter-project.sh | 2 +- template/README.md | 4 +- .../flutter-devcontainer-template/README.md | 4 +- .../scripts/README.md | 4 +- vscode-tasks-snippets.md | 2 +- 14 files changed, 165 insertions(+), 92 deletions(-) diff --git a/CONTAINER_COMPARISON.md b/CONTAINER_COMPARISON.md index 549286c..57d0619 100755 --- a/CONTAINER_COMPARISON.md +++ b/CONTAINER_COMPARISON.md @@ -36,7 +36,7 @@ We use two different container approaches for Flutter development: ### Project Container (LIGHTWEIGHT) Includes: - **Core Utilities**: curl, wget, git, unzip, xz-utils, ca-certificates -- **Flutter Essentials**: Flutter SDK 3.24.0 (stable only) +- **Flutter Essentials**: Flutter SDK 3.44.4 (stable only) - **Android Basics**: ADB, fastboot, minimal platform-tools - **Java Runtime**: OpenJDK 17 (for Android builds) - **Shell**: zsh, bash, Oh My Zsh (for better UX) @@ -127,4 +127,4 @@ cd FlutterBench # Back to the monster for deployment tasks Both containers connect to the **same shared ADB infrastructure**, so you get consistent device connectivity regardless of which container you're using. -This dual-container approach optimizes for both **developer productivity** (FlutterBench) and **resource efficiency** (Project containers). \ No newline at end of file +This dual-container approach optimizes for both **developer productivity** (FlutterBench) and **resource efficiency** (Project containers). diff --git a/Dockerfile.layer2 b/Dockerfile.layer2 index a827c1a..894a7cc 100644 --- a/Dockerfile.layer2 +++ b/Dockerfile.layer2 @@ -1,3 +1,4 @@ +# syntax=docker/dockerfile:1.7 # Layer 2: Flutter Bench Image # Extends Layer 1 (dev-bench-base) with Flutter-specific tools # Includes: Flutter SDK, Android SDK, Dart tools, mobile dev tools @@ -8,7 +9,7 @@ FROM ${BASE_IMAGE} # Container version labels LABEL layer="2" LABEL layer.name="flutter-bench" -LABEL layer.version="1.0.1" +LABEL layer.version="1.0.7" LABEL layer.description="Flutter and mobile development tools" LABEL bench.type="flutter" @@ -50,7 +51,7 @@ RUN apt-get update && apt-get install -y \ # ======================================== RUN mkdir -p /opt/android-sdk \ - && wget -q https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -O /tmp/cmdtools.zip \ + && wget -q https://dl.google.com/android/repository/commandlinetools-linux-14742923_latest.zip -O /tmp/cmdtools.zip \ && unzip -q /tmp/cmdtools.zip -d /opt/android-sdk \ && rm /tmp/cmdtools.zip \ && mv /opt/android-sdk/cmdline-tools /opt/android-sdk/cmdline-tools-temp \ @@ -65,61 +66,131 @@ ENV ANDROID_HOME="/opt/android-sdk" ENV ANDROID_SDK_ROOT="/opt/android-sdk" ENV PATH="$PATH:/opt/android-sdk/platform-tools:/opt/android-sdk/emulator:/opt/android-sdk/cmdline-tools/latest/bin" -# Install essential Android SDK components -RUN yes | /opt/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses \ - && /opt/android-sdk/cmdline-tools/latest/bin/sdkmanager \ - "platform-tools" \ - "emulator" \ - "cmake;3.22.1" \ - "ndk;27.0.12077973" \ - "build-tools;33.0.0" \ - "build-tools;34.0.0" \ - "platforms;android-30" \ - "platforms;android-31" \ - "platforms;android-32" \ - "platforms;android-33" \ - "platforms;android-34" \ - "platforms;android-35" \ - "platforms;android-36" \ - "system-images;android-34;google_apis;x86_64" \ - && chmod -R 775 /opt/android-sdk +# Install current Android platform-tools directly. The full sdkmanager package +# set is opt-in because Google package downloads can hang for hours mid-build. +ARG ANDROID_PLATFORM_TOOLS_VERSION=37.0.0 +RUN --mount=type=cache,target=/var/cache/android-sdk-downloads,sharing=locked set -eux; \ + archive="/var/cache/android-sdk-downloads/platform-tools_r${ANDROID_PLATFORM_TOOLS_VERSION}-linux.zip"; \ + for attempt in 1 2 3 4 5; do \ + curl -fL --retry 2 --connect-timeout 30 --max-time 900 -C - \ + -o "$archive" \ + "https://dl.google.com/android/repository/platform-tools_r${ANDROID_PLATFORM_TOOLS_VERSION}-linux.zip" \ + && break; \ + sleep 5; \ + done; \ + unzip -q -o "$archive" -d /opt/android-sdk; \ + chmod -R 775 /opt/android-sdk + +ARG INSTALL_ANDROID_SDK_PACKAGES=false +ARG ANDROID_SDK_PACKAGE_INSTALL_TIMEOUT=600 +RUN if [ "$INSTALL_ANDROID_SDK_PACKAGES" = "true" ]; then \ + set -eux; \ + yes | /opt/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses; \ + for package in \ + "emulator" \ + "cmake;3.22.1" \ + "ndk;27.0.12077973" \ + "build-tools;33.0.0" \ + "build-tools;34.0.0" \ + "platforms;android-30" \ + "platforms;android-31" \ + "platforms;android-32" \ + "platforms;android-33" \ + "platforms;android-34" \ + "platforms;android-35" \ + "platforms;android-36" \ + "system-images;android-34;google_apis;x86_64"; do \ + timeout "$ANDROID_SDK_PACKAGE_INSTALL_TIMEOUT" \ + /opt/android-sdk/cmdline-tools/latest/bin/sdkmanager "$package" || \ + echo "Android SDK package ${package} timed out or failed; continuing."; \ + done; \ + chmod -R 775 /opt/android-sdk; \ + else \ + echo "Skipping heavyweight Android SDK package preloads; set INSTALL_ANDROID_SDK_PACKAGES=true to include them."; \ + fi # ======================================== # FLUTTER ECOSYSTEM # ======================================== +RUN apt-get update && apt-get install -y --no-install-recommends aria2 \ + && rm -rf /var/lib/apt/lists/* + # Install Flutter SDKs ENV FLUTTER_HOME="/opt/flutter" ENV FLUTTER_LTS_327_HOME="/opt/flutter-3.27.0" ENV PATH="$PUB_CACHE/bin:$FLUTTER_HOME/bin:$FLUTTER_HOME/bin/cache/dart-sdk/bin:$PATH" -# Install Flutter with fallback -ARG FLUTTER_VERSION=3.41.6 -RUN (git clone --depth 1 --branch stable https://github.com/flutter/flutter.git $FLUTTER_HOME \ - && $FLUTTER_HOME/bin/flutter config --no-analytics) || \ - (echo "⚠️ Flutter git clone failed, using direct download fallback..." && \ - curl -fsSL --retry 3 --user-agent "Mozilla/5.0" \ - https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${FLUTTER_VERSION}-stable.tar.xz | tar -xJC /opt \ - && $FLUTTER_HOME/bin/flutter config --no-analytics) || \ - echo "❌ Flutter installation failed completely, skipping..." +# Install the versioned Flutter SDK directly. The git clone path can hang for a +# long time inside Docker Desktop without producing progress output. +ARG FLUTTER_VERSION=3.44.4 +RUN --mount=type=cache,target=/var/cache/flutter-downloads,sharing=locked set -eux; \ + mkdir -p /var/cache/flutter-downloads; \ + download_archive() { \ + url="$1"; \ + output="$2"; \ + if aria2c --allow-overwrite=true --auto-file-renaming=false --continue=true \ + --max-connection-per-server=8 --split=8 --min-split-size=16M \ + --max-tries=10 --retry-wait=5 --connect-timeout=30 --timeout=120 \ + --summary-interval=30 --console-log-level=warn \ + -d "$(dirname "$output")" -o "$(basename "$output")" "$url"; then \ + return 0; \ + fi; \ + for attempt in 1 2 3 4 5 6 7 8; do \ + curl -fL --retry 3 --connect-timeout 30 --max-time 1800 -C - \ + --user-agent "Mozilla/5.0" -o "$output" "$url" && return 0; \ + sleep 5; \ + done; \ + return 1; \ + }; \ + archive_path="/var/cache/flutter-downloads/flutter_linux_${FLUTTER_VERSION}-stable.tar.xz"; \ + download_archive \ + "https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${FLUTTER_VERSION}-stable.tar.xz" \ + "$archive_path"; \ + tmp_root="$(mktemp -d)"; \ + tar -xJf "$archive_path" -C "$tmp_root"; \ + rm -rf "$FLUTTER_HOME"; \ + mv "$tmp_root/flutter" "$FLUTTER_HOME"; \ + rm -rf "$tmp_root"; \ + git config --system --add safe.directory "$FLUTTER_HOME"; \ + "$FLUTTER_HOME/bin/flutter" config --no-analytics # Install the long-term supported Flutter 3.27 SDK alongside the shared stable # toolchain so pinned repos can avoid first-run downloads inside the bench. ARG FLUTTER_LTS_327_VERSION=3.27.0 -RUN set -eux; \ - tmp_root="$(mktemp -d)"; \ - archive_path="$tmp_root/flutter_linux_${FLUTTER_LTS_327_VERSION}-stable.tar.xz"; \ - curl -fsSL --retry 3 --user-agent "Mozilla/5.0" \ +RUN --mount=type=cache,target=/var/cache/flutter-downloads,sharing=locked set -eux; \ + mkdir -p /var/cache/flutter-downloads; \ + download_archive() { \ + url="$1"; \ + output="$2"; \ + if aria2c --allow-overwrite=true --auto-file-renaming=false --continue=true \ + --max-connection-per-server=8 --split=8 --min-split-size=16M \ + --max-tries=10 --retry-wait=5 --connect-timeout=30 --timeout=120 \ + --summary-interval=30 --console-log-level=warn \ + -d "$(dirname "$output")" -o "$(basename "$output")" "$url"; then \ + return 0; \ + fi; \ + for attempt in 1 2 3 4 5 6 7 8; do \ + curl -fL --retry 3 --connect-timeout 30 --max-time 1800 -C - \ + --user-agent "Mozilla/5.0" -o "$output" "$url" && return 0; \ + sleep 5; \ + done; \ + return 1; \ + }; \ + archive_path="/var/cache/flutter-downloads/flutter_linux_${FLUTTER_LTS_327_VERSION}-stable.tar.xz"; \ + download_archive \ "https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${FLUTTER_LTS_327_VERSION}-stable.tar.xz" \ - -o "$archive_path"; \ + "$archive_path"; \ + tmp_root="$(mktemp -d)"; \ tar -xJf "$archive_path" -C "$tmp_root"; \ rm -rf "$FLUTTER_LTS_327_HOME"; \ mv "$tmp_root/flutter" "$FLUTTER_LTS_327_HOME"; \ rm -rf "$tmp_root"; \ - "$FLUTTER_LTS_327_HOME/bin/flutter" config --no-analytics + git config --system --add safe.directory "$FLUTTER_LTS_327_HOME" # Install shared Dart global tools into a system cache, then expose them via # /usr/local/bin so Layer 3 users can run them without inheriting root's home. +ARG DART_PUB_ACTIVATE_TIMEOUT=600 RUN set -eux; \ mkdir -p "$PUB_CACHE"; \ for package in \ @@ -138,8 +209,9 @@ RUN set -eux; \ get_cli \ patrol_cli \ melos; do \ - $FLUTTER_HOME/bin/dart pub global activate "$package" || \ - echo "❌ ${package} installation failed, skipping..."; \ + echo "Activating Dart package: ${package}"; \ + timeout "$DART_PUB_ACTIVATE_TIMEOUT" "$FLUTTER_HOME/bin/dart" pub global activate "$package" || \ + echo "Dart package ${package} installation failed or timed out, skipping..."; \ done; \ if [ -d "$PUB_CACHE/bin" ]; then \ find "$PUB_CACHE/bin" -maxdepth 1 -type f -exec chmod a+rx {} +; \ @@ -242,9 +314,10 @@ RUN (curl -fsSL --retry 3 --user-agent "Mozilla/5.0" \ echo "❌ Sentry CLI installation failed completely, skipping..." # Install Shorebird for code push updates with fallback -RUN (curl -fsSL --retry 3 --user-agent "Mozilla/5.0" \ - https://raw.githubusercontent.com/shorebirdtech/install/main/install.sh | bash) || \ - echo "❌ Shorebird installation failed, skipping..." +ARG SHOREBIRD_INSTALL_TIMEOUT=600 +RUN timeout "$SHOREBIRD_INSTALL_TIMEOUT" bash -lc 'curl -fsSL --retry 3 --connect-timeout 30 --max-time 300 --user-agent "Mozilla/5.0" \ + https://raw.githubusercontent.com/shorebirdtech/install/main/install.sh | bash' || \ + echo "❌ Shorebird installation failed or timed out, skipping..." # Make Shorebird available to Layer 3 users without relying on root's home directory. RUN if [ -d /root/.shorebird ]; then \ @@ -296,9 +369,9 @@ RUN echo '' >> /etc/skel/.zshrc && \ echo 'alias dart-sonar-coverage="sonarcloud-dart-flutter"' >> /etc/skel/.zshrc # Pre-download Flutter dependencies and accept Android licenses -RUN flutter doctor --android-licenses || true \ +RUN timeout 5m bash -lc 'yes | flutter doctor --android-licenses' || true \ && flutter precache || true \ - && "$FLUTTER_LTS_327_HOME/bin/flutter" precache || true + && timeout 20m "$FLUTTER_LTS_327_HOME/bin/flutter" precache || true # Root prewarming creates new cache files; restore group-write only where later # Layer 3 users actually need it. The Android SDK tree is already normalized diff --git a/README.md b/README.md index 5b57b8f..947031f 100755 --- a/README.md +++ b/README.md @@ -194,7 +194,7 @@ PROJECT_NAME=dartwing APP_CONTAINER_SUFFIX=app # Results in: dartwing-app SERVICE_CONTAINER_SUFFIX=gateway # Results in: dartwing-gateway USER_UID=1000 -FLUTTER_VERSION=3.24.0 +FLUTTER_VERSION=3.44.4 COMPOSE_PROJECT_NAME=dartwingers ``` diff --git a/docs/CONTAINER_COMPARISON.md b/docs/CONTAINER_COMPARISON.md index 549286c..57d0619 100755 --- a/docs/CONTAINER_COMPARISON.md +++ b/docs/CONTAINER_COMPARISON.md @@ -36,7 +36,7 @@ We use two different container approaches for Flutter development: ### Project Container (LIGHTWEIGHT) Includes: - **Core Utilities**: curl, wget, git, unzip, xz-utils, ca-certificates -- **Flutter Essentials**: Flutter SDK 3.24.0 (stable only) +- **Flutter Essentials**: Flutter SDK 3.44.4 (stable only) - **Android Basics**: ADB, fastboot, minimal platform-tools - **Java Runtime**: OpenJDK 17 (for Android builds) - **Shell**: zsh, bash, Oh My Zsh (for better UX) @@ -127,4 +127,4 @@ cd FlutterBench # Back to the monster for deployment tasks Both containers connect to the **same shared ADB infrastructure**, so you get consistent device connectivity regardless of which container you're using. -This dual-container approach optimizes for both **developer productivity** (FlutterBench) and **resource efficiency** (Project containers). \ No newline at end of file +This dual-container approach optimizes for both **developer productivity** (FlutterBench) and **resource efficiency** (Project containers). diff --git a/docs/centralized-configuration-guide.md b/docs/centralized-configuration-guide.md index 715a313..6d079ab 100755 --- a/docs/centralized-configuration-guide.md +++ b/docs/centralized-configuration-guide.md @@ -109,7 +109,7 @@ USER_GID=1000 # Group ID (run 'id -g') ### Development Environment ```bash # Flutter SDK -FLUTTER_VERSION=3.24.0 # Flutter version to install +FLUTTER_VERSION=3.44.4 # Flutter version to install ANDROID_HOME=/home/vscode/android-sdk # Android SDK path FLUTTER_PUB_CACHE=/home/vscode/.pub-cache # Flutter pub cache path @@ -349,7 +349,7 @@ SERVICE_PORT=5000 ```bash # .env.development PROJECT_NAME=myapp-dev -FLUTTER_VERSION=3.24.0 +FLUTTER_VERSION=3.44.4 CONTAINER_MEMORY=8g # .env.production @@ -361,7 +361,7 @@ CONTAINER_MEMORY=4g ### Multiple Flutter Versions ```bash # project1/.env -FLUTTER_VERSION=3.24.0 # Latest +FLUTTER_VERSION=3.44.4 # Latest # project2/.env FLUTTER_VERSION=3.19.6 # Legacy compatibility diff --git a/docs/env-file-docker-compose-guide.md b/docs/env-file-docker-compose-guide.md index a10c5b1..9a206fb 100755 --- a/docs/env-file-docker-compose-guide.md +++ b/docs/env-file-docker-compose-guide.md @@ -51,7 +51,7 @@ services: build: args: USER_UID: 1000 # ← Hard-coded - FLUTTER_VERSION: 3.24.0 # ← Hard-coded + FLUTTER_VERSION: 3.44.4 # ← Hard-coded ``` **Solution With .env**: @@ -189,7 +189,7 @@ Action: Clicks "Reopen in Container" │ USER_NAME=developer │ │ USER_UID=1000 │ │ USER_GID=1000 │ -│ FLUTTER_VERSION=3.24.0 │ +│ FLUTTER_VERSION=3.44.4 │ └─────────────────────────┬───────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ @@ -217,7 +217,7 @@ Action: Clicks "Reopen in Container" │ - USER_NAME=developer │ │ - USER_UID=1000 │ │ - USER_GID=1000 │ -│ - FLUTTER_VERSION=3.24.0 │ +│ - FLUTTER_VERSION=3.44.4 │ └─────────────────────────┬───────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ @@ -273,7 +273,7 @@ Action: Clicks "Reopen in Container" ```dockerfile ARG USER_UID=1000 -ARG FLUTTER_VERSION=3.24.0 +ARG FLUTTER_VERSION=3.44.4 # Available here during build RUN useradd -u ${USER_UID} developer @@ -407,7 +407,7 @@ USER_GID=1000 # ==================================== # Flutter Configuration # ==================================== -FLUTTER_VERSION=3.24.0 +FLUTTER_VERSION=3.44.4 # ==================================== # Container Resources (optional) @@ -437,7 +437,7 @@ services: USER_NAME: ${USER_NAME:-developer} USER_UID: ${USER_UID:-1000} USER_GID: ${USER_GID:-1000} - FLUTTER_VERSION: ${FLUTTER_VERSION:-3.24.0} + FLUTTER_VERSION: ${FLUTTER_VERSION:-3.44.4} # Container configuration from .env container_name: ${PROJECT_NAME:-myproject}-dev @@ -448,7 +448,7 @@ services: # Runtime environment variables environment: - ADB_SERVER_SOCKET=tcp:${ADB_SERVER_HOST:-shared-adb-server}:${ADB_SERVER_PORT:-5037} - - FLUTTER_VERSION=${FLUTTER_VERSION:-3.24.0} + - FLUTTER_VERSION=${FLUTTER_VERSION:-3.44.4} # Network configuration networks: @@ -494,7 +494,7 @@ FROM ubuntu:22.04 ARG USER_NAME=developer ARG USER_UID=1000 ARG USER_GID=1000 -ARG FLUTTER_VERSION=3.24.0 +ARG FLUTTER_VERSION=3.44.4 # Prevent interactive prompts ENV DEBIAN_FRONTEND=noninteractive @@ -602,13 +602,13 @@ PROJECT_NAME=ledgerlinc USER_NAME=developer USER_UID=1000 USER_GID=1000 -FLUTTER_VERSION=3.24.0 +FLUTTER_VERSION=3.44.4 ``` **Result**: - Container name: `ledgerlinc-dev` - User: `developer` (UID 1000, GID 1000) -- Flutter: version 3.24.0 +- Flutter: version 3.44.4 - Pub cache: `flutter-pub-cache-ledgerlinc` ### Example 2: Different Flutter Version @@ -639,7 +639,7 @@ PROJECT_NAME=davincidesigner USER_NAME=davinci # ← Custom username USER_UID=1500 # ← Custom UID USER_GID=1500 # ← Custom GID -FLUTTER_VERSION=3.24.0 +FLUTTER_VERSION=3.44.4 ``` **Result**: @@ -657,7 +657,7 @@ PROJECT_NAME=bigproject USER_NAME=developer USER_UID=1000 USER_GID=1000 -FLUTTER_VERSION=3.24.0 +FLUTTER_VERSION=3.44.4 CONTAINER_MEMORY=8g # ← More memory CONTAINER_CPUS=4 # ← More CPUs ``` @@ -905,12 +905,12 @@ echo "✅ .env file validated" ```bash # Good: Clear what it's for -FLUTTER_VERSION=3.24.0 +FLUTTER_VERSION=3.44.4 ADB_SERVER_HOST=shared-adb-server CONTAINER_MEMORY=4g # Bad: Unclear -VERSION=3.24.0 +VERSION=3.44.4 HOST=server MEM=4g ``` @@ -933,7 +933,7 @@ USER_GID=1000 # ==================================== # Flutter Configuration # ==================================== -FLUTTER_VERSION=3.24.0 +FLUTTER_VERSION=3.44.4 ``` ### 7. Test Configuration Before Committing diff --git a/docs/template-configuration-guide.md b/docs/template-configuration-guide.md index 49d0210..9f7cff7 100755 --- a/docs/template-configuration-guide.md +++ b/docs/template-configuration-guide.md @@ -109,7 +109,7 @@ USER_GID=1000 # Group ID (run 'id -g') ### Development Environment ```bash # Flutter SDK -FLUTTER_VERSION=3.24.0 # Flutter version to install +FLUTTER_VERSION=3.44.4 # Flutter version to install ANDROID_HOME=/home/vscode/android-sdk # Android SDK path FLUTTER_PUB_CACHE=/home/vscode/.pub-cache # Flutter pub cache path @@ -349,7 +349,7 @@ SERVICE_PORT=5000 ```bash # .env.development PROJECT_NAME=myapp-dev -FLUTTER_VERSION=3.24.0 +FLUTTER_VERSION=3.44.4 CONTAINER_MEMORY=8g # .env.production @@ -361,7 +361,7 @@ CONTAINER_MEMORY=4g ### Multiple Flutter Versions ```bash # project1/.env -FLUTTER_VERSION=3.24.0 # Latest +FLUTTER_VERSION=3.44.4 # Latest # project2/.env FLUTTER_VERSION=3.19.6 # Legacy compatibility diff --git a/docs/vscode-tasks-snippets.md b/docs/vscode-tasks-snippets.md index f1d3ba1..f9289f8 100755 --- a/docs/vscode-tasks-snippets.md +++ b/docs/vscode-tasks-snippets.md @@ -480,7 +480,7 @@ ENV ANDROID_SDK_ROOT=/android-sdk ENV PATH=$PATH:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/platform-tools # Install Flutter -ENV FLUTTER_VERSION=3.24.0 +ENV FLUTTER_VERSION=3.44.4 ENV FLUTTER_ROOT=/flutter RUN git clone --depth 1 --branch ${FLUTTER_VERSION} https://github.com/flutter/flutter.git ${FLUTTER_ROOT} ENV PATH=$PATH:${FLUTTER_ROOT}/bin diff --git a/env-file-docker-compose-guide.md b/env-file-docker-compose-guide.md index 93553df..e87e901 100755 --- a/env-file-docker-compose-guide.md +++ b/env-file-docker-compose-guide.md @@ -39,7 +39,7 @@ services: build: args: USER_UID: 1000 # ← Hard-coded - FLUTTER_VERSION: 3.24.0 # ← Hard-coded + FLUTTER_VERSION: 3.44.4 # ← Hard-coded ``` **Solution With .env**: @@ -177,7 +177,7 @@ Action: Clicks "Reopen in Container" │ USER_NAME=developer │ │ USER_UID=1000 │ │ USER_GID=1000 │ -│ FLUTTER_VERSION=3.24.0 │ +│ FLUTTER_VERSION=3.44.4 │ └─────────────────────────┬───────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ @@ -205,7 +205,7 @@ Action: Clicks "Reopen in Container" │ - USER_NAME=developer │ │ - USER_UID=1000 │ │ - USER_GID=1000 │ -│ - FLUTTER_VERSION=3.24.0 │ +│ - FLUTTER_VERSION=3.44.4 │ └─────────────────────────┬───────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ @@ -261,7 +261,7 @@ Action: Clicks "Reopen in Container" ```dockerfile ARG USER_UID=1000 -ARG FLUTTER_VERSION=3.24.0 +ARG FLUTTER_VERSION=3.44.4 # Available here during build RUN useradd -u ${USER_UID} developer @@ -391,7 +391,7 @@ USER_GID=1000 # ==================================== # Flutter Configuration # ==================================== -FLUTTER_VERSION=3.24.0 +FLUTTER_VERSION=3.44.4 # ==================================== # Container Resources (optional) @@ -421,7 +421,7 @@ services: USER_NAME: ${USER_NAME:-developer} USER_UID: ${USER_UID:-1000} USER_GID: ${USER_GID:-1000} - FLUTTER_VERSION: ${FLUTTER_VERSION:-3.24.0} + FLUTTER_VERSION: ${FLUTTER_VERSION:-3.44.4} # Container configuration from .env container_name: ${PROJECT_NAME:-myproject}-dev @@ -432,7 +432,7 @@ services: # Runtime environment variables environment: - ADB_SERVER_SOCKET=tcp:${ADB_SERVER_HOST:-shared-adb-server}:${ADB_SERVER_PORT:-5037} - - FLUTTER_VERSION=${FLUTTER_VERSION:-3.24.0} + - FLUTTER_VERSION=${FLUTTER_VERSION:-3.44.4} # Network configuration networks: @@ -478,7 +478,7 @@ FROM ubuntu:22.04 ARG USER_NAME=developer ARG USER_UID=1000 ARG USER_GID=1000 -ARG FLUTTER_VERSION=3.24.0 +ARG FLUTTER_VERSION=3.44.4 # Prevent interactive prompts ENV DEBIAN_FRONTEND=noninteractive @@ -586,13 +586,13 @@ PROJECT_NAME=ledgerlinc USER_NAME=developer USER_UID=1000 USER_GID=1000 -FLUTTER_VERSION=3.24.0 +FLUTTER_VERSION=3.44.4 ``` **Result**: - Container name: `ledgerlinc-dev` - User: `developer` (UID 1000, GID 1000) -- Flutter: version 3.24.0 +- Flutter: version 3.44.4 - Pub cache: `flutter-pub-cache-ledgerlinc` ### Example 2: Different Flutter Version @@ -623,7 +623,7 @@ PROJECT_NAME=davincidesigner USER_NAME=davinci # ← Custom username USER_UID=1500 # ← Custom UID USER_GID=1500 # ← Custom GID -FLUTTER_VERSION=3.24.0 +FLUTTER_VERSION=3.44.4 ``` **Result**: @@ -641,7 +641,7 @@ PROJECT_NAME=bigproject USER_NAME=developer USER_UID=1000 USER_GID=1000 -FLUTTER_VERSION=3.24.0 +FLUTTER_VERSION=3.44.4 CONTAINER_MEMORY=8g # ← More memory CONTAINER_CPUS=4 # ← More CPUs ``` @@ -889,12 +889,12 @@ echo "✅ .env file validated" ```bash # Good: Clear what it's for -FLUTTER_VERSION=3.24.0 +FLUTTER_VERSION=3.44.4 ADB_SERVER_HOST=shared-adb-server CONTAINER_MEMORY=4g # Bad: Unclear -VERSION=3.24.0 +VERSION=3.44.4 HOST=server MEM=4g ``` @@ -917,7 +917,7 @@ USER_GID=1000 # ==================================== # Flutter Configuration # ==================================== -FLUTTER_VERSION=3.24.0 +FLUTTER_VERSION=3.44.4 ``` ### 7. Test Configuration Before Committing diff --git a/scripts/new-flutter-project.sh b/scripts/new-flutter-project.sh index 7738637..9b123f4 100755 --- a/scripts/new-flutter-project.sh +++ b/scripts/new-flutter-project.sh @@ -311,7 +311,7 @@ echo " - COMPOSE_PROJECT_NAME=$COMPOSE_PROJECT_NAME (in .devcontainer/.env)" echo " - ADB_INFRASTRUCTURE_PROJECT_NAME=$ADB_INFRASTRUCTURE_PROJECT_NAME (in .devcontainer/.env)" echo " - USER_UID=$CURRENT_UID (in .devcontainer/.env)" echo " - USER_GID=$CURRENT_GID (in .devcontainer/.env)" -echo " - FLUTTER_VERSION=3.24.0 (in .devcontainer/.env)" +echo " - FLUTTER_VERSION=3.44.4 (in .devcontainer/.env)" echo "" echo "📝 Quick start:" echo " 1. Review and customize .devcontainer/.env file if needed" diff --git a/template/README.md b/template/README.md index 036e694..36f4401 100755 --- a/template/README.md +++ b/template/README.md @@ -158,7 +158,7 @@ cp .env.example .env - `USER_GID`: Group ID - **should match your host GID** (`id -g`) #### **Flutter Configuration** -- `FLUTTER_VERSION`: SDK version (e.g., `3.24.0`, `3.19.6`, `stable`) +- `FLUTTER_VERSION`: SDK version (e.g., `3.44.4`, `3.19.6`, `stable`) - `ANDROID_HOME`: Android SDK path in container #### **Resource Limits** @@ -244,7 +244,7 @@ Template files use environment variable substitution - **no manual editing requi - ✅ Connects to Android emulators on Windows host ### Development Tools (Lightweight) -- ✅ **Flutter SDK 3.24.0** (stable channel only) +- ✅ **Flutter SDK 3.44.4** (stable channel only) - ✅ **Minimal Android SDK** (platform-tools for ADB debugging) - ✅ **Java 17 JDK** (OpenJDK) - ✅ **Essential tools only**: git, curl, nano, jq, tree, zsh, Oh My Zsh diff --git a/templates/flutter-devcontainer-template/README.md b/templates/flutter-devcontainer-template/README.md index 357a052..fdfbda9 100755 --- a/templates/flutter-devcontainer-template/README.md +++ b/templates/flutter-devcontainer-template/README.md @@ -159,7 +159,7 @@ cp .env.example .env - `USER_GID`: Group ID - **should match your host GID** (`id -g`) #### **Flutter Configuration** -- `FLUTTER_VERSION`: SDK version (e.g., `3.24.0`, `3.19.6`, `stable`) +- `FLUTTER_VERSION`: SDK version (e.g., `3.44.4`, `3.19.6`, `stable`) - `ANDROID_HOME`: Android SDK path in container #### **Resource Limits** @@ -245,7 +245,7 @@ Template files use environment variable substitution - **no manual editing requi - ✅ Connects to Android emulators on Windows host ### Development Tools (Lightweight) -- ✅ **Flutter SDK 3.24.0** (stable channel only) +- ✅ **Flutter SDK 3.44.4** (stable channel only) - ✅ **Minimal Android SDK** (platform-tools for ADB debugging) - ✅ **Java 17 JDK** (OpenJDK) - ✅ **Essential tools only**: git, curl, nano, jq, tree, zsh, Oh My Zsh diff --git a/templates/flutter-devcontainer-template/scripts/README.md b/templates/flutter-devcontainer-template/scripts/README.md index 3a55781..36dd943 100755 --- a/templates/flutter-devcontainer-template/scripts/README.md +++ b/templates/flutter-devcontainer-template/scripts/README.md @@ -121,7 +121,7 @@ id # Check your current UID/GID 📋 Configuration Summary: Project Name: my-flutter-app User: developer (1000:1000) - Flutter Version: 3.24.0 + Flutter Version: 3.44.4 Container Name: my-flutter-app-dev ✅ Your Flutter DevContainer environment is ready! @@ -214,4 +214,4 @@ id # Check your current UID/GID - **Check your UID/GID** with `id` command before setting up - **Keep `.env.example` in version control** but not `.env` - **Use descriptive project names** (no spaces or special characters) -- **Run validation again** after making configuration changes \ No newline at end of file +- **Run validation again** after making configuration changes diff --git a/vscode-tasks-snippets.md b/vscode-tasks-snippets.md index f1d3ba1..f9289f8 100755 --- a/vscode-tasks-snippets.md +++ b/vscode-tasks-snippets.md @@ -480,7 +480,7 @@ ENV ANDROID_SDK_ROOT=/android-sdk ENV PATH=$PATH:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/platform-tools # Install Flutter -ENV FLUTTER_VERSION=3.24.0 +ENV FLUTTER_VERSION=3.44.4 ENV FLUTTER_ROOT=/flutter RUN git clone --depth 1 --branch ${FLUTTER_VERSION} https://github.com/flutter/flutter.git ${FLUTTER_ROOT} ENV PATH=$PATH:${FLUTTER_ROOT}/bin