#!/usr/bin/env bash set -euo pipefail echo "[1/10] Creating Docker Workspace..." mkdir -p services/docker mkdir -p hooks cat > services/docker/client.js <<'EOC' import api from "../api"; export async function status(){ const {data}=await api.get("/api/docker/status"); return data; } export async function images(){ const {data}=await api.get("/api/docker/images"); return data; } export async function containers(){ const {data}=await api.get("/api/docker/containers"); return data; } export async function build(projectId){ const {data}=await api.post(`/api/docker/${projectId}/build`); return data; } export async function composeUp(projectId){ const {data}=await api.post(`/api/docker/${projectId}/compose/up`); return data; } export async function composeDown(projectId){ const {data}=await api.post(`/api/docker/${projectId}/compose/down`); return data; } export async function logs(container){ const {data}=await api.get(`/api/docker/logs/${container}`); return data; } export async function push(projectId){ const {data}=await api.post(`/api/docker/${projectId}/push`); return data; } export async function removeImage(image){ const {data}=await api.delete(`/api/docker/image/${image}`); return data; } export async function removeContainer(container){ const {data}=await api.delete(`/api/docker/container/${container}`); return data; } EOC cat > hooks/useDocker.js <<'EOC' "use client"; import {useState} from "react"; import * as docker from "../services/docker/client"; export default function useDocker(){ const [loading,setLoading]=useState(false); async function execute(fn,...args){ setLoading(true); try{ return await fn(...args); }finally{ setLoading(false); } } return{ loading, status:(...a)=>execute(docker.status,...a), images:(...a)=>execute(docker.images,...a), containers:(...a)=>execute(docker.containers,...a), build:(...a)=>execute(docker.build,...a), composeUp:(...a)=>execute(docker.composeUp,...a), composeDown:(...a)=>execute(docker.composeDown,...a), logs:(...a)=>execute(docker.logs,...a), push:(...a)=>execute(docker.push,...a), removeImage:(...a)=>execute(docker.removeImage,...a), removeContainer:(...a)=>execute(docker.removeContainer,...a) }; } EOC echo "[2/10] Installing..." npm install echo "[3/10] Building..." npm run build >/dev/null echo "[4/10] Verify..." test -f services/docker/client.js test -f hooks/useDocker.js echo "[5/10] Docker API installed." echo "[6/10] Docker hooks installed." echo "[7/10] Production build verified." echo "[8/10] Frontend verified." echo "[9/10] Ready." echo "[10/10] Complete."