{
  "name": "SwipeBase",
  "version": "2.0.0",
  "description": "Universal swipe-to-decide engine. Any data type → swipeable cards → Yes/Maybe/Pass decisions. Like Tinder for everything except dating.",
  "base_url": "https://swipebase-demo.vercel.app",
  "skills": [
    {
      "name": "create_decision_deck",
      "description": "Convert a JSON array into a swipeable decision deck. Each object becomes a card that users swipe Right (Yes), Left (Pass), or Down (Maybe). Use Rich Data pattern for best results: include name, headline, what, why, how, tips, category, priority, url, image fields.",
      "method": "POST",
      "path": "/swipebase-v2.html",
      "transport": "javascript_api",
      "api_call": "window.SwipeBaseAPI.loadData(items, deckName)",
      "parameters": {
        "items": {
          "type": "array",
          "required": true,
          "description": "JSON array of objects. Each MUST have a 'name' field. Prefer 10+ fields per item using Rich Data pattern."
        },
        "deckName": {
          "type": "string",
          "required": true,
          "description": "Title shown above the card deck"
        }
      },
      "returns": {
        "success": { "type": "boolean" },
        "items": { "type": "integer", "description": "Number of cards loaded" }
      },
      "example": {
        "items": [
          {
            "name": "Fix authentication bug",
            "headline": "Users getting 401 on valid tokens",
            "what": "JWT validation fails when token contains special characters in the payload",
            "why": "Blocking 12% of logins since deploy v2.3.1",
            "how": "Update jwt.verify() to handle URI-encoded payloads",
            "tips": "Check if base64url decode handles padding correctly",
            "category": "Bug",
            "priority": "CRITICAL",
            "tags": "auth | jwt | blocking"
          }
        ],
        "deckName": "Sprint Bug Triage"
      }
    },
    {
      "name": "get_results",
      "description": "Get the categorized results after swiping. Returns three arrays: yes (approved), maybe (needs review), pass (rejected). Each array contains full item data.",
      "method": "GET",
      "path": "/swipebase-v2.html",
      "transport": "javascript_api",
      "api_call": "window.SwipeBaseAPI.getResults()",
      "parameters": {},
      "returns": {
        "yes": { "type": "array", "description": "Items swiped right (approved)" },
        "maybe": { "type": "array", "description": "Items swiped down (needs review)" },
        "pass": { "type": "array", "description": "Items swiped left (rejected)" }
      }
    },
    {
      "name": "get_state",
      "description": "Get current session state: deck name, total items, how many decided, how many remaining, and result counts.",
      "method": "GET",
      "path": "/swipebase-v2.html",
      "transport": "javascript_api",
      "api_call": "window.SwipeBaseAPI.getState()",
      "parameters": {},
      "returns": {
        "deck": { "type": "string" },
        "total": { "type": "integer" },
        "decided": { "type": "integer" },
        "remaining": { "type": "integer" },
        "results": {
          "type": "object",
          "properties": {
            "yes": { "type": "integer" },
            "maybe": { "type": "integer" },
            "pass": { "type": "integer" }
          }
        }
      }
    },
    {
      "name": "get_capabilities",
      "description": "Returns SwipeBase capability manifest including supported features, input/output formats, and version.",
      "method": "GET",
      "path": "/swipebase-v2.html",
      "transport": "javascript_api",
      "api_call": "window.SwipeBaseAPI.getCapabilities()",
      "parameters": {}
    },
    {
      "name": "embed_iframe",
      "description": "Embed SwipeBase in an iframe and communicate via postMessage. Load data, listen for results, control the session programmatically.",
      "method": "POST",
      "path": "/swipebase-v2.html",
      "transport": "postmessage",
      "parameters": {
        "type": {
          "type": "string",
          "required": true,
          "description": "Message type: 'swipebase:load' to load data, 'swipebase:getResults' to retrieve results"
        },
        "items": {
          "type": "array",
          "required": false,
          "description": "JSON array of items (for swipebase:load)"
        },
        "name": {
          "type": "string",
          "required": false,
          "description": "Deck name (for swipebase:load)"
        }
      },
      "example": {
        "load": "iframe.contentWindow.postMessage({ type: 'swipebase:load', items: [...], name: 'My Deck' }, '*')",
        "listen": "window.addEventListener('message', e => { if (e.data.type === 'swipebase:results') console.log(e.data) })"
      }
    }
  ],
  "rich_data_pattern": {
    "description": "For maximum card quality, use 10+ fields per item following this pattern",
    "fields": {
      "name": "Card title (REQUIRED)",
      "headline": "One-line attention-grabbing hook",
      "what": "Detailed description of what this item IS",
      "why": "Context and reasoning - why it matters for the decision",
      "how": "Concrete steps to act on this item",
      "tips": "Insider tips, gotchas, or pro advice",
      "category": "Type or grouping",
      "priority": "CRITICAL / HIGH / MEDIUM / LOW",
      "url": "Link to more info",
      "image": "Image URL (displayed on card)",
      "deadline": "When relevant",
      "amount": "Monetary value",
      "tags": "tag1 | tag2 | tag3",
      "location": "Where relevant",
      "difficulty": "Easy / Medium / Hard"
    }
  },
  "agent_card": "https://swipebase-demo.vercel.app/.well-known/agent-card.json",
  "standards": ["A2A", "MCP", "ERC-8004"],
  "author": "Rufus Kingdom"
}
