leopold-driver 0.1.3 → 0.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/assets/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.4
1
+ 0.4.6
@@ -77,7 +77,8 @@ main_menu() {
77
77
  "$C_BOLD" "$i" "$C_RESET" "$C_BOLD" "$title" "$C_RESET" "$st" "$C_DIM" "$summary" "$C_RESET"
78
78
  i=$((i + 1))
79
79
  done < <(list_exts)
80
- printf " %sd%s) Doctor all %sq%s) Quit\n\n" "$C_BOLD" "$C_RESET" "$C_BOLD" "$C_RESET"
80
+ printf " %sd%s) Doctor all %su%s) Uninstall %sq%s) Quit\n\n" \
81
+ "$C_BOLD" "$C_RESET" "$C_BOLD" "$C_RESET" "$C_BOLD" "$C_RESET"
81
82
  }
82
83
 
83
84
  component_menu() {
@@ -113,6 +114,92 @@ doctor_all() {
113
114
  pause
114
115
  }
115
116
 
117
+ # ---- uninstall (granular, data-safe) ---------------------------------------
118
+
119
+ confirm() { # prompt -> 0 if yes
120
+ printf "%s [y/N] " "$1"
121
+ local a; read -r a || a=""
122
+ case "$a" in [yY]*) return 0 ;; *) echo " skipped." ; return 1 ;; esac
123
+ }
124
+ ext_path() { [ -d "$EXT_DIR/$1" ] && printf "%s" "$EXT_DIR/$1"; }
125
+ CLAUDE="${CLAUDE_HOME:-$HOME/.claude}"
126
+
127
+ remove_core() {
128
+ local settings="$CLAUDE/settings.json" tmp d
129
+ if [ -f "$settings" ] && command -v jq >/dev/null 2>&1; then
130
+ cp "$settings" "$settings.leopold.bak"
131
+ tmp="$(mktemp)"
132
+ jq 'if .hooks then .hooks |= ( to_entries
133
+ | map(.value |= ( map(.hooks |= map(select((.command // "") | test("leopold/hooks/") | not)))
134
+ | map(select((.hooks | length) > 0)) ))
135
+ | from_entries ) else . end' "$settings" > "$tmp" && mv "$tmp" "$settings"
136
+ echo " unwired Leopold's Stop/PreToolUse hooks (backup at $settings.leopold.bak)"
137
+ fi
138
+ for d in "$CLAUDE"/skills/leopold-*; do [ -d "$d" ] && rm -rf "$d"; done
139
+ rm -rf "$CLAUDE/leopold" 2>/dev/null || true
140
+ echo " removed the leopold-* skills and $CLAUDE/leopold"
141
+ }
142
+
143
+ remove_cli() {
144
+ if command -v npm >/dev/null 2>&1; then
145
+ npm uninstall -g leopold-driver >/dev/null 2>&1 \
146
+ && echo " uninstalled the leopold CLI (npm)" \
147
+ || echo " (leopold CLI not installed via npm, or it needs sudo)"
148
+ else
149
+ echo " npm not found — nothing to do for the CLI"
150
+ fi
151
+ }
152
+
153
+ remove_ext() { # name
154
+ local d; d="$(ext_path "$1")"
155
+ [ -n "$d" ] && ext_run "$d" remove || echo " ($1 extension not found in this build)"
156
+ }
157
+
158
+ remove_ovmem_data() {
159
+ printf "%s This DELETES ~/.openviking — your ENTIRE long-term memory — and uninstalls\n" "$C_YELLOW"
160
+ printf " the OpenViking server. There is no undo.%s\n" "$C_RESET"
161
+ printf " Type %sDELETE%s to confirm: " "$C_BOLD" "$C_RESET"
162
+ local a; read -r a || a=""
163
+ [ "$a" = "DELETE" ] || { echo " skipped (not confirmed)."; return; }
164
+ pkill -f "openviking-server" 2>/dev/null || true
165
+ command -v uv >/dev/null 2>&1 && uv tool uninstall openviking >/dev/null 2>&1 && echo " uninstalled the openviking server" || true
166
+ rm -rf "$HOME/.openviking" 2>/dev/null && echo " deleted ~/.openviking (long-term memory)" || true
167
+ }
168
+
169
+ uninstall_menu() {
170
+ header
171
+ printf " %sUninstall Leopold%s — pick exactly what to remove.\n" "$C_BOLD" "$C_RESET"
172
+ printf " %sYour data is KEPT unless you pick a DATA item; each pick is confirmed.%s\n\n" "$C_DIM" "$C_RESET"
173
+ printf " 1) Leopold core skills + hooks + %s/leopold (the harness)\n" "$CLAUDE"
174
+ printf " 2) leopold CLI npm uninstall -g leopold-driver\n"
175
+ printf " 3) serena unregister MCP + unwire hooks (keeps the serena CLI)\n"
176
+ printf " 4) gstack remove the skill suite\n"
177
+ printf " 5) ovmem unwire hooks + remove engine %s(keeps your memory)%s\n" "$C_DIM" "$C_RESET"
178
+ printf " 6) %sovmem DATA + server ~/.openviking + OpenViking — DELETES memory!%s\n\n" "$C_YELLOW" "$C_RESET"
179
+ printf " a) everything except DATA (1-5) q) cancel\n\n"
180
+ printf "pick (space-separated, e.g. \"1 2 5\"): "
181
+ local picks p; read -r picks || picks="q"
182
+ case "$picks" in q|Q|"") return ;; a|A) picks="1 2 3 4 5" ;; esac
183
+ echo
184
+ printf "%sSelected: %s%s\n" "$C_BOLD" "$picks" "$C_RESET"
185
+ confirm "Proceed with the removals above?" || { pause; return; }
186
+ echo
187
+ for p in $picks; do
188
+ case "$p" in
189
+ 1) confirm "Remove Leopold core (skills + hooks)?" && remove_core ;;
190
+ 2) confirm "Uninstall the leopold CLI (npm -g)?" && remove_cli ;;
191
+ 3) confirm "Remove serena (MCP + hooks)?" && remove_ext serena ;;
192
+ 4) confirm "Remove gstack?" && remove_ext gstack ;;
193
+ 5) confirm "Remove ovmem engine (keeps your memory)?" && remove_ext ovmem ;;
194
+ 6) remove_ovmem_data ;;
195
+ *) echo " ignored: '$p'" ;;
196
+ esac
197
+ done
198
+ echo
199
+ printf "%sUninstall done.%s\n" "$C_GREEN" "$C_RESET"
200
+ pause
201
+ }
202
+
116
203
  # ---- main loop --------------------------------------------------------------
117
204
 
118
205
  while true; do
@@ -121,6 +208,7 @@ while true; do
121
208
  case "$choice" in
122
209
  q|Q) echo; exit 0 ;;
123
210
  d|D) doctor_all ;;
211
+ u|U) uninstall_menu ;;
124
212
  ''|*[!0-9]*) ;; # ignore non-numeric
125
213
  *)
126
214
  idx=$((choice - 1))
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leopold-driver",
3
- "version": "0.1.3",
3
+ "version": "0.4.6",
4
4
  "description": "Leopold SDK driver: a persistent conductor that orchestrates fresh Claude Code workers per task, decides from your charter, and notifies you. Uses your Claude Code auth. Git stays locked.",
5
5
  "type": "module",
6
6
  "bin": {