{
  "schema": "snappy-card/1",
  "skill": "snappy-cleanshot",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "You are driving CleanShot X (v4.8.10) on THIS Mac through its `cleanshot://` URL",
  "verbs": [
    {
      "name": "area",
      "args": [
        "x",
        "y",
        "width",
        "height"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts area <x> <y> <width> <height>"
    },
    {
      "name": "ax",
      "args": [
        "app-or-pid"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts ax <app-or-pid>"
    },
    {
      "name": "crop",
      "args": [
        "image-path",
        "x",
        "y",
        "width",
        "height"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts crop <image-path> <x> <y> <width> <height>"
    },
    {
      "name": "fullscreen",
      "args": [],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts fullscreen"
    },
    {
      "name": "grab",
      "args": [
        "window-id"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts grab <window-id>"
    },
    {
      "name": "grab-app",
      "args": [
        "app",
        "title-substring?"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts grab-app <app>"
    },
    {
      "name": "history",
      "args": [
        "limit?"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts history"
    },
    {
      "name": "icons",
      "args": [
        "app?"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts icons"
    },
    {
      "name": "last",
      "args": [],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts last"
    },
    {
      "name": "ocr",
      "args": [
        "image-path"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts ocr <image-path>"
    },
    {
      "name": "ocr-region",
      "args": [
        "x",
        "y",
        "width",
        "height"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts ocr-region <x> <y> <width> <height>"
    },
    {
      "name": "previous",
      "args": [],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts previous"
    },
    {
      "name": "probe",
      "args": [],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts probe"
    },
    {
      "name": "record",
      "args": [
        "x",
        "y",
        "width",
        "height",
        "seconds"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts record <x> <y> <width> <height> <seconds>"
    },
    {
      "name": "screens",
      "args": [],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts screens"
    },
    {
      "name": "scroll",
      "args": [
        "x",
        "y",
        "width",
        "height"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts scroll <x> <y> <width> <height>"
    },
    {
      "name": "space",
      "args": [
        "space-index?"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts space"
    },
    {
      "name": "spaces",
      "args": [],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts spaces"
    },
    {
      "name": "sweep",
      "args": [
        "app-or-pid",
        "dir"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts sweep <app-or-pid> <dir>"
    },
    {
      "name": "tab",
      "args": [
        "index"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts tab <index>"
    },
    {
      "name": "tabs",
      "args": [],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts tabs"
    },
    {
      "name": "vlm",
      "args": [
        "image-path"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts vlm <image-path>"
    },
    {
      "name": "win",
      "args": [
        "app",
        "title-substring?"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts win <app>"
    },
    {
      "name": "window",
      "args": [],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts window"
    },
    {
      "name": "windows",
      "args": [],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts windows"
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [
    "snappy-ffmpeg",
    "snappy-image",
    "snappy-browse",
    "snappy-dispatch",
    "snappy-faces"
  ],
  "used_by": [
    "snappy-ax",
    "snappy-voice-control"
  ],
  "checks": {
    "pass": 39,
    "fail": 8,
    "defer": 14,
    "line": "39 of 47 checks pass",
    "failing": [
      {
        "id": 4,
        "rule": "Near-neighbour descriptions cross-reference each other",
        "says": "near neighbours not named: snappy-runner"
      },
      {
        "id": 5,
        "rule": "Description is valid, third-person, and says what plus when",
        "says": "no when/use marker"
      },
      {
        "id": 8,
        "rule": "Skill body and reference graph stay within disclosure budgets",
        "says": "425 lines; ~5758 tokens"
      },
      {
        "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 ~195 tokens; body ~5758 tokens"
      },
      {
        "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",
    "ax.py",
    "contract.test.ts",
    "entities.json",
    "manifests/SnappyOS.json",
    "writing-sweeps.md"
  ],
  "total_size": 151743,
  "checksum": "sha256:31f80f0f8ca4eb218b3c9cc03fce44e7f710e2c6425eb66a665dbd36b43c1dce",
  "built_at": "2026-09-09T22:08:25.577Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-cleanshot",
      "version": "0.0.0",
      "description": "CleanShot X local capture primitive. Headless region/fullscreen screenshots at Retina 2x (~0.25s), local Apple Vision OCR of files and screen regions (~1.5s, free), auto-scrolling stitched captures that handle virtualized inner scrollers, and automated video/GIF recording. Resolves names to rectangles across the full hierarchy — Space, app, window, Chrome tab. Runs on THIS Mac against the live display — no SSH, no network, no credentials, no per-call cost. Triggers: cleanshot, clean shot, screenshot, screen capture, capture window, capture screen, scrolling capture, full page screenshot, record screen, screen recording, record gif, make a gif, ocr, extract text from image, read text from screen, capture that window, screenshot the app, capture chrome tab, switch space."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-cleanshot/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/area": {
        "post": {
          "operationId": "snappy_cleanshot_area",
          "summary": "snappy-cleanshot area",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "x": {
                      "type": "integer",
                      "description": "Left edge of the region in screen points",
                      "x-snappy-position": 0
                    },
                    "y": {
                      "type": "integer",
                      "description": "Top edge of the region in screen points",
                      "x-snappy-position": 1
                    },
                    "width": {
                      "type": "integer",
                      "description": "Region width in points",
                      "x-snappy-position": 2
                    },
                    "height": {
                      "type": "integer",
                      "description": "Region height in points",
                      "x-snappy-position": 3
                    }
                  },
                  "required": [
                    "x",
                    "y",
                    "width",
                    "height"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/ax": {
        "post": {
          "operationId": "snappy_cleanshot_ax",
          "summary": "snappy-cleanshot ax",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "app-or-pid": {
                      "type": "string",
                      "description": "Application name or process id whose windows are captured",
                      "x-snappy-position": 0
                    }
                  },
                  "required": [
                    "app-or-pid"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/crop": {
        "post": {
          "operationId": "snappy_cleanshot_crop",
          "summary": "snappy-cleanshot crop",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "image-path": {
                      "type": "string",
                      "description": "Existing image file to crop",
                      "x-snappy-position": 0
                    },
                    "x": {
                      "type": "integer",
                      "description": "Left edge of the region in screen points",
                      "x-snappy-position": 1
                    },
                    "y": {
                      "type": "integer",
                      "description": "Top edge of the region in screen points",
                      "x-snappy-position": 2
                    },
                    "width": {
                      "type": "integer",
                      "description": "Region width in points",
                      "x-snappy-position": 3
                    },
                    "height": {
                      "type": "integer",
                      "description": "Region height in points",
                      "x-snappy-position": 4
                    }
                  },
                  "required": [
                    "image-path",
                    "x",
                    "y",
                    "width",
                    "height"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/fullscreen": {
        "post": {
          "operationId": "snappy_cleanshot_fullscreen",
          "summary": "snappy-cleanshot fullscreen",
          "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`."
            }
          }
        }
      },
      "/grab": {
        "post": {
          "operationId": "snappy_cleanshot_grab",
          "summary": "snappy-cleanshot grab",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "window-id": {
                      "type": "string",
                      "description": "Window id from windows",
                      "x-snappy-position": 0
                    }
                  },
                  "required": [
                    "window-id"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/grab-app": {
        "post": {
          "operationId": "snappy_cleanshot_grab_app",
          "summary": "snappy-cleanshot grab-app",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "app": {
                      "type": "string",
                      "description": "Application whose window is captured",
                      "x-snappy-position": 0
                    },
                    "title-substring": {
                      "type": "string",
                      "description": "Substring the window title must contain when the app has several",
                      "x-snappy-position": 1
                    }
                  },
                  "required": [
                    "app"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/history": {
        "get": {
          "operationId": "snappy_cleanshot_history",
          "summary": "snappy-cleanshot history",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "parameters": [
            {
              "name": "limit",
              "in": "query",
              "required": false,
              "schema": {
                "type": "integer",
                "description": "How many recent captures to list",
                "default": 20,
                "maximum": 200,
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/icons": {
        "post": {
          "operationId": "snappy_cleanshot_icons",
          "summary": "snappy-cleanshot icons",
          "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": {
                    "app": {
                      "type": "string",
                      "description": "Application whose icon is extracted; omit for every running app",
                      "x-snappy-position": 0
                    }
                  }
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/last": {
        "get": {
          "operationId": "snappy_cleanshot_last",
          "summary": "snappy-cleanshot last",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "parameters": [],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/ocr": {
        "post": {
          "operationId": "snappy_cleanshot_ocr",
          "summary": "snappy-cleanshot ocr",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "image-path": {
                      "type": "string",
                      "description": "Image file to read text out of",
                      "x-snappy-position": 0
                    }
                  },
                  "required": [
                    "image-path"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/ocr-region": {
        "post": {
          "operationId": "snappy_cleanshot_ocr_region",
          "summary": "snappy-cleanshot ocr-region",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "x": {
                      "type": "integer",
                      "description": "Left edge of the region in screen points",
                      "x-snappy-position": 0
                    },
                    "y": {
                      "type": "integer",
                      "description": "Top edge of the region in screen points",
                      "x-snappy-position": 1
                    },
                    "width": {
                      "type": "integer",
                      "description": "Region width in points",
                      "x-snappy-position": 2
                    },
                    "height": {
                      "type": "integer",
                      "description": "Region height in points",
                      "x-snappy-position": 3
                    }
                  },
                  "required": [
                    "x",
                    "y",
                    "width",
                    "height"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/previous": {
        "get": {
          "operationId": "snappy_cleanshot_previous",
          "summary": "snappy-cleanshot previous",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "parameters": [],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/probe": {
        "get": {
          "operationId": "snappy_cleanshot_probe",
          "summary": "snappy-cleanshot probe",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/record": {
        "post": {
          "operationId": "snappy_cleanshot_record",
          "summary": "snappy-cleanshot record",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "x": {
                      "type": "integer",
                      "description": "Left edge of the region in screen points",
                      "x-snappy-position": 0
                    },
                    "y": {
                      "type": "integer",
                      "description": "Top edge of the region in screen points",
                      "x-snappy-position": 1
                    },
                    "width": {
                      "type": "integer",
                      "description": "Region width in points",
                      "x-snappy-position": 2
                    },
                    "height": {
                      "type": "integer",
                      "description": "Region height in points",
                      "x-snappy-position": 3
                    },
                    "seconds": {
                      "type": "integer",
                      "description": "Recording length in seconds",
                      "x-snappy-position": 4
                    }
                  },
                  "required": [
                    "x",
                    "y",
                    "width",
                    "height",
                    "seconds"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/screens": {
        "get": {
          "operationId": "snappy_cleanshot_screens",
          "summary": "snappy-cleanshot screens",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/scroll": {
        "post": {
          "operationId": "snappy_cleanshot_scroll",
          "summary": "snappy-cleanshot scroll",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "x": {
                      "type": "integer",
                      "description": "Left edge of the region in screen points",
                      "x-snappy-position": 0
                    },
                    "y": {
                      "type": "integer",
                      "description": "Top edge of the region in screen points",
                      "x-snappy-position": 1
                    },
                    "width": {
                      "type": "integer",
                      "description": "Region width in points",
                      "x-snappy-position": 2
                    },
                    "height": {
                      "type": "integer",
                      "description": "Region height in points",
                      "x-snappy-position": 3
                    }
                  },
                  "required": [
                    "x",
                    "y",
                    "width",
                    "height"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/space": {
        "post": {
          "operationId": "snappy_cleanshot_space",
          "summary": "snappy-cleanshot space",
          "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": {
                    "space-index": {
                      "type": "integer",
                      "description": "Which Mission Control space to capture, one-based",
                      "x-snappy-position": 0
                    }
                  }
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/spaces": {
        "get": {
          "operationId": "snappy_cleanshot_spaces",
          "summary": "snappy-cleanshot spaces",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/sweep": {
        "post": {
          "operationId": "snappy_cleanshot_sweep",
          "summary": "snappy-cleanshot sweep",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "app-or-pid": {
                      "type": "string",
                      "description": "Application name or process id to sweep every window of",
                      "x-snappy-position": 0
                    },
                    "dir": {
                      "type": "string",
                      "description": "Directory the sweep writes its images into",
                      "x-snappy-position": 1
                    },
                    "out": {
                      "x-snappy-flag": "--out"
                    },
                    "target": {
                      "x-snappy-flag": "--target"
                    }
                  },
                  "required": [
                    "app-or-pid",
                    "dir"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/tab": {
        "post": {
          "operationId": "snappy_cleanshot_tab",
          "summary": "snappy-cleanshot tab",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "index": {
                      "type": "integer",
                      "description": "Browser tab index to capture, one-based",
                      "x-snappy-position": 0
                    }
                  },
                  "required": [
                    "index"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/tabs": {
        "get": {
          "operationId": "snappy_cleanshot_tabs",
          "summary": "snappy-cleanshot tabs",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/vlm": {
        "post": {
          "operationId": "snappy_cleanshot_vlm",
          "summary": "snappy-cleanshot vlm",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "image-path": {
                      "type": "string",
                      "description": "Image file described by the vision model",
                      "x-snappy-position": 0
                    }
                  },
                  "required": [
                    "image-path"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/win": {
        "post": {
          "operationId": "snappy_cleanshot_win",
          "summary": "snappy-cleanshot win",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "app": {
                      "type": "string",
                      "description": "Application whose window is captured",
                      "x-snappy-position": 0
                    },
                    "title-substring": {
                      "type": "string",
                      "description": "Substring the window title must contain when the app has several",
                      "x-snappy-position": 1
                    }
                  },
                  "required": [
                    "app"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/window": {
        "post": {
          "operationId": "snappy_cleanshot_window",
          "summary": "snappy-cleanshot window",
          "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`."
            }
          }
        }
      },
      "/windows": {
        "get": {
          "operationId": "snappy_cleanshot_windows",
          "summary": "snappy-cleanshot windows",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [],
          "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"
            }
          }
        }
      }
    }
  }
}