staruhub/wechat-article-writer
专业微信公众号文章助手,支持四个独立且可组合模式:article 写正文;image-prompts 从文章生成版本化、provider-neutral 的图片提示词 manifest 与稳定占位符,但不调用生图;layout 把文章和 manifest 确定性转换为微信安全的内联 HTML;full-pipeline 串联正文、提示词/占位符和排版。用户提到公众号、微信文章、推文、配图提示词、图片 manifest、公众号排版、内联 HTML 或完整图文流水线时触发。支持企业官号、个人技术博客、活动回顾和产品评测。不用于:带引用的研究报告(用 deep-research)、PPT/组图(用 deck-studio)、英文文章、仅润色一小段。永不自动发布,永不把提示词或占位符声称为已生成图片。
npx skills add https://github.com/staruhub/ClaudeSkills --skill wechat-article-writer
帮助用户创作高质量的微信公众号文章。核心能力是风格灵活适配——同一个skill既能写企业官号的正式文案,也能写个人IP的技术博客。根据用户需求自动匹配最合适的风格和结构。
用户未指定时默认 article。需要跨模式时按
references/PIPELINE-CONTRACT.md 的文件接口交接,不靠对话隐含状态。
| 模式 | 输入 | 必须输出 | 停止位置 |
|---|---|---|---|
| article | 素材/选题 | article.md | 正文完成 |
| image-prompts | article.md | image-manifest.json,正文含稳定锚点与占位符 | 提示词完成,不生图 |
| layout | article.md + 可选 manifest | layout.html | HTML 完成,不发布 |
| full-pipeline | 素材/选题 | article + manifest + HTML | 三件套完成,不生图、不发布 |
manifest 必须通过 schemas/image-manifest.schema.json 和
scripts/validate_image_manifest.py。排版优先调用宿主的“排版输出” Skill;
其接口不可用时,使用 scripts/render_wechat_layout.py 的确定性降级实现。
根据用户的描述自动判断风格,无需每次手动选择:
| 信号 | 匹配风格 |
|------|---------|
| "公司号"、"官方"、"企业宣传"、"品牌" | 🏢 官方文案 |
| "我的公众号"、"技术博客"、"个人分享"、"实操"、提到"卡兹克" | 🧑💻 技术博客 |
| "活动回顾"、"分享会"、"社区"、"meetup" | 🎤 活动回顾 |
| "评测"、"对比"、"体验报告" | 🔍 评测对比 |
| 无法判断 → 询问用户:"这篇文章发在企业官号还是个人号?风格偏正式还是轻松?" |
仅在信息严重不足时询问(不超过2个问题):
信息充足时直接开始创作。
使用 web search 补充内容(所有风格都适用):
根据文章类型选择搜索策略:
技术类文章:
企业/产品类文章:
活动/社区类文章:
适用于:产品发布、企业动态、品牌宣传、行业白皮书
语气:专业可信、有温度但有距离感。参考 references/style-guide.md。
核心特征:
references/style-guide.md 第七节)结构:
标题风格:参考 references/title-formulas.md,偏向权威型、数字型、福利型。
示例语气:
> 在数字化转型的浪潮中,语言学习正在经历一场深刻变革。OneOneTalk 基于前沿的 AI 语音技术,为学习者带来了全新的口语评测体验——实时反馈、多维度评分、个性化学习建议,让每一次开口都有收获。
适用于:技术教程、工具评测、实操分享、观点评论、AI话题深度分析
这是与官方风格差异最大的模式。核心是「一个技术人在跟朋友聊技术」的感觉。
语气:个人化、有态度、接地气但有深度。
核心特征:
技术内容写作规范:
代码示例:使用`标记代码块,标注语言类型
# 示例:创建一个skill的eval
python -m scripts.run_loop \
--eval-set evals/trigger-eval.json \
--skill-path ./my-skill \
--max-iterations 5
命令行操作:用代码块包裹,加上注释说明
# 安装依赖
pip install -r requirements.txt
# 启动服务
python main.py --port 8080
技术概念解释:先说人话,再给术语
> 简单来说,eval就是给你的skill做一次"模拟考试"——丢几个测试题进去,看看skill能不能正确应对。技术上叫evaluation(评估),但你可以理解为自动化测试。
结构:
标题风格(技术博客专用):
反面教材——技术博客绝对不要这样写:
适用于:技术分享会回顾、社区meetup、黑客马拉松、线下活动
语气:有现场感、有人味、兼顾技术内容和社区氛围。
核心特征:
结构:
适用于:产品评测、工具对比、技术方案选型
语气:客观有深度,但可以有个人偏好。
核心特征:
结构:
为所有文章提供 3个备选标题:
标题通用原则:
官方文章标题 → 参考 references/title-formulas.md
技术博客标题 → 参考本文件「风格B」的标题公式
排版建议(所有风格通用):
article 模式最终交付物:
输出格式:
image-prompts、layout 和 full-pipeline 不使用上面的口头“配图建议”作为机器接口;
必须按 references/PIPELINE-CONTRACT.md 生成可校验文件。每张图使用稳定 ID,
锚点固定为 <!-- image:{id} -->,占位符固定为 {{IMAGE:{id}}}。
provider_status 只能是 not-requested 或 prompt-only。img 标签或灰色占位框描述成“图片已生成”。<script>、<style>、事件属性、外部 CSS/JS/字体和横向溢出。参考 references/quality-checklist.md 进行最终审核,重点关注:
所有风格:
官方风格额外检查:
技术博客额外检查:
反翻译腔检查(所有风格适用):
参考 references/quality-checklist.md §2.3 逐条执行五类翻译腔标记扫描(物理动作动词、形容词+冒号起手式、抽象名词骨架、可译英文词、段落节奏)。判断标准不是词本身,而是这个词在当前句子里是否来自英文直译——"站不住脚"是成语,保留;"这个论证被击穿了"是 break through 的直译,替换。
模式选择:默认走保守模式(准确性优先,不确定就保留原表达)。公众号观点文、文学创作、营销文案场景走激进模式(允许以中文母语思维重新组织整段话,可牺牲少量字面精度换取自然度)。用户可指定模式。
以上五类是最高频的翻译腔标记;如果通读后仍觉得句式别扭,回到原则:用中文里本来会怎么说这件事,重新说一遍。
当用户指定 “L4 / 深度润色 / polish”、要求彻底去翻译腔,或创作
ChaoGeek 深度文、观点文、品牌文案时,在第六步后启用。按
references/quality-checklist.md §2.3 的完整协议执行:独立体检、母语化
改写、逐句复核、语义回退。技术文档、PRD、学术翻译等准确性优先场景
不启用 L4,继续使用保守模式。
references/style-guide.md(官方必读)与 references/writing-techniques.md(写作技巧)。references/title-formulas.md(标题模板)与 references/quality-checklist.md(发布前检查)。references/linguistic-background.md(语言学背景,维护者参考)。references/PIPELINE-CONTRACT.md(非 article 模式必读)与 schemas/image-manifest.schema.json(provider-neutral schema)。scripts/validate_image_manifest.py / scripts/render_wechat_layout.py — fail-closed 校验与安全排版降级器。assets/template-structure.md(文章结构)与 assets/emoji-library.txt(emoji 素材)。evals/routing-evals.json — 触发边界回归用例,改动 description 后用仓库根 scripts/run_routing_evals.py 校验。Take staruhub/wechat-article-writer from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference pip.
Without those the skill loads but fails at the first command.