feat(statusline): show update indicator when new GSD version available

Adds SessionStart hook that checks npm in background, caches result.
Statusline shows "⬆ /gsd:update │" when update available.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Lex Christopherson
2026-01-16 12:53:45 -06:00
parent 2569be698d
commit 7a451e6410
4 changed files with 71 additions and 6 deletions

20
hooks/gsd-check-update.sh Executable file
View File

@@ -0,0 +1,20 @@
#!/bin/bash
# Check for GSD updates in background, write result to cache
# Called by SessionStart hook - runs once per session
CACHE_FILE="$HOME/.claude/cache/gsd-update-check.json"
mkdir -p "$HOME/.claude/cache"
# Run check in background (non-blocking)
(
installed=$(cat "$HOME/.claude/get-shit-done/VERSION" 2>/dev/null || echo "0.0.0")
latest=$(npm view get-shit-done-cc version 2>/dev/null)
if [[ -n "$latest" && "$installed" != "$latest" ]]; then
echo "{\"update_available\":true,\"installed\":\"$installed\",\"latest\":\"$latest\",\"checked\":$(date +%s)}" > "$CACHE_FILE"
else
echo "{\"update_available\":false,\"installed\":\"$installed\",\"latest\":\"${latest:-unknown}\",\"checked\":$(date +%s)}" > "$CACHE_FILE"
fi
) &
exit 0

13
hooks/statusline.sh Normal file → Executable file
View File

@@ -40,10 +40,19 @@ if [[ -f "$todo" ]]; then
task=$(jq -r '.[] | select(.status=="in_progress") | .activeForm' "$todo" 2>/dev/null | head -1)
fi
# GSD update available?
gsd_update=""
if [[ -f "$HOME/.claude/cache/gsd-update-check.json" ]]; then
update_available=$(jq -r '.update_available' "$HOME/.claude/cache/gsd-update-check.json" 2>/dev/null)
if [[ "$update_available" == "true" ]]; then
gsd_update=$'\033[33m⬆ /gsd:update\033[0m │ '
fi
fi
# Output
dirname=$(basename "$dir")
if [[ -n "$task" ]]; then
printf '\033[2m%s\033[0m │ \033[1m%s\033[0m │ \033[2m%s\033[0m%s' "$model" "$task" "$dirname" "$ctx"
printf '%s\033[2m%s\033[0m │ \033[1m%s\033[0m │ \033[2m%s\033[0m%s' "$gsd_update" "$model" "$task" "$dirname" "$ctx"
else
printf '\033[2m%s\033[0m │ \033[2m%s\033[0m%s' "$model" "$dirname" "$ctx"
printf '%s\033[2m%s\033[0m │ \033[2m%s\033[0m%s' "$gsd_update" "$model" "$dirname" "$ctx"
fi