{
  "schema": "snappy-card/1",
  "skill": "snappy-xano-dashboard",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "Browser-driven admin operations on the Xano dashboard (xano.snappy.ai) via agent-browser for tasks the REST API cannot do.",
  "verbs": [
    {
      "name": "logs",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-xano-dashboard/api.ts logs"
    },
    {
      "name": "open",
      "args": [],
      "effect": "write",
      "firstCall": "npx tsx ~/.claude/skills/snappy-xano-dashboard/api.ts open"
    },
    {
      "name": "test",
      "args": [
        "endpoint"
      ],
      "effect": "write",
      "firstCall": "npx tsx ~/.claude/skills/snappy-xano-dashboard/api.ts test <endpoint>"
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [],
  "used_by": [],
  "checks": {
    "pass": 38,
    "fail": 9,
    "defer": 14,
    "line": "38 of 47 checks pass",
    "failing": [
      {
        "id": 7,
        "rule": "Promised and declared verbs have no set difference",
        "says": "promised-only=[closeDashboard]; loader-missing=[]"
      },
      {
        "id": 8,
        "rule": "Skill body and reference graph stay within disclosure budgets",
        "says": "293 lines; ~3391 tokens; deep reference ../snappy-infra/auth-reference.md; deep reference ../snappy-database/SKILL.md; ../snappy-database/SKILL.md >100 lines without ToC; deep reference ../snappy-browse/SKILL.md; ../snappy-browse/SKILL.md >100 lines without ToC"
      },
      {
        "id": 10,
        "rule": "One term names each concept",
        "says": "mixed synonym sets: endpoint/url/route/path"
      },
      {
        "id": 11,
        "rule": "Each task presents one default, not a menu",
        "says": "1 line(s) present three-way alternative menus"
      },
      {
        "id": 32,
        "rule": "Refusals name a literal from the valid domain",
        "says": "refusals checked against contract literals"
      },
      {
        "id": 40,
        "rule": "Metadata, skill body, and resources follow three-level budgets",
        "says": "metadata ~209 tokens; body ~3391 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",
    "api.ts",
    "refusals.test.ts"
  ],
  "total_size": 28315,
  "checksum": "sha256:7c24f7940d32c3ba0f102c56be6a7f0902909dc8d2ebe6f74749567a18873173",
  "built_at": "2026-09-09T22:11:31.838Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-xano-dashboard",
      "version": "0.0.0",
      "description": "Browser-driven operations on the Xano admin dashboard for the Snappy backend instance (`xnwv-v1z6-dvnr.n7c.xano.io`, vanity `xano.snappy.ai`). Wraps `agent-browser` (snappy-browse) to navigate the Xano UI for tasks the public REST API doesn't expose: editing endpoints, inspecting request logs, viewing the database schema, deploying functions, managing API groups, configuring auth, viewing background tasks, looking at the function stack, and working with the visual XanoScript editor. Pairs with xanoscript-builder (raw script authoring) and snappy-infra (REST API surface). Triggers on: xano dashboard, xano admin, xano.snappy.ai, edit xano endpoint, xano logs, xano request log, xano database, xano table, xano api group, xano auth, xano function, xano background task, xanoscript editor, xano deploy, browse xano, xano workspace."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-xano-dashboard/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/logs": {
        "get": {
          "operationId": "snappy_xano_dashboard_logs",
          "summary": "snappy-xano-dashboard logs",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/open": {
        "post": {
          "operationId": "snappy_xano_dashboard_open",
          "summary": "snappy-xano-dashboard open",
          "x-snappy-effect": "write",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "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`."
            }
          }
        }
      },
      "/test": {
        "post": {
          "operationId": "snappy_xano_dashboard_test",
          "summary": "snappy-xano-dashboard test",
          "x-snappy-effect": "write",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "endpoint": {
                      "type": "string",
                      "description": "Xano endpoint path to call",
                      "x-snappy-position": 0
                    }
                  },
                  "required": [
                    "endpoint"
                  ]
                }
              }
            }
          },
          "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"
            }
          }
        }
      }
    }
  }
}