#!/bin/bash set -e # OpenCode Guardian — Clean macOS Installer # Universal across any Mac user account BOLD="\033[1m" GREEN="\033[38;5;48m" CYAN="\033[38;5;45m" GRAY="\033[38;5;244m" RESET="\033[0m" echo "" echo -e "${BOLD}${CYAN}Installing OpenCode Guardian...${RESET}" echo "" GUARDIAN_DIR="$HOME/.opencode_guardian" BIN_DIR="$HOME/.local/bin" PLIST_DIR="$HOME/Library/LaunchAgents" PLIST_PATH="$PLIST_DIR/ai.opencode.guardian.plist" USER_ID=$(id -u) mkdir -p "$GUARDIAN_DIR" mkdir -p "$BIN_DIR" mkdir -p "$PLIST_DIR" REPO_URL="https://raw.githubusercontent.com/PotterSkxawng/opencode-guardian/main" # Download or copy files if [ -f "$(dirname "$0")/bin/oc" ]; then # Local install cp "$(dirname "$0")/bin/oc" "$BIN_DIR/oc" cp "$(dirname "$0")/daemon/guardian.py" "$GUARDIAN_DIR/guardian.py" else # Remote curl install curl -fsSL "$REPO_URL/bin/oc" -o "$BIN_DIR/oc" curl -fsSL "$REPO_URL/daemon/guardian.py" -o "$GUARDIAN_DIR/guardian.py" fi chmod +x "$BIN_DIR/oc" chmod +x "$GUARDIAN_DIR/guardian.py" # Create default config if not exists if [ ! -f "$GUARDIAN_DIR/config.json" ]; then echo '{"auto_nudge": false, "interval": 30, "version": "1.1.0"}' > "$GUARDIAN_DIR/config.json" fi # Generate LaunchAgent plist dynamically cat << PLIST_EOF > "$PLIST_PATH" Label ai.opencode.guardian ProgramArguments /usr/bin/python3 $GUARDIAN_DIR/guardian.py RunAtLoad KeepAlive StandardOutPath $GUARDIAN_DIR/guardian.log StandardErrorPath $GUARDIAN_DIR/guardian.log ThrottleInterval 5 PLIST_EOF # Ensure ~/.local/bin is in PATH if ! echo "$PATH" | grep -q "$BIN_DIR"; then SHELL_PROFILE="$HOME/.zshrc" if [ -f "$HOME/.bashrc" ] && [ ! -f "$HOME/.zshrc" ]; then SHELL_PROFILE="$HOME/.bashrc" fi if ! grep -q "$BIN_DIR" "$SHELL_PROFILE" 2>/dev/null; then echo "export PATH=\"\$HOME/.local/bin:\$PATH\"" >> "$SHELL_PROFILE" echo -e "${GRAY}Added $BIN_DIR to $SHELL_PROFILE${RESET}" fi fi # Reload launchd daemon launchctl bootout "gui/$USER_ID/ai.opencode.guardian" 2>/dev/null || true pkill -9 -f guardian.py 2>/dev/null || true launchctl bootstrap "gui/$USER_ID" "$PLIST_PATH" echo -e "${GREEN}✔ OpenCode Guardian installed successfully.${RESET}" echo "" echo -e "Try it now:" echo -e " ${BOLD}oc status${RESET} Inspect sessions and engine" echo -e " ${BOLD}oc top${RESET} Live terminal dashboard" echo -e " ${BOLD}oc nudge${RESET} Safely recover frozen sessions" echo -e " ${BOLD}oc auto-nudge${RESET} Enable automatic background healing" echo -e " ${BOLD}oc update${RESET} Update to latest version" echo ""