← back to Designer Wallcoverings
DW-Agents/codex_plans/executor.sh
151 lines
#!/usr/bin/env bash
set -euo pipefail
ROOT="/root/Projects/Designer-Wallcoverings/DW-Programming/ImportNewSkufromURL"
INBOX="/root/Projects/Designer-Wallcoverings/DW-Agents/codex_plans/inbox"
APPROVED="/root/Projects/Designer-Wallcoverings/DW-Agents/codex_plans/approved"
APPLIED="/root/Projects/Designer-Wallcoverings/DW-Agents/codex_plans/applied"
LOGS="/root/Projects/Designer-Wallcoverings/DW-Agents/codex_plans/logs"
ts() { date -u +"%Y%m%dT%H%M%SZ"; }
require_tools() {
command -v git >/dev/null
command -v node >/dev/null || true
command -v npm >/dev/null || true
command -v pm2 >/dev/null || true
}
sanitize_cmd() {
local c="$1"
# Disallow dangerous patterns
if echo "$c" | grep -Eqi '(curl|wget)\s+.*\|\s*(sh|bash)|\brm\s+-rf\b|:\(\)\s*\{\s*:\s*\|\s*:\s*;\s*\}\s*;|mkfs|dd\s+if=|shutdown|reboot'; then
echo "BLOCKED: $c" >&2
return 1
fi
return 0
}
run_checks_pre() {
cd "$ROOT"
echo "== PRECHECK git status =="
git status -sb
echo "== PRECHECK git diff (should be clean) =="
git diff --stat
}
apply_patches() {
local plan_dir="$1"
cd "$ROOT"
if [ -d "$plan_dir/patches" ]; then
for p in "$plan_dir"/patches/*.patch; do
[ -e "$p" ] || continue
echo "== Applying patch: $p =="
echo "--- Patch preview (first 200 lines) ---"
sed -n '1,200p' "$p"
git apply --check "$p"
git apply "$p"
done
fi
}
run_scripts() {
local plan_dir="$1"
if [ -d "$plan_dir/scripts" ]; then
for s in "$plan_dir"/scripts/*.sh; do
[ -e "$s" ] || continue
echo "== Running script: $s =="
chmod +x "$s"
( set -euo pipefail; "$s" )
done
fi
}
run_commands() {
local plan_dir="$1"
local f="$plan_dir/commands.txt"
[ -f "$f" ] || return 0
echo "== Running commands from: $f =="
while IFS= read -r cmd; do
[ -z "$cmd" ] && continue
sanitize_cmd "$cmd"
echo "+ $cmd"
( cd "$ROOT"; bash -lc "$cmd" )
done < "$f"
}
run_tests_post() {
cd "$ROOT"
if [ -f package.json ]; then
echo "== POSTCHECK npm test (if defined) =="
if npm run | grep -qE ' test'; then
npm test || true
else
echo "No npm test script found."
fi
fi
}
restart_pm2_optional() {
cd "$ROOT"
if command -v pm2 >/dev/null; then
echo "== PM2 list (no restart unless plan requests) =="
pm2 list || true
fi
}
final_report() {
cd "$ROOT"
echo "== FINAL git status =="
git status -sb
echo "== FINAL diff stat =="
git diff --stat || true
}
main() {
require_tools
local plan_json="${1:-}"
if [ -z "$plan_json" ]; then
echo "Usage: $0 /path/to/plan.json" >&2
exit 1
fi
[ -f "$plan_json" ] || { echo "Plan not found: $plan_json" >&2; exit 1; }
local id
id="$(basename "$plan_json" .json)"
local plan_dir="$APPROVED/$id"
mkdir -p "$plan_dir"
echo "== Importing approved plan: $id =="
cp -f "$plan_json" "$plan_dir/plan.json"
# Expect Codex to have created folders alongside plan.json:
# patches/, scripts/, commands.txt
# If they exist next to plan.json, copy them in.
local src_dir
src_dir="$(dirname "$plan_json")"
[ -d "$src_dir/patches" ] && rm -rf "$plan_dir/patches" && cp -R "$src_dir/patches" "$plan_dir/"
[ -d "$src_dir/scripts" ] && rm -rf "$plan_dir/scripts" && cp -R "$src_dir/scripts" "$plan_dir/"
[ -f "$src_dir/commands.txt" ] && cp -f "$src_dir/commands.txt" "$plan_dir/commands.txt"
local log="$LOGS/${id}_$(ts).log"
exec > >(tee -a "$log") 2>&1
echo "== EXECUTING PLAN $id =="
run_checks_pre
apply_patches "$plan_dir"
run_scripts "$plan_dir"
run_commands "$plan_dir"
run_tests_post
restart_pm2_optional
final_report
mkdir -p "$APPLIED/$id"
cp -R "$plan_dir" "$APPLIED/$id/"
echo "== DONE. Log: $log =="
}
main "$@"