From 7939269baec6f0409481daa69b543cca84a5e479 Mon Sep 17 00:00:00 2001 From: Garry Tan Date: Wed, 27 May 2026 08:34:02 -0700 Subject: [PATCH] feat(brain): gstack-config gbrain-refresh subcommand Adds a new subcommand that re-detects gbrain installation state and persists the result to ~/.gstack/gbrain-detection.json. The detection file is consumed by gen-skill-docs --respect-detection (next commit) to decide whether to render the GBRAIN_CONTEXT_LOAD and GBRAIN_SAVE_RESULTS resolver blocks in user-local SKILL.md generation. Reuses the existing bin/gstack-gbrain-detect helper for the actual probe; this subcommand just persists + summarizes. Users run it after installing or uninstalling gbrain so their locally generated SKILL.md files match their installation state. Co-Authored-By: Claude Opus 4.7 (1M context) --- bin/gstack-config | 48 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/bin/gstack-config b/bin/gstack-config index afb8bc205..2916b766f 100755 --- a/bin/gstack-config +++ b/bin/gstack-config @@ -328,8 +328,54 @@ case "${1:-}" in # Brain integration helper (T16 / D4 A3): resolve + persist user-slug resolve_user_slug ;; + gbrain-refresh) + # Brain integration helper: re-detect gbrain installation state and + # persist to ~/.gstack/gbrain-detection.json. gen-skill-docs reads this + # file (when invoked with --respect-detection) to decide whether to + # render GBRAIN_CONTEXT_LOAD and GBRAIN_SAVE_RESULTS blocks in + # generated SKILL.md files. + # + # Run this after installing or uninstalling gbrain so your locally + # generated SKILL.md files match your installation state. + SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" + DETECT_BIN="$SCRIPT_DIR/gstack-gbrain-detect" + DETECTION_FILE="$STATE_DIR/gbrain-detection.json" + mkdir -p "$STATE_DIR" + if [ ! -x "$DETECT_BIN" ]; then + echo "gstack-gbrain-detect not found at $DETECT_BIN" >&2 + exit 1 + fi + if ! "$DETECT_BIN" > "$DETECTION_FILE.tmp" 2>/dev/null; then + printf '{"gbrain_on_path":false,"gbrain_local_status":"no-cli"}\n' > "$DETECTION_FILE.tmp" + fi + mv "$DETECTION_FILE.tmp" "$DETECTION_FILE" + + # Summarize for the user. Use python (already required elsewhere) to + # parse the JSON portably; fall back to grep if python is unavailable. + PYTHON_CMD=$(command -v python3 || command -v python || true) + if [ -n "$PYTHON_CMD" ]; then + STATUS=$("$PYTHON_CMD" -c "import json,sys; d=json.load(open('$DETECTION_FILE')); print(d.get('gbrain_local_status','unknown'))" 2>/dev/null || echo unknown) + VERSION=$("$PYTHON_CMD" -c "import json,sys; d=json.load(open('$DETECTION_FILE')); print(d.get('gbrain_version') or 'unknown')" 2>/dev/null || echo unknown) + else + STATUS=$(grep -o '"gbrain_local_status":[[:space:]]*"[^"]*"' "$DETECTION_FILE" | sed 's/.*"\([^"]*\)"$/\1/') + VERSION=$(grep -o '"gbrain_version":[[:space:]]*"[^"]*"' "$DETECTION_FILE" | sed 's/.*"\([^"]*\)"$/\1/') + [ -z "$STATUS" ] && STATUS=unknown + [ -z "$VERSION" ] && VERSION=unknown + fi + + case "$STATUS" in + ok) + echo "Detected gbrain v$VERSION → brain-aware blocks will render in planning-skill SKILL.md files." + echo "Run 'bun run gen:skill-docs' in the gstack repo (or re-run ./setup) to regenerate now." + ;; + *) + echo "gbrain not detected (local-status: $STATUS) → brain-aware blocks will be suppressed in planning-skill SKILL.md files." + echo "Install gbrain (see /setup-gbrain) and re-run 'gstack-config gbrain-refresh' once it's configured." + ;; + esac + ;; *) - echo "Usage: gstack-config {get|set|list|defaults|endpoint-hash|resolve-user-slug} [key] [value]" + echo "Usage: gstack-config {get|set|list|defaults|endpoint-hash|resolve-user-slug|gbrain-refresh} [key] [value]" exit 1 ;; esac