{
  "schema": "snappy-card/1",
  "skill": "snappy-desktop",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "You are operating the macOS desktop automation primitive. Wraps `npx -y @midscene/computer@1` (Gemini 2.5 Flash via OpenRouter) to give any Snappy skill \"hands on the screen\" for native apps -- Finder, System Settings, Messages, Notes, Mail, third-party apps. For websites use snappy-browse. For iMessage default to snappy-imessage first.",
  "verbs": [
    {
      "name": "run",
      "args": [
        "instruction"
      ],
      "effect": "write",
      "firstCall": "npx tsx ~/.claude/skills/snappy-desktop/api.ts run <instruction>"
    },
    {
      "name": "screenshot",
      "args": [],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-desktop/api.ts screenshot"
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [],
  "used_by": [
    "snappy-ax"
  ],
  "checks": {
    "pass": 25,
    "fail": 9,
    "defer": 27,
    "line": "25 of 34 checks pass",
    "failing": [
      {
        "id": 4,
        "rule": "Near-neighbour descriptions cross-reference each other",
        "says": "near neighbours not named: snappy-runner"
      },
      {
        "id": 7,
        "rule": "Promised and declared verbs have no set difference",
        "says": "promised-only=[wa-chats, wa-read, wa-send]; loader-missing=[]"
      },
      {
        "id": 8,
        "rule": "Skill body and reference graph stay within disclosure budgets",
        "says": "339 lines; ~4550 tokens; troubleshooting.md >100 lines without ToC; deep reference ../snappy-infra/auth-reference.md"
      },
      {
        "id": 10,
        "rule": "One term names each concept",
        "says": "mixed synonym sets: endpoint/url/route/path, field/box/element"
      },
      {
        "id": 11,
        "rule": "Each task presents one default, not a menu",
        "says": "1 line(s) present three-way alternative menus"
      },
      {
        "id": 40,
        "rule": "Metadata, skill body, and resources follow three-level budgets",
        "says": "metadata ~165 tokens; body ~4550 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",
    "contract.test.ts",
    "patterns.md",
    "troubleshooting.md"
  ],
  "total_size": 45386,
  "checksum": "sha256:4705579fd96baa453e578d2e4cfe2cbf4f938d19baacd44bdf7b98107ba50507",
  "built_at": "2026-09-09T22:08:47.419Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-desktop",
      "version": "0.0.0",
      "description": "macOS desktop automation primitive for the Snappy stack via Midscene vision AI (`npx @midscene/computer@1`). Controls real mouse and keyboard from screen vision -- works with ANY native app. NEVER run Midscene directly over SSH -- always route through local Terminal via osascript so Screen Recording permission applies. Triggers on desktop, open app, click button, screenshot desktop, launch application, switch window, desktop automation, control computer, mouse click, keyboard shortcut, Finder, System Settings, native app, Spotlight, macOS, Messages.app fallback, screen recording, vision automation, Midscene, Mac Mini desktop, AppleScript automation."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-desktop/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/run": {
        "post": {
          "operationId": "snappy_desktop_run",
          "summary": "snappy-desktop run",
          "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": {
                    "instruction": {
                      "type": "string",
                      "description": "Plain-language instruction the desktop agent performs on this Mac",
                      "x-snappy-position": 0
                    }
                  },
                  "required": [
                    "instruction"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/screenshot": {
        "post": {
          "operationId": "snappy_desktop_screenshot",
          "summary": "snappy-desktop screenshot",
          "x-snappy-effect": "write-reversible",
          "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`."
            }
          }
        }
      }
    },
    "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"
            }
          }
        }
      }
    }
  }
}