{
  "schemaVersion": "1.0",
  "item": {
    "slug": "disclaw",
    "name": "Disclaw",
    "source": "tencent",
    "type": "skill",
    "category": "效率提升",
    "sourceUrl": "https://clawhub.ai/ofan/disclaw",
    "canonicalUrl": "https://clawhub.ai/ofan/disclaw",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/disclaw",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=disclaw",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "_meta.json"
    ],
    "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-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.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/disclaw"
    },
    "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/disclaw",
    "agentPageUrl": "https://openagent3.xyz/skills/disclaw/agent",
    "manifestUrl": "https://openagent3.xyz/skills/disclaw/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/disclaw/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": "Disclaw — Discord Structure as Code",
        "body": "Disclaw manages Discord workspace structure (categories, channels, threads) and OpenClaw agent-to-channel bindings as code via a YAML config file.\n\nDisclaw vs Discord plugin: Disclaw manages structure (create/rename/delete channels, categories, threads; manage bindings and routing gates). The Discord plugin manages messaging (send/receive, reactions, pins, thread replies). They do not conflict."
      },
      {
        "title": "Installation",
        "body": "npm install -g @ofan/disclaw\ndisclaw --version"
      },
      {
        "title": "Prerequisites",
        "body": "Discord bot token must be in OpenClaw config at channels.discord.token\nGateway API access — add to openclaw.json:\n{ gateway: { tools: { allow: [\"gateway\"] } } }\n\nThis lets disclaw read/write config via the gateway API. Without it, disclaw falls back to CLI.\nConfig file — create disclaw.yaml in the workspace (see format below)"
      },
      {
        "title": "Verify Setup",
        "body": "disclaw validate -c disclaw.yaml\ndisclaw diff -c disclaw.yaml"
      },
      {
        "title": "Config File Format",
        "body": "The config file (disclaw.yaml) declares the desired state of Discord workspace structure.\n\nversion: 1\nmanagedBy: disclaw\nguild: \"YOUR_GUILD_ID\"\n\nchannels:\n  # Standalone channel (no category)\n  - name: announcements\n    topic: \"Important announcements\"\n\n  # Category with channels\n  - category: Engineering\n    channels:\n      - name: general\n        threads: [Standup, Retro]\n      - name: alerts\n        topic: \"Automated alerts only\"\n\n  # Another category\n  - category: Support\n    channels:\n      - name: tickets\n      - name: escalations\n\n# OpenClaw agent bindings (optional)\nopenclaw:\n  requireMention: false\n  agents:\n    main: general              # single channel\n    siren: [general, alerts]   # multiple channels\n    support:                   # with options\n      channel: tickets\n      requireMention: true"
      },
      {
        "title": "Key rules",
        "body": "guild is the Discord server ID (right-click server → Copy Server ID)\nChannel names must be lowercase, no spaces (Discord enforces this)\nThread names can have spaces and mixed case\nAgent bindings reference channel names from the channels section\nrequireMention controls whether the bot needs @mention to respond in that channel"
      },
      {
        "title": "disclaw diff — Show what would change",
        "body": "disclaw diff -c disclaw.yaml\ndisclaw diff -c disclaw.yaml --json          # structured output\ndisclaw diff -c disclaw.yaml --channel alerts # filter by channel\n\nShows: managed resources (create/update/delete/noop), unmanaged resources, unbound agents, stale agents, routing health warnings, and pinned messages."
      },
      {
        "title": "disclaw apply — Apply changes (dry-run by default)",
        "body": "disclaw apply -c disclaw.yaml          # dry-run (shows what would change)\ndisclaw apply -c disclaw.yaml --yes    # actually apply changes\ndisclaw apply -c disclaw.yaml --prune --yes  # also delete unmanaged resources\n\nSafety: Always takes a snapshot before mutating. Creates before deletes. Bindings and routing gates are updated atomically."
      },
      {
        "title": "disclaw import — Import unmanaged Discord resources",
        "body": "disclaw import -c disclaw.yaml          # dry-run (shows what would be imported)\ndisclaw import -c disclaw.yaml --yes    # write to config file\n\nDiscovers Discord channels/categories/threads not in the config and adds them. Also finds unbound OpenClaw agents."
      },
      {
        "title": "disclaw rollback — Restore from snapshot",
        "body": "disclaw rollback -c disclaw.yaml          # dry-run\ndisclaw rollback -c disclaw.yaml --yes    # actually rollback\n\nRestores Discord state from the most recent pre-apply snapshot. Drift-aware (shows what changed since the snapshot)."
      },
      {
        "title": "disclaw validate — Validate config (no API calls)",
        "body": "disclaw validate -c disclaw.yaml\ndisclaw validate -c disclaw.yaml --json\n\nSafe for CI. Checks: schema validity, empty names, duplicate channels/threads, binding refs pointing to non-existent channels."
      },
      {
        "title": "Filter flags (diff, apply, import)",
        "body": "--category <names...>   # filter by category name\n--channel <names...>    # filter by channel name\n--thread <names...>     # filter by thread name\n--agent <names...>      # filter by agent name\n--json                  # structured JSON output"
      },
      {
        "title": "Gateway options (all commands except validate)",
        "body": "--gateway-url <url>     # override gateway URL (default: http://127.0.0.1:18789)\n--gateway-token <token> # override gateway auth token\n\nAlso via env vars: OPENCLAW_GATEWAY_URL, OPENCLAW_GATEWAY_TOKEN."
      },
      {
        "title": "Add a new channel",
        "body": "Edit disclaw.yaml — add channel under the appropriate category\nValidate: disclaw validate -c disclaw.yaml\nPreview: disclaw diff -c disclaw.yaml\nApply: disclaw apply -c disclaw.yaml --yes"
      },
      {
        "title": "Bind an agent to a channel",
        "body": "Edit disclaw.yaml — add entry under openclaw.agents\nPreview: disclaw diff -c disclaw.yaml\nApply: disclaw apply -c disclaw.yaml --yes\n\nThis creates the binding AND allowlists the channel in routing gates automatically."
      },
      {
        "title": "Import existing Discord channels",
        "body": "Run: disclaw import -c disclaw.yaml (dry-run to preview)\nReview the output\nRun: disclaw import -c disclaw.yaml --yes (writes to config)\nVerify: disclaw diff -c disclaw.yaml"
      },
      {
        "title": "Delete a channel",
        "body": "Remove the channel from disclaw.yaml\nPreview: disclaw apply -c disclaw.yaml --prune\nApply: disclaw apply -c disclaw.yaml --prune --yes\n\nWarning: --prune is required for deletions. Without it, removed channels are shown as \"unmanaged\" but not deleted."
      },
      {
        "title": "Rename a channel",
        "body": "Change the channel name in disclaw.yaml\nPreview: disclaw diff -c disclaw.yaml (shows delete old + create new)\nApply: disclaw apply -c disclaw.yaml --yes\n\nNote: Discord doesn't support true renames via API — disclaw creates the new channel and (with --prune) deletes the old one."
      },
      {
        "title": "Troubleshooting",
        "body": "\"Discord bot token not found\"\n\nEnsure channels.discord.token is set in openclaw.json\nOr set DISCORD_BOT_TOKEN env var\n\n\"Gateway tool not available\"\n\nAdd gateway.tools.allow: [\"gateway\"] to openclaw.json\nOr disclaw will fall back to CLI automatically\n\n\"Gateway auth failed\"\n\nCheck OPENCLAW_GATEWAY_TOKEN env var matches gateway.auth.token in config\nOr pass --gateway-token <token>\n\n\"OpenClaw CLI timed out\"\n\nCheck if the gateway is running: openclaw status\nCheck network: curl http://127.0.0.1:18789/\n\n\"Discord connection timed out\"\n\nCheck internet connectivity\nVerify bot token is valid\nTry again (Discord API can be flaky)\n\n\"Permission denied\" during apply\n\nBot needs: Manage Channels, Manage Threads permissions\nCheck bot role position in Discord server settings"
      },
      {
        "title": "Safety",
        "body": "Dry-run by default — all mutating commands require --yes\nSnapshot before apply — automatic, saved to .disclaw/snapshots/\nRollback available — disclaw rollback -c disclaw.yaml --yes\nManaged-scope only — disclaw only touches resources in the config\nCreates before deletes — safer ordering during apply\nValidation — config is validated before any API calls"
      }
    ],
    "body": "Disclaw — Discord Structure as Code\n\nDisclaw manages Discord workspace structure (categories, channels, threads) and OpenClaw agent-to-channel bindings as code via a YAML config file.\n\nDisclaw vs Discord plugin: Disclaw manages structure (create/rename/delete channels, categories, threads; manage bindings and routing gates). The Discord plugin manages messaging (send/receive, reactions, pins, thread replies). They do not conflict.\n\nInstallation\nnpm install -g @ofan/disclaw\ndisclaw --version\n\nPrerequisites\nDiscord bot token must be in OpenClaw config at channels.discord.token\nGateway API access — add to openclaw.json:\n{ gateway: { tools: { allow: [\"gateway\"] } } }\n\nThis lets disclaw read/write config via the gateway API. Without it, disclaw falls back to CLI.\nConfig file — create disclaw.yaml in the workspace (see format below)\nVerify Setup\ndisclaw validate -c disclaw.yaml\ndisclaw diff -c disclaw.yaml\n\nConfig File Format\n\nThe config file (disclaw.yaml) declares the desired state of Discord workspace structure.\n\nversion: 1\nmanagedBy: disclaw\nguild: \"YOUR_GUILD_ID\"\n\nchannels:\n  # Standalone channel (no category)\n  - name: announcements\n    topic: \"Important announcements\"\n\n  # Category with channels\n  - category: Engineering\n    channels:\n      - name: general\n        threads: [Standup, Retro]\n      - name: alerts\n        topic: \"Automated alerts only\"\n\n  # Another category\n  - category: Support\n    channels:\n      - name: tickets\n      - name: escalations\n\n# OpenClaw agent bindings (optional)\nopenclaw:\n  requireMention: false\n  agents:\n    main: general              # single channel\n    siren: [general, alerts]   # multiple channels\n    support:                   # with options\n      channel: tickets\n      requireMention: true\n\nKey rules\nguild is the Discord server ID (right-click server → Copy Server ID)\nChannel names must be lowercase, no spaces (Discord enforces this)\nThread names can have spaces and mixed case\nAgent bindings reference channel names from the channels section\nrequireMention controls whether the bot needs @mention to respond in that channel\nCommands\ndisclaw diff — Show what would change\ndisclaw diff -c disclaw.yaml\ndisclaw diff -c disclaw.yaml --json          # structured output\ndisclaw diff -c disclaw.yaml --channel alerts # filter by channel\n\n\nShows: managed resources (create/update/delete/noop), unmanaged resources, unbound agents, stale agents, routing health warnings, and pinned messages.\n\ndisclaw apply — Apply changes (dry-run by default)\ndisclaw apply -c disclaw.yaml          # dry-run (shows what would change)\ndisclaw apply -c disclaw.yaml --yes    # actually apply changes\ndisclaw apply -c disclaw.yaml --prune --yes  # also delete unmanaged resources\n\n\nSafety: Always takes a snapshot before mutating. Creates before deletes. Bindings and routing gates are updated atomically.\n\ndisclaw import — Import unmanaged Discord resources\ndisclaw import -c disclaw.yaml          # dry-run (shows what would be imported)\ndisclaw import -c disclaw.yaml --yes    # write to config file\n\n\nDiscovers Discord channels/categories/threads not in the config and adds them. Also finds unbound OpenClaw agents.\n\ndisclaw rollback — Restore from snapshot\ndisclaw rollback -c disclaw.yaml          # dry-run\ndisclaw rollback -c disclaw.yaml --yes    # actually rollback\n\n\nRestores Discord state from the most recent pre-apply snapshot. Drift-aware (shows what changed since the snapshot).\n\ndisclaw validate — Validate config (no API calls)\ndisclaw validate -c disclaw.yaml\ndisclaw validate -c disclaw.yaml --json\n\n\nSafe for CI. Checks: schema validity, empty names, duplicate channels/threads, binding refs pointing to non-existent channels.\n\nFilter flags (diff, apply, import)\n--category <names...>   # filter by category name\n--channel <names...>    # filter by channel name\n--thread <names...>     # filter by thread name\n--agent <names...>      # filter by agent name\n--json                  # structured JSON output\n\nGateway options (all commands except validate)\n--gateway-url <url>     # override gateway URL (default: http://127.0.0.1:18789)\n--gateway-token <token> # override gateway auth token\n\n\nAlso via env vars: OPENCLAW_GATEWAY_URL, OPENCLAW_GATEWAY_TOKEN.\n\nCommon Workflows\nAdd a new channel\nEdit disclaw.yaml — add channel under the appropriate category\nValidate: disclaw validate -c disclaw.yaml\nPreview: disclaw diff -c disclaw.yaml\nApply: disclaw apply -c disclaw.yaml --yes\nBind an agent to a channel\nEdit disclaw.yaml — add entry under openclaw.agents\nPreview: disclaw diff -c disclaw.yaml\nApply: disclaw apply -c disclaw.yaml --yes\n\nThis creates the binding AND allowlists the channel in routing gates automatically.\n\nImport existing Discord channels\nRun: disclaw import -c disclaw.yaml (dry-run to preview)\nReview the output\nRun: disclaw import -c disclaw.yaml --yes (writes to config)\nVerify: disclaw diff -c disclaw.yaml\nDelete a channel\nRemove the channel from disclaw.yaml\nPreview: disclaw apply -c disclaw.yaml --prune\nApply: disclaw apply -c disclaw.yaml --prune --yes\n\nWarning: --prune is required for deletions. Without it, removed channels are shown as \"unmanaged\" but not deleted.\n\nRename a channel\nChange the channel name in disclaw.yaml\nPreview: disclaw diff -c disclaw.yaml (shows delete old + create new)\nApply: disclaw apply -c disclaw.yaml --yes\n\nNote: Discord doesn't support true renames via API — disclaw creates the new channel and (with --prune) deletes the old one.\n\nTroubleshooting\n\n\"Discord bot token not found\"\n\nEnsure channels.discord.token is set in openclaw.json\nOr set DISCORD_BOT_TOKEN env var\n\n\"Gateway tool not available\"\n\nAdd gateway.tools.allow: [\"gateway\"] to openclaw.json\nOr disclaw will fall back to CLI automatically\n\n\"Gateway auth failed\"\n\nCheck OPENCLAW_GATEWAY_TOKEN env var matches gateway.auth.token in config\nOr pass --gateway-token <token>\n\n\"OpenClaw CLI timed out\"\n\nCheck if the gateway is running: openclaw status\nCheck network: curl http://127.0.0.1:18789/\n\n\"Discord connection timed out\"\n\nCheck internet connectivity\nVerify bot token is valid\nTry again (Discord API can be flaky)\n\n\"Permission denied\" during apply\n\nBot needs: Manage Channels, Manage Threads permissions\nCheck bot role position in Discord server settings\nSafety\nDry-run by default — all mutating commands require --yes\nSnapshot before apply — automatic, saved to .disclaw/snapshots/\nRollback available — disclaw rollback -c disclaw.yaml --yes\nManaged-scope only — disclaw only touches resources in the config\nCreates before deletes — safer ordering during apply\nValidation — config is validated before any API calls"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/ofan/disclaw",
    "publisherUrl": "https://clawhub.ai/ofan/disclaw",
    "owner": "ofan",
    "version": "1.1.2",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/disclaw",
    "downloadUrl": "https://openagent3.xyz/downloads/disclaw",
    "agentUrl": "https://openagent3.xyz/skills/disclaw/agent",
    "manifestUrl": "https://openagent3.xyz/skills/disclaw/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/disclaw/agent.md"
  }
}