#!/bin/bash set -euo pipefail # ───────────────────────────────────────────────────────────────────────────── # SpinOrFlip Skill Installer for Claude Code # Generated by spinorflip.com # ───────────────────────────────────────────────────────────────────────────── COMMANDS_DIR="$HOME/.claude/commands" SKILL_FILE="$COMMANDS_DIR/spinorflip.md" MCP_INDEX="$HOME/.spinorflip-mcp/index.js" CLAUDE_MCP="$HOME/.claude/mcp.json" GRN='\033[0;32m'; YLW='\033[1;33m'; RED='\033[0;31m'; NC='\033[0m' echo "" echo " ┌──────────────────────────────────────────┐" echo " │ 🌀 Spin or Flip — Claude Code Installer │" echo " └──────────────────────────────────────────┘" echo "" # ── 1. Write skill file ────────────────────────────────────────────────────── mkdir -p "$COMMANDS_DIR" echo 'LS0tCmRlc2NyaXB0aW9uOiBDcmVhdGUgYSBTcGluIG9yIEZsaXAgZGVjaXNpb24gd2hlZWwgZnJvbSBhbnkgdG9waWMKLS0tCgpDcmVhdGUgYSBTcGluIG9yIEZsaXAgZGVjaXNpb24gd2hlZWwgZm9yOiAkQVJHVU1FTlRTCgpJZiB0aGUgYHNwaW5vcmZsaXBgIE1DUCB0b29sIGlzIGF2YWlsYWJsZSBpbiB0aGlzIHNlc3Npb24sIGNhbGwgaXQgd2l0aCB0aGUgdG9waWMgZnJvbSB0aGUgaW5wdXQuCgpJZiB0aGUgTUNQIHRvb2wgaXMgTk9UIGF2YWlsYWJsZSwgZG8gdGhpcyBtYW51YWxseToKMS4gQ29tZSB1cCB3aXRoIGEgc2hvcnQgdGl0bGUgKDLigJM1IHdvcmRzKSBmb3IgdGhlIHRvcGljCjIuIEdlbmVyYXRlIGV4YWN0bHkgOCBjb25jaXNlIG9wdGlvbnMgKDHigJM0IHdvcmRzIGVhY2gpIOKAlCB0aGUgYmVzdC9tb3N0IGNsYXNzaWMgY2hvaWNlcwozLiBCdWlsZCB0aGUgVVJMOiBgaHR0cHM6Ly93d3cuc3Bpbm9yZmxpcC5jb20vP3RpdGxlPVRJVExFJm9wdGlvbnM9SlNPTl9BUlJBWWAKICAgd2hlcmUgSlNPTl9BUlJBWSBpcyBhIFVSTC1lbmNvZGVkIEpTT04gYXJyYXkgb2YgOCBzdHJpbmdzCgpUaGVuOgotIFNob3cgdGhlIHRpdGxlIGFuZCBudW1iZXJlZCBsaXN0IG9mIDggb3B0aW9ucwotIFByZXNlbnQgdGhlIFNwaW4gb3IgRmxpcCBVUkwgYXMgYSBjbGlja2FibGUgbGluawotIE9mZmVyIHRvIGFkanVzdCBvcHRpb25zIGlmIHRoZSB1c2VyIHdhbnRzIGNoYW5nZXMKCklmIG5vIHRvcGljIHdhcyBwcm92aWRlZCAodXNlciB0eXBlZCBqdXN0IGAvc3Bpbm9yZmxpcGApLCBhc2sgdGhlbSB3aGF0IHRoZXknZCBsaWtlIHRvIGRlY2lkZS4K' | base64 --decode > "$SKILL_FILE" echo -e "${GRN}✓ Skill installed at $SKILL_FILE${NC}" # ── 2. Optional: wire MCP server into Claude Code if already installed ─────── if [ -f "$MCP_INDEX" ]; then NODE_PATH="" NVM_DIR="$HOME/.nvm" NVM_LATEST=$(ls "$NVM_DIR/versions/node/" 2>/dev/null | sort -V | tail -1) for candidate in \ "$(command -v node 2>/dev/null || true)" \ "$NVM_DIR/versions/node/$NVM_LATEST/bin/node" \ "/opt/homebrew/bin/node" \ "/usr/local/bin/node"; do if [ -x "$candidate" ]; then NODE_PATH="$candidate" break fi done if [ -n "$NODE_PATH" ]; then CLAUDE_MCP="$CLAUDE_MCP" \ NODE_PATH="$NODE_PATH" \ MCP_INDEX="$MCP_INDEX" \ python3 - << 'PYEOF' import json, os, sys mcp_path = os.environ['CLAUDE_MCP'] node_path = os.environ['NODE_PATH'] index_path = os.environ['MCP_INDEX'] try: with open(mcp_path, 'r') as f: cfg = json.load(f) except Exception: cfg = {} cfg.setdefault('mcpServers', {}) if 'spin-or-flip' not in cfg['mcpServers']: cfg['mcpServers']['spin-or-flip'] = { 'command': node_path, 'args': [index_path], 'env': {} } os.makedirs(os.path.dirname(mcp_path), exist_ok=True) with open(mcp_path, 'w') as f: json.dump(cfg, f, indent=2) print('\033[0;32m✓ MCP server also connected to Claude Code\033[0m') PYEOF fi fi # ── Done ───────────────────────────────────────────────────────────────────── echo "" echo "────────────────────────────────────────────────" echo -e "${GRN}✅ Done! In any Claude Code session type:${NC}" echo "" echo " /spinorflip dinner ideas" echo "" echo " For AI-generated wheels with backgrounds," echo " also install the MCP server from:" echo " https://www.spinorflip.com (Settings → MCP)" echo "────────────────────────────────────────────────" echo "" read -rp "Press Enter to close..."