init
This commit is contained in:
@@ -0,0 +1,211 @@
|
||||
#!/usr/bin/env bash
|
||||
# ==============================================================================
|
||||
# remove.sh — Multi-Agent Mux (MAM) Orchestration Uninstaller
|
||||
# ==============================================================================
|
||||
# Safely removes MAM orchestration skills, virtual environment, and metadata.
|
||||
# Leaves pre-existing user configurations and files untouched by reading
|
||||
# the installation manifest (.mam/install_manifest.txt).
|
||||
# ==============================================================================
|
||||
set -euo pipefail
|
||||
|
||||
TARGET_DIR=""
|
||||
FORCE=0
|
||||
PURGE_ENV=0
|
||||
|
||||
# Parse arguments
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
-y|--yes|--force)
|
||||
FORCE=1
|
||||
shift
|
||||
;;
|
||||
--purge-env)
|
||||
PURGE_ENV=1
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
TARGET_DIR="$1"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ -z "$TARGET_DIR" ]; then
|
||||
TARGET_DIR="$(pwd)"
|
||||
fi
|
||||
|
||||
echo "===================================================================="
|
||||
echo "⚡ Starting Multi-Agent Mux (MAM) Uninstallation"
|
||||
echo "📂 Target Workspace: $TARGET_DIR"
|
||||
echo "===================================================================="
|
||||
|
||||
if [ ! -d "$TARGET_DIR" ]; then
|
||||
echo "❌ Error: Target directory '$TARGET_DIR' does not exist." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd "$TARGET_DIR"
|
||||
|
||||
# 1. Non-interactive input safety guard (set -e read crash prevention)
|
||||
if [ ! -t 0 ] && [ $FORCE -eq 0 ]; then
|
||||
echo "❌ Error: Non-interactive terminal detected. Please run with -y/--yes/--force." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if there is anything to remove
|
||||
MANIFEST_FILE=".mam/install_manifest.txt"
|
||||
any_exist=0
|
||||
manifest_files=()
|
||||
|
||||
# Load the install manifest if it exists
|
||||
if [ -f "$MANIFEST_FILE" ]; then
|
||||
any_exist=1
|
||||
while IFS= read -r line; do
|
||||
if [ -n "$line" ]; then
|
||||
manifest_files+=("$line")
|
||||
fi
|
||||
done < "$MANIFEST_FILE"
|
||||
else
|
||||
# Fallback to the core MAM directories to check if any exist
|
||||
fallback_assets=(
|
||||
".agents/skills/lib.sh"
|
||||
".agents/skills/multi-agent-mux-create"
|
||||
".agents/skills/multi-agent-mux-delegate-job"
|
||||
".agents/skills/multi-agent-mux-monitor"
|
||||
".agents/skills/multi-agent-mux-resume"
|
||||
".agents/skills/multi-agent-mux-status"
|
||||
".agents/skills/multi-agent-mux-stop"
|
||||
".venv"
|
||||
".mam"
|
||||
)
|
||||
for asset in "${fallback_assets[@]}"; do
|
||||
if [ -e "$asset" ] || [ -h "$asset" ]; then
|
||||
any_exist=1
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [ $any_exist -eq 0 ]; then
|
||||
echo "ℹ️ No MAM assets detected in '$TARGET_DIR'. Nothing to do."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Request confirmation if not forced
|
||||
if [ $FORCE -eq 0 ]; then
|
||||
echo "⚠️ WARNING: This will permanently remove the MAM orchestration skills, "
|
||||
echo " virtual environment (.venv), local metadata (.mam), and docs."
|
||||
echo " (Your own custom files inside .agents/ will NOT be touched)."
|
||||
|
||||
if ! read -p "❓ Are you sure you want to proceed? [y/N]: " -r response; then
|
||||
response="n"
|
||||
fi
|
||||
if [[ ! "$response" =~ ^[yY](es)?$ ]]; then
|
||||
echo "❌ Uninstallation cancelled by user."
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
delete_asset() {
|
||||
local asset="$1"
|
||||
if [ -e "$asset" ] || [ -h "$asset" ]; then
|
||||
echo "🗑️ Removing: $asset"
|
||||
rm -rf "$asset"
|
||||
fi
|
||||
}
|
||||
|
||||
# 2. Uninstall files using the manifest if present
|
||||
if [ ${#manifest_files[@]} -gt 0 ]; then
|
||||
echo "📜 Manifest found. Reversing installer-created files..."
|
||||
for f in ${manifest_files[@]+"${manifest_files[@]}"}; do
|
||||
# Skip .env and remove.sh for now, they are handled separately
|
||||
if [ "$f" = ".env" ] || [ "$f" = "remove.sh" ]; then
|
||||
continue
|
||||
fi
|
||||
delete_asset "$f"
|
||||
done
|
||||
else
|
||||
# Fallback: Delete MAM skills manually (only if manifest is missing)
|
||||
echo "⚠️ No manifest found. Deleting standard MAM skills..."
|
||||
delete_asset ".agents/skills/lib.sh"
|
||||
delete_asset ".agents/skills/multi-agent-mux-create"
|
||||
delete_asset ".agents/skills/multi-agent-mux-delegate-job"
|
||||
delete_asset ".agents/skills/multi-agent-mux-monitor"
|
||||
delete_asset ".agents/skills/multi-agent-mux-resume"
|
||||
delete_asset ".agents/skills/multi-agent-mux-status"
|
||||
delete_asset ".agents/skills/multi-agent-mux-stop"
|
||||
fi
|
||||
|
||||
# 3. Clean up empty parent directories under .agents recursively to avoid littering
|
||||
if [ -d ".agents" ]; then
|
||||
find .agents -depth -type d -exec rmdir {} + 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# 4. Remove virtual environment, monitor cache, and metadata database
|
||||
delete_asset ".venv"
|
||||
delete_asset ".cache/multi-agent-mux-monitor"
|
||||
delete_asset ".mam" # Deletes manifest file too
|
||||
|
||||
# 5. Clean up .env file (Only if created by installer, or forced with --purge-env)
|
||||
# If .env is in manifest, it means MAM created it.
|
||||
env_created_by_mam=0
|
||||
for f in ${manifest_files[@]+"${manifest_files[@]}"}; do
|
||||
if [ "$f" = ".env" ]; then
|
||||
env_created_by_mam=1
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -f ".env" ]; then
|
||||
should_delete_env=0
|
||||
if [ $PURGE_ENV -eq 1 ]; then
|
||||
should_delete_env=1
|
||||
elif [ $env_created_by_mam -eq 1 ]; then
|
||||
# Even if MAM created it, ask or rename to backup to prevent loss of custom secrets
|
||||
if [ $FORCE -eq 1 ]; then
|
||||
should_delete_env=1
|
||||
else
|
||||
if ! read -p "❓ MAM-created '.env' found. Delete it? (Saying No preserves it) [y/N]: " -r env_response; then
|
||||
env_response="n"
|
||||
fi
|
||||
if [[ "$env_response" =~ ^[yY](es)?$ ]]; then
|
||||
should_delete_env=1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $should_delete_env -eq 1 ]; then
|
||||
delete_asset ".env"
|
||||
else
|
||||
if [ $env_created_by_mam -eq 1 ]; then
|
||||
backup_name=".env.mam-backup"
|
||||
if [ -e "$backup_name" ]; then
|
||||
backup_name=".env.mam-backup.$(date +%Y%m%d%H%M%S)"
|
||||
fi
|
||||
echo "💾 Backing up .env configuration to $backup_name..."
|
||||
mv ".env" "$backup_name"
|
||||
else
|
||||
echo "ℹ️ Preserving user-owned .env configuration."
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# 6. Remove uninstaller file itself (if we are in the target root)
|
||||
# Simple check: only delete remove.sh if it is recorded in the manifest
|
||||
remove_in_manifest=0
|
||||
for f in ${manifest_files[@]+"${manifest_files[@]}"}; do
|
||||
if [ "$f" = "remove.sh" ]; then
|
||||
remove_in_manifest=1
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -f "remove.sh" ] && [ $remove_in_manifest -eq 1 ]; then
|
||||
echo "🗑️ Removing uninstaller: remove.sh"
|
||||
# Self-delete is the final action
|
||||
rm -f "remove.sh"
|
||||
fi
|
||||
|
||||
echo "===================================================================="
|
||||
echo "🎉 Uninstallation complete!"
|
||||
echo "===================================================================="
|
||||
Reference in New Issue
Block a user