diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..59746ce --- /dev/null +++ b/Dockerfile @@ -0,0 +1,45 @@ +# syntax=docker/dockerfile:1 + +# ── Build stage ─────────────────────────────────────────────────────────────── +FROM golang:1.26-bookworm AS builder + +ARG VERSION=dev +WORKDIR /src + +COPY go.mod go.sum ./ +RUN go mod download + +COPY . . +RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \ + go build -trimpath -ldflags="-s -w -X main.version=${VERSION}" \ + -o /out/supervisor ./cmd/supervisor + +# ── Runtime stage ───────────────────────────────────────────────────────────── +# Node.js 22 slim — needed for claude CLI subprocess +FROM node:22-slim + +# Install claude CLI (provides the `claude` binary the supervisor shells out to) +RUN npm install -g @anthropic-ai/claude-code \ + && claude --version \ + && echo "claude CLI installed" + +# Copy supervisor binary +COPY --from=builder /out/supervisor /usr/local/bin/supervisor + +# Bake in config (models.yaml + skill discipline files) +COPY config/ /app/config/ + +WORKDIR /app + +# brain/ is writable state — mount a PersistentVolume here +VOLUME /app/brain + +ENV SUPERVISOR_CONFIG_DIR=/app/config/supervisor +ENV SUPERVISOR_MODELS_FILE=/app/config/models.yaml +ENV SUPERVISOR_BRAIN_DIR=/app/brain +ENV SUPERVISOR_SESSIONS_DIR=/app/brain/sessions +ENV SUPERVISOR_PORT=3200 + +EXPOSE 3200 + +ENTRYPOINT ["/usr/local/bin/supervisor"]