1+ #! /usr/bin/env bash
2+ # Marionette uninstaller for macOS and Linux
3+ # Usage: bash scripts/uninstall.sh
4+ # or one-liner: curl -fsSL https://raw.githubusercontent.com/yarin-mag/Marrionet/master/scripts/uninstall.sh | bash
5+ set -euo pipefail
6+
7+ INSTALL_DIR=" /usr/local/lib/marionette"
8+ BIN_LINK=" /usr/local/bin/marionette"
9+ CLAUDE_DIR=" $HOME /.claude"
10+ MCP_SETTINGS=" $CLAUDE_DIR /mcp_settings.json"
11+ SETTINGS=" $CLAUDE_DIR /settings.json"
12+ LOGS_DIR=" $HOME /.marionette"
13+
14+ OS=" $( uname -s | tr ' [:upper:]' ' [:lower:]' ) "
15+ case " $OS " in
16+ darwin) OS=" macos" ;;
17+ linux) OS=" linux" ;;
18+ * ) echo " Unsupported OS: $OS " >&2 ; exit 1 ;;
19+ esac
20+
21+ echo " ==> Uninstalling Marionette..."
22+
23+ # ── 1. Stop and remove auto-start ─────────────────────────────────────────────
24+ if [ " $OS " = " macos" ]; then
25+ APP_PLIST=" $HOME /Library/LaunchAgents/com.marionette.app.plist"
26+ PROXY_PLIST=" $HOME /Library/LaunchAgents/com.marionette.proxy.plist"
27+ if [ -f " $APP_PLIST " ]; then
28+ launchctl unload " $APP_PLIST " 2> /dev/null || true
29+ rm -f " $APP_PLIST "
30+ echo " ==> Removed LaunchAgent: com.marionette.app"
31+ fi
32+ if [ -f " $PROXY_PLIST " ]; then
33+ launchctl unload " $PROXY_PLIST " 2> /dev/null || true
34+ rm -f " $PROXY_PLIST "
35+ echo " ==> Removed LaunchAgent: com.marionette.proxy"
36+ fi
37+ elif [ " $OS " = " linux" ]; then
38+ systemctl --user disable --now marionette 2> /dev/null || true
39+ systemctl --user disable --now marionette-proxy 2> /dev/null || true
40+ SYSTEMD_DIR=" $HOME /.config/systemd/user"
41+ rm -f " $SYSTEMD_DIR /marionette.service" " $SYSTEMD_DIR /marionette-proxy.service"
42+ systemctl --user daemon-reload 2> /dev/null || true
43+ echo " ==> Removed systemd user services"
44+ fi
45+
46+ # ── 2. Remove ANTHROPIC_BASE_URL from shell rc files ──────────────────────────
47+ MARKER=" # Added by Marionette"
48+ ENV_LINE=' export ANTHROPIC_BASE_URL="http://localhost:8788"'
49+ for RC in " $HOME /.zshrc" " $HOME /.bashrc" " $HOME /.bash_profile" ; do
50+ if [ -f " $RC " ] && grep -qF " $ENV_LINE " " $RC " ; then
51+ perl -i -0pe " s/\n?\Q${MARKER} \E\n\Q${ENV_LINE} \E\n?//g" " $RC "
52+ echo " ==> Removed ANTHROPIC_BASE_URL from $RC "
53+ fi
54+ done
55+
56+ # ── 3. Remove MCP server registration ─────────────────────────────────────────
57+ if [ -f " $MCP_SETTINGS " ] && command -v node & > /dev/null; then
58+ node -e "
59+ const fs = require('fs');
60+ const p = process.argv[1];
61+ try {
62+ const cfg = JSON.parse(fs.readFileSync(p, 'utf8'));
63+ if (cfg.mcpServers && cfg.mcpServers.marionette) {
64+ delete cfg.mcpServers.marionette;
65+ fs.writeFileSync(p, JSON.stringify(cfg, null, 2));
66+ console.log('==> Removed marionette MCP server from ' + p);
67+ }
68+ } catch (e) {}
69+ " " $MCP_SETTINGS "
70+ fi
71+
72+ # ── 4. Remove hooks from Claude Code settings ──────────────────────────────────
73+ if [ -f " $SETTINGS " ] && command -v node & > /dev/null; then
74+ node -e "
75+ const fs = require('fs');
76+ const p = process.argv[1];
77+ try {
78+ const cfg = JSON.parse(fs.readFileSync(p, 'utf8'));
79+ if (cfg.hooks) {
80+ ['PreToolUse', 'Stop', 'Notification'].forEach(k => delete cfg.hooks[k]);
81+ if (Object.keys(cfg.hooks).length === 0) delete cfg.hooks;
82+ fs.writeFileSync(p, JSON.stringify(cfg, null, 2));
83+ console.log('==> Removed Marionette hooks from ' + p);
84+ }
85+ } catch (e) {}
86+ " " $SETTINGS "
87+ fi
88+
89+ # ── 5. Remove binary symlink and install directory ────────────────────────────
90+ if [ -L " $BIN_LINK " ] || [ -f " $BIN_LINK " ]; then
91+ sudo rm -f " $BIN_LINK "
92+ echo " ==> Removed $BIN_LINK "
93+ fi
94+ if [ -d " $INSTALL_DIR " ]; then
95+ sudo rm -rf " $INSTALL_DIR "
96+ echo " ==> Removed $INSTALL_DIR "
97+ fi
98+
99+ # ── 6. Remove logs directory ───────────────────────────────────────────────────
100+ if [ -d " $LOGS_DIR " ]; then
101+ rm -rf " $LOGS_DIR "
102+ echo " ==> Removed $LOGS_DIR "
103+ fi
104+
105+ echo " "
106+ echo " ✓ Marionette has been uninstalled."
107+ echo " Restart your terminal for shell changes to take effect."
0 commit comments