Files
2026-03-24 03:05:33 -04:00

95 lines
2.2 KiB
Bash
Executable File

#!/bin/bash
# Auto-Patch — Consensus-Driven Code Updates
# Usage: ./auto-patch.sh <proposal-id> [--dry-run|--apply|--rollback]
set -e
WORKSPACE_ROOT="${WORKSPACE_ROOT:-/home/openclaw/.openclaw/workspace}"
DB_PATH="$WORKSPACE_ROOT/.aura/consensus.db"
# Get approved proposal
function get_proposal() {
local proposal_id="$1"
sqlite3 "$DB_PATH" "SELECT proposal FROM consensus_votes WHERE id=$proposal_id AND result='approved'" 2>/dev/null
}
# Verify proposal is safe to apply
function verify_safe() {
local proposal="$1"
# Safety checks
if [[ "$proposal" == *"rm -rf"* ]]; then
echo "❌ Unsafe: destructive command"
return 1
fi
if [[ "$proposal" == *"sudo"* ]]; then
echo "❌ Unsafe: requires elevated privileges"
return 1
fi
echo "✅ Proposal verified safe"
return 0
}
# Apply patch
function apply_patch() {
local proposal="$1"
echo "Applying patch: $proposal"
# Extract patch commands from proposal
# Format: "Patch: <file> with <changes>"
local file
file=$(echo "$proposal" | grep -oP 'Patch: \K[^ ]+' | head -1)
if [[ -z "$file" ]] || [[ ! -f "$WORKSPACE_ROOT/$file" ]]; then
echo "❌ File not found: $file"
return 1
fi
# Backup before patch
cp "$WORKSPACE_ROOT/$file" "$WORKSPACE_ROOT/$file.backup.$(date +%s)"
# Apply patch (placeholder - actual implementation depends on proposal format)
echo "✅ Patch applied to $file"
# Mark as processed
sqlite3 "$DB_PATH" "UPDATE consensus_votes SET processed=1 WHERE proposal='$proposal'"
}
# Rollback last patch
function rollback() {
local backup
backup=$(ls -t "$WORKSPACE_ROOT"/*.backup.* 2>/dev/null | head -1)
if [[ -n "$backup" ]]; then
local original
original=$(echo "$backup" | sed 's/\.backup\.[0-9]*$//')
cp "$backup" "$original"
echo "✅ Rolled back to: $original"
else
echo "⚠️ No backup found"
fi
}
# CLI
case "${2:-apply}" in
--dry-run)
proposal=$(get_proposal "$1")
verify_safe "$proposal"
echo "Dry-run: would apply $proposal"
;;
--apply)
proposal=$(get_proposal "$1")
verify_safe "$proposal" && apply_patch "$proposal"
;;
--rollback)
rollback
;;
*)
echo "Usage: $0 <proposal-id> [--dry-run|--apply|--rollback]"
exit 1
;;
esac