[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M70FJPQR9G2SZAEJG5JM4JCS":3,"skill-same:01M70FJPQR9G2SZAEJG5JM4JCS":61},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":31,"linkOnly":32,"markdownContent":33,"markdownBody":34,"frontMatter":35,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":41,"repositoryHtmlUrl":42,"repositoryHomepageUrl":43,"ownerHtmlUrl":44,"ownerBlogUrl":45,"ownerDescription":46,"updatedAt":47,"install":48,"resources":60},"01M70FJPQR9G2SZAEJG5JM4JCS","gstack-upgrade",null,"Upgrade gstack to the latest version. Detects global vs vendored install,\nruns the upgrade, and shows what's new. Use when asked to \"upgrade gstack\",\n\"update gstack\", or \"get latest version\".","shengdabai\u002FTony-Claude-Code-Skills","shengdabai","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F116417419?v=4","01M70F6D2WY5PQV5A92BKYJQEW","Tony Sheng","01M70F6D3GAAAYZ5H4CC1G8VXM",3,"MIT","https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002F.factory\u002Fskills\u002Fgstack-upgrade\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30],"upgrade","gstack upgrade","gstack","get","true","use","when","version","update","latest","install","global","2026-11-10 10:12:30",false,"---\nname: gstack-upgrade\ndescription: |\n  Upgrade gstack to the latest version. Detects global vs vendored install,\n  runs the upgrade, and shows what's new. Use when asked to \"upgrade gstack\",\n  \"update gstack\", or \"get latest version\".\nuser-invocable: true\n---\n\u003C!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->\n\u003C!-- Regenerate: bun run gen:skill-docs -->\n\n# \u002Fgstack-upgrade\n\nUpgrade gstack to the latest version and show what's new.\n\n## Inline upgrade flow\n\nThis section is referenced by all skill preambles when they detect `UPGRADE_AVAILABLE`.\n\n### Step 1: Ask the user (or auto-upgrade)\n\nFirst, check if auto-upgrade is enabled:\n```bash\n_AUTO=\"\"\n[ \"${GSTACK_AUTO_UPGRADE:-}\" = \"1\" ] && _AUTO=\"true\"\n[ -z \"$_AUTO\" ] && _AUTO=$($GSTACK_ROOT\u002Fbin\u002Fgstack-config get auto_upgrade 2>\u002Fdev\u002Fnull || true)\necho \"AUTO_UPGRADE=$_AUTO\"\n```\n\n**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 `.\u002Fsetup` fails during auto-upgrade, restore from backup (`.bak` directory) and warn the user: \"Auto-upgrade failed — restored previous version. Run `\u002Fgstack-upgrade` manually to retry.\"\n\n**Otherwise**, use AskUserQuestion:\n- Question: \"gstack **v{new}** is available (you're on v{old}). Upgrade now?\"\n- Options: [\"Yes, upgrade now\", \"Always keep me up to date\", \"Not now\", \"Never ask again\"]\n\n**If \"Yes, upgrade now\":** Proceed to Step 2.\n\n**If \"Always keep me up to date\":**\n```bash\n$GSTACK_ROOT\u002Fbin\u002Fgstack-config set auto_upgrade true\n```\nTell user: \"Auto-upgrade enabled. Future updates will install automatically.\" Then proceed to Step 2.\n\n**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.\n```bash\n_SNOOZE_FILE=~\u002F.gstack\u002Fupdate-snoozed\n_REMOTE_VER=\"{new}\"\n_CUR_LEVEL=0\nif [ -f \"$_SNOOZE_FILE\" ]; then\n  _SNOOZED_VER=$(awk '{print $1}' \"$_SNOOZE_FILE\")\n  if [ \"$_SNOOZED_VER\" = \"$_REMOTE_VER\" ]; then\n    _CUR_LEVEL=$(awk '{print $2}' \"$_SNOOZE_FILE\")\n    case \"$_CUR_LEVEL\" in *[!0-9]*) _CUR_LEVEL=0 ;; esac\n  fi\nfi\n_NEW_LEVEL=$((_CUR_LEVEL + 1))\n[ \"$_NEW_LEVEL\" -gt 3 ] && _NEW_LEVEL=3\necho \"$_REMOTE_VER $_NEW_LEVEL $(date +%s)\" > \"$_SNOOZE_FILE\"\n```\nNote: `{new}` is the remote version from the `UPGRADE_AVAILABLE` output — substitute it from the update check result.\n\nTell user the snooze duration: \"Next reminder in 24h\" (or 48h or 1 week, depending on level). Tip: \"Set `auto_upgrade: true` in `~\u002F.gstack\u002Fconfig.yaml` for automatic upgrades.\"\n\n**If \"Never ask again\":**\n```bash\n$GSTACK_ROOT\u002Fbin\u002Fgstack-config set update_check false\n```\nTell user: \"Update checks disabled. Run `$GSTACK_ROOT\u002Fbin\u002Fgstack-config set update_check true` to re-enable.\"\nContinue with the current skill.\n\n### Step 2: Detect install type\n\n```bash\nif [ -d \"$HOME\u002F.factory\u002Fskills\u002Fgstack\u002F.git\" ]; then\n  INSTALL_TYPE=\"global-git\"\n  INSTALL_DIR=\"$HOME\u002F.factory\u002Fskills\u002Fgstack\"\nelif [ -d \"$HOME\u002F.gstack\u002Frepos\u002Fgstack\u002F.git\" ]; then\n  INSTALL_TYPE=\"global-git\"\n  INSTALL_DIR=\"$HOME\u002F.gstack\u002Frepos\u002Fgstack\"\nelif [ -d \".factory\u002Fskills\u002Fgstack\u002F.git\" ]; then\n  INSTALL_TYPE=\"local-git\"\n  INSTALL_DIR=\".factory\u002Fskills\u002Fgstack\"\nelif [ -d \".agents\u002Fskills\u002Fgstack\u002F.git\" ]; then\n  INSTALL_TYPE=\"local-git\"\n  INSTALL_DIR=\".agents\u002Fskills\u002Fgstack\"\nelif [ -d \".factory\u002Fskills\u002Fgstack\" ]; then\n  INSTALL_TYPE=\"vendored\"\n  INSTALL_DIR=\".factory\u002Fskills\u002Fgstack\"\nelif [ -d \"$HOME\u002F.factory\u002Fskills\u002Fgstack\" ]; then\n  INSTALL_TYPE=\"vendored-global\"\n  INSTALL_DIR=\"$HOME\u002F.factory\u002Fskills\u002Fgstack\"\nelse\n  echo \"ERROR: gstack not found\"\n  exit 1\nfi\necho \"Install type: $INSTALL_TYPE at $INSTALL_DIR\"\n```\n\nThe install type and directory path printed above will be used in all subsequent steps.\n\n### Step 3: Save old version\n\nUse the install directory from Step 2's output below:\n\n```bash\nOLD_VERSION=$(cat \"$INSTALL_DIR\u002FVERSION\" 2>\u002Fdev\u002Fnull || echo \"unknown\")\n```\n\n### Step 4: Upgrade\n\nUse the install type and directory detected in Step 2:\n\n**For git installs** (global-git, local-git):\n```bash\ncd \"$INSTALL_DIR\"\nSTASH_OUTPUT=$(git stash 2>&1)\ngit fetch origin\ngit reset --hard origin\u002Fmain\n.\u002Fsetup\n```\nIf `$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.\"\n\n**For vendored installs** (vendored, vendored-global):\n```bash\nPARENT=$(dirname \"$INSTALL_DIR\")\nTMP_DIR=$(mktemp -d)\ngit clone --depth 1 https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgstack.git \"$TMP_DIR\u002Fgstack\"\nmv \"$INSTALL_DIR\" \"$INSTALL_DIR.bak\"\nmv \"$TMP_DIR\u002Fgstack\" \"$INSTALL_DIR\"\ncd \"$INSTALL_DIR\" && .\u002Fsetup\nrm -rf \"$INSTALL_DIR.bak\" \"$TMP_DIR\"\n```\n\n### Step 4.5: Sync local vendored copy\n\nUse the install directory from Step 2. Check if there's also a local vendored copy that needs updating:\n\n```bash\n_ROOT=$(git rev-parse --show-toplevel 2>\u002Fdev\u002Fnull)\nLOCAL_GSTACK=\"\"\nif [ -n \"$_ROOT\" ] && [ -d \"$_ROOT\u002F.factory\u002Fskills\u002Fgstack\" ]; then\n  _RESOLVED_LOCAL=$(cd \"$_ROOT\u002F.factory\u002Fskills\u002Fgstack\" && pwd -P)\n  _RESOLVED_PRIMARY=$(cd \"$INSTALL_DIR\" && pwd -P)\n  if [ \"$_RESOLVED_LOCAL\" != \"$_RESOLVED_PRIMARY\" ]; then\n    LOCAL_GSTACK=\"$_ROOT\u002F.factory\u002Fskills\u002Fgstack\"\n  fi\nfi\necho \"LOCAL_GSTACK=$LOCAL_GSTACK\"\n```\n\nIf `LOCAL_GSTACK` is non-empty, update it by copying from the freshly-upgraded primary install (same approach as README vendored install):\n```bash\nmv \"$LOCAL_GSTACK\" \"$LOCAL_GSTACK.bak\"\ncp -Rf \"$INSTALL_DIR\" \"$LOCAL_GSTACK\"\nrm -rf \"$LOCAL_GSTACK\u002F.git\"\ncd \"$LOCAL_GSTACK\" && .\u002Fsetup\nrm -rf \"$LOCAL_GSTACK.bak\"\n```\nTell user: \"Also updated vendored copy at `$LOCAL_GSTACK` — commit `.factory\u002Fskills\u002Fgstack\u002F` when you're ready.\"\n\nIf `.\u002Fsetup` fails, restore from backup and warn the user:\n```bash\nrm -rf \"$LOCAL_GSTACK\"\nmv \"$LOCAL_GSTACK.bak\" \"$LOCAL_GSTACK\"\n```\nTell user: \"Sync failed — restored previous version at `$LOCAL_GSTACK`. Run `\u002Fgstack-upgrade` manually to retry.\"\n\n### Step 5: Write marker + clear cache\n\n```bash\nmkdir -p ~\u002F.gstack\necho \"$OLD_VERSION\" > ~\u002F.gstack\u002Fjust-upgraded-from\nrm -f ~\u002F.gstack\u002Flast-update-check\nrm -f ~\u002F.gstack\u002Fupdate-snoozed\n```\n\n### Step 6: Show What's New\n\nRead `$INSTALL_DIR\u002FCHANGELOG.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.\n\nFormat:\n```\ngstack v{new} — upgraded from v{old}!\n\nWhat's new:\n- [bullet 1]\n- [bullet 2]\n- ...\n\nHappy shipping!\n```\n\n### Step 7: Continue\n\nAfter showing What's New, continue with whatever skill the user originally invoked. The upgrade is done — no further action needed.\n\n---\n\n## Standalone usage\n\nWhen invoked directly as `\u002Fgstack-upgrade` (not from a preamble):\n\n1. Force a fresh update check (bypass cache):\n```bash\n$GSTACK_ROOT\u002Fbin\u002Fgstack-update-check --force 2>\u002Fdev\u002Fnull || \\\n.factory\u002Fskills\u002Fgstack\u002Fbin\u002Fgstack-update-check --force 2>\u002Fdev\u002Fnull || true\n```\nUse the output to determine if an upgrade is available.\n\n2. If `UPGRADE_AVAILABLE \u003Cold> \u003Cnew>`: follow Steps 2-6 above.\n\n3. If no output (primary is up to date): check for a stale local vendored copy.\n\nRun the Step 2 bash block above to detect the primary install type and directory (`INSTALL_TYPE` and `INSTALL_DIR`). Then run the Step 4.5 detection bash block above to check for a local vendored copy (`LOCAL_GSTACK`).\n\n**If `LOCAL_GSTACK` is empty** (no local vendored copy): tell the user \"You're already on the latest version (v{version}).\"\n\n**If `LOCAL_GSTACK` is non-empty**, compare versions:\n```bash\nPRIMARY_VER=$(cat \"$INSTALL_DIR\u002FVERSION\" 2>\u002Fdev\u002Fnull || echo \"unknown\")\nLOCAL_VER=$(cat \"$LOCAL_GSTACK\u002FVERSION\" 2>\u002Fdev\u002Fnull || echo \"unknown\")\necho \"PRIMARY=$PRIMARY_VER LOCAL=$LOCAL_VER\"\n```\n\n**If versions differ:** follow the Step 4.5 sync bash block above to update the local copy from the primary. Tell user: \"Global v{PRIMARY_VER} is up to date. Updated local vendored copy from v{LOCAL_VER} → v{PRIMARY_VER}. Commit `.factory\u002Fskills\u002Fgstack\u002F` when you're ready.\"\n\n**If versions match:** tell the user \"You're on the latest version (v{PRIMARY_VER}). Global and local vendored copy are both up to date.\"\n","\u003C!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->\n\u003C!-- Regenerate: bun run gen:skill-docs -->\n\n# \u002Fgstack-upgrade\n\nUpgrade gstack to the latest version and show what's new.\n\n## Inline upgrade flow\n\nThis section is referenced by all skill preambles when they detect `UPGRADE_AVAILABLE`.\n\n### Step 1: Ask the user (or auto-upgrade)\n\nFirst, check if auto-upgrade is enabled:\n```bash\n_AUTO=\"\"\n[ \"${GSTACK_AUTO_UPGRADE:-}\" = \"1\" ] && _AUTO=\"true\"\n[ -z \"$_AUTO\" ] && _AUTO=$($GSTACK_ROOT\u002Fbin\u002Fgstack-config get auto_upgrade 2>\u002Fdev\u002Fnull || true)\necho \"AUTO_UPGRADE=$_AUTO\"\n```\n\n**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 `.\u002Fsetup` fails during auto-upgrade, restore from backup (`.bak` directory) and warn the user: \"Auto-upgrade failed — restored previous version. Run `\u002Fgstack-upgrade` manually to retry.\"\n\n**Otherwise**, use AskUserQuestion:\n- Question: \"gstack **v{new}** is available (you're on v{old}). Upgrade now?\"\n- Options: [\"Yes, upgrade now\", \"Always keep me up to date\", \"Not now\", \"Never ask again\"]\n\n**If \"Yes, upgrade now\":** Proceed to Step 2.\n\n**If \"Always keep me up to date\":**\n```bash\n$GSTACK_ROOT\u002Fbin\u002Fgstack-config set auto_upgrade true\n```\nTell user: \"Auto-upgrade enabled. Future updates will install automatically.\" Then proceed to Step 2.\n\n**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.\n```bash\n_SNOOZE_FILE=~\u002F.gstack\u002Fupdate-snoozed\n_REMOTE_VER=\"{new}\"\n_CUR_LEVEL=0\nif [ -f \"$_SNOOZE_FILE\" ]; then\n  _SNOOZED_VER=$(awk '{print $1}' \"$_SNOOZE_FILE\")\n  if [ \"$_SNOOZED_VER\" = \"$_REMOTE_VER\" ]; then\n    _CUR_LEVEL=$(awk '{print $2}' \"$_SNOOZE_FILE\")\n    case \"$_CUR_LEVEL\" in *[!0-9]*) _CUR_LEVEL=0 ;; esac\n  fi\nfi\n_NEW_LEVEL=$((_CUR_LEVEL + 1))\n[ \"$_NEW_LEVEL\" -gt 3 ] && _NEW_LEVEL=3\necho \"$_REMOTE_VER $_NEW_LEVEL $(date +%s)\" > \"$_SNOOZE_FILE\"\n```\nNote: `{new}` is the remote version from the `UPGRADE_AVAILABLE` output — substitute it from the update check result.\n\nTell user the snooze duration: \"Next reminder in 24h\" (or 48h or 1 week, depending on level). Tip: \"Set `auto_upgrade: true` in `~\u002F.gstack\u002Fconfig.yaml` for automatic upgrades.\"\n\n**If \"Never ask again\":**\n```bash\n$GSTACK_ROOT\u002Fbin\u002Fgstack-config set update_check false\n```\nTell user: \"Update checks disabled. Run `$GSTACK_ROOT\u002Fbin\u002Fgstack-config set update_check true` to re-enable.\"\nContinue with the current skill.\n\n### Step 2: Detect install type\n\n```bash\nif [ -d \"$HOME\u002F.factory\u002Fskills\u002Fgstack\u002F.git\" ]; then\n  INSTALL_TYPE=\"global-git\"\n  INSTALL_DIR=\"$HOME\u002F.factory\u002Fskills\u002Fgstack\"\nelif [ -d \"$HOME\u002F.gstack\u002Frepos\u002Fgstack\u002F.git\" ]; then\n  INSTALL_TYPE=\"global-git\"\n  INSTALL_DIR=\"$HOME\u002F.gstack\u002Frepos\u002Fgstack\"\nelif [ -d \".factory\u002Fskills\u002Fgstack\u002F.git\" ]; then\n  INSTALL_TYPE=\"local-git\"\n  INSTALL_DIR=\".factory\u002Fskills\u002Fgstack\"\nelif [ -d \".agents\u002Fskills\u002Fgstack\u002F.git\" ]; then\n  INSTALL_TYPE=\"local-git\"\n  INSTALL_DIR=\".agents\u002Fskills\u002Fgstack\"\nelif [ -d \".factory\u002Fskills\u002Fgstack\" ]; then\n  INSTALL_TYPE=\"vendored\"\n  INSTALL_DIR=\".factory\u002Fskills\u002Fgstack\"\nelif [ -d \"$HOME\u002F.factory\u002Fskills\u002Fgstack\" ]; then\n  INSTALL_TYPE=\"vendored-global\"\n  INSTALL_DIR=\"$HOME\u002F.factory\u002Fskills\u002Fgstack\"\nelse\n  echo \"ERROR: gstack not found\"\n  exit 1\nfi\necho \"Install type: $INSTALL_TYPE at $INSTALL_DIR\"\n```\n\nThe install type and directory path printed above will be used in all subsequent steps.\n\n### Step 3: Save old version\n\nUse the install directory from Step 2's output below:\n\n```bash\nOLD_VERSION=$(cat \"$INSTALL_DIR\u002FVERSION\" 2>\u002Fdev\u002Fnull || echo \"unknown\")\n```\n\n### Step 4: Upgrade\n\nUse the install type and directory detected in Step 2:\n\n**For git installs** (global-git, local-git):\n```bash\ncd \"$INSTALL_DIR\"\nSTASH_OUTPUT=$(git stash 2>&1)\ngit fetch origin\ngit reset --hard origin\u002Fmain\n.\u002Fsetup\n```\nIf `$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.\"\n\n**For vendored installs** (vendored, vendored-global):\n```bash\nPARENT=$(dirname \"$INSTALL_DIR\")\nTMP_DIR=$(mktemp -d)\ngit clone --depth 1 https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgstack.git \"$TMP_DIR\u002Fgstack\"\nmv \"$INSTALL_DIR\" \"$INSTALL_DIR.bak\"\nmv \"$TMP_DIR\u002Fgstack\" \"$INSTALL_DIR\"\ncd \"$INSTALL_DIR\" && .\u002Fsetup\nrm -rf \"$INSTALL_DIR.bak\" \"$TMP_DIR\"\n```\n\n### Step 4.5: Sync local vendored copy\n\nUse the install directory from Step 2. Check if there's also a local vendored copy that needs updating:\n\n```bash\n_ROOT=$(git rev-parse --show-toplevel 2>\u002Fdev\u002Fnull)\nLOCAL_GSTACK=\"\"\nif [ -n \"$_ROOT\" ] && [ -d \"$_ROOT\u002F.factory\u002Fskills\u002Fgstack\" ]; then\n  _RESOLVED_LOCAL=$(cd \"$_ROOT\u002F.factory\u002Fskills\u002Fgstack\" && pwd -P)\n  _RESOLVED_PRIMARY=$(cd \"$INSTALL_DIR\" && pwd -P)\n  if [ \"$_RESOLVED_LOCAL\" != \"$_RESOLVED_PRIMARY\" ]; then\n    LOCAL_GSTACK=\"$_ROOT\u002F.factory\u002Fskills\u002Fgstack\"\n  fi\nfi\necho \"LOCAL_GSTACK=$LOCAL_GSTACK\"\n```\n\nIf `LOCAL_GSTACK` is non-empty, update it by copying from the freshly-upgraded primary install (same approach as README vendored install):\n```bash\nmv \"$LOCAL_GSTACK\" \"$LOCAL_GSTACK.bak\"\ncp -Rf \"$INSTALL_DIR\" \"$LOCAL_GSTACK\"\nrm -rf \"$LOCAL_GSTACK\u002F.git\"\ncd \"$LOCAL_GSTACK\" && .\u002Fsetup\nrm -rf \"$LOCAL_GSTACK.bak\"\n```\nTell user: \"Also updated vendored copy at `$LOCAL_GSTACK` — commit `.factory\u002Fskills\u002Fgstack\u002F` when you're ready.\"\n\nIf `.\u002Fsetup` fails, restore from backup and warn the user:\n```bash\nrm -rf \"$LOCAL_GSTACK\"\nmv \"$LOCAL_GSTACK.bak\" \"$LOCAL_GSTACK\"\n```\nTell user: \"Sync failed — restored previous version at `$LOCAL_GSTACK`. Run `\u002Fgstack-upgrade` manually to retry.\"\n\n### Step 5: Write marker + clear cache\n\n```bash\nmkdir -p ~\u002F.gstack\necho \"$OLD_VERSION\" > ~\u002F.gstack\u002Fjust-upgraded-from\nrm -f ~\u002F.gstack\u002Flast-update-check\nrm -f ~\u002F.gstack\u002Fupdate-snoozed\n```\n\n### Step 6: Show What's New\n\nRead `$INSTALL_DIR\u002FCHANGELOG.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.\n\nFormat:\n```\ngstack v{new} — upgraded from v{old}!\n\nWhat's new:\n- [bullet 1]\n- [bullet 2]\n- ...\n\nHappy shipping!\n```\n\n### Step 7: Continue\n\nAfter showing What's New, continue with whatever skill the user originally invoked. The upgrade is done — no further action needed.\n\n---\n\n## Standalone usage\n\nWhen invoked directly as `\u002Fgstack-upgrade` (not from a preamble):\n\n1. Force a fresh update check (bypass cache):\n```bash\n$GSTACK_ROOT\u002Fbin\u002Fgstack-update-check --force 2>\u002Fdev\u002Fnull || \\\n.factory\u002Fskills\u002Fgstack\u002Fbin\u002Fgstack-update-check --force 2>\u002Fdev\u002Fnull || true\n```\nUse the output to determine if an upgrade is available.\n\n2. If `UPGRADE_AVAILABLE \u003Cold> \u003Cnew>`: follow Steps 2-6 above.\n\n3. If no output (primary is up to date): check for a stale local vendored copy.\n\nRun the Step 2 bash block above to detect the primary install type and directory (`INSTALL_TYPE` and `INSTALL_DIR`). Then run the Step 4.5 detection bash block above to check for a local vendored copy (`LOCAL_GSTACK`).\n\n**If `LOCAL_GSTACK` is empty** (no local vendored copy): tell the user \"You're already on the latest version (v{version}).\"\n\n**If `LOCAL_GSTACK` is non-empty**, compare versions:\n```bash\nPRIMARY_VER=$(cat \"$INSTALL_DIR\u002FVERSION\" 2>\u002Fdev\u002Fnull || echo \"unknown\")\nLOCAL_VER=$(cat \"$LOCAL_GSTACK\u002FVERSION\" 2>\u002Fdev\u002Fnull || echo \"unknown\")\necho \"PRIMARY=$PRIMARY_VER LOCAL=$LOCAL_VER\"\n```\n\n**If versions differ:** follow the Step 4.5 sync bash block above to update the local copy from the primary. Tell user: \"Global v{PRIMARY_VER} is up to date. Updated local vendored copy from v{LOCAL_VER} → v{PRIMARY_VER}. Commit `.factory\u002Fskills\u002Fgstack\u002F` when you're ready.\"\n\n**If versions match:** tell the user \"You're on the latest version (v{PRIMARY_VER}). Global and local vendored copy are both up to date.\"\n",{"name":5,"description":36,"user-invocable":37},"Upgrade gstack to the latest version. Detects global vs vendored install,\nruns the upgrade, and shows what's new. Use when asked to \"upgrade gstack\",\n\"update gstack\", or \"get latest version\".\n",true,"main","7850740bd837adb32f0a109ab2af82482196c6f2","skills\u002F.factory\u002Fskills\u002Fgstack-upgrade",1,"https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills","https:\u002F\u002Fzturnsgo.com","https:\u002F\u002Fgithub.com\u002Fshengdabai","https:\u002F\u002Fzturnsgo.com\u002F","AI × education creator — producer, not consumer. Taught 6,000+ learners; shipping learning tools & daily essays with Claude Code, practicing @xiaolai's way 🥋","2026-11-01 21:28:23",{"source":8,"skillName":5,"commands":49,"prompt":59,"zipAvailable":37},[50,53,56],{"tool":51,"command":52},"npx","npx skills add shengdabai\u002FTony-Claude-Code-Skills --skill gstack-upgrade",{"tool":54,"command":55},"bunx","bunx skills add shengdabai\u002FTony-Claude-Code-Skills --skill gstack-upgrade",{"tool":57,"command":58},"pnpm","pnpm dlx skills add shengdabai\u002FTony-Claude-Code-Skills --skill gstack-upgrade","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002F.factory\u002Fskills\u002Fgstack-upgrade\u002FSKILL.md",[],[62,81,114,139,160,180],{"skillNo":63,"name":64,"nameZh":6,"description":65,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":73,"publishedAt":31},"01M70P17DAD4C1C47NPH6A96EM","xiaolai-methodology","以李笑来(Li Xiaolai)的思考方式、方法论与表达风格,为用户做全方位 1-on-1 教练指导,覆盖创业、赚钱、投资、学习、自学、读书写作、用 AI、以及人生心态与自我管理。当用户提到 \"李笑来\"、\"笑来\"、\"笑来老师\"、\"扮演李笑来\"、\"找笑来聊聊\"、\"笑来怎么看\"、\"xiaolai\"、\"把时间当作朋友\"、\"通往财富自由之路\"、\"定投改变命运\"、\"韭菜的自我修养\"、\"自学是门手艺\"、\"让时间陪你慢慢变富\"、\"七年就是一辈子\"、\"元认知\"、\"活在未来\"、\"复利\u002F长期主义\"、\"践行\"、\"痴迷改进\"、\"个人商业模式\u002F出售时间\"、\"睡后收入\"、\"定投\"、\"财富自由\"、\"操作系统升级\"、\"最少必要知识\"、\"北极星提示词\"、\"用 AI 该怎么学\u002F思考\" 等任一触发词,或当用户带着关于创业\u002F赚钱\u002F投资\u002F学习\u002F职业\u002F重大人生决策的困惑、希望被人用笑来式的「逻辑 + 大白话 + 类比 + 重新定义 + 践行导向」来点醒和指导时,自动进入李笑来教练模式。","https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fxiaolai-methodology\u002FSKILL.md",[68],{"categoryNo":69,"categoryName":70,"taxonomyType":71,"taxonomyTypeDesc":72},"01JBSEEDCAT000000000000018","写作与文案","SCENARIO","使用场景",[74,75,76,77,78,79,80],"methodology","xiaolai","xiaolai methodology","朋友","投资","writing","收入",{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":95,"publishedAt":31},"01M70P13NB9YP7ACJR1S861CDS","zread","Produce and consume a wiki-style knowledge base for a code repository via the `zread` CLI and its on-disk output under `.\u002F.zread\u002Fwiki\u002F`. Use this skill whenever the user wants to understand, onboard onto, explore, summarize, map, or get an overview of an unfamiliar codebase; asks for architecture docs, a project wiki, a repo walkthrough, module\u002Fpackage explanations, or \"what does this repo do\"; wants to generate, regenerate, resume, browse, or serve code documentation locally; or mentions zread \u002F zread.ai directly. Also use it proactively before diving into a large unknown repo — if `.\u002F.zread\u002Fwiki\u002Fcurrent` exists, read the generated pages instead of crawling source file-by-file; if it doesn't, consider offering to run `zread generate`. The trigger is the intent (understand a codebase through generated docs), not the literal word \"zread\".","https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fzread\u002FSKILL.md",[87,90],{"categoryNo":88,"categoryName":89,"taxonomyType":71,"taxonomyTypeDesc":72},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":91,"categoryName":92,"taxonomyType":93,"taxonomyTypeDesc":94},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[83,96,97,98,99,100,22,101,102,103,104,105,106,107,108,109,110,111,112,113],"knowledge","wiki","explore","walkthrough","project","knowledge base","run","generate","intent","cli","map","documentation","project wiki","disk","architecture","code","unknown","generated",{"skillNo":115,"name":116,"nameZh":6,"description":117,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":124,"publishedAt":31},"01M70P10S4SWMZQ8BJAFBFDRW3","youtube","Launch the YouTube Creator Agent to auto-generate videos.\nUse when: user types \u002Fyoutube, wants to create YouTube videos,\ngenerate video content, or upload to YouTube.\nKeywords: youtube, video, 视频, 创作视频, 发布视频","https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fyoutube\u002FSKILL.md",[120,121],{"categoryNo":88,"categoryName":89,"taxonomyType":71,"taxonomyTypeDesc":72},{"categoryNo":122,"categoryName":123,"taxonomyType":93,"taxonomyTypeDesc":94},"01JBSEEDCAT000000000000036","内容创作者",[116,125,126,127,128,129,130,131,103,132,133,134,25,24,135,136,137,138],"user","content","视频","creator","generate video","videos","launch","video content","create","upload","auto","types","Video","创作",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":146,"publishedAt":31},"01M70P0YE95D8BACZCGV8BK90K","youtube-script-sync","Sync, update, or optimize Tony's GetNote knowledge base `Youtube视频逐字稿` by turning each parent recording or first-person idea note into an idempotent child note containing a directly recordable YouTube long-video or Shorts script. Use when the user says “更新\u002F同步\u002F优化 Youtube视频逐字稿知识库”, or says “更新\u002F同步\u002F优化该知识库” while this knowledge base is the active context.","https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fyoutube-script-sync\u002FSKILL.md",[145],{"categoryNo":88,"categoryName":89,"taxonomyType":71,"taxonomyTypeDesc":72},[147,148,116,149,150,137,151,152,153,154,27,155,156,157,101,158,25,24,96,159],"sync","script","youtube script sync","recording","shorts","first","base","person","active","child","optimize","idempotent","long",{"skillNo":161,"name":162,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":164,"categories":165,"keywords":170,"publishedAt":31},"01M70P0WMV5XT0EEC0N445PW07","writing-skills","How to write SKILL.md files that trigger reliably and teach effectively. Use when creating, improving, or reviewing Claude Code skills.","https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fxiaolai\u002Fnlpm\u002Fskills\u002Fnlpm\u002Fwriting-skills\u002FSKILL.md",[166,167,168,169],{"categoryNo":69,"categoryName":70,"taxonomyType":71,"taxonomyTypeDesc":72},{"categoryNo":88,"categoryName":89,"taxonomyType":71,"taxonomyTypeDesc":72},{"categoryNo":91,"categoryName":92,"taxonomyType":93,"taxonomyTypeDesc":94},{"categoryNo":122,"categoryName":123,"taxonomyType":93,"taxonomyTypeDesc":94},[171,79,172,173,174,175,111,25,24,176,177,178,179],"writing skills","how","teach","write skill","write","claude code skills","files","how to","trigger",{"skillNo":181,"name":182,"nameZh":6,"description":183,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":184,"categories":185,"keywords":188,"publishedAt":31},"01M70P0SJFR4YVJQBGMHKGSKXT","writing-rules","How to write .claude\u002Frules\u002F files that Claude actually follows. Use when creating, improving, or reviewing project rules.","https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fxiaolai\u002Fnlpm\u002Fskills\u002Fnlpm\u002Fwriting-rules\u002FSKILL.md",[186,187],{"categoryNo":69,"categoryName":70,"taxonomyType":71,"taxonomyTypeDesc":72},{"categoryNo":122,"categoryName":123,"taxonomyType":93,"taxonomyTypeDesc":94},[189,79,190,100,191,177,25,172,175,24,178],"Rules","writing rules","project rules"]