Use this skill as a native, research-first article system. It does not route execution to external skills.
text into text (url) because WeChat forbids clickable links.Path A: research-first articleuse for: topic, keyword, question, notes, transcript, subtitle file
goal: build the article from a research brief and evidence ledger
Path B: source-to-WeChat editionuse for: article text, markdown file, article URL, WeChat URL
goal: preserve the useful source core, then rebuild it for WeChat reading and distribution
Default routing:
tutorialdeep-analysisnewsletterPDF policy:
imgs/source-fig-*.pngsource.mdVideo policy:
Create one workspace per article:
research-to-wechat/YYYY-MM-DD-
Required assets:
source.mdbrief.mdresearch.mdarticle.mdarticle-formatted.mdarticle.htmlmanifest.jsonimgs/cover.pngRequired frontmatter in final markdown:
titleauthordescriptiondigestcoverImagestyleModesourceTypestructureFramedisclosuremanifest.json must capture:
pathModestyleModestructureFramesourceTypeconfidencedraftStatusmanifest.json.outputs.wechat must include:
markdownhtmlcover_imagetitleauthordigestimagesDetermine this SKILL.md directory as SKILL_DIR, then use ${SKILL_DIR}/scripts/.
| Script | Purpose |
|---|---|
| -------- | --------- |
scripts/fetch_wechat_article.py | WeChat article fetch (mobile UA) |
scripts/wechat_delivery.py | Native WeChat delivery entrypoint (check, design-catalog, render, upload-images, save-draft) |
scripts/install-openclaw.sh | OpenClaw skill installer |
This skill executes every stage itself:
python3 "${SKILL_DIR}/scripts/wechat_delivery.py" design-catalogpython3 "${SKILL_DIR}/scripts/wechat_delivery.py" renderpython3 "${SKILL_DIR}/scripts/wechat_delivery.py" upload-imagespython3 "${SKILL_DIR}/scripts/wechat_delivery.py" save-draftUse the internal contract in capability-map.md.
Resolve WeChat draft delivery in this order:
L0 official-http: WECHAT_APPID and WECHAT_SECRET are ready, so bundled scripts call the official media and draft APIs directlyL1 assisted-browser: only use a browser when the account setup or draft inspection needs human helpL2 manual-handoff: stop with exact file paths and required API fields when official delivery cannot proceedThe renderer reads an optional EXTEND.md for author-specific CTA content and preferences. This keeps the skill generic — CTA text, QR codes, and blog URLs belong to the author, not the skill.
Lookup order: project dir → ~/.config/research-to-wechat/ → ~/.research-to-wechat/
See author-config.md for the full format and field reference.
When EXTEND.md is present with a cta section, the renderer appends a styled CTA block after the article body. When absent, no CTA is rendered.
Resolve style in this order:
Use the full style system in style-engine.md.
Visual rendering is decided by:
styleModestructureFramelight or dark output modeRun the article through these phases:
```bash
# negation-contrast patterns (must be 0 hits)
grep -n '不是.而是\|不仅.而且\|不只.更\|不再.而是\|已经不是' article-formatted.md
# em-dash count (≤5 in body)
grep -c '——' article-formatted.md
# exclamation marks (must be 0)
grep -c '!' article-formatted.md
```
wechat-compliance-check 扫描 article-formatted.md,有命中则改写后重新扫描,直到零违规。⛔ Pre-delivery compliance gate (BLOCKING — must execute before Phase 8):
Long sessions cause attention decay on early-loaded rules. Before proceeding to HTML rendering and draft save, you MUST:
cat the file, do not rely on memory). For WeChat projects this is ../AGENTS-wechat.md or the path specified in AGENTS.md.This step exists because context-window attention decay will cause you to forget rules loaded at session start. Do not skip it. Do not check from memory.
wechat_delivery.py render, image upload, draft save, and manifest.Image upload rules:
imgs/cdn-urls.json already exists from a previous upload, skip re-uploading unchanged images. Only upload new or modified files (compare filename + file size/mtime).wechatqr.png (CTA QR code) must reuse the existing CDN URL from project-level images/wechatqr.png or a previous cdn-urls.json. Never re-upload the same QR code per article.cdn-urls.json (not overwrite).Draft save rules:
manifest.json already contains a media_id, pass --media-id to save-draft to update the existing draft. Never create a duplicate.draft/delete) immediately and keep only the original media_id.manifest.json is the single source of truth for media_id.Before draft save, run HTML compliance check (must all pass):
```bash
grep -c 'class=' article.html # must be 0
grep -c '