com um clique
bstack-upgrade
Upgrade bstack to the latest version. Detects global vs vendored install, runs the upgrade, and shows what's new.
Menu
Upgrade bstack to the latest version. Detects global vs vendored install, runs the upgrade, and shows what's new.
| name | bstack-upgrade |
| version | 1.0.0 |
| description | Upgrade bstack to the latest version. Detects global vs vendored install, runs the upgrade, and shows what's new. |
| allowed-tools | ["Bash","Read","Write","AskUserQuestion"] |
Upgrade bstack to the latest version and show what's new.
This section is referenced by the bstack SKILL.md preamble when it detects UPGRADE_AVAILABLE.
First, check if auto-upgrade is enabled:
_BSTACK_ROOT="${BSTACK_DIR:-$HOME/.claude/skills/bstack}"
[ ! -x "$_BSTACK_ROOT/bin/bstack-config" ] && _BSTACK_ROOT="$HOME/.agents/skills/bstack"
_AUTO=""
[ "${BSTACK_AUTO_UPGRADE:-}" = "1" ] && _AUTO="true"
[ -z "$_AUTO" ] && _AUTO=$("$_BSTACK_ROOT/bin/bstack-config" get auto_upgrade 2>/dev/null || true)
echo "AUTO_UPGRADE=$_AUTO"
If AUTO_UPGRADE=true or AUTO_UPGRADE=1: Skip AskUserQuestion. Log "Auto-upgrading bstack v{old} → v{new}..." and proceed directly to Step 2.
Otherwise, use AskUserQuestion:
If "Yes, upgrade now": Proceed to Step 2.
If "Always keep me up to date":
"$_BSTACK_ROOT/bin/bstack-config" set auto_upgrade true
Tell user: "Auto-upgrade enabled. Future updates will install automatically." Then proceed to Step 2.
If "Not now": Write snooze state with escalating backoff (first snooze = 24h, second = 48h, third+ = 1 week), then continue with the current skill.
_SNOOZE_FILE=~/.bstack/update-snoozed
_REMOTE_VER="{new}"
_CUR_LEVEL=0
if [ -f "$_SNOOZE_FILE" ]; then
_SNOOZED_VER=$(awk '{print $1}' "$_SNOOZE_FILE")
if [ "$_SNOOZED_VER" = "$_REMOTE_VER" ]; then
_CUR_LEVEL=$(awk '{print $2}' "$_SNOOZE_FILE")
case "$_CUR_LEVEL" in *[!0-9]*) _CUR_LEVEL=0 ;; esac
fi
fi
_NEW_LEVEL=$((_CUR_LEVEL + 1))
[ "$_NEW_LEVEL" -gt 3 ] && _NEW_LEVEL=3
echo "$_REMOTE_VER $_NEW_LEVEL $(date +%s)" > "$_SNOOZE_FILE"
Note: {new} is the remote version from the UPGRADE_AVAILABLE output — substitute it from the update check result.
Tell user the snooze duration: "Next reminder in 24h" (or 48h or 1 week, depending on level).
If "Never ask again":
"$_BSTACK_ROOT/bin/bstack-config" set update_check false
Tell user: "Update checks disabled. Run bstack-config set update_check true to re-enable."
Continue with the current skill.
_BSTACK_ROOT=""
if [ -d "$HOME/.claude/skills/bstack/.git" ]; then
INSTALL_TYPE="global-git"
_BSTACK_ROOT="$HOME/.claude/skills/bstack"
elif [ -d "$HOME/.agents/skills/bstack/.git" ]; then
INSTALL_TYPE="agents-git"
_BSTACK_ROOT="$HOME/.agents/skills/bstack"
elif [ -d ".claude/skills/bstack/.git" ]; then
INSTALL_TYPE="local-git"
_BSTACK_ROOT=".claude/skills/bstack"
elif [ -d "$HOME/.claude/skills/bstack" ]; then
INSTALL_TYPE="vendored-global"
_BSTACK_ROOT="$HOME/.claude/skills/bstack"
elif [ -d "$HOME/.agents/skills/bstack" ]; then
INSTALL_TYPE="vendored-agents"
_BSTACK_ROOT="$HOME/.agents/skills/bstack"
else
echo "ERROR: bstack not found"
exit 1
fi
echo "Install type: $INSTALL_TYPE at $_BSTACK_ROOT"
OLD_VERSION=$(cat "$_BSTACK_ROOT/VERSION" 2>/dev/null || echo "unknown")
For git installs (global-git, agents-git, local-git):
cd "$_BSTACK_ROOT"
STASH_OUTPUT=$(git stash 2>&1)
git fetch origin
git reset --hard origin/main
chmod +x bin/* scripts/* 2>/dev/null || true
If $STASH_OUTPUT contains "Saved working directory", warn the user.
For vendored installs:
PARENT=$(dirname "$_BSTACK_ROOT")
TMP_DIR=$(mktemp -d)
git clone --depth 1 https://github.com/broomva/bstack.git "$TMP_DIR/bstack"
mv "$_BSTACK_ROOT" "$_BSTACK_ROOT.bak"
mv "$TMP_DIR/bstack" "$_BSTACK_ROOT"
chmod +x "$_BSTACK_ROOT/bin/"* "$_BSTACK_ROOT/scripts/"* 2>/dev/null || true
rm -rf "$_BSTACK_ROOT.bak" "$TMP_DIR"
mkdir -p ~/.bstack
echo "$OLD_VERSION" > ~/.bstack/just-upgraded-from
rm -f ~/.bstack/last-update-check
rm -f ~/.bstack/update-snoozed
Read $_BSTACK_ROOT/CHANGELOG.md if it exists. Otherwise check git log --oneline $OLD_VERSION..HEAD for changes. Summarize as 3-5 bullets. Format:
bstack v{new} — upgraded from v{old}!
What's new:
- [bullet 1]
- [bullet 2]
- ...
After showing What's New, continue with whatever skill the user originally invoked.
When invoked directly as /bstack-upgrade (not from a preamble):
~/.claude/skills/bstack/bin/bstack-update-check --force 2>/dev/null || ~/.agents/skills/bstack/bin/bstack-update-check --force 2>/dev/null || true
UPGRADE_AVAILABLE <old> <new>: follow Steps 2-6 above.