Polish and translate a technical blog draft into a 1000–1200 word, 4-5 section Markdown article in English and Simplified Chinese (zh-CN), preserving technic...
---
name: blog-polish-en-astro-cn
description: Polish and translate a technical blog draft into a 1000–1200 word, 4-5 section Markdown article in English and Simplified Chinese (zh-CN), preserving technical terms and code blocks. Then convert the English edition into Astro markdown compatible
author: Jeff Yang
version: 1.0.12
tags: [openclaw, clawhub, blog, polish, translate, linux, markdown]
metadata:
openclaw:
requires: ["jq"]
platforms: ["linux", "darwin"]
entrypoint: skill
inputSchema:
type: object
properties:
draftPath:
type: string
description: Path to the draft markdown file.
default: "~/.openclaw/workspace/contentDraft/latestDraft.md"
outputDir:
type: string
description: Directory where polished file is saved.
default: "~/.openclaw/workspace/contentPolished/"
required: ["draftPath", "outputDir"]
outputSchema:
type: object
properties:
outputPath:
type: string
description: Path to the final polished markdown file.
required: ["outputPath"]
workflow:
- name: init
description: Set defaults and create timestamp
run: |
draftPath=${draftPath:-~/.openclaw/workspace/contentDraft/latestDraft.md}
outputDir=${outputDir:-~/.openclaw/workspace/contentPolished/}
outputDir=$(eval echo "$outputDir")
ts=$(date +"%y%m%d%H%M")
save_state ts "$ts"
save_state draftPath "$draftPath"
save_state outputDir "$outputDir"
- name: verify_input
description: Check if draftPath exists
run: |
if [ ! -f "$draftPath" ]; then
echo "Error: Draft not found at $draftPath" >&2
exit 1
fi
- name: generate-slug
description: Create Astro-compatible slug from filename or title
run: |
# Default: use input filename without extension
slug=$(basename "$draftPath" .md | sed 's/^[0-9]\{10\}-//' | tr '[:upper:]' '[:lower:]' | tr -s '-' | sed 's/[^a-z0-9-]//g')
# Better: extract title from first H1 header
title=$(sed -n 's/# \(.*\)/\1/p' "$draftPath" | head -1 | tr '[:upper:]' '[:lower:]' | tr -s ' ' '-' | sed 's/[^a-z0-9-]//g' | sed 's/--*/-/g')
# Use title if available, else filename
slug="${title:-$slug}"
# Fallback: timestamp
slug="${slug:-$(date +%y%m%d%H%M)}"
save_state slug "$slug"
save_state title "$title"
- name: prepare_output
description: Define output filename variable
run: |
ts=$(load_state ts)
slug=$(load_state slug)
outputDir=$(load_state outputDir)
outputPath="${outputDir}/${ts}-${slug}_eng.md"
save_state outputPath "$outputPath"
- name: read_draft
inputs: ["draftPath"]
outputs: ["draftText"]
- name: polish
description: "LLM: Polish grammar in English → Save to ${outputDir}/${ts}-${slug}_eng.md"
inputs: ["draftText", "ts", "outputDir"]
outputs: ["outputPath"]
llm: true # or specific model
set_output: engOutputPath
post: |
save_state engOutputPath "$outputPath"
- name: translate
description: "LLM: Polish grammar in Simplified Chinese > Translate in Simplified → Save to ${outputDir}/${ts}-${slug}_chn.md"
inputs: ["outputPath", "ts", "outputDir"]
outputs: ["outputPath"]
llm: true # or specific model
set_output: chnOutputPath
post: |
save_state chnOutputPath "$outputPath"
- name: add-astro-frontmatter
description: Inject standard Astro YAML header into polished file
run: |
slug=$(load_state slug)
title=$(load_state title)
ts=$(load_state ts)
polishedFile=$(load_state engOutputPath)
outputDir=$(load_state outputDir)
outputFile="${outputDir}/${ts}-${slug}_astro.md"
tagsYAML='["linux","ai","opensource","openclaw"]'
cat > "$outputFile" << EOF
---
title: "${title:-Generated by OpenClaw}"
date: $(date -Iseconds)
tags: ${tagsYAML}
image: ./hero.png
---
$(cat "$polishedFile")
EOF
mkdir -p "${outputDir}/${ts}-${slug}/images/"
save_state outputPath "$outputFile"
- name: finalize
description: Emit polished path only
run: |
# outputPath=$(load_state outputPath)
# jq -n --arg outputPath "$outputPath" '{ outputPath: $outputPath }'
engOutputPath=$(load_state engOutputPath)
chnOutputPath=$(load_state chnOutputPath)
outputPath=$(load_state outputPath)
jq -n \
--arg engOutputPath "$engOutputPath" \
--arg chnOutputPath "$chnOutputPath" \
--arg astroPath "$outputPath" \
'{ engOutputPath: $engOutputPath, chnOutputPath: $chnOutputPath, astroPath: $astroPath }'
---
# Blog Polish (en-US and zh-CN)
This skill polishes a technical blog draft and translates it to English and then Simplified Chinese while preserving technical accuracy.
## When to Use
Use when the user asks to polish/translate a technical blog draft to zh-CN **without images**. Triggers: "polish my draft", "translate blog to Chinese", "enhance latestDraft.md".
## Defaults
- `draftPath`: `~/.openclaw/workspace/contentDraft/latestDraft.md`
- `outputDir`: `~/.openclaw/workspace/contentPolished/`
- Output filename: `${ts}-polished.md` or `${ts}-${subject}.md`
## Workflow Summary
Draft → Check → Polish (EN) → Translate (ZH) → Convert EN to Astro format → Emit path JSON.
1. **Resolve paths** + create timestamp (`date +"%y%m%d%H%M"`)
2. **Read draft** from `draftPath`
3. **Polish English**: Fix grammar/spelling, improve clarity, structure into 4-5 sections, target 1000-1200 words
4. **Translate to zh-CN**: Preserve code blocks, inline code, technical terms (`openclaw`, `skill`, `cli`)
5. **Save polished markdown** to `${outputDir}/${ts}-polished.md`
6. **Return**: `{ outputPath: "/full/path/to/file.md" }`
## Output
## Example
**Input**: `~/.openclaw/workspace/contentDraft/latestDraft.md`
{ "outputPath": "~/.openclaw/workspace/contentPolished/2603142134-openclaw-skills.md" }
don't have the plugin yet? install it then click "run inline in claude" again.