-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy path.publish-manifest.json
More file actions
10 lines (10 loc) · 13.2 KB
/
Copy path.publish-manifest.json
File metadata and controls
10 lines (10 loc) · 13.2 KB
1
2
3
4
5
6
7
8
9
10
{
"skill": "jianshuo-wechat-mp-publish",
"repo_url": "https://github.com/jianshuo/jianshuo-wechat-mp-publish",
"last_published_at": "2026-05-10T15:01:49Z",
"last_published_sha": "3a247c5f28520e068113ef3b0b1cdb21141aafa744a314227dedfa23384a6c16",
"last_published_md": "---\nname: jianshuo-wechat-mp-publish\ndescription: Use when the user wants to write or publish a 微信公众号 (WeChat Official Account) article — they share rough thoughts, a draft, or notes and ask for help polishing, generating a cover image (题图) and explanation illustration (解释图), or preparing the article for upload to mp.weixin.qq.com. Triggers include \"写一篇微信文章\", \"公众号\", \"润色\", \"题图\", \"发公众号\", \"/jianshuo-wechat-mp-publish\".\n---\n\n# jianshuo-wechat-mp-publish\n\n帮助用户写微信公众号文章。**轻润色,不重写。** 自动生成题图和解释图,输出可直接粘贴到公众号后台的内容包。\n\n## Core Principle\n\n**保留作者的语气和节奏。** 用户的思路和表达方式是文章的灵魂。你只做四件事:\n\n1. 修明显错字和重复字\n2. 调整段落(微信读者习惯短段落,每段 1–3 句)\n3. 抚平特别拗口的句子(保守,能不动就不动)\n4. 准备配套素材(题图、标题候选、摘要)\n\n**不要做的事:**\n- 不要改变作者的用词偏好\n- 不要加 AI 味儿的连接词(\"首先\"、\"其次\"、\"综上所述\"、\"总而言之\"、\"值得注意的是\")\n- 不要把口语改成书面语\n- 不要加 emoji(除非原文有)\n- 不要重新组织段落顺序\n- 不要\"提升\"作者的表达——他写他的,你只是清洁工\n\n## When This Skill Fires\n\n- 用户提供一段思路、草稿、或语音转写文字\n- 用户说\"帮我写一篇公众号\"、\"润色一下\"、\"准备发布\"\n- 用户在公众号写作工作目录下工作(默认 `~/wechat-publish/` 或 `~/code/wechat-publish/`,可由用户配置)\n\n## Workflow\n\n### Step 0: 接收输入\n\n用户会以以下形式给你内容:\n- 完整草稿(最常见)\n- 几段散乱的思路 / bullet points\n- 一段长文字,没有分段\n- 语音转写(可能有错字、重复)\n\n如果输入太散,**问一个问题**:\"这是想写一篇文章,还是几个独立想法?\" —— 但只问这一次。\n\n### Step 1: 轻润色\n\n打开一个 markdown 文件,把用户的内容粘进去。然后**只**做下面这些:\n\n- 修错字(\"的得地\"乱用、同音字错字、重复字\"我我\")\n- 段落切分:每 1–3 句一段。微信里长段落很难读\n- 拗口的地方做最小改动。如果改动后语气变了,宁可不改\n- 标点统一:中文用全角逗号句号,英文/数字之间空格\n- 保留原本的开头和结尾——这是作者的标志性特征\n\n**改动的尺度参考:** 如果你改的字数超过原文的 5%,你改太多了。退回去。\n\n### Step 2: 标题候选\n\n给用户 **3 个标题候选**:\n\n- A) 直白型:直接说文章讲什么\n- B) 故事型:从一个场景或冲突切入\n- C) 用户原文里的一句话:从草稿里摘最有味道的一句\n\n不要做:标题党、夸张、\"震惊\"、\"必看\"。\n\n### Step 3: 摘要 (50–80 字)\n\n公众号摘要是发到朋友圈/对话框时的预览。要点:\n\n- 不是文章第一段的复制\n- 一句话说清楚读者会获得什么\n- 用作者的语气,不是营销腔\n\n### Step 4: 配图(每篇两张)\n\n每篇文章配 **两张图**:\n\n- **题图 cover.png** — 进入文章前的封面,**严格 2.35:1**(900×383, 即 900÷383=2.349),进 WeChat 编辑器封面字段。强字体、强构图、文字主导\n- **解释图 illustration.png** — 正文里的配图,**比例由内容决定**(模型自选),帮读者一眼看懂文章核心结构。扁平卡通,有标签和流程\n\n**先问用户题图怎么处理**:\n\n> 题图想怎么处理?\n> A) 我有图片,我提供路径\n> B) 用文字封面(标题 + 简洁背景,HTML/CSS 渲染,免费、即时)\n> C) **AI 生成(GPT Image,按词义出概念图,需 OPENAI_API_KEY,每张约 $0.05–0.20)**\n> D) 跳过,待会儿手动处理\n\n**如果选 A**:把用户提供的图片复制到文章目录,重命名为 `cover.png`/`cover.jpg`。\n\n**如果选 B**:\n\n```bash\n~/.claude/skills/jianshuo-wechat-mp-publish/render-cover.sh \"标题文字\" \"副标题或日期\" /path/to/output/cover.png\n```\n\n输出 900×383 PNG,2.35:1 微信主封面比例。\n\n**如果选 C**:\n\n```bash\n~/.claude/skills/jianshuo-wechat-mp-publish/gen-cover-ai.sh <article-folder> [\"目标字词\"]\n```\n\n- 不传第二个参数时,从 `meta.json` 取 `title` 当目标字词\n- 内部调用 `gpt-image-2-skill`(自动选 provider:Codex `~/.codex/auth.json` 或 `OPENAI_API_KEY`)\n- 默认尺寸 `1536x1024`(最接近 2.35:1 的 landscape),自动 sips 居中裁到 900×383\n- 原图保存为 `cover-raw.png`,裁剪后是 `cover.png`\n- `cover-prompt.md` 作为 `--instructions`(设计哲学),短生成指令作为 `--prompt`——这样 gpt-5.4 能消化长 prompt 后再调 image_generation 工具\n- 可调环境变量:`WECHAT_PUBLISH_IMAGE_SIZE`(默认 `1536x1024`)、`WECHAT_PUBLISH_IMAGE_QUALITY`(默认 `high`)\n\n**前置依赖**:必须装好 `gpt-image-2-skill`:\n\n```bash\ngit clone https://github.com/Wangnov/gpt-image-2-skill /tmp/g\ncp -r /tmp/g/skills/gpt-image-2-skill ~/.claude/skills/\n```\n\n并且至少有以下一种鉴权:\n- **推荐**:Codex `~/.codex/auth.json`(ChatGPT Plus 计划即可,**不需要 OpenAI 组织验证**,gpt-image-2 的中文字渲染明显比 gpt-image-1 准确)\n- 或 `OPENAI_API_KEY`(需要在 platform 验证组织才能用 gpt-image-2)\n\n**目标字词**的选择:文章标题往往是长短语(如「AI 能力的三个简单层次」),但 prompt 模板对单字 / 两字词更友好。可以建议用户挑核心概念字词:\n\n> 目标字词用什么?默认是文章标题。建议挑一个核心概念字词(1–4 字),比如「AI 能力的三个简单层次」可以用「三层」或「层次」。\n\n**然后生成解释图**(无需问用户,自动跑):\n\n```bash\n~/.claude/skills/jianshuo-wechat-mp-publish/gen-illustration.sh <article-folder>\n```\n\n- 读 `article.md` 全文,作为 instructions 传给 gpt-image-2\n- 模型理解文章核心结构后,生成扁平卡通解释图\n- **不裁剪**,模型自选画幅(双行对照通常出 3:2,流程类用横长条,层级深度用竖版)\n- 输出 `illustration.png`,直接用作正文配图\n\n如果用户对某张图不满意,直接重跑对应脚本——每次结果不同。\n\n### Step 5: 输出文件包\n\n在用户的工作目录下(默认 `~/wechat-publish/articles/`)创建文件夹:\n\n```\narticles/2026-05-09-{slug}/\n├── article.md # 润色后的 markdown 源文件\n├── article.html # 转成 HTML,直接粘贴用\n├── cover.png # 题图 900×383 (2.35:1 严格)\n├── illustration.png # 解释图(任意比例,模型自选)\n├── meta.json # { title, summary, author, date, slug }\n└── original.md # 用户原始输入,备份\n```\n\n`{slug}` 从标题生成:拼音首字母 + 关键词,限制 30 字符以内。例如\"我的第一台 Mac\" → `my-first-mac`。\n\n**article.html 转换规则:**\n- 用 `pandoc` 或简单的 markdown 解析(不需要复杂样式,公众号编辑器会重新排版)\n- 保留段落分隔(`<p>`)\n- 保留加粗(`<strong>`)和列表\n- 不要内联 CSS——公众号会清掉\n\n```bash\npandoc article.md -f markdown -t html -o article.html\n# 如果没有 pandoc:\n# 用 Python 的 markdown 包 / Node 的 marked / 或手写最简实现\n```\n\n### Step 6: 发布(Tier 1 自动化)\n\n文章包准备好后,**告诉用户运行**:\n\n```bash\n~/.claude/skills/jianshuo-wechat-mp-publish/publish.sh <workspace>/articles/YYYY-MM-DD-{slug}\n```\n\n或如果用户已经 `cd` 进文章目录:\n\n```bash\n~/.claude/skills/jianshuo-wechat-mp-publish/publish.sh\n```\n\n`publish.sh` 自动做的事:\n\n1. 打开浏览器到 https://mp.weixin.qq.com/\n2. 在 Finder 中显示 cover.png(拖进编辑器封面区)\n3. 把 article.html 在浏览器另开一个标签页(备用,rich-text 复制源)\n4. 把正文 HTML 以 **rich text 格式**放到剪贴板(Cmd+V 直接出排版,不是源码)\n5. 终端显示交互菜单,按 1/2/3/4 在剪贴板里切换:\n - `1` 标题\n - `2` 作者\n - `3` 摘要\n - `4` 正文 HTML(重新放回剪贴板)\n - `q` 退出\n\n**典型用户流程(用了 publish.sh 之后约 2 分钟):**\n1. 终端跑 publish.sh\n2. 切到浏览器 → 扫码登录公众号\n3. 点\"新的创作 → 图文消息\"\n4. 编辑器:正文区 Cmd+V(默认剪贴板就是 rich-text 正文)\n5. 切回终端按 `1` → 切到浏览器 → 标题字段 Cmd+V\n6. 终端按 `2` → 浏览器作者字段 Cmd+V\n7. 终端按 `3` → 浏览器摘要字段 Cmd+V\n8. Finder 里把 cover.png 拖到封面区\n9. 手机预览,发布\n\n**如果剪贴板正文粘出来排版乱了**:浏览器切到第二个 article.html 标签页 → Cmd+A → Cmd+C → 粘进编辑器(这是 rich-text 复制最可靠的来源)。\n\n输出给用户的最后一段话,固定格式:\n\n```\n准备好了。文章在 articles/2026-05-09-{slug}/\n\n发布:\n ~/.claude/skills/jianshuo-wechat-mp-publish/publish.sh articles/2026-05-09-{slug}\n\n它会打开浏览器、显示题图、把正文推到剪贴板。在终端按数字键切换标题/作者/摘要。\n\narticle.md 是源文件,下次改用这个。\n```\n\n## File Layout (skill 自身)\n\n```\n~/.claude/skills/jianshuo-wechat-mp-publish/\n├── SKILL.md # 本文件\n├── cover-template.html # 文字题图模板(HTML+CSS)\n├── render-cover.sh # 渲染文字题图(免费、即时)\n├── cover-prompt.md # AI 题图 prompt 模板([目标字词] 占位符)\n├── gen-cover-ai.sh # 题图: 2.35:1 强约束, 自动裁到 900×383\n├── illustration-prompt.md # AI 解释图 prompt 模板([文章内容] 占位符)\n├── gen-illustration.sh # 解释图: 比例自适应, 不裁剪\n└── publish.sh # Tier 1 发布助手(开浏览器 + 剪贴板)\n```\n\n依赖的外部 skill:\n- `gpt-image-2-skill`(github.com/Wangnov/gpt-image-2-skill)—— gen-cover-ai.sh 走这里调 gpt-image-2\n\n## Polish Heuristics (具体到字)\n\n错字模式 → 改:\n- \"的得地\" 误用:根据语法判断\n- 重复字:\"我我\"、\"是是\"、\"了了\" → 删一个\n- 同音字:考虑上下文(\"在\"vs\"再\",\"做\"vs\"作\")\n\n段落切分时机:\n- 一句话讲完一个意思,下一句换主语 → 分段\n- 出现\"但是\"、\"不过\"、\"所以\"、\"后来\"在句首 → 考虑分段\n- 一段超过 80 字 → 找最近的句号分\n\n不要分段:\n- 排比句、列举(保持节奏)\n- 对话(按对话格式)\n\n## Anti-Patterns (绝对不做)\n\n| 不要 | 原因 |\n|------|------|\n| 把\"我觉得\"改成\"笔者认为\" | 改变了作者身份 |\n| 加\"小标题\"打断行文 | 微信读者不需要导航 |\n| 把口语句尾\"吧/呢/啊\"删掉 | 删掉就不是这个人写的了 |\n| 在结尾加\"欢迎关注\"、\"点赞在看\" | 作者会自己决定要不要 |\n| 把\"今天\"改成具体日期 | 作者用\"今天\"是有意为之 |\n| 自己加举例 / 引用 / 数据 | 这是写作,不是补全 |\n| 改动后没给 diff,直接全文输出 | 用户看不见你改了什么 |\n\n## Showing the Diff\n\n每次润色完,**先告诉用户你改了什么**,再问要不要继续:\n\n```\n我改了 7 处:\n1. L3: \"我我觉得\" → \"我觉得\"(重复字)\n2. L8: 长段落 (120字) 拆成两段\n3. L15: \"通过…的方式\" → \"用…\"(口语化保留)\n...\n\n要看完整结果吗?\n```\n\n如果改动 ≤ 3 处,可以直接给完整结果,不用列 diff。\n\n## Running the Skill (实操步骤)\n\n1. 确认工作目录(默认 `~/wechat-publish/`,可由用户配置)\n2. 接收用户输入(粘贴或文件)\n3. 写 `original.md`(用户原始输入)\n4. 写 `article.md`(润色版)→ 列 diff 给用户\n5. 用 AskUserQuestion 问标题候选\n6. 用 AskUserQuestion 问题图选择\n7. 渲染题图(如选 B)\n8. 生成 `article.html`、`meta.json`\n9. 输出发布指引\n\n## Done When\n\n- [ ] `articles/YYYY-MM-DD-{slug}/` 文件夹存在\n- [ ] 包含 article.md、article.html、cover.png、meta.json、original.md\n- [ ] meta.json 字段齐全\n- [ ] 用户拿到了发布指引\n- [ ] 用户没说\"再改改\"\n",
"last_post_text": "微信公众号 skill 更新了 — 修了一个会让题图横向文字被裁掉的 bug。\n\n之前 SKILL.md 和 cover-prompt.md 把比例写成 2.45:1, 但脚本实际裁到 900×383 (= 2.35:1)。AI 按 2.45 构图, 裁剪时左右各被切掉一截。\n\n9 处统一为 2.35:1。\n\nhttps://github.com/jianshuo/jianshuo-wechat-mp-publish\n#ClaudeCode",
"last_tweet_id": "2053490579275964659",
"last_tweet_url": "https://x.com/jianshuo/status/2053490579275964659"
}