executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
poetize-blog-automation专为开源版 awesome-poetize-open 设计的 POETIZE 博客自动化技能。通过 `/api/api/*` 接口完成文章发布、更新、隐藏、分类标签维护、主题切换、数据分析和 SEO 运维。Use only when the task explicitly targets a POETIZE site or POETIZE admin API workflow. Do not use for generic writing, generic SEO advice, or non-POETIZE CMS work.
Independent GitHub snapshot · Automated classification · Original documentation governs
/api/api/* 接口完成文章发布、更新、隐藏、分类标签维护、主题切换、数据分析和 SEO 运维。Use only when the task explicitly targets a POETIZE site or POETIZE admin API workflow. Do not use for generic writing, generic SEO advice, or non-POETIZE CMS work.
homepage: https://github.com/LeapYa/awesome-poetize-open/tree/main/openclaw-skills/poetize-blog-automation
metadata: {"openclaw":{"skillKey":"poetize-blog-automation","emoji":"✍️","primaryEnv":"POETIZE_API_KEY","requires":{"anyBins":["python","python3"],"env":["POETIZE_BASE_URL","POETIZE_API_KEY"]},"install":[{"id":"brew-python","kind":"brew","formula":"python","bins":["python3"],"label":"Install Python 3 (brew)"}]}}
user-invocable: true
disable-model-invocation: falseUse this skill to operate a POETIZE blog as a personal publishing and maintenance system. It is built on the existing POETIZE API feature, not browser automation. It is free-first, growth-first, and maintenance-first. It is not monetization-first.
/api/api/* 接口进行文章发布、更新、隐藏、分类标签维护、主题切换、数据分析和 SEO 运维。awesome-poetize-open 开源分支,不适用于原版 POETIZE。awesome-poetize-open 设计。awesome-poetize-open-blog-automation so the registry entry stays tied to the open-source project.awesome-poetize-open.{baseDir} for any file path that points inside this skill folder.python in examples and switch to python3 when that is the installed binary.scripts/render_openclaw_config.py to generate OpenClaw config instead of hand-writing JSON.scripts/openclaw_smoke_test.py before the first real write action on a new OpenClaw environment.POETIZE_BASE_URL at the public nginx/domain origin.${POETIZE_BASE_URL}/api/api/...; do not append /api inside the variable value itself.Read references/poetize-api.md before publishing, updating, querying, or operating articles.
Read references/openclaw-setup.md when connecting the skill to OpenClaw.
Read references/strategy-playbook.md before deciding whether to create, refresh, or hide content.
Read references/decision-matrix.md before setting publish posture, search posture, or paywall posture.
Read references/creativity-workflow.md before drafting article copy.
Read references/evaluation-scenarios.md when validating the strategy layer.
Run scripts/run_strategy_evals.py to verify the local strategy layer before shipping skill changes.
Breaking change:
--brief-file.assets/article-brief.template.json and assets/ops-brief.template.json as the starting point for strategy briefs.Gather the publishing intent. Decide whether the user wants a draft or a public article. Decide whether the task is new content, old-content maintenance, taxonomy cleanup, SEO follow-up, or article takedown by hiding. Default to free content unless the user explicitly asks for a draft or a paywalled post. Create a strategy brief before any mutating action.
Create the strategy brief.
Use {baseDir}/assets/article-brief.template.json for article creation or article refresh work.
Use {baseDir}/assets/ops-brief.template.json for update or hide operations.
Fill primaryGoal, reasoning, and the required brief fields before calling any mutating script.
If required brief information is missing, stop and ask for it.
Diverge, then converge.
Produce 2 or 3 candidate angles first.
Choose one final direction and record it as selectedAngle.
Record the rejected candidates in alternativesConsidered.
Write the article in Markdown.
Prefer a single H1 at the top.
Keep the body as clean Markdown.
Use short lead paragraphs, clear section headings, lists only when they improve readability, and avoid HTML unless required.
If the article includes images, save them as local files first and reference them from the Markdown file with relative paths such as .
publish_post.py will upload those local article images through /api/resource/upload before publishing and replace them with returned URLs.
When the task is maintenance, prefer revising existing articles over creating duplicates.
Add front matter for routing and publishing metadata.
Use the front matter keys documented in references/poetize-api.md.
At minimum provide title, sort or sortId, and label or labelId.
Prefer existing sort and label names when IDs are unknown.
The script will query /api/categories and /api/tags first and reuse exact matches.
If exact matches fail, the script may return close category or tag candidates for confirmation.
Close matches are suggestions only and must not be auto-selected.
It will not create a new category or tag unless you explicitly allow it.
Be explicit about article switches when the user mentions them:
commentStatus for comments
recommendStatus for recommendation
viewStatus for visibility
submitToSearchEngine for search-engine push
Only set paid fields when the user explicitly wants a paywall and the content clearly deserves it.
For most personal blogs, keep payType: 0.
When the user does not want to upload a cover, set coverBlank: true or cover: " ".
Publish through the bundled publish script.
Use {baseDir}/scripts/publish_post.py for create or content update flows driven by Markdown.
OpenClaw runtime only needs:
POETIZE_BASE_URL
POETIZE_API_KEY
--brief-file is mandatory.
If the markdown body references local images or local <img src="..."> files, the script uploads them automatically before sending the article payload.
For paid posts, the script will check /api/payment/plugin/status first, but paid publishing is not the default path for this skill.
If the payment plugin is installed but not configured, provide paymentPluginKey in front matter and optionally pass --payment-config-file payment.json.
Operate existing articles, themes, analytics, and SEO through the management script.
Use {baseDir}/scripts/manage_blog.py.
It supports:
article listing
exact-title lookup
article detail
article update
article hide
global article theme switching
article analytics
site visit trends
controlled SEO config
sitemap update
It does not support article deletion.
If the user wants a post effectively removed from public view, hide it by setting viewStatus: false.
update-article and hide-article now require --brief-file.
Return the final result.
Prefer --wait so the script polls until the async task finishes.
Report the returned articleId, articleUrl, task status, visibility state, and any follow-up analytics when requested.
viewStatus: false or run with --draft.commentStatus, recommendStatus, viewStatus, and submitToSearchEngine explicitly when the user mentions them.viewStatus: false, the script will auto-fill a draft password and preview tip when omitted.sortId or labelId. Use sort and label names when IDs are unknown.sort or label does not exist, stop and ask for confirmation unless allowCreateTaxonomy, allowCreateSort, or allowCreateLabel is explicitly set.pendingTranslationLanguage, pendingTranslationTitle, and pendingTranslationContent.viewStatus: false.payType explicit. Do not guess a paywall mode from prose alone.payType: 0.coverBlank: true over inventing a fake cover URL.publish_post.py uses hard strategy validation.manage_blog.py update-article and hide-article use hard strategy validation.Generate a usable OpenClaw config that points OpenClaw at this repo's openclaw-skills directory:
python {baseDir}/scripts/render_openclaw_config.py --output openclaw.poetize.local.json --api-key "replace-with-poetize-api-key"
Run a read-only smoke test before the first publish or update:
python {baseDir}/scripts/openclaw_smoke_test.py --base-url "https://your-blog.example.com" --api-key "replace-with-poetize-api-key"
Start from the bundled strategy templates:
Create article-brief.json from {baseDir}/assets/article-brief.template.json.
Create ops-brief.json from {baseDir}/assets/ops-brief.template.json.
Front matter example with the common publish switches:
---
title: "示例文章"
sort: "AI实践"
label: "自动化"
commentStatus: true
recommendStatus: false
viewStatus: true
submitToSearchEngine: true
---
# 示例文章
正文...
Markdown image example with local files:
---
title: "带图文章示例"
sort: "AI实践"
label: "自动化"
---
# 带图文章示例
这里是一张本地图片:

At publish time, publish_post.py uploads ./assets/flow.png and rewrites the Markdown image target to the returned URL.
Publish a new draft and wait:
python {baseDir}/scripts/publish_post.py --markdown-file draft.md --brief-file article-brief.json --draft --wait
Publish a public article and wait:
python {baseDir}/scripts/publish_post.py --markdown-file article.md --brief-file article-brief.json --publish --wait
Update an existing article:
python {baseDir}/scripts/publish_post.py --markdown-file article.md --brief-file article-brief.json --article-id 123 --publish --wait
Publish a paid article and require payment readiness:
python {baseDir}/scripts/publish_post.py --markdown-file paid-article.md --brief-file article-brief.json --payment-plugin-key afdian --payment-config-file payment.json --require-paid --publish --wait
Start an async task without waiting:
python {baseDir}/scripts/publish_post.py --markdown-file article.md --brief-file article-brief.json
Allow creating a missing category and tag only when explicitly confirmed:
python {baseDir}/scripts/publish_post.py --markdown-file article.md --brief-file article-brief.json --allow-create-taxonomy --publish --wait
List articles for运营筛选:
python {baseDir}/scripts/manage_blog.py list-articles --search-key "AI" --sort-name "AI实践" --label-name "自动化" --current 1 --size 10
If an exact category or tag name does not match, the management script returns close candidates and stops. OpenClaw should surface those candidates for confirmation instead of guessing.
Hide an existing article:
python {baseDir}/scripts/manage_blog.py hide-article --article-id 123 --brief-file ops-brief.json --wait
Deletion policy:
viewStatus to false.Switch the global article theme:
python {baseDir}/scripts/manage_blog.py activate-theme --plugin-key academic
Update controlled SEO config:
python {baseDir}/scripts/manage_blog.py seo-set-config --config-file seo.json
taskId and task status URL when not waitingarticleIdarticleUrl