[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C2MYWR671AJW71ASX11D28":3,"skill-same:01M6C2MYWR671AJW71ASX11D28":58},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":26,"linkOnly":27,"markdownContent":28,"markdownBody":29,"frontMatter":30,"refName":31,"commitSha":32,"skillDirectory":33,"forksCount":34,"repositoryHtmlUrl":35,"repositoryHomepageUrl":6,"ownerHtmlUrl":36,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":37,"install":38,"resources":51},"01M6C2MYWR671AJW71ASX11D28","gateway-upgrade",null,"Safe gateway upgrade\u002Fdowngrade with pre-flight checks, rollback, and post-verification","jleechanorg\u002Fjleechan-skills","jleechanorg","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F221404966?v=4","01M6C1VJ99XG950X1DWPEBCBGX","01M6C1VJDK5YVDNT3362RT5WSB",6,"MIT","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills_archive\u002F2026-08-27-historical-zero-use\u002Fgateway-upgrade\u002FSKILL.md",[],[18,19,20,21,22,23,24,25],"gateway","gateway upgrade","upgrade","safe","verification","rollback","post","with","2026-11-10 10:12:30",false,"---\nname: gateway-upgrade\ndescription: Safe gateway upgrade\u002Fdowngrade with pre-flight checks, rollback, and post-verification\n---\n\n# Gateway Upgrade Safety Checklist\n\n**MANDATORY before any `npm install -g openclaw@*`, `openclaw doctor --fix`, or gateway version change.**\n\n## Pre-flight (run BEFORE upgrade)\n\n```bash\n# 1. Snapshot current state\nCURRENT_VERSION=$(openclaw --version 2>\u002Fdev\u002Fnull | grep -oE '[0-9]+\\.[0-9]+\\.[0-9]+')\nCURRENT_PID=$(pgrep -f 'openclaw-gateway' | head -1)\necho \"Current: v$CURRENT_VERSION PID=$CURRENT_PID\"\n\n# 2. Check for competing plists (MUST be exactly 1)\nPLIST_COUNT=$(ls ~\u002FLibrary\u002FLaunchAgents\u002F*openclaw*gateway* 2>\u002Fdev\u002Fnull | wc -l | tr -d ' ')\necho \"Gateway plists: $PLIST_COUNT\"\nls ~\u002FLibrary\u002FLaunchAgents\u002F*openclaw*gateway* 2>\u002Fdev\u002Fnull\nif [ \"$PLIST_COUNT\" -gt 1 ]; then\n  echo \"ABORT: Multiple gateway plists detected. Remove extras before upgrading.\"\n  exit 1\nfi\n\n# 3. Backup config\ncp ~\u002F.openclaw\u002Fopenclaw.json ~\u002F.openclaw\u002Fopenclaw.json.pre-upgrade-$(date +%s)\n\n# 4. Record active plist label\nACTIVE_LABEL=$(launchctl list 2>\u002Fdev\u002Fnull | grep -E 'openclaw.*gateway' | awk '{print $3}' | head -1)\necho \"Active launchd label: $ACTIVE_LABEL\"\n\n# 5. Verify Slack is working (baseline)\nopenclaw channels status --probe 2>&1 | grep -i slack\n```\n\n## Upgrade\n\n```bash\n# Install new version\n\u002Fopt\u002Fhomebrew\u002Fbin\u002Fnpm install -g openclaw@\u003Cversion>\nopenclaw --version  # verify\n\n# CRITICAL: Check if doctor --fix is needed\n# If it prompts for --fix, do NOT run it blindly.\n# Instead, check what it wants to change:\nopenclaw doctor 2>&1 | head -40\n# Only run --fix if you understand every change it will make.\n```\n\n## Post-flight (run AFTER upgrade)\n\n```bash\n# 1. Verify still exactly 1 plist\nPLIST_COUNT=$(ls ~\u002FLibrary\u002FLaunchAgents\u002F*openclaw*gateway* 2>\u002Fdev\u002Fnull | wc -l | tr -d ' ')\nif [ \"$PLIST_COUNT\" -gt 1 ]; then\n  echo \"ALERT: doctor --fix created a second plist. Remove the old one:\"\n  ls -la ~\u002FLibrary\u002FLaunchAgents\u002F*openclaw*gateway*\n  # Keep only the one matching the active label\nfi\n\n# 2. Verify config wasn't corrupted\npython3 -c \"import json; json.load(open('$HOME\u002F.openclaw\u002Fopenclaw.json')); print('Config JSON: valid')\"\n\n# 3. Verify critical config keys survived (doctor --fix can silently drop keys)\npython3 -c \"\nimport json\nwith open('$HOME\u002F.openclaw\u002Fopenclaw.json') as f:\n    d = json.load(f)\nchecks = [\n    ('agents.defaults.heartbeat', d.get('agents',{}).get('defaults',{}).get('heartbeat')),\n    ('gateway.auth.token', d.get('gateway',{}).get('auth',{}).get('token')),\n    ('channels.slack.appToken', d.get('channels',{}).get('slack',{}).get('appToken')),\n    ('channels.slack.botToken', d.get('channels',{}).get('slack',{}).get('botToken')),\n]\nfor path, val in checks:\n    status = 'OK' if val else 'MISSING'\n    print(f'  {path}: {status}')\n\"\n\n# 4. Rebuild native modules\nbash ~\u002F.openclaw\u002Fscripts\u002Frebuild-native-modules.sh\n\n# 5. Restart gateway\nlaunchctl kickstart -k gui\u002F$(id -u)\u002F$ACTIVE_LABEL\n\n# 6. Wait and verify\nsleep 10\nopenclaw channels status --probe 2>&1 | grep -i slack\ntail -5 ~\u002F.openclaw\u002Flogs\u002Fgateway.err.log | grep -v 'plugin\\|tools.profile'\n```\n\n## Rollback\n\n```bash\n# If upgrade fails, rollback immediately:\n\u002Fopt\u002Fhomebrew\u002Fbin\u002Fnpm install -g openclaw@$CURRENT_VERSION\ncp ~\u002F.openclaw\u002Fopenclaw.json.pre-upgrade-* ~\u002F.openclaw\u002Fopenclaw.json  # restore config\npython3 -c \"\nimport json\nwith open('$HOME\u002F.openclaw\u002Fopenclaw.json') as f:\n    d = json.load(f)\nd['meta']['lastTouchedVersion'] = '$CURRENT_VERSION'\nwith open('$HOME\u002F.openclaw\u002Fopenclaw.json', 'w') as f:\n    json.dump(d, f, indent=2)\n\"\nlaunchctl kickstart -k gui\u002F$(id -u)\u002F$ACTIVE_LABEL\n```\n\n## Red flags that mean STOP\n\n- `doctor --fix` wants to create a new plist → check for existing plists first\n- Config says \"last written by newer version\" → update `meta.lastTouchedVersion`\n- Multiple `openclaw-gateway` processes → kill extras, verify single plist\n- ThrottleInterval \u003C 10 in plist → change to 30 (prevents restart storms)\n- Slack `invalid_auth` after upgrade → token may be burned; check api.slack.com\n","# Gateway Upgrade Safety Checklist\n\n**MANDATORY before any `npm install -g openclaw@*`, `openclaw doctor --fix`, or gateway version change.**\n\n## Pre-flight (run BEFORE upgrade)\n\n```bash\n# 1. Snapshot current state\nCURRENT_VERSION=$(openclaw --version 2>\u002Fdev\u002Fnull | grep -oE '[0-9]+\\.[0-9]+\\.[0-9]+')\nCURRENT_PID=$(pgrep -f 'openclaw-gateway' | head -1)\necho \"Current: v$CURRENT_VERSION PID=$CURRENT_PID\"\n\n# 2. Check for competing plists (MUST be exactly 1)\nPLIST_COUNT=$(ls ~\u002FLibrary\u002FLaunchAgents\u002F*openclaw*gateway* 2>\u002Fdev\u002Fnull | wc -l | tr -d ' ')\necho \"Gateway plists: $PLIST_COUNT\"\nls ~\u002FLibrary\u002FLaunchAgents\u002F*openclaw*gateway* 2>\u002Fdev\u002Fnull\nif [ \"$PLIST_COUNT\" -gt 1 ]; then\n  echo \"ABORT: Multiple gateway plists detected. Remove extras before upgrading.\"\n  exit 1\nfi\n\n# 3. Backup config\ncp ~\u002F.openclaw\u002Fopenclaw.json ~\u002F.openclaw\u002Fopenclaw.json.pre-upgrade-$(date +%s)\n\n# 4. Record active plist label\nACTIVE_LABEL=$(launchctl list 2>\u002Fdev\u002Fnull | grep -E 'openclaw.*gateway' | awk '{print $3}' | head -1)\necho \"Active launchd label: $ACTIVE_LABEL\"\n\n# 5. Verify Slack is working (baseline)\nopenclaw channels status --probe 2>&1 | grep -i slack\n```\n\n## Upgrade\n\n```bash\n# Install new version\n\u002Fopt\u002Fhomebrew\u002Fbin\u002Fnpm install -g openclaw@\u003Cversion>\nopenclaw --version  # verify\n\n# CRITICAL: Check if doctor --fix is needed\n# If it prompts for --fix, do NOT run it blindly.\n# Instead, check what it wants to change:\nopenclaw doctor 2>&1 | head -40\n# Only run --fix if you understand every change it will make.\n```\n\n## Post-flight (run AFTER upgrade)\n\n```bash\n# 1. Verify still exactly 1 plist\nPLIST_COUNT=$(ls ~\u002FLibrary\u002FLaunchAgents\u002F*openclaw*gateway* 2>\u002Fdev\u002Fnull | wc -l | tr -d ' ')\nif [ \"$PLIST_COUNT\" -gt 1 ]; then\n  echo \"ALERT: doctor --fix created a second plist. Remove the old one:\"\n  ls -la ~\u002FLibrary\u002FLaunchAgents\u002F*openclaw*gateway*\n  # Keep only the one matching the active label\nfi\n\n# 2. Verify config wasn't corrupted\npython3 -c \"import json; json.load(open('$HOME\u002F.openclaw\u002Fopenclaw.json')); print('Config JSON: valid')\"\n\n# 3. Verify critical config keys survived (doctor --fix can silently drop keys)\npython3 -c \"\nimport json\nwith open('$HOME\u002F.openclaw\u002Fopenclaw.json') as f:\n    d = json.load(f)\nchecks = [\n    ('agents.defaults.heartbeat', d.get('agents',{}).get('defaults',{}).get('heartbeat')),\n    ('gateway.auth.token', d.get('gateway',{}).get('auth',{}).get('token')),\n    ('channels.slack.appToken', d.get('channels',{}).get('slack',{}).get('appToken')),\n    ('channels.slack.botToken', d.get('channels',{}).get('slack',{}).get('botToken')),\n]\nfor path, val in checks:\n    status = 'OK' if val else 'MISSING'\n    print(f'  {path}: {status}')\n\"\n\n# 4. Rebuild native modules\nbash ~\u002F.openclaw\u002Fscripts\u002Frebuild-native-modules.sh\n\n# 5. Restart gateway\nlaunchctl kickstart -k gui\u002F$(id -u)\u002F$ACTIVE_LABEL\n\n# 6. Wait and verify\nsleep 10\nopenclaw channels status --probe 2>&1 | grep -i slack\ntail -5 ~\u002F.openclaw\u002Flogs\u002Fgateway.err.log | grep -v 'plugin\\|tools.profile'\n```\n\n## Rollback\n\n```bash\n# If upgrade fails, rollback immediately:\n\u002Fopt\u002Fhomebrew\u002Fbin\u002Fnpm install -g openclaw@$CURRENT_VERSION\ncp ~\u002F.openclaw\u002Fopenclaw.json.pre-upgrade-* ~\u002F.openclaw\u002Fopenclaw.json  # restore config\npython3 -c \"\nimport json\nwith open('$HOME\u002F.openclaw\u002Fopenclaw.json') as f:\n    d = json.load(f)\nd['meta']['lastTouchedVersion'] = '$CURRENT_VERSION'\nwith open('$HOME\u002F.openclaw\u002Fopenclaw.json', 'w') as f:\n    json.dump(d, f, indent=2)\n\"\nlaunchctl kickstart -k gui\u002F$(id -u)\u002F$ACTIVE_LABEL\n```\n\n## Red flags that mean STOP\n\n- `doctor --fix` wants to create a new plist → check for existing plists first\n- Config says \"last written by newer version\" → update `meta.lastTouchedVersion`\n- Multiple `openclaw-gateway` processes → kill extras, verify single plist\n- ThrottleInterval \u003C 10 in plist → change to 30 (prevents restart storms)\n- Slack `invalid_auth` after upgrade → token may be burned; check api.slack.com\n",{"name":5,"description":7},"main","42ccd02cbf5e8e47839dc3eab6fc754dc6b339cf",".claude\u002Fskills_archive\u002F2026-08-27-historical-zero-use\u002Fgateway-upgrade",0,"https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills","https:\u002F\u002Fgithub.com\u002Fjleechanorg","2026-11-12 14:45:07",{"source":8,"skillName":5,"commands":39,"prompt":49,"zipAvailable":50},[40,43,46],{"tool":41,"command":42},"npx","npx skills add jleechanorg\u002Fjleechan-skills --skill gateway-upgrade",{"tool":44,"command":45},"bunx","bunx skills add jleechanorg\u002Fjleechan-skills --skill gateway-upgrade",{"tool":47,"command":48},"pnpm","pnpm dlx skills add jleechanorg\u002Fjleechan-skills --skill gateway-upgrade","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills_archive\u002F2026-08-27-historical-zero-use\u002Fgateway-upgrade\u002FSKILL.md",true,[52],{"path":53,"resourceType":54,"resourceTypeDesc":55,"sizeBytes":56,"sourceHtmlUrl":57},"scripts\u002Fdoc_export.py","SCRIPT","脚本",13445,"https:\u002F\u002Fgithub.com\u002FMuvon\u002Foctomind-tap\u002Fblob\u002Fmaster\u002Fskills\u002Fdocument-export\u002Fscripts\u002Fdoc_export.py",[59,77,99,113,127,143],{"skillNo":60,"name":61,"nameZh":6,"description":62,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":63,"categories":64,"keywords":65,"publishedAt":26},"01M716Y5MTJ6GYJZ2ATXCJK8G4","instinct","Use when the user invokes \u002Finstinct or \u002Fin, or asks to \"message Instinct\", \"ask Instinct\", \"tell Instinct\", \"check Instinct\", or read replies from the configured peer assistant. iMessage first, WhatsApp Web as fallback.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Finstinct\u002FSKILL.md",[],[61,66,67,68,69,70,71,72,73,74,75,76],"user","when","replies","check","use","identity","whatsapp","gmail","read","message","ask",{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":88,"publishedAt":26},"01M716Y4HF7FVVMJSA2CCVN5VF","hr","Compatibility alias for history-resume; produce the same fresh-state, provenance-aware resume briefing.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fhr\u002FSKILL.md",[83],{"categoryNo":84,"categoryName":85,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000038","人力资源","PROFESSION","适用职业",[79,89,90,91,92,93,94,95,96,97,98],"resume","compatibility","provenance","for","history","produce","alias","briefing","state","fresh",{"skillNo":100,"name":101,"nameZh":6,"description":102,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":103,"categories":104,"keywords":106,"publishedAt":26},"01M716Y1FFNFKFJYYKF8HQA6T8","history-resume","Resume briefing for the current repository branch or worktree using fresh state and admitted history sources.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fhistory-resume\u002FSKILL.md",[105],{"categoryNo":84,"categoryName":85,"taxonomyType":86,"taxonomyTypeDesc":87},[93,89,107,108,66,109,96,110,92,111,112,97,98],"history resume","branch","analysis","repository","worktree","sources",{"skillNo":114,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":119,"publishedAt":26},"01M716XWXJ8EPHK4RH9T14TR85","grok","Alias for the canonical grokbot browser conversation workflow; \u002Fgrok talks to the Grok bot the same way \u002Fdot talks to Dot.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fgrok\u002FSKILL.md",[],[115,120,121,122,92,123,95,124,125,126],"dot","bot","workflow","canonical","conversation","browser","grokbot",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":133,"publishedAt":26},"01M70N9Q07DTE0EW5KFXMMMSJ0","codexa-bench","Compare `codexa` and normal `codex` on a fair split of comparable work by default; use `--strict` for duplicate runs of the exact same task.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fcodexa-bench\u002FSKILL.md",[],[134,135,136,70,137,92,138,139,140,141,142],"codexa bench","work","split","default","duplicate","task","compare","normal","codex",{"skillNo":144,"name":145,"nameZh":6,"description":146,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":147,"licenseFileUrl":148,"sourceHtmlUrl":149,"categories":150,"keywords":162,"publishedAt":26},"01M6C24S2X60SP8BBFGAEKPEGW","frontend-design","Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML\u002FCSS layouts, or when styling\u002Fbeautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-design\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-design\u002FSKILL.md",[151,156,159],{"categoryNo":152,"categoryName":153,"taxonomyType":154,"taxonomyTypeDesc":155},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",{"categoryNo":157,"categoryName":158,"taxonomyType":154,"taxonomyTypeDesc":155},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":160,"categoryName":161,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000032","设计师",[163,164,165,70,166,167,168,66,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,25,184,185,67,186],"frontend","design","frontend design","generic","ui design","react","html","components","code","artifacts","ui","aesthetics","Production","web components","landing","applications","quality","web","css","create","examples","react components","web ui","pages"]