{
  "schemaVersion": "1.0",
  "item": {
    "slug": "demo-slap",
    "name": "Demo-Slap Highlights",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/Damirikys/demo-slap",
    "canonicalUrl": "https://clawhub.ai/Damirikys/demo-slap",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/demo-slap",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=demo-slap",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "scripts/demo_slap_analyze.py",
      "scripts/demo_slap_common.py",
      "scripts/demo_slap_match_pick.py",
      "scripts/demo_slap_matches.py",
      "scripts/demo_slap_render.py"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/demo-slap"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/demo-slap",
    "agentPageUrl": "https://openagent3.xyz/skills/demo-slap/agent",
    "manifestUrl": "https://openagent3.xyz/skills/demo-slap/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/demo-slap/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Demo-Slap Highlight Skill",
        "body": "Generate MP4 highlights and fragmovies from CS2 demos.\n\nThis skill is designed for OpenClaw environments where background jobs, local helper scripts, and chat-aware delivery are available. It uses Python 3 scripts and the requests package for HTTP API access.\n\nExpected runtime inputs:\n\nRequired: DEMOSLAP_API_KEY\nOptional: LEETIFY_API_KEY\nOptional deployment helper: DEMO_SLAP_WATCHDOG_JOB_ID"
      },
      {
        "title": "Scripts",
        "body": "Run bundled scripts relative to the skill root, usually from scripts/."
      },
      {
        "title": "Demo-Slap",
        "body": "ScriptPurposedemo_slap_matches.pyList recent matches from Demo-Slap /public-api/matchesdemo_slap_resolve.pyTry to resolve replay/demo URL from Demo-Slap match history by index; fail clearly if the API exposes only jobIddemo_slap_match_pick.pyPick a Demo-Slap match by index and return structured match info including jobIddemo_slap_analyze.pySubmit a demo for analysis, poll until done, output highlights JSONdemo_slap_render.pyRender one or more highlights, poll until done, output clip URLdemo_slap_common.pyShared utilities (config, API calls, state)"
      },
      {
        "title": "Leetify",
        "body": "ScriptPurposeleetify/leetify_matches.pyList recent matchesleetify/leetify_resolve.pyResolve replay URL by username + match indexleetify/leetify_save_id.pySave username -> Steam64 ID mappingleetify/leetify_common.pyShared Leetify utilities"
      },
      {
        "title": "Match source selection",
        "body": "Prefer Leetify for recent match discovery when LEETIFY_API_KEY is available.\nIf LEETIFY_API_KEY is not configured but DEMOSLAP_API_KEY is available, use Demo-Slap match history from /public-api/matches.\nSwagger: https://api-doc.demo-slap.net/\nTreat Demo-Slap match history as the fallback discovery path for listing matches and selecting an existing analyzed match or replay context before analyze/render."
      },
      {
        "title": "Runtime files",
        "body": "Use these files as optional local runtime state during execution:\n\ndata/state.json\ndata/highlights.json\ndata/history.log\ndata/steam_ids.json\ndata/config.json\n\nThese files are runtime helpers for local operation and are not required to understand or inspect the skill package itself.\n\nstate.json tracks the current operation:\n\n{\n  \"status\": \"idle|analyzing|rendering|done|error\",\n  \"job_id\": \"...\",\n  \"render_job_id\": \"...\",\n  \"chat_id\": \"telegram:182314856\",\n  \"clip_urls\": {\"highlight_id\": \"https://...\"},\n  \"progress\": \"polling 3/30\",\n  \"last_completed_op\": \"analyze|render\",\n  \"notification\": {\n    \"sent\": false,\n    \"sent_at\": null,\n    \"last_attempt_at\": null,\n    \"error\": null\n  },\n  \"updated_at\": \"ISO timestamp\"\n}"
      },
      {
        "title": "1. Find the match",
        "body": "Preferred path when LEETIFY_API_KEY is available:\n\npython3 scripts/leetify/leetify_matches.py <USERNAME> [--limit 10]\n\nFallback path when LEETIFY_API_KEY is missing but DEMOSLAP_API_KEY is available:\n\npython3 scripts/demo_slap_matches.py [<USERNAME>] [--limit 10]\n\nuses Demo-Slap /public-api/matches\nuse the Demo-Slap swagger docs at https://api-doc.demo-slap.net/ if schema details are needed\nif <USERNAME> is provided and mapped, filter matches to that player's Steam ID when possible\nafter the user picks a match, run:\n\npython3 scripts/demo_slap_match_pick.py [<USERNAME>] --match-index <N>\n\ntreat the returned jobId as the primary handle for downstream Demo-Slap operations"
      },
      {
        "title": "2. Resolve replay URL",
        "body": "Preferred path when using Leetify:\n\npython3 scripts/leetify/leetify_resolve.py <USERNAME> --match-index <N>\n\nWhen using Demo-Slap fallback:\n\npython3 scripts/demo_slap_match_pick.py [<USERNAME>] --match-index <N>\n\nuse the returned jobId as the selected match identifier\nif demoUrl is present, you may still use analyze-by-URL\nif demoUrl is absent, skip URL resolution and continue by API endpoints that accept the existing analyze jobId\nuse GET /public-api/analyze/{jobId}/status and GET /public-api/analyze/{jobId}/data to inspect existing highlights\nif the user wants clips and highlights already exist, render directly from that jobId"
      },
      {
        "title": "3. Analyze in background",
        "body": "python3 -u scripts/demo_slap_analyze.py --url '<REPLAY_URL>' --username <USERNAME> --chat-id <CHAT_ID>\n\nRun with exec(background: true) and keep the returned process/session id.\n\nOptional deployment-specific watchdog pattern for OpenClaw environments:\n\nUse a watchdog only when background analyze/render work benefits from periodic delivery checks.\nReuse an existing deployment watchdog when available instead of assuming a new persistent scheduler entry is always needed.\nIf a deployment chooses to create or enable a watchdog through the built-in cron tool, keep it scoped to the active run and disable it again after terminal delivery.\nA 2 minute interval is a reasonable default.\nUse scripts/demo_slap_watchdog.sh status|tail|job only as a local helper for inspecting runtime state, logs, or deployment-specific job references.\nTreat data/state.json and data/highlights.json as the source of truth during runtime.\n\nAgent workflow:\n\nChoose the match source:\n\nLeetify if LEETIFY_API_KEY exists\nDemo-Slap /public-api/matches if LEETIFY_API_KEY is missing and DEMOSLAP_API_KEY exists\n\n\nIf using Leetify, resolve the replay URL and run analyze\nIf using Demo-Slap fallback, pick a match and inspect the returned jobId\nIf the selected Demo-Slap match already has analyze data, continue by jobId instead of forcing analyze-by-URL\nUse or enable a deployment watchdog only when long-running analyze/render work benefits from it\nLaunch analyze or render and save the returned process/session id when applicable\nLet the watchdog deliver the result when a deployment uses one\nDisable the watchdog again after terminal delivery"
      },
      {
        "title": "4. Render in background",
        "body": "# Single highlight\npython3 -u scripts/demo_slap_render.py <JOB_ID> <HIGHLIGHT_ID> --chat-id <CHAT_ID>\n\n# Fragmovie\npython3 -u scripts/demo_slap_render.py <JOB_ID> <ID1> <ID2> ... --fragmovie --chat-id <CHAT_ID>\n\nRun with exec(background: true) and keep the returned process/session id.\n\nOptional deployment-specific watchdog pattern for OpenClaw environments:\n\nUse a watchdog only when background analyze/render work benefits from periodic delivery checks.\nReuse an existing deployment watchdog when available instead of assuming a new persistent scheduler entry is always needed.\nIf a deployment chooses to create or enable a watchdog through the built-in cron tool, keep it scoped to the active run and disable it again after terminal delivery.\nA 2 minute interval is a reasonable default.\nUse scripts/demo_slap_watchdog.sh status|tail|job only as a local helper for inspecting runtime state, logs, or deployment-specific job references.\nTreat data/state.json and data/highlights.json as the source of truth during runtime.\n\nAgent workflow:\n\nEnable or reuse a deployment watchdog only when needed for the active run\nLaunch render and save the returned process/session id\nPoll process output for the Estimated finish: line and tell the user the ETA if present\nLet the watchdog deliver the result when one is in use\nDisable the watchdog again after terminal delivery\n\nCritical: set <CHAT_ID> from inbound metadata of the originating request. Treat hardcoded chat identifiers as local examples only, not as a reusable default."
      },
      {
        "title": "5. Check status",
        "body": "Read data/state.json."
      },
      {
        "title": "Map username to Steam ID",
        "body": "python3 scripts/leetify/leetify_save_id.py <USERNAME> <STEAM_64_ID>"
      },
      {
        "title": "Configure API keys",
        "body": "Prefer environment variables:\n\nDEMOSLAP_API_KEY - required\nLEETIFY_API_KEY - optional, only for Leetify-backed match discovery\nDEMO_SLAP_WATCHDOG_JOB_ID - optional deployment-specific helper for watchdog inspection scripts\n\nSource selection rules:\n\nIf LEETIFY_API_KEY exists, use Leetify for match discovery.\nIf LEETIFY_API_KEY is absent but DEMOSLAP_API_KEY exists, use Demo-Slap /public-api/matches for match discovery.\nDEMOSLAP_API_KEY is always required for analyze/render.\n\nOptional local fallback for controlled self-hosted setups: put them in data/config.json."
      },
      {
        "title": "Support",
        "body": "For access and support, please join our Discord community: https://discord.gg/8nfh26W9wQ"
      }
    ],
    "body": "Demo-Slap Highlight Skill\n\nGenerate MP4 highlights and fragmovies from CS2 demos.\n\nThis skill is designed for OpenClaw environments where background jobs, local helper scripts, and chat-aware delivery are available. It uses Python 3 scripts and the requests package for HTTP API access.\n\nExpected runtime inputs:\n\nRequired: DEMOSLAP_API_KEY\nOptional: LEETIFY_API_KEY\nOptional deployment helper: DEMO_SLAP_WATCHDOG_JOB_ID\nScripts\n\nRun bundled scripts relative to the skill root, usually from scripts/.\n\nDemo-Slap\nScript\tPurpose\ndemo_slap_matches.py\tList recent matches from Demo-Slap /public-api/matches\ndemo_slap_resolve.py\tTry to resolve replay/demo URL from Demo-Slap match history by index; fail clearly if the API exposes only jobId\ndemo_slap_match_pick.py\tPick a Demo-Slap match by index and return structured match info including jobId\ndemo_slap_analyze.py\tSubmit a demo for analysis, poll until done, output highlights JSON\ndemo_slap_render.py\tRender one or more highlights, poll until done, output clip URL\ndemo_slap_common.py\tShared utilities (config, API calls, state)\nLeetify\nScript\tPurpose\nleetify/leetify_matches.py\tList recent matches\nleetify/leetify_resolve.py\tResolve replay URL by username + match index\nleetify/leetify_save_id.py\tSave username -> Steam64 ID mapping\nleetify/leetify_common.py\tShared Leetify utilities\nMatch source selection\nPrefer Leetify for recent match discovery when LEETIFY_API_KEY is available.\nIf LEETIFY_API_KEY is not configured but DEMOSLAP_API_KEY is available, use Demo-Slap match history from /public-api/matches.\nSwagger: https://api-doc.demo-slap.net/\nTreat Demo-Slap match history as the fallback discovery path for listing matches and selecting an existing analyzed match or replay context before analyze/render.\nRuntime files\n\nUse these files as optional local runtime state during execution:\n\ndata/state.json\ndata/highlights.json\ndata/history.log\ndata/steam_ids.json\ndata/config.json\n\nThese files are runtime helpers for local operation and are not required to understand or inspect the skill package itself.\n\nstate.json tracks the current operation:\n\n{\n  \"status\": \"idle|analyzing|rendering|done|error\",\n  \"job_id\": \"...\",\n  \"render_job_id\": \"...\",\n  \"chat_id\": \"telegram:182314856\",\n  \"clip_urls\": {\"highlight_id\": \"https://...\"},\n  \"progress\": \"polling 3/30\",\n  \"last_completed_op\": \"analyze|render\",\n  \"notification\": {\n    \"sent\": false,\n    \"sent_at\": null,\n    \"last_attempt_at\": null,\n    \"error\": null\n  },\n  \"updated_at\": \"ISO timestamp\"\n}\n\nWorkflow\n1. Find the match\n\nPreferred path when LEETIFY_API_KEY is available:\n\npython3 scripts/leetify/leetify_matches.py <USERNAME> [--limit 10]\n\n\nFallback path when LEETIFY_API_KEY is missing but DEMOSLAP_API_KEY is available:\n\npython3 scripts/demo_slap_matches.py [<USERNAME>] [--limit 10]\n\nuses Demo-Slap /public-api/matches\nuse the Demo-Slap swagger docs at https://api-doc.demo-slap.net/ if schema details are needed\nif <USERNAME> is provided and mapped, filter matches to that player's Steam ID when possible\nafter the user picks a match, run:\npython3 scripts/demo_slap_match_pick.py [<USERNAME>] --match-index <N>\n\ntreat the returned jobId as the primary handle for downstream Demo-Slap operations\n2. Resolve replay URL\n\nPreferred path when using Leetify:\n\npython3 scripts/leetify/leetify_resolve.py <USERNAME> --match-index <N>\n\n\nWhen using Demo-Slap fallback:\n\npython3 scripts/demo_slap_match_pick.py [<USERNAME>] --match-index <N>\n\nuse the returned jobId as the selected match identifier\nif demoUrl is present, you may still use analyze-by-URL\nif demoUrl is absent, skip URL resolution and continue by API endpoints that accept the existing analyze jobId\nuse GET /public-api/analyze/{jobId}/status and GET /public-api/analyze/{jobId}/data to inspect existing highlights\nif the user wants clips and highlights already exist, render directly from that jobId\n3. Analyze in background\npython3 -u scripts/demo_slap_analyze.py --url '<REPLAY_URL>' --username <USERNAME> --chat-id <CHAT_ID>\n\n\nRun with exec(background: true) and keep the returned process/session id.\n\nOptional deployment-specific watchdog pattern for OpenClaw environments:\n\nUse a watchdog only when background analyze/render work benefits from periodic delivery checks.\nReuse an existing deployment watchdog when available instead of assuming a new persistent scheduler entry is always needed.\nIf a deployment chooses to create or enable a watchdog through the built-in cron tool, keep it scoped to the active run and disable it again after terminal delivery.\nA 2 minute interval is a reasonable default.\nUse scripts/demo_slap_watchdog.sh status|tail|job only as a local helper for inspecting runtime state, logs, or deployment-specific job references.\nTreat data/state.json and data/highlights.json as the source of truth during runtime.\n\nAgent workflow:\n\nChoose the match source:\nLeetify if LEETIFY_API_KEY exists\nDemo-Slap /public-api/matches if LEETIFY_API_KEY is missing and DEMOSLAP_API_KEY exists\nIf using Leetify, resolve the replay URL and run analyze\nIf using Demo-Slap fallback, pick a match and inspect the returned jobId\nIf the selected Demo-Slap match already has analyze data, continue by jobId instead of forcing analyze-by-URL\nUse or enable a deployment watchdog only when long-running analyze/render work benefits from it\nLaunch analyze or render and save the returned process/session id when applicable\nLet the watchdog deliver the result when a deployment uses one\nDisable the watchdog again after terminal delivery\n4. Render in background\n# Single highlight\npython3 -u scripts/demo_slap_render.py <JOB_ID> <HIGHLIGHT_ID> --chat-id <CHAT_ID>\n\n# Fragmovie\npython3 -u scripts/demo_slap_render.py <JOB_ID> <ID1> <ID2> ... --fragmovie --chat-id <CHAT_ID>\n\n\nRun with exec(background: true) and keep the returned process/session id.\n\nOptional deployment-specific watchdog pattern for OpenClaw environments:\n\nUse a watchdog only when background analyze/render work benefits from periodic delivery checks.\nReuse an existing deployment watchdog when available instead of assuming a new persistent scheduler entry is always needed.\nIf a deployment chooses to create or enable a watchdog through the built-in cron tool, keep it scoped to the active run and disable it again after terminal delivery.\nA 2 minute interval is a reasonable default.\nUse scripts/demo_slap_watchdog.sh status|tail|job only as a local helper for inspecting runtime state, logs, or deployment-specific job references.\nTreat data/state.json and data/highlights.json as the source of truth during runtime.\n\nAgent workflow:\n\nEnable or reuse a deployment watchdog only when needed for the active run\nLaunch render and save the returned process/session id\nPoll process output for the Estimated finish: line and tell the user the ETA if present\nLet the watchdog deliver the result when one is in use\nDisable the watchdog again after terminal delivery\n\nCritical: set <CHAT_ID> from inbound metadata of the originating request. Treat hardcoded chat identifiers as local examples only, not as a reusable default.\n\n5. Check status\n\nRead data/state.json.\n\nSetup\nMap username to Steam ID\npython3 scripts/leetify/leetify_save_id.py <USERNAME> <STEAM_64_ID>\n\nConfigure API keys\n\nPrefer environment variables:\n\nDEMOSLAP_API_KEY - required\nLEETIFY_API_KEY - optional, only for Leetify-backed match discovery\nDEMO_SLAP_WATCHDOG_JOB_ID - optional deployment-specific helper for watchdog inspection scripts\n\nSource selection rules:\n\nIf LEETIFY_API_KEY exists, use Leetify for match discovery.\nIf LEETIFY_API_KEY is absent but DEMOSLAP_API_KEY exists, use Demo-Slap /public-api/matches for match discovery.\nDEMOSLAP_API_KEY is always required for analyze/render.\n\nOptional local fallback for controlled self-hosted setups: put them in data/config.json.\n\nSupport\n\nFor access and support, please join our Discord community: https://discord.gg/8nfh26W9wQ"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/Damirikys/demo-slap",
    "publisherUrl": "https://clawhub.ai/Damirikys/demo-slap",
    "owner": "Damirikys",
    "version": "0.1.4",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/demo-slap",
    "downloadUrl": "https://openagent3.xyz/downloads/demo-slap",
    "agentUrl": "https://openagent3.xyz/skills/demo-slap/agent",
    "manifestUrl": "https://openagent3.xyz/skills/demo-slap/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/demo-slap/agent.md"
  }
}