{
  "schemaVersion": "1.0",
  "item": {
    "slug": "ghost-admin",
    "name": "Ghost Admin",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/Romain-Grosos/ghost-admin",
    "canonicalUrl": "https://clawhub.ai/Romain-Grosos/ghost-admin",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/ghost-admin",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=ghost-admin",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "README.md",
      "SKILL.md",
      "config.example.json",
      "references/api.md",
      "references/troubleshooting.md",
      "scripts/_retry.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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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/ghost-admin"
    },
    "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/ghost-admin",
    "agentPageUrl": "https://openagent3.xyz/skills/ghost-admin/agent",
    "manifestUrl": "https://openagent3.xyz/skills/ghost-admin/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/ghost-admin/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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Ghost Skill",
        "body": "Full Ghost Admin API v5 client. HS256 JWT auth and all HTTP calls via stdlib (urllib) - zero external dependencies.\nCredentials: ~/.openclaw/secrets/ghost_creds · Config: ~/.openclaw/config/ghost/config.json"
      },
      {
        "title": "Trigger phrases",
        "body": "Load this skill immediately when the user says anything like:\n\n\"create / write / draft a blog post / article\"\n\"publish this post / article\", \"make this live on Ghost\"\n\"update / edit [post title or slug]\", \"change the title of my post\"\n\"unpublish / revert to draft [post]\"\n\"create / add a tag\", \"list my tags on Ghost\"\n\"create / update / publish a page\"\n\"upload this image to Ghost\"\n\"list my posts / drafts\", \"show me what's in draft\"\n\"schedule this post for [date]\"\n\"what's on my Ghost site?\", \"show site info\""
      },
      {
        "title": "Quick Start",
        "body": "python3 scripts/ghost.py config    # verify credentials + active config\npython3 scripts/ghost.py site      # test connection + show site info\npython3 scripts/ghost.py posts --limit 3 --fields \"id,title,status\""
      },
      {
        "title": "Setup",
        "body": "python3 scripts/setup.py       # interactive: credentials + permissions + connection test\npython3 scripts/init.py        # validate all configured permissions against live instance\n\ninit.py only runs write/delete tests when allow_delete=true. When allow_delete=false, write tests are skipped - no test artifacts are created, so none can be left behind.\n\nManual - ~/.openclaw/secrets/ghost_creds (chmod 600):\n\nGHOST_URL=https://your-ghost.example.com\nGHOST_ADMIN_KEY=id:secret_hex\n\nAdmin API Key: Ghost Admin → Settings → Integrations → Add custom integration → copy Admin API Key.\n\nconfig.json - behavior restrictions:\n\nKeyDefaultEffectallow_publishfalseallow status=published (enable explicitly to publish)allow_deletefalseallow delete posts/pages/tagsallow_member_accessfalseenable member read/writedefault_status\"draft\"status applied when not specifieddefault_tags[]tags always merged into new postsreadonly_modefalseoverride: block all writes"
      },
      {
        "title": "Storage & credentials",
        "body": "The skill reads and writes the following paths. All usage is intentional and documented:\n\nPathWritten byPurpose~/.openclaw/secrets/ghost_credssetup.pyGhost credentials (GHOST_URL, GHOST_ADMIN_KEY). chmod 600. Never committed.~/.openclaw/config/ghost/config.jsonsetup.pyBehavior restrictions (allow_publish, allow_delete, etc.). No secrets. Not in skill dir - survives clawhub updates.\n\nCredentials can also be provided via environment variables (GHOST_URL, GHOST_ADMIN_KEY). The skill checks env vars first.\n\nCleanup on uninstall: clawhub uninstall ghost-admin removes the skill directory. To also remove credentials and config:\n\npython3 scripts/setup.py --cleanup\n\nOn reinstall, any existing config at ~/.openclaw/config/ghost/config.json is picked up automatically."
      },
      {
        "title": "Module usage",
        "body": "from scripts.ghost import GhostClient\ngc = GhostClient()\npost = gc.create_post(\"My Title\", html=\"<p>Body</p>\", status=\"draft\")\ngc.publish_post(post[\"id\"])"
      },
      {
        "title": "CLI reference",
        "body": "# Posts\npython3 scripts/ghost.py posts --status published --limit 10\npython3 scripts/ghost.py posts --tag devops --fields \"id,title,published_at\"\npython3 scripts/ghost.py post <id_or_slug>\npython3 scripts/ghost.py post-create \"Title\" --html \"<p>...</p>\" --status draft\npython3 scripts/ghost.py post-create \"Title\" --html-file body.html --tags \"DevOps,Linux\"\npython3 scripts/ghost.py post-create \"Title\" --html-file body.html --feature-image \"https://...\"\npython3 scripts/ghost.py post-update <id> --fields-json '{\"title\":\"New\",\"custom_excerpt\":\"...\"}'\npython3 scripts/ghost.py post-publish <id>\npython3 scripts/ghost.py post-unpublish <id>\npython3 scripts/ghost.py post-delete <id>          # requires allow_delete: true\n\n# Pages\npython3 scripts/ghost.py pages\npython3 scripts/ghost.py page-create \"About\" --html \"<p>...</p>\"\npython3 scripts/ghost.py page-publish <id>\n\n# Tags\npython3 scripts/ghost.py tags\npython3 scripts/ghost.py tag-create \"DevOps\" --slug devops --desc \"DevOps content\"\npython3 scripts/ghost.py tag-delete <id>           # requires allow_delete: true\n\n# Images\npython3 scripts/ghost.py image-upload ./image.png --alt \"Description\"\n\n# Members & newsletters (read)\npython3 scripts/ghost.py members --limit 20        # requires allow_member_access: true\npython3 scripts/ghost.py newsletters\npython3 scripts/ghost.py tiers\n\n# Account\npython3 scripts/ghost.py site\npython3 scripts/ghost.py me\npython3 scripts/ghost.py config"
      },
      {
        "title": "Draft → review → publish",
        "body": "gc = GhostClient()\n# 1. Create draft\npost = gc.create_post(\n    title=\"My Article\",\n    html=article_html,\n    tags=[{\"name\": \"DevOps\"}, {\"name\": \"Linux\"}],\n    meta_description=\"Short SEO description\",\n    status=\"draft\",\n)\ndraft_url = f\"{gc.base_url}/ghost/#/editor/post/{post['id']}\"\n# 2. Return preview link to user for review\n# → f\"Draft created: {draft_url}\"\n# 3. After user approval:\ngc.publish_post(post[\"id\"])\n# → f\"Published: {post['url']}\""
      },
      {
        "title": "Research → structured post",
        "body": "# Create a post with full SEO metadata\npost = gc.create_post(\n    title=\"Why Rust is Taking Over Systems Programming\",\n    html=content_html,\n    custom_excerpt=\"A technical deep-dive into Rust's memory model and adoption trends.\",\n    meta_title=\"Rust Systems Programming 2025\",\n    meta_description=\"Why Rust is replacing C++ in systems programming in 2025.\",\n    og_title=\"Rust is Taking Over Systems Programming\",\n    tags=[{\"name\": \"Rust\"}, {\"name\": \"Systems\"}],\n    feature_image=\"https://example.com/rust.png\",\n    status=\"draft\",\n)"
      },
      {
        "title": "Content audit by tag",
        "body": "result = gc.list_posts(limit=\"all\", tag=\"devops\", fields=\"id,title,status,published_at\")\nposts  = result[\"posts\"]\ndrafts    = [p for p in posts if p[\"status\"] == \"draft\"]\npublished = [p for p in posts if p[\"status\"] == \"published\"]\n# → summarize backlog for user"
      },
      {
        "title": "Batch tag creation",
        "body": "for name in [\"DevOps\", \"Security\", \"Linux\", \"Cloud\"]:\n    try:\n        gc.create_tag(name, slug=name.lower())\n    except Exception:\n        pass  # already exists"
      },
      {
        "title": "Ideas",
        "body": "Set allow_publish: false + default_status: draft for a \"suggest only\" mode\nUse default_tags in config for auto-tagging (e.g. always add \"AI-assisted\")\nDraft from a research summary, share preview link, publish after human review\nList posts --status draft to surface the content backlog for triage\nUpload a feature image first, then embed the returned URL in post HTML"
      },
      {
        "title": "Notes",
        "body": "updated_at conflict guard: update_post/update_page auto-fetches updated_at if omitted.\nHTML content: Ghost v5 stores Lexical internally but html import works perfectly for agent-generated content.\nallow_publish: false: Status is silently capped to \"draft\" - no error raised.\nJWT tokens: Generated fresh per request (5-min TTL), no caching needed.\nSlug: Auto-generated from title if omitted. Override with --slug for clean URLs."
      },
      {
        "title": "Combine with",
        "body": "SkillWorkflowsummarizeSummarize a URL / PDF → draft a Ghost post from the summarytavily-searchResearch a topic → structured Ghost draft with sourcesnextcloudSave draft .md to NC → review → publish to GhostgmailForward a newsletter / article → draft Ghost post from itapi-gateway (linkedin)Publish Ghost post → cross-post excerpt to LinkedIn"
      },
      {
        "title": "API reference",
        "body": "See references/api.md for endpoint details, NQL filters, field list, and error codes."
      },
      {
        "title": "Troubleshooting",
        "body": "See references/troubleshooting.md for common errors and fixes."
      }
    ],
    "body": "Ghost Skill\n\nFull Ghost Admin API v5 client. HS256 JWT auth and all HTTP calls via stdlib (urllib) - zero external dependencies. Credentials: ~/.openclaw/secrets/ghost_creds · Config: ~/.openclaw/config/ghost/config.json\n\nTrigger phrases\n\nLoad this skill immediately when the user says anything like:\n\n\"create / write / draft a blog post / article\"\n\"publish this post / article\", \"make this live on Ghost\"\n\"update / edit [post title or slug]\", \"change the title of my post\"\n\"unpublish / revert to draft [post]\"\n\"create / add a tag\", \"list my tags on Ghost\"\n\"create / update / publish a page\"\n\"upload this image to Ghost\"\n\"list my posts / drafts\", \"show me what's in draft\"\n\"schedule this post for [date]\"\n\"what's on my Ghost site?\", \"show site info\"\nQuick Start\npython3 scripts/ghost.py config    # verify credentials + active config\npython3 scripts/ghost.py site      # test connection + show site info\npython3 scripts/ghost.py posts --limit 3 --fields \"id,title,status\"\n\nSetup\npython3 scripts/setup.py       # interactive: credentials + permissions + connection test\npython3 scripts/init.py        # validate all configured permissions against live instance\n\n\ninit.py only runs write/delete tests when allow_delete=true. When allow_delete=false, write tests are skipped - no test artifacts are created, so none can be left behind.\n\nManual - ~/.openclaw/secrets/ghost_creds (chmod 600):\n\nGHOST_URL=https://your-ghost.example.com\nGHOST_ADMIN_KEY=id:secret_hex\n\n\nAdmin API Key: Ghost Admin → Settings → Integrations → Add custom integration → copy Admin API Key.\n\nconfig.json - behavior restrictions:\n\nKey\tDefault\tEffect\nallow_publish\tfalse\tallow status=published (enable explicitly to publish)\nallow_delete\tfalse\tallow delete posts/pages/tags\nallow_member_access\tfalse\tenable member read/write\ndefault_status\t\"draft\"\tstatus applied when not specified\ndefault_tags\t[]\ttags always merged into new posts\nreadonly_mode\tfalse\toverride: block all writes\nStorage & credentials\n\nThe skill reads and writes the following paths. All usage is intentional and documented:\n\nPath\tWritten by\tPurpose\n~/.openclaw/secrets/ghost_creds\tsetup.py\tGhost credentials (GHOST_URL, GHOST_ADMIN_KEY). chmod 600. Never committed.\n~/.openclaw/config/ghost/config.json\tsetup.py\tBehavior restrictions (allow_publish, allow_delete, etc.). No secrets. Not in skill dir - survives clawhub updates.\n\nCredentials can also be provided via environment variables (GHOST_URL, GHOST_ADMIN_KEY). The skill checks env vars first.\n\nCleanup on uninstall: clawhub uninstall ghost-admin removes the skill directory. To also remove credentials and config:\n\npython3 scripts/setup.py --cleanup\n\n\nOn reinstall, any existing config at ~/.openclaw/config/ghost/config.json is picked up automatically.\n\nModule usage\nfrom scripts.ghost import GhostClient\ngc = GhostClient()\npost = gc.create_post(\"My Title\", html=\"<p>Body</p>\", status=\"draft\")\ngc.publish_post(post[\"id\"])\n\nCLI reference\n# Posts\npython3 scripts/ghost.py posts --status published --limit 10\npython3 scripts/ghost.py posts --tag devops --fields \"id,title,published_at\"\npython3 scripts/ghost.py post <id_or_slug>\npython3 scripts/ghost.py post-create \"Title\" --html \"<p>...</p>\" --status draft\npython3 scripts/ghost.py post-create \"Title\" --html-file body.html --tags \"DevOps,Linux\"\npython3 scripts/ghost.py post-create \"Title\" --html-file body.html --feature-image \"https://...\"\npython3 scripts/ghost.py post-update <id> --fields-json '{\"title\":\"New\",\"custom_excerpt\":\"...\"}'\npython3 scripts/ghost.py post-publish <id>\npython3 scripts/ghost.py post-unpublish <id>\npython3 scripts/ghost.py post-delete <id>          # requires allow_delete: true\n\n# Pages\npython3 scripts/ghost.py pages\npython3 scripts/ghost.py page-create \"About\" --html \"<p>...</p>\"\npython3 scripts/ghost.py page-publish <id>\n\n# Tags\npython3 scripts/ghost.py tags\npython3 scripts/ghost.py tag-create \"DevOps\" --slug devops --desc \"DevOps content\"\npython3 scripts/ghost.py tag-delete <id>           # requires allow_delete: true\n\n# Images\npython3 scripts/ghost.py image-upload ./image.png --alt \"Description\"\n\n# Members & newsletters (read)\npython3 scripts/ghost.py members --limit 20        # requires allow_member_access: true\npython3 scripts/ghost.py newsletters\npython3 scripts/ghost.py tiers\n\n# Account\npython3 scripts/ghost.py site\npython3 scripts/ghost.py me\npython3 scripts/ghost.py config\n\nTemplates\nDraft → review → publish\ngc = GhostClient()\n# 1. Create draft\npost = gc.create_post(\n    title=\"My Article\",\n    html=article_html,\n    tags=[{\"name\": \"DevOps\"}, {\"name\": \"Linux\"}],\n    meta_description=\"Short SEO description\",\n    status=\"draft\",\n)\ndraft_url = f\"{gc.base_url}/ghost/#/editor/post/{post['id']}\"\n# 2. Return preview link to user for review\n# → f\"Draft created: {draft_url}\"\n# 3. After user approval:\ngc.publish_post(post[\"id\"])\n# → f\"Published: {post['url']}\"\n\nResearch → structured post\n# Create a post with full SEO metadata\npost = gc.create_post(\n    title=\"Why Rust is Taking Over Systems Programming\",\n    html=content_html,\n    custom_excerpt=\"A technical deep-dive into Rust's memory model and adoption trends.\",\n    meta_title=\"Rust Systems Programming 2025\",\n    meta_description=\"Why Rust is replacing C++ in systems programming in 2025.\",\n    og_title=\"Rust is Taking Over Systems Programming\",\n    tags=[{\"name\": \"Rust\"}, {\"name\": \"Systems\"}],\n    feature_image=\"https://example.com/rust.png\",\n    status=\"draft\",\n)\n\nContent audit by tag\nresult = gc.list_posts(limit=\"all\", tag=\"devops\", fields=\"id,title,status,published_at\")\nposts  = result[\"posts\"]\ndrafts    = [p for p in posts if p[\"status\"] == \"draft\"]\npublished = [p for p in posts if p[\"status\"] == \"published\"]\n# → summarize backlog for user\n\nBatch tag creation\nfor name in [\"DevOps\", \"Security\", \"Linux\", \"Cloud\"]:\n    try:\n        gc.create_tag(name, slug=name.lower())\n    except Exception:\n        pass  # already exists\n\nIdeas\nSet allow_publish: false + default_status: draft for a \"suggest only\" mode\nUse default_tags in config for auto-tagging (e.g. always add \"AI-assisted\")\nDraft from a research summary, share preview link, publish after human review\nList posts --status draft to surface the content backlog for triage\nUpload a feature image first, then embed the returned URL in post HTML\nNotes\nupdated_at conflict guard: update_post/update_page auto-fetches updated_at if omitted.\nHTML content: Ghost v5 stores Lexical internally but html import works perfectly for agent-generated content.\nallow_publish: false: Status is silently capped to \"draft\" - no error raised.\nJWT tokens: Generated fresh per request (5-min TTL), no caching needed.\nSlug: Auto-generated from title if omitted. Override with --slug for clean URLs.\nCombine with\nSkill\tWorkflow\nsummarize\tSummarize a URL / PDF → draft a Ghost post from the summary\ntavily-search\tResearch a topic → structured Ghost draft with sources\nnextcloud\tSave draft .md to NC → review → publish to Ghost\ngmail\tForward a newsletter / article → draft Ghost post from it\napi-gateway (linkedin)\tPublish Ghost post → cross-post excerpt to LinkedIn\nAPI reference\n\nSee references/api.md for endpoint details, NQL filters, field list, and error codes.\n\nTroubleshooting\n\nSee references/troubleshooting.md for common errors and fixes."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/Romain-Grosos/ghost-admin",
    "publisherUrl": "https://clawhub.ai/Romain-Grosos/ghost-admin",
    "owner": "Romain-Grosos",
    "version": "1.2.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/ghost-admin",
    "downloadUrl": "https://openagent3.xyz/downloads/ghost-admin",
    "agentUrl": "https://openagent3.xyz/skills/ghost-admin/agent",
    "manifestUrl": "https://openagent3.xyz/skills/ghost-admin/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/ghost-admin/agent.md"
  }
}