请参见原始 SKILL.md 内容(由于长度限制,未在此重复)
- Canonical npm package name is
@leeguoo/blog-publish (single source of truth).
- Use
blog-publish to publish normal blog content and dynamic section content.
- Keep dynamic section publishing compliant with no public
producer leakage.
- Reuse one skill across
editorial, hot, news, and ai_news.
- Enforce deterministic quality rules so auto-published News/Hot briefs are readable and source-grounded.
- Use the image upload path in
blog-publish to generate CDN-hosted markdown URLs for embedded assets.
# When to Use
- Publishing normal editorial posts.
- Publishing dynamic section posts under
hot/news/ai_news.
- Running batch skill sync to ClawHub.
# Inputs
- Required for all entries:
-
locale
-
slug
-
title
-
summary
-
contentMarkdown
- Required for dynamic sections:
-
section (
hot,
news, or
ai_news)
-
pairId (if omitted, server falls back to
slug)
-
repoUrl
-
sourceUrl
-
publicSourceLabel
-
tags
-
decisionMeta
-
producer (internal only, never for public display)
# Quality Gates (Required for hot/news/ai_news)
- Title + short deck (
summary) + structured body.
- Body must contain numbered topics (
## 1) ...,
## 2) ...) and a closing takeaways section.
- Dynamic briefs should normally contain
4-8 topics; reject outputs with only
1-2 thin topics unless the source itself is extremely short.
- Each topic must include exactly five lines:
-
来源/Source
-
证据/Evidence
-
摘要/Summary
-
解读/Interpretation
-
行动建议/Action
-
证据/Evidence must point to a concrete anchor (release bullet / PR / issue / official doc section), not only homepage-level links.
-
摘要/Summary is factual and source-grounded.
-
解读/Interpretation is inference/opinion and must not fabricate facts; include explicit impact level (
P0/
P1/
P2).
-
行动建议/Action must be executable (for example: "upgrade now", "canary first", "hold and monitor").
- Do not publish naked URLs in prose or list items.
- Use Markdown links only:
来源标题.
- One topic should have one primary source link + one evidence link when available.
- Avoid same-link repetition across all topics; evidence links should be topic-specific whenever possible.
- No "据说/rumor/未证实" style claims without attribution.
- No placeholder text (
TBD,
待补充,
lorem ipsum).
- No leaked render placeholders (
INLINE_CODE,
RUBYPH,
@@...@@).
- No exposing internal producer identity in byline/meta/body (for example: "generated by skill/openclaw bot").
- Mentioning
OpenClaw is allowed when it is the article subject, not the publisher identity.
# Quality Score (Publish Threshold)
- Score each topic on 3 axes (
0-2 each):
- Evidence quality: traceable and specific.
- Summary clarity: factual, concise, no ambiguity.
- Actionability: recommendation can be executed.
- Any topic total score
< 4, or
- Any topic missing
Evidence/
Action.
# Body Template (news / hot / ai_news)
# {{title}}更新时间:{{timestamp}}
数据来源:{{source_set}}
说明:本期每条热点均包含「摘要 + 解读」。
1) {{topic_title}}
2) {{topic_title}}
总结
- {{takeaway_1}}
- {{takeaway_2}}
- {{takeaway_3}}
# Preflight Checks
- Before publish, run dry-run and fail fast on quality violations:
-
blog-publish publish --dry-run --input .json
-
blog-publish publish --dry-run --input .md
- Quick markdown guardrails (example):
- Reject naked links:
rg -n "(^|[^\\]\\()https?://" against generated markdown files.
- Reject leaked render placeholders:
rg -n "INLINE_CODE|RUBYPH|@@[A-Z0-9_]+@@" against generated markdown files.
- Verify each topic has
Source + Evidence + Summary + Interpretation + Action.
- Verify each interpretation includes risk level label (
P0|P1|P2).
- Verify evidence links are not all identical across every topic.
- If
pairId is missing, ensure
slug is stable because server uses it for localization grouping.
- Only proceed to real publish when dry-run is clean.
# Publishing Rules
- Default
section is editorial when absent.
blog-publish publish and blog-publish update both accept JSON payload files and markdown files with frontmatter.
- Use
blog-publish post-list to discover existing locale + slug pairs before editing existing posts.
- Use
blog-publish download to export stored content into editable markdown frontmatter, then feed that file back into blog-publish update.
- Single-language submit is supported for all sections; server handles auto-localization.
- Auto-generated section content is free by default and does not enter premium gating.
- Keep
producer as internal metadata only; public surfaces must use publicSourceLabel or section label.
# Command Playbook
-
pnpm add -g @leeguoo/blog-publish
-
blog-publish login --api-base https://blog.misonote.com --sso-client-id misonote-blog-web --sso-redirect-uri https://blog.misonote.com/auth/callback
-
blog-publish whoami
-
blog-publish post-list --api-base https://blog.misonote.com --locale zh
-
blog-publish download --api-base https://blog.misonote.com --locale zh --slug --output ./drafts/.zh.md
-
blog-publish upload --api-base https://blog.misonote.com --file ./assets/cover.png --markdown-only
-
blog-publish upload --api-base https://blog.misonote.com --file ./assets/cover.png --filename cover-final.png
- Automation Auth (OpenClaw/CI):
- Use service token only:
PUBLISH_API_TOKEN=
- Preflight:
blog-publish whoami --api-base https://blog.misonote.com
- Never prompt end users to complete browser authorization links.
-
blog-publish publish --dry-run --input .json
-
blog-publish publish --dry-run --input .md
-
blog-publish publish --input .json
-
blog-publish publish --input .md
-
blog-publish update --dry-run --input .md
-
blog-publish update --input .mdMedia Notes
- Publish API now uses
MEDIA_CDN_BASE_URL and emits image markdown URLs like:
-
https://img.leeguoo.com/media//
- Repeated uploads of the same file are deduplicated by SHA-256 and return:
-
deduped: true and the existing
asset.id instead of creating a duplicate.
- Keep
img.leeguoo.com as the canonical image host in generated markdown to leverage Cloudflare CDN + cache.
- Skill sync:
-
pnpm clawhub:sync:dry-run
-
pnpm clawhub:sync:all
- Alias compatible with team wording (
clawdhub sync all):
-
pnpm clawdhub:sync:dry-run
-
pnpm clawdhub:sync:all# Failure Handling
- Check API status code and error payload first.
- Fix validation issues (required fields, auth scope), then retry.
- If quality gates fail, regenerate the current locale content and retry.
- If login gets wrong client/redirect values, remove environment overrides (
BLOG_PUBLISH_SSO_CLIENT_ID,
BLOG_PUBLISH_SSO_REDIRECT_URI) and rerun strict login command.
- If running in automation and error is
PUBLISH_UNAUTHORIZED, stop interactive login attempts, rotate
PUBLISH_API_TOKEN, then retry publish.
- Record error output and alert maintainers.
- Do not block already-published content visibility.
- Retry sync after login/permission/network issues are resolved.