{
  "schemaVersion": "1.0",
  "item": {
    "slug": "blog-content-publish",
    "name": "Blog Content Publish",
    "source": "tencent",
    "type": "skill",
    "category": "内容创作",
    "sourceUrl": "https://clawhub.ai/leeguooooo/blog-content-publish",
    "canonicalUrl": "https://clawhub.ai/leeguooooo/blog-content-publish",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/blog-content-publish",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=blog-content-publish",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "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/blog-content-publish"
    },
    "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/blog-content-publish",
    "agentPageUrl": "https://openagent3.xyz/skills/blog-content-publish/agent",
    "manifestUrl": "https://openagent3.xyz/skills/blog-content-publish/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/blog-content-publish/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": "Goal",
        "body": "Canonical npm package name is @leeguoo/blog-publish (single source of truth).\nUse blog-publish to publish normal blog content and dynamic section content.\nKeep dynamic section publishing compliant with no public producer leakage.\nReuse one skill across editorial, hot, news, and ai_news.\nEnforce deterministic quality rules so auto-published News/Hot briefs are readable and source-grounded.\nUse the image upload path in blog-publish to generate CDN-hosted markdown URLs for embedded assets."
      },
      {
        "title": "When to Use",
        "body": "Publishing normal editorial posts.\nPublishing dynamic section posts under hot/news/ai_news.\nRunning batch skill sync to ClawHub."
      },
      {
        "title": "Inputs",
        "body": "Required for all entries:\n\nlocale\nslug\ntitle\nsummary\ncontentMarkdown\n\n\nRequired for dynamic sections:\n\nsection (hot, news, or ai_news)\n\n\nOptional:\n\npairId (if omitted, server falls back to slug)\nrepoUrl\nsourceUrl\npublicSourceLabel\ntags\ndecisionMeta\nproducer (internal only, never for public display)"
      },
      {
        "title": "Quality Gates (Required for hot/news/ai_news)",
        "body": "Output shape:\n\nTitle + short deck (summary) + structured body.\nBody must contain numbered topics (## 1) ..., ## 2) ...) and a closing takeaways section.\nDynamic briefs should normally contain 4-8 topics; reject outputs with only 1-2 thin topics unless the source itself is extremely short.\n\n\nTopic quality:\n\nEach topic must include exactly five lines:\n\n来源/Source\n证据/Evidence\n摘要/Summary\n解读/Interpretation\n行动建议/Action\n\n\n证据/Evidence must point to a concrete anchor (release bullet / PR / issue / official doc section), not only homepage-level links.\n摘要/Summary is factual and source-grounded.\n解读/Interpretation is inference/opinion and must not fabricate facts; include explicit impact level (P0/P1/P2).\n行动建议/Action must be executable (for example: \"upgrade now\", \"canary first\", \"hold and monitor\").\n\n\nLink format:\n\nDo not publish naked URLs in prose or list items.\nUse Markdown links only: [来源标题](https://...).\nOne topic should have one primary source link + one evidence link when available.\nAvoid same-link repetition across all topics; evidence links should be topic-specific whenever possible.\n\n\nForbidden patterns:\n\nNo \"据说/rumor/未证实\" style claims without attribution.\nNo placeholder text (TBD, 待补充, lorem ipsum).\nNo leaked render placeholders (INLINE_CODE, RUBYPH, @@...@@).\nNo exposing internal producer identity in byline/meta/body (for example: \"generated by skill/openclaw bot\").\nMentioning OpenClaw is allowed when it is the article subject, not the publisher identity."
      },
      {
        "title": "Quality Score (Publish Threshold)",
        "body": "Score each topic on 3 axes (0-2 each):\n\nEvidence quality: traceable and specific.\nSummary clarity: factual, concise, no ambiguity.\nActionability: recommendation can be executed.\n\n\nReject publish if:\n\nAny topic total score < 4, or\nAny topic missing Evidence/Action."
      },
      {
        "title": "Body Template (news / hot / ai_news)",
        "body": "# {{title}}\n\n更新时间：{{timestamp}}  \n数据来源：{{source_set}}\n\n> 说明：本期每条热点均包含「摘要 + 解读」。\n\n## 1) {{topic_title}}\n- 来源：[{{source_name}}]({{url}})\n- 证据：[{{evidence_anchor}}]({{evidence_url}})\n- 摘要：{{fact_summary}}\n- 解读（P1）：{{implication}}\n- 行动建议：{{operator_action}}\n\n## 2) {{topic_title}}\n- 来源：[{{source_name}}]({{url}})\n- 证据：[{{evidence_anchor}}]({{evidence_url}})\n- 摘要：{{fact_summary}}\n- 解读（P2）：{{implication}}\n- 行动建议：{{operator_action}}\n\n## 总结\n1. {{takeaway_1}}\n2. {{takeaway_2}}\n3. {{takeaway_3}}"
      },
      {
        "title": "Preflight Checks",
        "body": "Before publish, run dry-run and fail fast on quality violations:\n\nblog-publish publish --dry-run --input <file>.json\nblog-publish publish --dry-run --input <file>.md\n\n\nQuick markdown guardrails (example):\n\nReject naked links: rg -n \"(^|[^\\\\]\\\\()https?://\" against generated markdown files.\nReject leaked render placeholders: rg -n \"INLINE_CODE|RUBYPH|@@[A-Z0-9_]+@@\" against generated markdown files.\nVerify each topic has Source + Evidence + Summary + Interpretation + Action.\nVerify each interpretation includes risk level label (P0|P1|P2).\nVerify evidence links are not all identical across every topic.\nIf pairId is missing, ensure slug is stable because server uses it for localization grouping.\n\n\nOnly proceed to real publish when dry-run is clean."
      },
      {
        "title": "Publishing Rules",
        "body": "Default section is editorial when absent.\nblog-publish publish and blog-publish update both accept JSON payload files and markdown files with frontmatter.\nUse blog-publish post-list to discover existing locale + slug pairs before editing existing posts.\nUse blog-publish download to export stored content into editable markdown frontmatter, then feed that file back into blog-publish update.\nSingle-language submit is supported for all sections; server handles auto-localization.\nAuto-generated section content is free by default and does not enter premium gating.\nKeep producer as internal metadata only; public surfaces must use publicSourceLabel or section label."
      },
      {
        "title": "Command Playbook",
        "body": "Auth:\n\npnpm add -g @leeguoo/blog-publish\nblog-publish login --api-base https://blog.misonote.com --sso-client-id misonote-blog-web --sso-redirect-uri https://blog.misonote.com/auth/callback\nblog-publish whoami\nblog-publish post-list --api-base https://blog.misonote.com --locale zh\nblog-publish download --api-base https://blog.misonote.com --locale zh --slug <slug> --output ./drafts/<slug>.zh.md\nblog-publish upload --api-base https://blog.misonote.com --file ./assets/cover.png --markdown-only\nblog-publish upload --api-base https://blog.misonote.com --file ./assets/cover.png --filename cover-final.png\n\n\nAutomation Auth (OpenClaw/CI):\n\nUse service token only: PUBLISH_API_TOKEN=<secret>\nPreflight: blog-publish whoami --api-base https://blog.misonote.com\nNever prompt end users to complete browser authorization links.\n\n\nPublish:\n\nblog-publish publish --dry-run --input <file>.json\nblog-publish publish --dry-run --input <file>.md\nblog-publish publish --input <file>.json\nblog-publish publish --input <file>.md\nblog-publish update --dry-run --input <file>.md\nblog-publish update --input <file>.md"
      },
      {
        "title": "Media Notes",
        "body": "Publish API now uses MEDIA_CDN_BASE_URL and emits image markdown URLs like:\n\nhttps://img.leeguoo.com/media/<asset-id>/<filename>\n\n\nRepeated uploads of the same file are deduplicated by SHA-256 and return:\n\ndeduped: true and the existing asset.id instead of creating a duplicate.\n\n\nKeep img.leeguoo.com as the canonical image host in generated markdown to leverage Cloudflare CDN + cache.\nSkill sync:\n\npnpm clawhub:sync:dry-run\npnpm clawhub:sync:all\n\n\nAlias compatible with team wording (clawdhub sync all):\n\npnpm clawdhub:sync:dry-run\npnpm clawdhub:sync:all"
      },
      {
        "title": "Failure Handling",
        "body": "Publish failure:\n\nCheck API status code and error payload first.\nFix validation issues (required fields, auth scope), then retry.\nIf quality gates fail, regenerate the current locale content and retry.\nIf login gets wrong client/redirect values, remove environment overrides (BLOG_PUBLISH_SSO_CLIENT_ID, BLOG_PUBLISH_SSO_REDIRECT_URI) and rerun strict login command.\nIf running in automation and error is PUBLISH_UNAUTHORIZED, stop interactive login attempts, rotate PUBLISH_API_TOKEN, then retry publish.\n\n\nSync failure:\n\nRecord error output and alert maintainers.\nDo not block already-published content visibility.\nRetry sync after login/permission/network issues are resolved."
      }
    ],
    "body": "Goal\nCanonical npm package name is @leeguoo/blog-publish (single source of truth).\nUse blog-publish to publish normal blog content and dynamic section content.\nKeep dynamic section publishing compliant with no public producer leakage.\nReuse one skill across editorial, hot, news, and ai_news.\nEnforce deterministic quality rules so auto-published News/Hot briefs are readable and source-grounded.\nUse the image upload path in blog-publish to generate CDN-hosted markdown URLs for embedded assets.\nWhen to Use\nPublishing normal editorial posts.\nPublishing dynamic section posts under hot/news/ai_news.\nRunning batch skill sync to ClawHub.\nInputs\nRequired for all entries:\nlocale\nslug\ntitle\nsummary\ncontentMarkdown\nRequired for dynamic sections:\nsection (hot, news, or ai_news)\nOptional:\npairId (if omitted, server falls back to slug)\nrepoUrl\nsourceUrl\npublicSourceLabel\ntags\ndecisionMeta\nproducer (internal only, never for public display)\nQuality Gates (Required for hot/news/ai_news)\nOutput shape:\nTitle + short deck (summary) + structured body.\nBody must contain numbered topics (## 1) ..., ## 2) ...) and a closing takeaways section.\nDynamic briefs should normally contain 4-8 topics; reject outputs with only 1-2 thin topics unless the source itself is extremely short.\nTopic quality:\nEach topic must include exactly five lines:\n来源/Source\n证据/Evidence\n摘要/Summary\n解读/Interpretation\n行动建议/Action\n证据/Evidence must point to a concrete anchor (release bullet / PR / issue / official doc section), not only homepage-level links.\n摘要/Summary is factual and source-grounded.\n解读/Interpretation is inference/opinion and must not fabricate facts; include explicit impact level (P0/P1/P2).\n行动建议/Action must be executable (for example: \"upgrade now\", \"canary first\", \"hold and monitor\").\nLink format:\nDo not publish naked URLs in prose or list items.\nUse Markdown links only: [来源标题](https://...).\nOne topic should have one primary source link + one evidence link when available.\nAvoid same-link repetition across all topics; evidence links should be topic-specific whenever possible.\nForbidden patterns:\nNo \"据说/rumor/未证实\" style claims without attribution.\nNo placeholder text (TBD, 待补充, lorem ipsum).\nNo leaked render placeholders (INLINE_CODE, RUBYPH, @@...@@).\nNo exposing internal producer identity in byline/meta/body (for example: \"generated by skill/openclaw bot\").\nMentioning OpenClaw is allowed when it is the article subject, not the publisher identity.\nQuality Score (Publish Threshold)\nScore each topic on 3 axes (0-2 each):\nEvidence quality: traceable and specific.\nSummary clarity: factual, concise, no ambiguity.\nActionability: recommendation can be executed.\nReject publish if:\nAny topic total score < 4, or\nAny topic missing Evidence/Action.\nBody Template (news / hot / ai_news)\n# {{title}}\n\n更新时间：{{timestamp}}  \n数据来源：{{source_set}}\n\n> 说明：本期每条热点均包含「摘要 + 解读」。\n\n## 1) {{topic_title}}\n- 来源：[{{source_name}}]({{url}})\n- 证据：[{{evidence_anchor}}]({{evidence_url}})\n- 摘要：{{fact_summary}}\n- 解读（P1）：{{implication}}\n- 行动建议：{{operator_action}}\n\n## 2) {{topic_title}}\n- 来源：[{{source_name}}]({{url}})\n- 证据：[{{evidence_anchor}}]({{evidence_url}})\n- 摘要：{{fact_summary}}\n- 解读（P2）：{{implication}}\n- 行动建议：{{operator_action}}\n\n## 总结\n1. {{takeaway_1}}\n2. {{takeaway_2}}\n3. {{takeaway_3}}\n\nPreflight Checks\nBefore publish, run dry-run and fail fast on quality violations:\nblog-publish publish --dry-run --input <file>.json\nblog-publish publish --dry-run --input <file>.md\nQuick markdown guardrails (example):\nReject naked links: rg -n \"(^|[^\\\\]\\\\()https?://\" against generated markdown files.\nReject leaked render placeholders: rg -n \"INLINE_CODE|RUBYPH|@@[A-Z0-9_]+@@\" against generated markdown files.\nVerify each topic has Source + Evidence + Summary + Interpretation + Action.\nVerify each interpretation includes risk level label (P0|P1|P2).\nVerify evidence links are not all identical across every topic.\nIf pairId is missing, ensure slug is stable because server uses it for localization grouping.\nOnly proceed to real publish when dry-run is clean.\nPublishing Rules\nDefault section is editorial when absent.\nblog-publish publish and blog-publish update both accept JSON payload files and markdown files with frontmatter.\nUse blog-publish post-list to discover existing locale + slug pairs before editing existing posts.\nUse blog-publish download to export stored content into editable markdown frontmatter, then feed that file back into blog-publish update.\nSingle-language submit is supported for all sections; server handles auto-localization.\nAuto-generated section content is free by default and does not enter premium gating.\nKeep producer as internal metadata only; public surfaces must use publicSourceLabel or section label.\nCommand Playbook\nAuth:\npnpm add -g @leeguoo/blog-publish\nblog-publish login --api-base https://blog.misonote.com --sso-client-id misonote-blog-web --sso-redirect-uri https://blog.misonote.com/auth/callback\nblog-publish whoami\nblog-publish post-list --api-base https://blog.misonote.com --locale zh\nblog-publish download --api-base https://blog.misonote.com --locale zh --slug <slug> --output ./drafts/<slug>.zh.md\nblog-publish upload --api-base https://blog.misonote.com --file ./assets/cover.png --markdown-only\nblog-publish upload --api-base https://blog.misonote.com --file ./assets/cover.png --filename cover-final.png\nAutomation Auth (OpenClaw/CI):\nUse service token only: PUBLISH_API_TOKEN=<secret>\nPreflight: blog-publish whoami --api-base https://blog.misonote.com\nNever prompt end users to complete browser authorization links.\nPublish:\nblog-publish publish --dry-run --input <file>.json\nblog-publish publish --dry-run --input <file>.md\nblog-publish publish --input <file>.json\nblog-publish publish --input <file>.md\nblog-publish update --dry-run --input <file>.md\nblog-publish update --input <file>.md\nMedia Notes\nPublish API now uses MEDIA_CDN_BASE_URL and emits image markdown URLs like:\nhttps://img.leeguoo.com/media/<asset-id>/<filename>\nRepeated uploads of the same file are deduplicated by SHA-256 and return:\ndeduped: true and the existing asset.id instead of creating a duplicate.\nKeep img.leeguoo.com as the canonical image host in generated markdown to leverage Cloudflare CDN + cache.\nSkill sync:\npnpm clawhub:sync:dry-run\npnpm clawhub:sync:all\nAlias compatible with team wording (clawdhub sync all):\npnpm clawdhub:sync:dry-run\npnpm clawdhub:sync:all\nFailure Handling\nPublish failure:\nCheck API status code and error payload first.\nFix validation issues (required fields, auth scope), then retry.\nIf quality gates fail, regenerate the current locale content and retry.\nIf login gets wrong client/redirect values, remove environment overrides (BLOG_PUBLISH_SSO_CLIENT_ID, BLOG_PUBLISH_SSO_REDIRECT_URI) and rerun strict login command.\nIf running in automation and error is PUBLISH_UNAUTHORIZED, stop interactive login attempts, rotate PUBLISH_API_TOKEN, then retry publish.\nSync failure:\nRecord error output and alert maintainers.\nDo not block already-published content visibility.\nRetry sync after login/permission/network issues are resolved."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/leeguooooo/blog-content-publish",
    "publisherUrl": "https://clawhub.ai/leeguooooo/blog-content-publish",
    "owner": "leeguooooo",
    "version": "1.0.8",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/blog-content-publish",
    "downloadUrl": "https://openagent3.xyz/downloads/blog-content-publish",
    "agentUrl": "https://openagent3.xyz/skills/blog-content-publish/agent",
    "manifestUrl": "https://openagent3.xyz/skills/blog-content-publish/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/blog-content-publish/agent.md"
  }
}