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_AVAILABLEStep 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 or : Skip AskUserQuestion. Log "Auto-upgrading gstack v{old} → v{new}..." and proceed directly to Step 2. If fails during auto-upgrade, restore from backup ( directory) and warn the user: "Auto-upgrade failed — restored previous version. Run manually to retry."
AUTO_UPGRADE=trueAUTO_UPGRADE=1./setup.bak/gstack-upgradeOtherwise, 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 trueTell 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: is the remote version from the output — substitute it from the update check result.
{new}UPGRADE_AVAILABLETell user the snooze duration: "Next reminder in 24h" (or 48h or 1 week, depending on level). Tip: "Set in for automatic upgrades."
auto_upgrade: true~/.gstack/config.yamlIf "Never ask again":
bash
~/.claude/skills/gstack/bin/gstack-config set update_check falseTell user: "Update checks disabled. Run to re-enable."
Continue with the current skill.
~/.claude/skills/gstack/bin/gstack-config set update_check true首先,检查是否启用了自动升级:
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"如果或: 跳过询问用户步骤。记录日志“自动升级gstack v{旧版本} → v{新版本}...”并直接进入步骤2。如果自动升级过程中执行失败,从备份目录()恢复并提醒用户:“自动升级失败 — 已恢复至之前版本。请手动运行重试。”
AUTO_UPGRADE=trueAUTO_UPGRADE=1./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.yamlauto_upgrade: true如果选择“不再询问”:
bash
~/.claude/skills/gstack/bin/gstack-config set update_check false告知用户:“已禁用更新检查。运行可重新启用。”
继续当前技能操作。
~/.claude/skills/gstack/bin/gstack-config set update_check trueStep 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
./setupIf contains "Saved working directory", warn the user: "Note: local changes were stashed. Run in the skill directory to restore them."
$STASH_OUTPUTgit stash popFor 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如果包含“Saved working directory”,提醒用户:“注意:本地修改已被暂存。在技能目录中运行可恢复这些修改。”
$STASH_OUTPUTgit 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 is non-empty, update it by copying from the freshly-upgraded primary install (same approach as README vendored install):
LOCAL_GSTACKbash
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 — commit when you're ready."
$LOCAL_GSTACK.claude/skills/gstack/使用步骤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"如果不为空,从刚升级完成的主安装目录复制文件来更新它(与README中的本地依赖安装方法相同):
LOCAL_GSTACKbash
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-snoozedbash
mkdir -p ~/.gstack
echo "$OLD_VERSION" > ~/.gstack/just-upgraded-from
rm -f ~/.gstack/last-update-check
rm -f ~/.gstack/update-snoozedStep 6: Show What's New
步骤6:展示新功能
Read . 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.
$INSTALL_DIR/CHANGELOG.mdFormat:
gstack v{new} — upgraded from v{old}!
What's new:
- [bullet 1]
- [bullet 2]
- ...
Happy shipping!读取。查找旧版本与新版本之间的所有版本条目。按主题分组总结为5-7条要点。避免信息过载 — 聚焦用户可见的变更。除非影响重大,否则跳过内部重构内容。
$INSTALL_DIR/CHANGELOG.md格式:
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 (not from a preamble):
/gstack-upgrade- Force a fresh update check (bypass cache):
bash
~/.claude/skills/gstack/bin/gstack-update-check --forceUse the output to determine if an upgrade is available.
- If : follow Steps 2-6 above.
UPGRADE_AVAILABLE <old> <new> - If no output (up to date): tell the user "You're already on the latest version (v{version})."
当直接调用(而非通过前置检测)时:
/gstack-upgrade- 强制执行全新更新检查(绕过缓存):
bash
~/.claude/skills/gstack/bin/gstack-update-check --force根据输出判断是否有可用升级。
- 如果输出为:遵循上述步骤2至步骤6。
UPGRADE_AVAILABLE <旧版本> <新版本> - 如果无输出(已为最新版本):告知用户“您当前已使用最新版本(v{版本号})。”