mirror of
https://github.com/garrytan/gstack.git
synced 2026-05-02 03:35:09 +02:00
abd19d7d71
CI's version-stale check (job 73106360896) failed: PR #1234 claims v1.16.1.0 but the queue moved to v1.17.0.0. Root cause: bumping 1.15.1.0 → 1.16.1.0 to dodge the prior collision turned the branch's diff classification from PATCH (1.15.0 → 1.15.1) into MINOR (1.15.0 → 1.16.x). detect-bump.ts now sees MINOR, gstack-next-version walks the MINOR lane past #1233's v1.16.0.0 claim, and the next free slot is v1.17.0.0. Honestly accurate per CLAUDE.md scale-aware bumps: this branch IS a MINOR ("substantial new capability shipped — skill, harness, command, big refactor"). The new helper + migration + integration totals ~1200 lines added across 11 files with 26 new tests. PATCH was always the wrong honest classification; the queue collision forced the right answer. Files updated: - VERSION 1.16.1.0 → 1.17.0.0 - package.json 1.16.1.0 → 1.17.0.0 - CHANGELOG.md heading + After column 1.16.1.0 → 1.17.0.0 - CHANGELOG removal targets 1.17.0.0 → 1.18.0.0 - gstack-upgrade/migrations/v1.16.1.0.sh → renamed v1.17.0.0.sh + log prefix - bin/gstack-brain-consumer "DEPRECATED in" + "removal in" 1.16.1.0/1.17.0.0 → 1.17.0.0/1.18.0.0 - bin/gstack-brain-uninstall "since vX.Y.Z.W" 1.16.1.0 → 1.17.0.0 - test/gstack-upgrade-migration-v1_16_1_0.test.ts → renamed v1_17_0_0.test.ts 26/26 tests still pass. No behavior change. 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.17.0.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
|