← 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 "$@"