Files
whetstone_DSL/tools/mcp/run_spec_batch_with_capture.sh

91 lines
2.6 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
INPUT="${1:-datasets/run_specs}"
if [[ "$INPUT" != /* ]]; then
INPUT_ABS="$ROOT_DIR/$INPUT"
else
INPUT_ABS="$INPUT"
fi
if [[ -d "$INPUT_ABS" ]]; then
mapfile -t SPEC_FILES < <(find "$INPUT_ABS" -maxdepth 1 -type f -name 'runspec_*.md' | sort)
else
mapfile -t SPEC_FILES < <(compgen -G "$INPUT_ABS" | sort)
fi
if [[ "${#SPEC_FILES[@]}" -eq 0 ]]; then
echo "error: no spec files found from input: $INPUT" >&2
exit 1
fi
BATCH_STAMP="$(date +%Y%m%d_%H%M%S)_${$}_$RANDOM"
BATCH_DIR="$ROOT_DIR/logs/taskitem_runs/batches"
mkdir -p "$BATCH_DIR"
BATCH_SUMMARY="$BATCH_DIR/spec_batch_${BATCH_STAMP}.json"
success_count=0
fail_count=0
results='[]'
for spec_abs in "${SPEC_FILES[@]}"; do
if [[ "$spec_abs" == "$ROOT_DIR"/* ]]; then
spec_rel="${spec_abs#$ROOT_DIR/}"
else
echo "warn: skipping spec outside repo root: $spec_abs" >&2
continue
fi
set +e
run_out="$(cd "$ROOT_DIR" && ./tools/mcp/run_sprint_taskitem_pipeline.sh "$spec_rel" 2>&1)"
rc=$?
set -e
if (( rc != 0 )); then
fail_count=$((fail_count + 1))
results="$(jq -nc --argjson prev "$results" --arg s "$spec_rel" --arg out "$run_out" '$prev + [{spec:$s,status:"failed",error:$out}]')"
continue
fi
run_dir="$(printf '%s\n' "$run_out" | sed -n 's/^Output dir: //p' | tail -n1)"
if [[ -z "$run_dir" || ! -d "$run_dir" ]]; then
fail_count=$((fail_count + 1))
results="$(jq -nc --argjson prev "$results" --arg s "$spec_rel" '$prev + [{spec:$s,status:"failed",error:"run_dir_not_found"}]')"
continue
fi
set +e
export_out="$(cd "$ROOT_DIR" && ./tools/mcp/export_taskitem_run_for_lora.sh "$run_dir" 2>&1)"
ex_rc=$?
set -e
if (( ex_rc != 0 )); then
fail_count=$((fail_count + 1))
results="$(jq -nc --argjson prev "$results" --arg s "$spec_rel" --arg d "$run_dir" --arg out "$export_out" '$prev + [{spec:$s,status:"failed",run_dir:$d,error:$out}]')"
continue
fi
success_count=$((success_count + 1))
results="$(jq -nc --argjson prev "$results" --arg s "$spec_rel" --arg d "$run_dir" '$prev + [{spec:$s,status:"ok",run_dir:$d}]')"
done
jq -nc \
--arg started_at "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
--arg input "$INPUT" \
--argjson ok "$success_count" \
--argjson fail "$fail_count" \
--argjson results "$results" \
'{
started_at: $started_at,
source_input: $input,
success_count: $ok,
fail_count: $fail,
results: $results
}' > "$BATCH_SUMMARY"
echo "Spec batch complete."
echo "Summary: $BATCH_SUMMARY"
echo "Success: $success_count"
echo "Failed : $fail_count"