FROM oven/bun:1 AS base
WORKDIR /app

FROM base AS deps
COPY package.json bun.lock* ./
RUN bun install --frozen-lockfile --production

FROM base AS build
COPY package.json bun.lock* ./
RUN bun install --frozen-lockfile
COPY src/ src/
COPY tsconfig.json ./
RUN bun run typecheck

FROM base
COPY --from=deps /app/node_modules node_modules
COPY package.json tsconfig.json repos.json ./
COPY src/ src/
COPY rules/ rules/

RUN apt-get update && apt-get install -y git git-lfs curl openssh-client ffmpeg && rm -rf /var/lib/apt/lists/* \
    && git lfs install \
    && mkdir -p /root/.ssh && ssh-keyscan github.com >> /root/.ssh/known_hosts

ENV GIT_LFS_SKIP_SMUDGE=1
ENV NVM_DIR="/root/.nvm"
ENV NODE_VERSION=24.11.1
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash \
    && . "$NVM_DIR/nvm.sh" \
    && nvm install $NODE_VERSION \
    && nvm alias default $NODE_VERSION \
    && npm install -g yarn pnpm @biomejs/biome

ENV PATH="$NVM_DIR/versions/node/v$NODE_VERSION/bin:/root/.local/bin:$PATH"
ENV NODE_OPTIONS="--max-old-space-size=8192"

RUN curl https://cursor.com/install -fsS | bash

# Claude Code CLI — used when AGENT_PROVIDER=claude. Installs to ~/.local/bin (already on PATH).
RUN curl -fsSL https://claude.ai/install.sh | bash

RUN mkdir -p /app/workdir

EXPOSE 3000
CMD ["sh", "-c", "ulimit -c 0 && exec bun run src/index.ts"]
