mirror of
https://github.com/garrytan/gstack.git
synced 2026-11-04 07:47:27 +01:00
Bins, careful/freeze hooks, setup, upgrade migrations, browse/src, design, ios-qa daemon, lib and scripts resolve the state root through bin/gstack-state-root.sh (bash) or lib/state-root.ts (TS). Bins source the twin and stop with a reinstall message when it is missing; hooks source it and never spawn gstack-paths. browse/src/config.ts and lib/cso/state.ts delegate to resolveStateRoot. Analytics writers and readers move together so the usage log stays one file. gstack-uninstall deletes state only at ~/.gstack, refuses (exit 2) when it resolves to /, $HOME or an ancestor, the checkout or the git root, and leaves any other resolved root in place with the removal command. Fixtures that copy single bins now copy the twin.
168 lines
6.5 KiB
Bash
Executable File
168 lines
6.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# gstack-brain-uninstall — clean off-ramp for gstack-brain sync.
|
|
#
|
|
# Usage:
|
|
# gstack-brain-uninstall [--yes] [--delete-remote]
|
|
#
|
|
# Removes the git layer from ~/.gstack/ and clears sync config. Your local
|
|
# gstack memory (learnings, timelines, etc.) is NOT touched — this is an
|
|
# uninstall-sync command, not a delete-data command.
|
|
#
|
|
# Flags:
|
|
# --yes Skip the confirmation prompt.
|
|
# --delete-remote Also delete the GitHub repo via `gh repo delete`
|
|
# (interactive unless --yes is also passed).
|
|
#
|
|
# What it removes (in ~/.gstack/):
|
|
# .git/ — the sync repo's git data
|
|
# .gitignore — canonical ignore-all marker
|
|
# .gitattributes — merge driver declarations
|
|
# .brain-allowlist — sync path list
|
|
# .brain-privacy-map.json — sync privacy classifier
|
|
# .brain-queue.d/ — pending spool (one file per record)
|
|
# .brain-queue.jsonl — legacy pending queue (pre-spool)
|
|
# .brain-discover-cursor — discover-new cursor
|
|
# .brain-last-push — timestamp marker
|
|
# .brain-worktree-last-advance — daily worktree-advance stamp (#2516)
|
|
# .brain-skip.txt — user-maintained skip list
|
|
# .brain-sync.lock.d/ — lock dir (if present)
|
|
# .brain-sync-status.json — health status
|
|
# consumers.json — consumer/reader registry
|
|
#
|
|
# What it clears (via gstack-config):
|
|
# artifacts_sync_mode → off
|
|
# artifacts_sync_mode_prompted → false (so user re-prompts on re-init)
|
|
#
|
|
# What it does NOT touch:
|
|
# Project data (projects/*, retros/*, developer-profile.json, etc.)
|
|
# Consumer tokens in gstack-config (<name>_token keys)
|
|
# ~/.gstack-brain-remote.txt in your home directory
|
|
# The actual remote git repo (unless --delete-remote)
|
|
|
|
set -euo pipefail
|
|
|
|
. "$(dirname "$0")/gstack-state-root.sh" 2>/dev/null || { echo "$0: cannot resolve the gstack state root: $(dirname "$0")/gstack-state-root.sh is missing. fix: reinstall with ./setup or /gstack-upgrade (docs/state-root.md)" >&2; exit 1; }
|
|
gstack_state_root_select
|
|
GSTACK_HOME="$_gstack_sr_root"
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
CONFIG_BIN="$SCRIPT_DIR/gstack-config"
|
|
# v1.27.0.0+ canonical name; brain-remote is the legacy fallback during migration.
|
|
if [ -f "$HOME/.gstack-artifacts-remote.txt" ]; then
|
|
REMOTE_FILE="$HOME/.gstack-artifacts-remote.txt"
|
|
else
|
|
REMOTE_FILE="$HOME/.gstack-brain-remote.txt"
|
|
fi
|
|
|
|
ASSUME_YES=0
|
|
DELETE_REMOTE=0
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
--yes|-y) ASSUME_YES=1; shift ;;
|
|
--delete-remote) DELETE_REMOTE=1; shift ;;
|
|
--help|-h) sed -n '2,30p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
|
|
*) echo "Unknown flag: $1" >&2; exit 1 ;;
|
|
esac
|
|
done
|
|
|
|
if [ ! -d "$GSTACK_HOME/.git" ]; then
|
|
echo "gstack-brain-uninstall: nothing to do (~/.gstack/.git doesn't exist)."
|
|
exit 0
|
|
fi
|
|
|
|
REMOTE_URL=$(git -C "$GSTACK_HOME" remote get-url origin 2>/dev/null || echo "")
|
|
|
|
# ---- confirmation ----
|
|
if [ "$ASSUME_YES" != "1" ]; then
|
|
cat <<EOF
|
|
This will remove gstack-brain sync from this machine:
|
|
- Remove ~/.gstack/.git and sync config files
|
|
- Clear artifacts_sync_mode in gstack-config
|
|
- Remote: $REMOTE_URL will be $([ "$DELETE_REMOTE" = "1" ] && echo "DELETED" || echo "kept")
|
|
|
|
Local memory (learnings, plans, etc.) is NOT touched.
|
|
|
|
EOF
|
|
printf "Proceed? [y/N] "
|
|
read -r reply
|
|
case "$reply" in
|
|
y|Y|yes|Yes) ;;
|
|
*) echo "Aborted."; exit 0 ;;
|
|
esac
|
|
fi
|
|
|
|
# ---- delete remote if requested ----
|
|
if [ "$DELETE_REMOTE" = "1" ] && [ -n "$REMOTE_URL" ]; then
|
|
case "$REMOTE_URL" in
|
|
*github.com*|*@github*)
|
|
if command -v gh >/dev/null 2>&1; then
|
|
# Extract owner/repo from URL.
|
|
REPO_SLUG=$(echo "$REMOTE_URL" | sed -E 's#.*[:/]([^/:]+/[^/]+)(\.git)?$#\1#' | sed 's/\.git$//')
|
|
if [ -n "$REPO_SLUG" ]; then
|
|
echo "Deleting GitHub repo: $REPO_SLUG"
|
|
if [ "$ASSUME_YES" = "1" ]; then
|
|
gh repo delete "$REPO_SLUG" --yes 2>/dev/null || echo "gh repo delete failed; continuing local uninstall"
|
|
else
|
|
gh repo delete "$REPO_SLUG" 2>/dev/null || echo "gh repo delete failed; continuing local uninstall"
|
|
fi
|
|
fi
|
|
else
|
|
echo "--delete-remote requires the gh CLI. Skipping remote deletion."
|
|
fi
|
|
;;
|
|
*)
|
|
echo "--delete-remote only supports github.com remotes. Delete manually if needed: $REMOTE_URL"
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
# ---- remove sync files ----
|
|
echo "Removing git layer and sync config files..."
|
|
rm -rf "$GSTACK_HOME/.git" 2>/dev/null || true
|
|
rm -f "$GSTACK_HOME/.gitignore" 2>/dev/null || true
|
|
rm -f "$GSTACK_HOME/.gitattributes" 2>/dev/null || true
|
|
rm -f "$GSTACK_HOME/.brain-allowlist" 2>/dev/null || true
|
|
rm -f "$GSTACK_HOME/.brain-privacy-map.json" 2>/dev/null || true
|
|
rm -rf "$GSTACK_HOME/.brain-queue.d" 2>/dev/null || true
|
|
rm -f "$GSTACK_HOME/.brain-queue.jsonl" 2>/dev/null || true
|
|
rm -f "$GSTACK_HOME/.brain-queue.jsonl.migrating" 2>/dev/null || true
|
|
rm -f "$GSTACK_HOME/.brain-discover-cursor" 2>/dev/null || true
|
|
rm -f "$GSTACK_HOME/.brain-last-push" 2>/dev/null || true
|
|
rm -f "$GSTACK_HOME/.brain-last-pull" 2>/dev/null || true
|
|
rm -f "$GSTACK_HOME/.brain-worktree-last-advance" 2>/dev/null || true
|
|
rm -f "$GSTACK_HOME/.brain-skip.txt" 2>/dev/null || true
|
|
rm -f "$GSTACK_HOME/.brain-sync-status.json" 2>/dev/null || true
|
|
rm -rf "$GSTACK_HOME/.brain-sync.lock.d" 2>/dev/null || true
|
|
|
|
# ---- unregister gbrain federated source + remove worktree (best-effort) ----
|
|
# The wireup helper handles: gbrain sources remove, git worktree remove,
|
|
# launchd plist (future). All best-effort; uninstall continues on failure.
|
|
WIREUP_BIN="$SCRIPT_DIR/gstack-gbrain-source-wireup"
|
|
if [ -x "$WIREUP_BIN" ]; then
|
|
"$WIREUP_BIN" --uninstall 2>/dev/null || true
|
|
fi
|
|
|
|
# ---- legacy consumers.json (no longer written by gstack-brain-init since v1.17.0.0) ----
|
|
rm -f "$GSTACK_HOME/consumers.json" 2>/dev/null || true
|
|
|
|
# ---- clear config keys ----
|
|
"$CONFIG_BIN" set artifacts_sync_mode off >/dev/null 2>&1 || true
|
|
"$CONFIG_BIN" set artifacts_sync_mode_prompted false >/dev/null 2>&1 || true
|
|
|
|
# ---- leave remote-helper file alone unless user asked to delete remote ----
|
|
if [ "$DELETE_REMOTE" = "1" ]; then
|
|
rm -f "$REMOTE_FILE" 2>/dev/null || true
|
|
else
|
|
if [ -f "$REMOTE_FILE" ]; then
|
|
echo "(keeping $REMOTE_FILE — remove manually if you want to forget the URL)"
|
|
fi
|
|
fi
|
|
|
|
cat <<EOF
|
|
|
|
gstack-brain uninstall complete.
|
|
Sync is off. ~/.gstack/ is a plain directory again.
|
|
Your project data, learnings, and profile are untouched.
|
|
|
|
To re-enable sync later: gstack-brain-init
|
|
EOF
|