Files
msd-core/get-shit-done/workflows/update.md
Alex Foster 19ac77e25d fix: clear both cache paths after update (#663) (#664)
The SessionStart hook always writes to ~/.claude/cache/ via os.homedir()
regardless of install type. The update workflow previously only cleared
the install-type-specific path, leaving stale cache at the global path
for local installs.

Clear both ./.claude/cache/ and ~/.claude/cache/ unconditionally.

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-27 13:34:31 -06:00

6.0 KiB

Check for GSD updates via npm, display changelog for versions between installed and latest, obtain user confirmation, and execute clean installation with cache clearing.

<required_reading> Read all files referenced by the invoking prompt's execution_context before starting. </required_reading>

Detect whether GSD is installed locally or globally by checking both locations and validating install integrity:
# Check local first (takes priority only if valid)
# Paths templated at install time for runtime compatibility
LOCAL_VERSION_FILE="./.claude/get-shit-done/VERSION"
LOCAL_MARKER_FILE="./.claude/get-shit-done/workflows/update.md"
GLOBAL_VERSION_FILE="$HOME/.claude/get-shit-done/VERSION"
GLOBAL_MARKER_FILE="$HOME/.claude/get-shit-done/workflows/update.md"

if [ -f "$LOCAL_VERSION_FILE" ] && [ -f "$LOCAL_MARKER_FILE" ] && grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+' "$LOCAL_VERSION_FILE"; then
  cat "$LOCAL_VERSION_FILE"
  echo "LOCAL"
elif [ -f "$GLOBAL_VERSION_FILE" ] && [ -f "$GLOBAL_MARKER_FILE" ] && grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+' "$GLOBAL_VERSION_FILE"; then
  cat "$GLOBAL_VERSION_FILE"
  echo "GLOBAL"
else
  echo "UNKNOWN"
fi

Parse output:

  • If last line is "LOCAL": local install is valid; installed version is first line; use --local
  • If last line is "GLOBAL": local missing/invalid, global install is valid; installed version is first line; use --global
  • If "UNKNOWN": proceed to install step (treat as version 0.0.0)

If VERSION file missing:

## GSD Update

**Installed version:** Unknown

Your installation doesn't include version tracking.

Running fresh install...

Proceed to install step (treat as version 0.0.0 for comparison).

Check npm for latest version:
npm view get-shit-done-cc version 2>/dev/null

If npm check fails:

Couldn't check for updates (offline or npm unavailable).

To update manually: `npx get-shit-done-cc --global`

Exit.

Compare installed vs latest:

If installed == latest:

## GSD Update

**Installed:** X.Y.Z
**Latest:** X.Y.Z

You're already on the latest version.

Exit.

If installed > latest:

## GSD Update

**Installed:** X.Y.Z
**Latest:** A.B.C

You're ahead of the latest release (development version?).

Exit.

**If update available**, fetch and show what's new BEFORE updating:
  1. Fetch changelog from GitHub raw URL
  2. Extract entries between installed and latest versions
  3. Display preview and ask for confirmation:
## GSD Update Available

**Installed:** 1.5.10
**Latest:** 1.5.15

### What's New
────────────────────────────────────────────────────────────

## [1.5.15] - 2026-01-20

### Added
- Feature X

## [1.5.14] - 2026-01-18

### Fixed
- Bug fix Y

────────────────────────────────────────────────────────────

⚠️  **Note:** The installer performs a clean install of GSD folders:
- `commands/gsd/` will be wiped and replaced
- `get-shit-done/` will be wiped and replaced
- `agents/gsd-*` files will be replaced

(Paths are relative to your install location: `~/.claude/` for global, `./.claude/` for local)

Your custom files in other locations are preserved:
- Custom commands not in `commands/gsd/` ✓
- Custom agents not prefixed with `gsd-` ✓
- Custom hooks ✓
- Your CLAUDE.md files ✓

If you've modified any GSD files directly, they'll be automatically backed up to `gsd-local-patches/` and can be reapplied with `/gsd:reapply-patches` after the update.

Use AskUserQuestion:

  • Question: "Proceed with update?"
  • Options:
    • "Yes, update now"
    • "No, cancel"

If user cancels: Exit.

Run the update using the install type detected in step 1:

If LOCAL install:

npx -y get-shit-done-cc@latest --local

If GLOBAL install (or unknown):

npx -y get-shit-done-cc@latest --global

Capture output. If install fails, show error and exit.

Clear the update cache so statusline indicator disappears:

rm -f ./.claude/cache/gsd-update-check.json
rm -f ~/.claude/cache/gsd-update-check.json

The SessionStart hook (gsd-check-update.js) always writes to ~/.claude/cache/ via os.homedir() regardless of install type, so both paths must be cleared to prevent stale update indicators.

Format completion message (changelog was already shown in confirmation step):
╔═══════════════════════════════════════════════════════════╗
║  GSD Updated: v1.5.10 → v1.5.15                           ║
╚═══════════════════════════════════════════════════════════╝

⚠️  Restart Claude Code to pick up the new commands.

[View full changelog](https://github.com/glittercowboy/get-shit-done/blob/main/CHANGELOG.md)
After update completes, check if the installer detected and backed up any locally modified files:

Check for gsd-local-patches/backup-meta.json in the config directory.

If patches found:

Local patches were backed up before the update.
Run /gsd:reapply-patches to merge your modifications into the new version.

If no patches: Continue normally.

<success_criteria>

  • Installed version read correctly
  • Latest version checked via npm
  • Update skipped if already current
  • Changelog fetched and displayed BEFORE update
  • Clean install warning shown
  • User confirmation obtained
  • Update executed successfully
  • Restart reminder shown </success_criteria>