← back to Codex Review 2026 04 30

run-codex.sh

49 lines

#!/usr/bin/env bash
# Driver: runs codex exec against one project, captures review.md, exit code, timing.
# Usage: ./run-codex.sh <project-name>
set -uo pipefail

PROJECT="$1"
ROOT="$HOME/Projects/codex-review-2026-04-30"
SRC="$HOME/Projects/$PROJECT"
OUT_DIR="$ROOT/$PROJECT"
PROMPT_FILE="$ROOT/REVIEW_PROMPT.txt"

mkdir -p "$OUT_DIR"

if [ ! -d "$SRC" ]; then
  echo "MISSING: $SRC" > "$OUT_DIR/error.log"
  exit 2
fi

START=$(date +%s)
echo "=== codex review of $PROJECT @ $(date -Iseconds) ===" > "$OUT_DIR/run.log"

# Read-only sandbox, skip git check, persist last assistant message to review.md.
# Self-imposed 10 min wall via background PID + sleep watchdog.
codex exec \
  --skip-git-repo-check \
  --sandbox read-only \
  -C "$SRC" \
  --output-last-message "$OUT_DIR/review.md" \
  "$(cat "$PROMPT_FILE")" \
  >> "$OUT_DIR/run.log" 2>&1 &
CODEX_PID=$!
( sleep 600; kill -TERM "$CODEX_PID" 2>/dev/null ) &
WATCH_PID=$!
wait "$CODEX_PID" 2>/dev/null
RC=$?
kill "$WATCH_PID" 2>/dev/null

END=$(date +%s)
echo "=== exit=$RC duration=$((END-START))s ===" >> "$OUT_DIR/run.log"
echo "$RC" > "$OUT_DIR/exit_code"
echo "$((END-START))" > "$OUT_DIR/duration_s"

# Flag if review.md is empty or missing
if [ ! -s "$OUT_DIR/review.md" ]; then
  echo "EMPTY_OR_MISSING review.md (rc=$RC)" > "$OUT_DIR/error.log"
fi

exit $RC