{
  "schema": "snappy-card/1",
  "skill": "snappy-post",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "You are posting content to one or more platforms. This skill distributes -- it does not write content (that's `snappy-content`).",
  "verbs": [
    {
      "name": "linkedin",
      "args": [
        "text"
      ],
      "effect": "post",
      "firstCall": "npx tsx ~/.claude/skills/snappy-post/api.ts linkedin \"<text>\""
    },
    {
      "name": "slack",
      "args": [
        "channel-id",
        "text"
      ],
      "effect": "post",
      "firstCall": "npx tsx ~/.claude/skills/snappy-post/api.ts slack <channel-id> \"<text>\""
    },
    {
      "name": "telegram",
      "args": [
        "text"
      ],
      "effect": "post",
      "firstCall": "npx tsx ~/.claude/skills/snappy-post/api.ts telegram \"<text>\""
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [],
  "used_by": [
    "snappy-email",
    "snappy-ffmpeg"
  ],
  "checks": {
    "pass": 28,
    "fail": 6,
    "defer": 27,
    "line": "28 of 34 checks pass",
    "failing": [
      {
        "id": 9,
        "rule": "Time-sensitive prose is isolated under Old patterns",
        "says": "1 time-sensitive instruction line(s) outside Old patterns"
      },
      {
        "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 ~156 tokens; body ~3956 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",
    "blog-publishing.md",
    "email-sending.md",
    "linkedin-posting.md",
    "multi-platform-workflow.md",
    "refusals.test.ts",
    "scheduling.md",
    "scripts/post.sh",
    "skool-posting.md",
    "stage.test.ts",
    "youtube-uploading.md"
  ],
  "total_size": 92714,
  "checksum": "sha256:852e51f1f1194d6b384fbe7199a1966a222e4b24d9398abc2f9bc64418ed56a6",
  "built_at": "2026-09-09T22:10:18.063Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-post",
      "version": "0.0.0",
      "description": "Unified social media posting and scheduling router for Snappy. One entry point that takes any approved content (text, image, carousel, video, MDX) and distributes it across LinkedIn, YouTube, Skool, Email (Xano/Gmail), and Blog (via snappy-publish). Adapts format per platform, enforces no-hashtag and anti-AI rules from snappy-content, dry-runs emails, and returns a distribution log. Triggers on: post, schedule post, publish, share on, post to linkedin, post to skool, schedule content, distribute content, post everywhere, multi-platform post, cross-post, distribute, post to all, send email, upload video, blog this."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-post/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/linkedin": {
        "post": {
          "operationId": "snappy_post_linkedin",
          "summary": "snappy-post linkedin",
          "x-snappy-effect": "post",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "text": {
                      "type": "string",
                      "description": "The words to use, verbatim",
                      "x-snappy-position": 0
                    }
                  },
                  "required": [
                    "text"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/slack": {
        "post": {
          "operationId": "snappy_post_slack",
          "summary": "snappy-post slack",
          "x-snappy-effect": "post",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "channel-id": {
                      "type": "string",
                      "description": "Destination channel id",
                      "x-snappy-position": 0
                    },
                    "text": {
                      "type": "string",
                      "description": "The words to use, verbatim",
                      "x-snappy-position": 1
                    }
                  },
                  "required": [
                    "channel-id",
                    "text"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/telegram": {
        "post": {
          "operationId": "snappy_post_telegram",
          "summary": "snappy-post telegram",
          "x-snappy-effect": "post",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "text": {
                      "type": "string",
                      "description": "The words to use, verbatim",
                      "x-snappy-position": 0
                    }
                  },
                  "required": [
                    "text"
                  ]
                }
              }
            }
          },
          "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": [
      "LINKEDIN_CLIENT_ID",
      "LINKEDIN_CLIENT_SECRET",
      "SLACK_BOT_TOKEN",
      "TELEGRAM_BOT_TOKEN",
      "TELEGRAM_ROBERT_CHAT_ID",
      "TYPEFULLY_API_KEY"
    ]
  }
}