{"id":"notfair-upgrade-skill","name":"upgrade","summary":"NotFairプラグインを最新バージョンにアップグレードしてください。マーケットプレイスのリポジトリを更新し、新しいバージョンをプラグインキャッシュにインストールし、installed_plugins.jsonを更新します。","body":"# /notfair:upgrade\n\nUpgrade the NotFair plugin to the latest version and show what's new.\n\n## Key paths\n\n| What | Path |\n|------|------|\n| Marketplace repo | `~/.claude/plugins/marketplaces/nowork-studio/` |\n| Plugin cache | `~/.claude/plugins/cache/nowork-studio/notfair/<version>/` |\n| Installed plugins | `~/.claude/plugins/installed_plugins.json` |\n| Update state | `~/.toprank/` (intentionally preserved — see CHANGELOG 0.24.0) |\n\n---\n\n## Inline upgrade flow\n\nThis section is used when a skill preamble outputs `UPGRADE_AVAILABLE`.\n\n### Step 1: Auto-upgrade\n\nLog \"Upgrading NotFair v{old} → v{new}...\" and proceed to Step 2.\n\n---\n\n### Step 2: Detect current install\n\nFirst check for dev symlink (see \"Dev symlink detection\" section). If detected, stop — do not upgrade.\n\n```bash\n# Find the currently installed plugin path\nINSTALLED_DIR=$(ls -d ~/.claude/plugins/cache/nowork-studio/notfair/*/ 2>/dev/null | grep -v '.bak' | head -1)\nif [ -z \"$INSTALLED_DIR\" ]; then\n  echo \"ERROR: NotFair plugin not found in cache\"; exit 1\nfi\nMARKETPLACE_DIR=\"$HOME/.claude/plugins/marketplaces/nowork-studio\"\nif [ ! -d \"$MARKETPLACE_DIR/.git\" ]; then\n  echo \"ERROR: marketplace repo not found at $MARKETPLACE_DIR\"; exit 1\nfi\necho \"Current install: $INSTALLED_DIR\"\necho \"Marketplace repo: $MARKETPLACE_DIR\"\n```\n\n### Step 3: Save old version\n\n```bash\nOLD_VERSION=$(cat \"$INSTALLED_DIR/VERSION\" 2>/dev/null | tr -d '[:space:]' || echo \"unknown\")\n```\n\n### Step 4: Update marketplace repo and install\n\n```bash\ncd \"$MARKETPLACE_DIR\"\ngit fetch origin\ngit reset --hard origin/main\nNEW_VERSION=$(cat VERSION | tr -d '[:space:]')\nGIT_SHA=$(git rev-parse HEAD)\n\n# Create new versioned cache directory\nNEW_CACHE_DIR=\"$HOME/.claude/plugins/cache/nowork-studio/notfair/$NEW_VERSION\"\nif [ -d \"$NEW_CACHE_DIR\" ]; then\n  rm -rf \"$NEW_CACHE_DIR\"\nfi\nmkdir -p \"$NEW_CACHE_DIR\"\n\n# Copy plugin files (exclude .git to save space)\nrsync -a --exclude='.git' \"$MARKETPLACE_DIR/\" \"$NEW_CACHE_DIR/\"\n```\n\nIf the copy fails, warn: \"Upgrade failed — the old version is still active. Run `/notfair:upgrade` manually.\" and stop.\n\n### Step 5: Update installed_plugins.json\n\nRead `~/.claude/plugins/installed_plugins.json`, then update the `notfair@nowork-studio` entry:\n\n```bash\npython3 -c \"\nimport json, os\nfrom datetime import datetime, timezone\n\npath = os.path.expanduser('~/.claude/plugins/installed_plugins.json')\nwith open(path) as f:\n    data = json.load(f)\n\ndata['plugins']['notfair@nowork-studio'] = [{\n    'scope': 'user',\n    'installPath': os.path.expanduser('~/.claude/plugins/cache/nowork-studio/notfair/$NEW_VERSION'),\n    'version': '$NEW_VERSION',\n    'installedAt': data['plugins'].get('notfair@nowork-studio', [{}])[0].get('installedAt', datetime.now(timezone.utc).isoformat()),\n    'lastUpdated': datetime.now(timezone.utc).isoformat(),\n    'gitCommitSha': '$GIT_SHA'\n}]\n\nwith open(path, 'w') as f:\n    json.dump(data, f, indent=4)\nprint('Updated installed_plugins.json: notfair@nowork-studio -> v$NEW_VERSION')\n\"\n```\n\n### Step 6: Clean up old cache versions\n\nRemove old versioned cache directories (keep only the new one). Never remove a `dev` symlink:\n\n```bash\nfor dir in ~/.claude/plugins/cache/nowork-studio/notfair/*/; do\n  ver=$(basename \"$dir\")\n  if [ \"$ver\" != \"$NEW_VERSION\" ] && [ \"$ver\" != \"dev\" ]; then\n    rm -rf \"$dir\"\n    echo \"Removed old cache: $ver\"\n  fi\ndone\n```\n\n### Step 7: Write marker + clear update state\n\n```bash\nmkdir -p ~/.toprank\necho \"$OLD_VERSION\" > ~/.toprank/just-upgraded-from\nrm -f ~/.toprank/last-update-check\nrm -f ~/.toprank/update-snoozed\n```\n\n### Step 8: Show What's New\n\nRead `$NEW_CACHE_DIR/CHANGELOG.md`. Find all version entries between the old version and the new version. Summarize as 3-7 bullets grouped by theme — focus on user-facing changes, skip internal refactors.\n\nFormat:\n```\nNotFair v{new} — upgraded from v{old}!\n\nWhat's new:\n- [bullet 1]\n- [bullet 2]\n- ...\n\nThe new version will be fully active on your next Claude Code session.\n```\n\n### Step 9: Continue\n\nAfter showing What's New, continue with whatever skill the user originally invoked.\n\n---\n\n## Dev symlink detection\n\nBefore upgrading, check if the installed cache directory is a symlink named `dev`:\n\n```bash\nCACHE_DIR=$(ls -d ~/.claude/plugins/cache/nowork-studio/notfair/*/ 2>/dev/null | head -1)\nif [ -L \"${CACHE_DIR%/}\" ] && [ \"$(basename \"$CACHE_DIR\")\" = \"dev\" ]; then\n  echo \"DEV_SYMLINK\"\nfi\n```\n\nIf `DEV_SYMLINK`: tell the user \"NotFair is installed as a dev symlink — it always points to your local source (v$(cat \"$CACHE_DIR/VERSION\" 2>/dev/null | tr -d '[:space:]')). No upgrade needed.\" and **stop**. Do not proceed with Steps 2–8.\n\n---\n\n## Standalone usage\n\nWhen invoked directly as `/notfair:upgrade`:\n\n1. Check for dev symlink (see \"Dev symlink detection\" above). If detected, stop.\n\n2. Force a fresh update check (bypass cache and snooze):\n```bash\n_UPD_BIN=$(ls ~/.claude/plugins/cache/nowork-studio/notfair/*/bin/notfair-update-check 2>/dev/null | head -1)\n[ -n \"$_UPD_BIN\" ] && _UPD=$(\"$_UPD_BIN\" --force 2>/dev/null || true) || _UPD=\"\"\necho \"$_UPD\"\n```\n\n3. If `UPGRADE_AVAILABLE <old> <new>`: follow Steps 2–8 above.\n\n4. If no `UPGRADE_AVAILABLE` output: tell the user \"You're already on the latest version (v{LOCAL}).\"","author":"@nowork-studio","ownerProfile":null,"authorContacts":null,"sourceUrl":"https://github.com/nowork-studio/notfair-plugin/tree/main/notfair-upgrade-skill","license":"MIT","category":null,"lang":"en","tokens":1503,"stars":0,"calls30d":1,"claimed":false,"visibility":"public","origin":"crawler","version":"0.1.0","createdAt":"2026-08-22","updatedAt":"2026-08-22","files":[{"path":"evals/evals.json","size":1417,"sha256":"35656ed35ff4cefba2c89094f3dea99fa5f37c1140d86800fdd8eaa8466930c2"}],"requires":{"mcp":[],"tools":["Bash","Read","AskUserQuestion"]},"safety":{"flags":[],"scannedAt":"2026-08-22","hasScripts":false,"networkEndpoints":[]}}