forked from WHC/Hermit
Vendored sashidown, OpenAI-compatible env (OPENAI_*), and bootstrap scripts. Co-authored-by: Cursor <cursoragent@cursor.com>
115 lines
3.1 KiB
Bash
Executable File
115 lines
3.1 KiB
Bash
Executable File
#!/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
|