#!/usr/bin/env bash # E2E: copy mini_calc → temp workspace → optional cst-agent headless → make test. # Usage: # ./scripts/e2e_mini_calc.sh # run agent if credentials exist # ./scripts/e2e_mini_calc.sh --baseline-only # only prove fixture starts RED then skip agent # SKIP_AGENT=1 ./scripts/e2e_mini_calc.sh set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" FIX="$ROOT/fixtures/mini_calc" OUT="$FIX/out" BASELINE_ONLY=0 for a in "$@"; do case "$a" in --baseline-only) BASELINE_ONLY=1 ;; esac done mkdir -p "$OUT" STAMP="$(date -u +%Y%m%dT%H%M%SZ)" WORKDIR="$(mktemp -d /tmp/cst-mini-calc.XXXXXX)" RESULT="$OUT/result-$STAMP.txt" SESSION_COPY="$OUT/session-$STAMP.jsonl" cleanup() { rm -rf "$WORKDIR"; } trap cleanup EXIT echo "== mini_calc e2e ==" | tee "$RESULT" echo "workdir=$WORKDIR" | tee -a "$RESULT" echo "stamp=$STAMP" | tee -a "$RESULT" # Fresh copy (no .agent from previous runs) cp -a "$FIX/." "$WORKDIR/" rm -rf "$WORKDIR/out" "$WORKDIR/.agent" chmod +x "$WORKDIR/tests/smoke.sh" cd "$WORKDIR" make clean >/dev/null 2>&1 || true make echo "-- baseline make test (expect FAIL before agent) --" | tee -a "$RESULT" set +e make test >"$OUT/baseline-$STAMP.log" 2>&1 base_rc=$? set -e echo "baseline_rc=$base_rc" | tee -a "$RESULT" if [[ "$base_rc" -eq 0 ]]; then echo "UNEXPECTED: fixture already passes; bugs may have been fixed in source." | tee -a "$RESULT" echo "outcome=unexpected_green_fixture" | tee -a "$RESULT" exit 2 fi echo "baseline: RED (as expected)" | tee -a "$RESULT" if [[ "$BASELINE_ONLY" -eq 1 || "${SKIP_AGENT:-0}" == "1" ]]; then echo "outcome=baseline_ok_agent_skipped" | tee -a "$RESULT" echo "SKIP agent step (--baseline-only or SKIP_AGENT=1)" exit 0 fi # Need API key for agent step has_key=0 if [[ -n "${CST_API_KEY:-}" || -n "${MINIMAX_API_KEY:-}" ]]; then has_key=1 elif [[ -f "$HOME/.config/cst-agent/credentials" ]]; then has_key=1 fi if [[ "$has_key" -eq 0 ]]; then echo "outcome=baseline_ok_no_api_key" | tee -a "$RESULT" echo "No API key; agent step skipped. Set CST_API_KEY or save credentials." exit 0 fi cd "$ROOT" make -s mkdir -p "$WORKDIR/.agent" PROMPT="$(cat "$FIX/TASK.md")" export CST_AUTO_APPROVE=1 echo "-- cst-agent headless --" | tee -a "$RESULT" set +e "$ROOT/cst-agent" --headless --workspace "$WORKDIR" --session "$WORKDIR/.agent/e2e.jsonl" \ --prompt "$PROMPT" >"$OUT/agent-$STAMP.log" 2>&1 agent_rc=$? set -e echo "agent_rc=$agent_rc" | tee -a "$RESULT" if [[ -f "$WORKDIR/.agent/e2e.jsonl" ]]; then cp -f "$WORKDIR/.agent/e2e.jsonl" "$SESSION_COPY" echo "session_copy=$SESSION_COPY" | tee -a "$RESULT" fi cd "$WORKDIR" set +e make test >"$OUT/after-$STAMP.log" 2>&1 test_rc=$? set -e echo "after_test_rc=$test_rc" | tee -a "$RESULT" # Classify changed=0 if ! diff -q "$FIX/calc.c" "$WORKDIR/calc.c" >/dev/null 2>&1; then changed=1 fi echo "calc_c_changed=$changed" | tee -a "$RESULT" if [[ "$test_rc" -eq 0 ]]; then echo "outcome=pass" | tee -a "$RESULT" exit 0 fi if [[ "$changed" -eq 1 ]]; then echo "outcome=partial" | tee -a "$RESULT" exit 1 fi echo "outcome=fail" | tee -a "$RESULT" exit 1