{
  "schema": "snappy-card/1",
  "skill": "snappy-infra",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "Foundation skill. Every other snappy-* skill that hits Xano consumes patterns from here.",
  "verbs": [
    {
      "name": "ssh",
      "args": [
        "command"
      ],
      "effect": "write",
      "firstCall": "npx tsx ~/.claude/skills/snappy-infra/api.ts ssh <command>"
    },
    {
      "name": "vercel",
      "args": [
        "project"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-infra/api.ts vercel <project>"
    },
    {
      "name": "xano",
      "args": [],
      "effect": "write",
      "firstCall": "npx tsx ~/.claude/skills/snappy-infra/api.ts xano"
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [],
  "used_by": [
    "snappy-box",
    "snappy-imessage",
    "snappy-playbook"
  ],
  "checks": {
    "pass": 31,
    "fail": 8,
    "defer": 22,
    "line": "31 of 39 checks pass",
    "failing": [
      {
        "id": 4,
        "rule": "Near-neighbour descriptions cross-reference each other",
        "says": "near neighbours not named: snappy-client-feisst, snappy-runner, snappy-specwatch"
      },
      {
        "id": 5,
        "rule": "Description is valid, third-person, and says what plus when",
        "says": "first/second person"
      },
      {
        "id": 8,
        "rule": "Skill body and reference graph stay within disclosure budgets",
        "says": "564 lines; ~7819 tokens"
      },
      {
        "id": 10,
        "rule": "One term names each concept",
        "says": "mixed synonym sets: endpoint/url/route/path"
      },
      {
        "id": 40,
        "rule": "Metadata, skill body, and resources follow three-level budgets",
        "says": "metadata ~242 tokens; body ~7819 tokens"
      },
      {
        "id": 54,
        "rule": "At least three eval scenarios precede ready status",
        "says": "0 eval scenario(s); ready=true"
      },
      {
        "id": 55,
        "rule": "Eval scenarios are multi-call with ground truth",
        "says": "eval manifest missing"
      },
      {
        "id": 57,
        "rule": "Eval manifest contains a disjoint holdout",
        "says": "0 disjoint holdout scenario(s)"
      }
    ]
  },
  "coverage": null,
  "spec": null,
  "evals": null,
  "files": [
    "AGENTS.md",
    "SKILL.md",
    "advanced-patterns.md",
    "api.ts",
    "auth-reference.md",
    "capability-map.md",
    "cognitive-architecture.md",
    "contract.test.ts",
    "media-and-devops.md",
    "messaging-and-comms.md",
    "productivity-and-calendar.md",
    "workflows.md"
  ],
  "total_size": 120853,
  "checksum": "sha256:a93a3b0a38612303a996b995eb4696b27ad057046efe6b7fca149dbb83ae1671",
  "built_at": "2026-09-09T22:09:39.678Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-infra",
      "version": "0.0.0",
      "description": "Snappy infrastructure foundation -- Xano API surface (Slack, email, LinkedIn, FreshBooks, WhatsApp, calendar, YouTube, knowledge graph), Mac Mini SSH, agent-browser delegation, native CLI tools (imsg, icalBuddy, remindctl, gh, ffmpeg, peekaboo). The PARENT skill consumed by every Snappy skill that hits Xano. Owns the auth-reference (single source of truth for tokens, API groups, env vars) and the capability map. PLUMBING ONLY -- HOW to call something (which endpoint, token, env var). Deciding WHAT to do, and the digital-twin operating loop, belong to mac-mini-remote-ops. Triggers on: xano api, mac mini, remote control, snappy infrastructure, auth reference, api groups, xano token, slack message, send slack, send imessage, text someone, check calendar, add reminder, process video, github cli, send invoice, freshbooks, whatsapp, email, world scan, morning briefing, post about, check inbox, who is, what should I do, digital twin, robot rob, capability map."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-infra/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/ssh": {
        "post": {
          "operationId": "snappy_infra_ssh",
          "summary": "snappy-infra ssh",
          "x-snappy-effect": "write",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "command": {
                      "type": "string",
                      "description": "Shell command run on the remote host",
                      "x-snappy-position": 0
                    }
                  },
                  "required": [
                    "command"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/vercel": {
        "get": {
          "operationId": "snappy_infra_vercel",
          "summary": "snappy-infra vercel",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "project",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Vercel project whose state is read",
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/xano": {
        "post": {
          "operationId": "snappy_infra_xano",
          "summary": "snappy-infra xano",
          "x-snappy-effect": "write",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": false,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {}
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      }
    },
    "components": {
      "schemas": {
        "SnappyRefusal": {
          "type": "object",
          "required": [
            "outcome",
            "code",
            "message"
          ],
          "properties": {
            "outcome": {
              "type": "string",
              "const": "refused"
            },
            "code": {
              "type": "string",
              "description": "A row of the closed refusal table."
            },
            "message": {
              "type": "string"
            },
            "fix": {
              "type": "string"
            }
          }
        }
      }
    },
    "x-snappy-requires": [
      "VERCEL_TOKEN",
      "XANO_METADATA_TOKEN"
    ]
  }
}