#!/usr/bin/env bash # Runs one builder: a headless Opus 5.5 session in the app's worktree, with # a 4-hour limit. Logs go to builders/logs/.build.jsonl. # builders/run-build.sh set -euo pipefail slug=$1 repo=$(cd "$(dirname "$0")/.." && pwd) wt="$repo/.worktrees/$slug" [ -d "$wt" ] || { echo "no worktree: run builders/worktree.sh $slug" >&2; exit 1; } language=$(cd "$repo/harness" && go run ./cmd/language "$slug") prompt=$(python3 - "$repo" "$slug" "$language" <<'PY' import sys, pathlib repo, slug, lang = sys.argv[1:] t = pathlib.Path(repo, "builders/prompts/build.md").read_text() extra = pathlib.Path(repo, "builders/extra", slug + ".md").read_text().strip() print(t.replace("{SLUG}", slug).replace("{LANGUAGE}", lang).replace("{EXTRA}", extra)) PY ) log="$repo/builders/logs/$slug.build.jsonl" cd "$wt" set +e timeout 4h "$repo/builders/claude.sh" -p "$prompt" > "$log" 2> "$repo/builders/logs/$slug.build.stderr" status=$? set -e python3 -c 'import json,sys; print(json.loads(open(sys.argv[1]).readline())["session_id"])' "$log" > "$repo/builders/logs/$slug.session" || true echo "$slug build exited $status (124 means the 4-hour limit)" exit $status