mirror of
https://github.com/garrytan/gstack.git
synced 2026-05-02 03:35:09 +02:00
fbb1a82d97
setup-gbrain Step 7 now invokes gstack-gbrain-source-wireup --strict after
gstack-brain-init + gbrain_sync_mode is set. Strict mode means the user sees
the failure rather than silently ending up with an unwired brain.
bin/gstack-brain-init drops 60 lines of dead code: the HTTP POST to
${GBRAIN_URL}/ingest-repo, the GBRAIN_URL_VAL/GBRAIN_TOKEN_VAL probes, the
consumers.json writer, and the chore commit step. CONSUMERS_FILE variable
declaration removed. The closing message no longer points at the dead
gstack-brain-consumer add path.
bin/gstack-brain-restore drops the 18-line consumers.json token-rehydration
block (was a no-op for the only consumer that ever existed). Adds a
best-effort wireup invocation after the brain-repo clone so 2nd-Mac restore
gets gbrain federation automatically. Failure prints a stderr WARNING but
does not abort the restore — restore's primary job is the git clone.
bin/gstack-brain-uninstall calls the helper's --uninstall mode (which
removes the gbrain source registration, the git worktree, and the
future-launchd-plist stub) before the existing legacy consumers.json
removal. Ordering is fragile-by-design: helper derives source-id via
multi-fallback so it works even after .git is destroyed.
bin/gstack-brain-consumer gets a DEPRECATED header note. Stays in the tree
for one cycle of grace; removal in v1.13.0.0.
setup-gbrain/SKILL.md is regenerated from the .tmpl via gen:skill-docs.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
156 lines
5.7 KiB
Bash
Executable File
156 lines
5.7 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.jsonl — pending queue
|
|
# .brain-discover-cursor — discover-new cursor
|
|
# .brain-last-push — timestamp marker
|
|
# .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):
|
|
# gbrain_sync_mode → off
|
|
# gbrain_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
|
|
|
|
GSTACK_HOME="${GSTACK_HOME:-$HOME/.gstack}"
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
CONFIG_BIN="$SCRIPT_DIR/gstack-config"
|
|
REMOTE_FILE="$HOME/.gstack-brain-remote.txt"
|
|
|
|
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 gbrain_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 -f "$GSTACK_HOME/.brain-queue.jsonl" 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-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.12.3.0) ----
|
|
rm -f "$GSTACK_HOME/consumers.json" 2>/dev/null || true
|
|
|
|
# ---- clear config keys ----
|
|
"$CONFIG_BIN" set gbrain_sync_mode off >/dev/null 2>&1 || true
|
|
"$CONFIG_BIN" set gbrain_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
|