gstack-upgrade

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly --> <!-- Regenerate: bun run gen:skill-docs -->
<!-- 由SKILL.md.tmpl自动生成 — 请勿直接编辑 --> <!-- 重新生成:bun run gen:skill-docs -->

/gstack-upgrade

/gstack-upgrade

Upgrade gstack to the latest version and show what's new.
将gstack升级至最新版本并展示新功能。

Inline upgrade flow

内嵌升级流程

This section is referenced by all skill preambles when they detect
UPGRADE_AVAILABLE
.
当所有技能的前置检测到
UPGRADE_AVAILABLE
时,会引用此部分内容。

Step 1: Ask the user (or auto-upgrade)

步骤1:询问用户(或自动升级)

First, check if auto-upgrade is enabled:
bash
_AUTO=""
[ "${GSTACK_AUTO_UPGRADE:-}" = "1" ] && _AUTO="true"
[ -z "$_AUTO" ] && _AUTO=$(~/.claude/skills/gstack/bin/gstack-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 gstack v{old} → v{new}..." and proceed directly to Step 2. If
./setup
fails during auto-upgrade, restore from backup (
.bak
directory) and warn the user: "Auto-upgrade failed — restored previous version. Run
/gstack-upgrade
manually to retry."
Otherwise, use AskUserQuestion:
  • Question: "gstack v{new} is available (you're on v{old}). Upgrade now?"
  • Options: ["Yes, upgrade now", "Always keep me up to date", "Not now", "Never ask again"]
If "Yes, upgrade now": Proceed to Step 2.
If "Always keep me up to date":
bash
~/.claude/skills/gstack/bin/gstack-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. Do not mention the upgrade again.
bash
_SNOOZE_FILE=~/.gstack/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). Tip: "Set
auto_upgrade: true
in
~/.gstack/config.yaml
for automatic upgrades."
If "Never ask again":
bash
~/.claude/skills/gstack/bin/gstack-config set update_check false
Tell user: "Update checks disabled. Run
~/.claude/skills/gstack/bin/gstack-config set update_check true
to re-enable." Continue with the current skill.
首先,检查是否启用了自动升级:
bash
_AUTO=""
[ "${GSTACK_AUTO_UPGRADE:-}" = "1" ] && _AUTO="true"
[ -z "$_AUTO" ] && _AUTO=$(~/.claude/skills/gstack/bin/gstack-config get auto_upgrade 2>/dev/null || true)
echo "AUTO_UPGRADE=$_AUTO"
如果
AUTO_UPGRADE=true
AUTO_UPGRADE=1
跳过询问用户步骤。记录日志“自动升级gstack v{旧版本} → v{新版本}...”并直接进入步骤2。如果自动升级过程中
./setup
执行失败,从备份目录(
.bak
)恢复并提醒用户:“自动升级失败 — 已恢复至之前版本。请手动运行
/gstack-upgrade
重试。”
否则,使用询问用户功能:
  • 问题:“gstack v{新版本} 已发布(当前版本为v{旧版本})。是否立即升级?”
  • 选项:["立即升级", "始终保持最新", "暂不升级", "不再询问"]
如果选择“立即升级”: 进入步骤2。
如果选择“始终保持最新”:
bash
~/.claude/skills/gstack/bin/gstack-config set auto_upgrade true
告知用户:“已启用自动升级。未来更新将自动安装。”然后进入步骤2。
如果选择“暂不升级”: 记录延迟提醒状态并逐步延长间隔(首次延迟24小时,第二次48小时,第三次及以后1周),然后继续当前技能操作。不再提及升级提示。
bash
_SNOOZE_FILE=~/.gstack/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"
注意:
{new}
是来自
UPGRADE_AVAILABLE
输出的远程版本号 — 需从更新检查结果中替换。
告知用户延迟时长:“下次提醒将在24小时后”(或48小时、1周,取决于延迟等级)。提示:“在
~/.gstack/config.yaml
中设置
auto_upgrade: true
即可开启自动升级。”
如果选择“不再询问”:
bash
~/.claude/skills/gstack/bin/gstack-config set update_check false
告知用户:“已禁用更新检查。运行
~/.claude/skills/gstack/bin/gstack-config set update_check true
可重新启用。” 继续当前技能操作。

Step 2: Detect install type

步骤2:检测安装类型

bash
if [ -d "$HOME/.claude/skills/gstack/.git" ]; then
  INSTALL_TYPE="global-git"
  INSTALL_DIR="$HOME/.claude/skills/gstack"
elif [ -d ".claude/skills/gstack/.git" ]; then
  INSTALL_TYPE="local-git"
  INSTALL_DIR=".claude/skills/gstack"
elif [ -d ".claude/skills/gstack" ]; then
  INSTALL_TYPE="vendored"
  INSTALL_DIR=".claude/skills/gstack"
elif [ -d "$HOME/.claude/skills/gstack" ]; then
  INSTALL_TYPE="vendored-global"
  INSTALL_DIR="$HOME/.claude/skills/gstack"
else
  echo "ERROR: gstack not found"
  exit 1
fi
echo "Install type: $INSTALL_TYPE at $INSTALL_DIR"
The install type and directory path printed above will be used in all subsequent steps.
bash
if [ -d "$HOME/.claude/skills/gstack/.git" ]; then
  INSTALL_TYPE="global-git"
  INSTALL_DIR="$HOME/.claude/skills/gstack"
elif [ -d ".claude/skills/gstack/.git" ]; then
  INSTALL_TYPE="local-git"
  INSTALL_DIR=".claude/skills/gstack"
elif [ -d ".claude/skills/gstack" ]; then
  INSTALL_TYPE="vendored"
  INSTALL_DIR=".claude/skills/gstack"
elif [ -d "$HOME/.claude/skills/gstack" ]; then
  INSTALL_TYPE="vendored-global"
  INSTALL_DIR="$HOME/.claude/skills/gstack"
else
  echo "ERROR: gstack not found"
  exit 1
fi
echo "Install type: $INSTALL_TYPE at $INSTALL_DIR"
上述输出的安装类型和目录路径将用于后续所有步骤。

Step 3: Save old version

步骤3:保存旧版本号

Use the install directory from Step 2's output below:
bash
OLD_VERSION=$(cat "$INSTALL_DIR/VERSION" 2>/dev/null || echo "unknown")
使用步骤2输出中的安装目录:
bash
OLD_VERSION=$(cat "$INSTALL_DIR/VERSION" 2>/dev/null || echo "unknown")

Step 4: Upgrade

步骤4:执行升级

Use the install type and directory detected in Step 2:
For git installs (global-git, local-git):
bash
cd "$INSTALL_DIR"
STASH_OUTPUT=$(git stash 2>&1)
git fetch origin
git reset --hard origin/main
./setup
If
$STASH_OUTPUT
contains "Saved working directory", warn the user: "Note: local changes were stashed. Run
git stash pop
in the skill directory to restore them."
For vendored installs (vendored, vendored-global):
bash
PARENT=$(dirname "$INSTALL_DIR")
TMP_DIR=$(mktemp -d)
git clone --depth 1 https://github.com/garrytan/gstack.git "$TMP_DIR/gstack"
mv "$INSTALL_DIR" "$INSTALL_DIR.bak"
mv "$TMP_DIR/gstack" "$INSTALL_DIR"
cd "$INSTALL_DIR" && ./setup
rm -rf "$INSTALL_DIR.bak" "$TMP_DIR"
使用步骤2检测到的安装类型和目录:
对于Git安装(global-git、local-git):
bash
cd "$INSTALL_DIR"
STASH_OUTPUT=$(git stash 2>&1)
git fetch origin
git reset --hard origin/main
./setup
如果
$STASH_OUTPUT
包含“Saved working directory”,提醒用户:“注意:本地修改已被暂存。在技能目录中运行
git stash pop
可恢复这些修改。”
对于本地依赖安装(vendored、vendored-global):
bash
PARENT=$(dirname "$INSTALL_DIR")
TMP_DIR=$(mktemp -d)
git clone --depth 1 https://github.com/garrytan/gstack.git "$TMP_DIR/gstack"
mv "$INSTALL_DIR" "$INSTALL_DIR.bak"
mv "$TMP_DIR/gstack" "$INSTALL_DIR"
cd "$INSTALL_DIR" && ./setup
rm -rf "$INSTALL_DIR.bak" "$TMP_DIR"

Step 4.5: Sync local vendored copy

步骤4.5:同步本地依赖副本

Use the install directory from Step 2. Check if there's also a local vendored copy that needs updating:
bash
_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
LOCAL_GSTACK=""
if [ -n "$_ROOT" ] && [ -d "$_ROOT/.claude/skills/gstack" ]; then
  _RESOLVED_LOCAL=$(cd "$_ROOT/.claude/skills/gstack" && pwd -P)
  _RESOLVED_PRIMARY=$(cd "$INSTALL_DIR" && pwd -P)
  if [ "$_RESOLVED_LOCAL" != "$_RESOLVED_PRIMARY" ]; then
    LOCAL_GSTACK="$_ROOT/.claude/skills/gstack"
  fi
fi
echo "LOCAL_GSTACK=$LOCAL_GSTACK"
If
LOCAL_GSTACK
is non-empty, update it by copying from the freshly-upgraded primary install (same approach as README vendored install):
bash
mv "$LOCAL_GSTACK" "$LOCAL_GSTACK.bak"
cp -Rf "$INSTALL_DIR" "$LOCAL_GSTACK"
rm -rf "$LOCAL_GSTACK/.git"
cd "$LOCAL_GSTACK" && ./setup
rm -rf "$LOCAL_GSTACK.bak"
Tell user: "Also updated vendored copy at
$LOCAL_GSTACK
— commit
.claude/skills/gstack/
when you're ready."
使用步骤2中的安装目录。检查是否存在需要更新的本地依赖副本:
bash
_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
LOCAL_GSTACK=""
if [ -n "$_ROOT" ] && [ -d "$_ROOT/.claude/skills/gstack" ]; then
  _RESOLVED_LOCAL=$(cd "$_ROOT/.claude/skills/gstack" && pwd -P)
  _RESOLVED_PRIMARY=$(cd "$INSTALL_DIR" && pwd -P)
  if [ "$_RESOLVED_LOCAL" != "$_RESOLVED_PRIMARY" ]; then
    LOCAL_GSTACK="$_ROOT/.claude/skills/gstack"
  fi
fi
echo "LOCAL_GSTACK=$LOCAL_GSTACK"
如果
LOCAL_GSTACK
不为空,从刚升级完成的主安装目录复制文件来更新它(与README中的本地依赖安装方法相同):
bash
mv "$LOCAL_GSTACK" "$LOCAL_GSTACK.bak"
cp -Rf "$INSTALL_DIR" "$LOCAL_GSTACK"
rm -rf "$LOCAL_GSTACK/.git"
cd "$LOCAL_GSTACK" && ./setup
rm -rf "$LOCAL_GSTACK.bak"
告知用户:“同时更新了位于
$LOCAL_GSTACK
的本地依赖副本 — 准备就绪后提交
.claude/skills/gstack/
目录。”

Step 5: Write marker + clear cache

步骤5:写入标记并清除缓存

bash
mkdir -p ~/.gstack
echo "$OLD_VERSION" > ~/.gstack/just-upgraded-from
rm -f ~/.gstack/last-update-check
rm -f ~/.gstack/update-snoozed
bash
mkdir -p ~/.gstack
echo "$OLD_VERSION" > ~/.gstack/just-upgraded-from
rm -f ~/.gstack/last-update-check
rm -f ~/.gstack/update-snoozed

Step 6: Show What's New

步骤6:展示新功能

Read
$INSTALL_DIR/CHANGELOG.md
. Find all version entries between the old version and the new version. Summarize as 5-7 bullets grouped by theme. Don't overwhelm — focus on user-facing changes. Skip internal refactors unless they're significant.
Format:
gstack v{new} — upgraded from v{old}!

What's new:
- [bullet 1]
- [bullet 2]
- ...

Happy shipping!
读取
$INSTALL_DIR/CHANGELOG.md
。查找旧版本与新版本之间的所有版本条目。按主题分组总结为5-7条要点。避免信息过载 — 聚焦用户可见的变更。除非影响重大,否则跳过内部重构内容。
格式:
gstack v{新版本} — 从v{旧版本}升级完成!

新功能:
- [要点1]
- [要点2]
- ...

祝您使用愉快!

Step 7: Continue

步骤7:继续操作

After showing What's New, continue with whatever skill the user originally invoked. The upgrade is done — no further action needed.

展示新功能后,继续执行用户最初调用的技能。升级完成 — 无需进一步操作。

Standalone usage

独立使用方式

When invoked directly as
/gstack-upgrade
(not from a preamble):
  1. Force a fresh update check (bypass cache):
bash
~/.claude/skills/gstack/bin/gstack-update-check --force
Use the output to determine if an upgrade is available.
  1. If
    UPGRADE_AVAILABLE <old> <new>
    : follow Steps 2-6 above.
  2. If no output (up to date): tell the user "You're already on the latest version (v{version})."
当直接调用
/gstack-upgrade
(而非通过前置检测)时:
  1. 强制执行全新更新检查(绕过缓存):
bash
~/.claude/skills/gstack/bin/gstack-update-check --force
根据输出判断是否有可用升级。
  1. 如果输出为
    UPGRADE_AVAILABLE <旧版本> <新版本>
    :遵循上述步骤2至步骤6。
  2. 如果无输出(已为最新版本):告知用户“您当前已使用最新版本(v{版本号})。”