{
  "schema": "snappy-card/1",
  "skill": "snappy-settings",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "You are the credential layer for Snappy. Every snappy-* skill that hits an external API sources its env vars from here. **Credentials live in one file: `.env.cache`.** That file is the single source of truth. No Bitwarden, no cloud sync. Edit it directly.",
  "verbs": [
    {
      "name": "check",
      "args": [
        "key"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-settings/api.ts check <key>"
    },
    {
      "name": "list",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-settings/api.ts list"
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [
    "snappy-system-review",
    "snappy-system"
  ],
  "used_by": [
    "snappy-client-ray",
    "snappy-ffmpeg",
    "snappy-image",
    "snappy-inbox-sweep",
    "snappy-openrouter",
    "snappy-os-operator",
    "snappy-runner",
    "snappy-skill",
    "snappy-sync"
  ],
  "checks": {
    "pass": 42,
    "fail": 5,
    "defer": 14,
    "line": "42 of 47 checks pass",
    "failing": [
      {
        "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": 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",
    "agents-md.test.ts",
    "agents-md.ts",
    "api.ts",
    "contract-openapi.ts",
    "docs/consolidation-candidates.md",
    "docs/consolidation-decisions-needed-2026-04-11.md",
    "docs/snappy-system-review.md",
    "docs/snappy-system.md",
    "env-reads.test.ts",
    "env-reads.ts",
    "evidence-additive.gate.test.ts",
    "evidence-envelope.test.ts",
    "evidence-envelope.ts",
    "google-token.ts",
    "hand-read.ts",
    "hand-resources.test.ts",
    "hand-resources.ts",
    "load.ts",
    "master-key.test.ts",
    "master-key.ts",
    "profile.ts",
    "providers-choice.test.ts",
    "providers-choice.ts",
    "read-answer.test.ts",
    "read-answer.ts",
    "read-limit.test.ts",
    "read-limit.ts",
    "refusal-codes.test.ts",
    "refusal-codes.ts",
    "scripts/agents-md-findings.mjs",
    "scripts/bootstrap.sh",
    "scripts/cert-check.sh",
    "scripts/check-creds.sh",
    "scripts/dry-check.sh",
    "scripts/generate-skill-index.sh",
    "scripts/get-cred.sh",
    "scripts/load-env.sh",
    "scripts/regenerate-skill-indices.sh",
    "scripts/skill-check.sh",
    "scripts/sync-from-xano.ts",
    "skill-spec.md",
    "spawn-pool.test.ts",
    "spawn-pool.ts",
    "spec-read.test.ts",
    "spec-read.ts",
    "stage.ts",
    "tool-annotations.test.ts",
    "tool-annotations.ts",
    "vendor-fetch.test.ts",
    "vendor-fetch.ts"
  ],
  "total_size": 444792,
  "checksum": "sha256:ef772628bbfcf54cd31eaf9a389f7ca0d5361685474de48158d37f5950c3fda4",
  "built_at": "2026-09-09T22:10:53.883Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-settings",
      "version": "0.0.0",
      "description": "Snappy Settings -- central environment and credentials layer for the entire Snappy operating system. Owns the single source of truth for every API key, bot token, and secret used across snappy-* skills: .env.cache. Provides the TypeScript loader (load.ts → env(\"KEY\")) and three bash helpers (load-env.sh, get-cred.sh, check-creds.sh) that read from the same file. No Bitwarden, no cloud sync -- edit .env.cache directly. Triggers on: settings, environment, env var, api key, credentials, secrets, env cache, missing env var, load env, get cred, check creds."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-settings/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/check": {
        "get": {
          "operationId": "snappy_settings_check",
          "summary": "snappy-settings check",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "parameters": [
            {
              "name": "key",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Credential key to check for; the value is never printed",
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/list": {
        "get": {
          "operationId": "snappy_settings_list",
          "summary": "snappy-settings list",
          "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 credential key names to return. The count is the FLAG --limit, never a positional word; default 500, ceiling 500",
                "default": 500,
                "minimum": 1,
                "maximum": 500,
                "x-snappy-flag": "--limit"
              }
            }
          ],
          "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"
            }
          }
        }
      }
    }
  }
}