6.8 KiB
<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)
# Detect runtime config directory (supports OpenCode, OpenCode, Gemini)
LOCAL_VERSION_FILE="" LOCAL_MARKER_FILE="" LOCAL_DIR=""
for dir in .OpenCode .config/opencode .opencode .gemini; do
if [ -f "./$dir/get-shit-done/VERSION" ]; then
LOCAL_VERSION_FILE="./$dir/get-shit-done/VERSION"
LOCAL_MARKER_FILE="./$dir/get-shit-done/workflows/update.md"
LOCAL_DIR="$(cd "./$dir" 2>/dev/null && pwd)"
break
fi
done
GLOBAL_VERSION_FILE="" GLOBAL_MARKER_FILE="" GLOBAL_DIR=""
for dir in .OpenCode .config/opencode .opencode .gemini; do
if [ -f "$HOME/$dir/get-shit-done/VERSION" ]; then
GLOBAL_VERSION_FILE="$HOME/$dir/get-shit-done/VERSION"
GLOBAL_MARKER_FILE="$HOME/$dir/get-shit-done/workflows/update.md"
GLOBAL_DIR="$(cd "$HOME/$dir" 2>/dev/null && pwd)"
break
fi
done
# Only treat as LOCAL if the resolved paths differ (prevents misdetection when CWD=$HOME)
IS_LOCAL=false
if [ -n "$LOCAL_VERSION_FILE" ] && [ -f "$LOCAL_VERSION_FILE" ] && [ -f "$LOCAL_MARKER_FILE" ] && grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+' "$LOCAL_VERSION_FILE"; then
if [ -z "$GLOBAL_DIR" ] || [ "$LOCAL_DIR" != "$GLOBAL_DIR" ]; then
IS_LOCAL=true
fi
fi
if [ "$IS_LOCAL" = true ]; then
cat "$LOCAL_VERSION_FILE"
echo "LOCAL"
elif [ -n "$GLOBAL_VERSION_FILE" ] && [ -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 gsd-opencode version 2>/dev/null
If npm check fails:
Couldn't check for updates (offline or npm unavailable).
To update manually: `npx gsd-opencode --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:- Fetch changelog from GitHub raw URL
- Extract entries between installed and latest versions
- 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: `./.opencode/` for global, `./.OpenCode/` 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 AGENTS.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 question:
- 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 gsd-opencode@latest --local
If GLOBAL install (or unknown):
npx -y gsd-opencode@latest --global
Capture output. If install fails, show error and exit.
Clear the update cache so statusline indicator disappears:
# Clear update cache across all runtime directories
for dir in .OpenCode .config/opencode .opencode .gemini; do
rm -f "./$dir/cache/gsd-update-check.json"
rm -f "$HOME/$dir/cache/gsd-update-check.json"
done
The SessionStart hook (gsd-check-update.js) writes to the detected runtime's cache directory, so all paths must be cleared to prevent stale update indicators.
╔═══════════════════════════════════════════════════════════╗
║ GSD Updated: v1.5.10 → v1.5.15 ║
╚═══════════════════════════════════════════════════════════╝
⚠️ Restart OpenCode to pick up the new commands.
[View full changelog](https://github.com/rokicool/gsd-opencode/blob/main/CHANGELOG.md)
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>