diff --git a/loop.sh b/loop.sh index 07e73aa..9b6a396 100755 --- a/loop.sh +++ b/loop.sh @@ -348,13 +348,17 @@ while [ "$ITERATION" -lt "$MAX_ITERATIONS" ]; do exit 0 fi - GENERATOR_OUTPUT=$(run_agent "$GENERATOR_PROMPT" "generator") - - # In interactive mode, generator output is empty (displayed in terminal, not captured). - # State is tracked via prd.json — the generator updates it directly. - if [ "${LOOP_HEADLESS:-false}" = "true" ] && [ -z "$GENERATOR_OUTPUT" ]; then - log "WARNING: Generator produced empty output (timeout or crash). Skipping to next iteration." - continue + if [ "${LOOP_HEADLESS:-false}" != "true" ]; then + # Interactive: run directly, no capture. User sees full CC UI. + run_agent "$GENERATOR_PROMPT" "generator" + GENERATOR_OUTPUT="" + else + # Headless: capture output for parsing. + GENERATOR_OUTPUT=$(run_agent "$GENERATOR_PROMPT" "generator") + if [ -z "$GENERATOR_OUTPUT" ]; then + log "WARNING: Generator produced empty output (timeout or crash). Skipping to next iteration." + continue + fi fi # --- Scope budget check --- @@ -377,8 +381,14 @@ while [ "$ITERATION" -lt "$MAX_ITERATIONS" ]; do export SCOPE_FILES_MODIFIED SCOPE_LINES_WRITTEN fi - # Check for completion sentinel - if echo "$GENERATOR_OUTPUT" | grep -q "COMPLETE"; then + # Check for completion — in interactive mode, check prd.json directly + if all_stories_pass 2>/dev/null; then + log_header "All Stories Complete! ($(story_counts))" + snapshot_for_archive + exit 0 + fi + # Headless mode: also check output sentinel + if [ -n "$GENERATOR_OUTPUT" ] && echo "$GENERATOR_OUTPUT" | grep -q "COMPLETE"; then log_header "Generator signaled COMPLETE ($(story_counts))" snapshot_for_archive exit 0 @@ -394,14 +404,21 @@ while [ "$ITERATION" -lt "$MAX_ITERATIONS" ]; do fi EVAL_PROMPT=$(build_prompt "evaluator" "$MODE") - EVAL_OUTPUT=$(run_agent "$EVAL_PROMPT" "evaluator") - if [ -z "$EVAL_OUTPUT" ]; then - # In interactive mode, check the verdict file + if [ "${LOOP_HEADLESS:-false}" != "true" ]; then + # Interactive: run directly, read verdict from file. + run_agent "$EVAL_PROMPT" "evaluator" if [ -f "$LOOP_DIR/.verdict" ]; then EVAL_OUTPUT=$(cat "$LOOP_DIR/.verdict") else - log "WARNING: Evaluator produced no output and no verdict file. Treating as REJECT." + log "WARNING: No verdict file found. Treating as REJECT." + EVAL_OUTPUT="REJECTEvaluator produced no verdict file" + fi + else + # Headless: capture output for parsing. + EVAL_OUTPUT=$(run_agent "$EVAL_PROMPT" "evaluator") + if [ -z "$EVAL_OUTPUT" ]; then + log "WARNING: Evaluator produced empty output. Treating as REJECT." EVAL_OUTPUT="REJECTEvaluator produced no output" fi fi