# WorkBuddy 无痛发 X 长文流水线搭建
**作者**: 码良
**日期**: 2026-07-15T08:03:25.000Z
**来源**: [https://x.com/cxjwin/status/2077303004735438982](https://x.com/cxjwin/status/2077303004735438982)
---

你正在读的这篇长文,从抓素材、写稿、生成配图到排期发布,没有我手动点过一次「发送」。
它是被这篇文章里写的流水线——WorkBuddy 读 SKILL.md 当操作手册、Codex 生图、Buffer 发短推、Typefully 发长文——自己发出去的。换句话说:这是一篇讲「让 AI 自动发 X」的文章,而它自己,正是被 AI 自动发出去的。
上篇我写了《我用 Claude Code + Codex + Buffer 搭了条无痛发推流水线》,有读者在评论区追了一句:这套东西离开 Claude Code 还能跑吗?毕竟 Buffer 的连接是写死在 `~/.claude.json` 里的,换个客户端,连接器面板里全是 disconnected,流水线会在发布这一步卡死。
这篇文章回答这个问题:能,而且我把"长文"也一起接进来了。 短推继续走 Buffer,长文(X Article,带标题、富文本、封面)走 Typefully。整条链路我在 WorkBuddy 上从头到尾实测跑通,过程中踩出三个文档里查不到、只能实测出来的坑——其中两个,根因都在「非交互 shell 读不到 `.zshrc`」。
## 一、整体架构:同一份 SKILL.md,换了个 Harness
```text
链接 ──> WorkBuddy(读 SKILL.md 当操作手册走流程)
├── WebFetch 抓原文
├── 按 SKILL.md 规范写中文摘要
├── Codex gpt-image-2 生成主题海报
├── ⏸ 人工确认(长文:先出草稿预览,再排期)
├── git push 到 GitHub 图床仓库
└── 发布(双通道):
├── 短推 → buffer-post.mjs 直连 Buffer JSON-RPC
└── 长文 → typefully-post.mjs 直连 Typefully API
```
和上篇最大的区别:这次没写任何新框架代码,只把"连接"从特定客户端的 MCP 面板,解耦成了"脚本 + 明文协议"。 两个发布脚本都是零依赖 node,直连官方端点:
- `buffer-post.mjs` → `https://mcp.buffer.com/mcp`(get_account / create_post / get_post)
- `typefully-post.mjs` → `https://api.typefully.com/v2`(drafts / media/upload)
效果很微妙但很重要:Harness 从 gatekeeper 退成了 runtime。 流水线能不能跑,不再取决于你用哪个客户端,而只取决于你能不能跑 bash + node。
## 二、摘要质量靠规范固化(这部分没变)
上篇已经写过,这里只复述结论:写作规范全部固化在 SKILL.md 里(钩子 + 2~3 要点 + 从业者短评;禁标题党词;每条至少一个具体信息点;折叠线以上放最强信息)。WorkBuddy 没有"自动加载 skill"的能力,它是把 SKILL.md 当操作手册读,一步步照着走。所以"可移植"指的是能力可复现,不是触发体验一致——功能全通,只是得我手动翻手册,不像 Claude Code 那样喊一声就自动调起。
## 三、生图:codex imagegen 的"超时"坑(新踩的)
这是第一个文档里查不到的坑。在 WorkBuddy 上第一次生图,codex imagegen 连吃三次 Exit 137(SIGKILL)。
我先怀疑 OOM——排除,机器 48G 内存,`ulimit` 全 unlimited。又怀疑 codex 的 Chromium 子进程被 macOS 杀——也排除,因为同环境的 Puppeteer 截图正常,而且 codex imagegen 实际走的是 WebSocket 通道,不靠本地 Chromium。
真因藏在我自己的工具里:WorkBuddy 的 Bash 工具有 180 秒超时,而 codex imagegen 实际需要约 224 秒。 codex 生图走 `wss://chatgpt.com` 的 WebSocket 长连接,还带自动重试(日志里能看到 `Reconnecting... 2/5`)。网络重试吃掉几十秒,留给实际生图的时间窗更窄,每次都在 3 分钟整被 SIGKILL,从没等到它完成。
修法一句话:超时放开到 300 秒,一次跑通。
```bash
export http_proxy=http://127.0.0.1:7897 https_proxy=http://127.0.0.1:7897 all_proxy=socks5://127.0.0.1:7897
codex exec --skip-git-repo-check -C <输出目录> --sandbox danger-full-access \
'$imagegen 生成一张 1536x1024 横版深色科技风推文海报,主题是「...」...'
# 超时务必 ≥ 300000ms(5 分钟)
```
Codex 的路线很聪明:gpt-image-2 生成无字底图,再本地用 Pillow 把中文精确叠上去,文字准确率 100%,背景质感又远超 CSS 渐变。如果它当真挂了,SKILL.md 里还有 `render.js` 的 HTML 模板兜底(Puppeteer 截图,3 秒出图、零成本、文字 100% 准),链路不中断。
## 四、图床:Buffer 只收 URL,GitHub 公开仓库兜底(同前)
上篇详写过,结论照用:Buffer 的 `assets[].image.url` 只收公开 URL、没有本地上传(用 introspect_schema 翻过整个 GraphQL schema 确认)。解法是拿 GitHub 公开仓库当图床,`raw.githubusercontent.com` 直链。顺带验证 Buffer 不转存图片——排期未发的帖子,图床上的图绝不能删。
## 五、发布:双通道(核心新增)
## 5.1 短推:buffer-post.mjs 解耦
根因上篇提过一半:Buffer 的 MCP 配置只活在 `~/.claude.json`(Claude Code 专属),别的客户端读不到,所以连接器全 disconnected,skill 原规则让它停下,行为其实是对的——只是根因是"连接被绑死在某个 harness 的面板里"。
治本方案是一个零依赖脚本直连 Buffer 的 JSON-RPC 端点,token 自动从 `BUFFER_TOKEN` 或 `~/.claude.json` 读取,不用复制凭证:
```bash
node .claude/skills/news-to-post/scripts/buffer-post.mjs --check # 连通检查
node .claude/skills/news-to-post/scripts/buffer-post.mjs \
--text-file /tmp/tweet.txt \
--image-url "https://raw.githubusercontent.com/cxjwin/post-assets/main/xxx.png" \
--first-comment "原文:https://..." \
[--due-at "2026-07-16T08:00:00+08:00"]
```
实测:WorkBuddy 上 `buffer-post.mjs --check` 连通正常(xxxxxx@gmail.com / My Organization),首发一条田柯宇世界模型创业帖,已成功发出。
## 5.2 长文:Typefully 通道(全新)
短推走 Buffer,但 Buffer 做不了 X Article——那种带标题、富文本、封面的文章格式。这条通道是今天新加的,走 Typefully API v2:
```bash
node .claude/skills/news-to-post/scripts/typefully-post.mjs --check
node .claude/skills/news-to-post/scripts/typefully-post.mjs \
--markdown-file 文章.md [--cover 封面.png] \
[--publish-at "2026-07-16T08:00:00+08:00"] # 不带 = 仅存草稿
```
正文直接吃 Markdown,标题自动取首个 `#` 一级标题,封面走 `media/upload` 预签名直传。已验证 social set `320605`(@cxjwin),需要 X Premium(我是 P+,满足)。
关键差异,必须单独说:长文不走短推那种"贴链接即发"的持续授权。一篇长文是作品级内容,默认只创建草稿,返回 `private_url` 预览链接,我在 Typefully 里核对排版后,再给你排期时间。发推是不可逆的对外动作,长文尤其不可逆——人工确认这一道闸门,不能省。
## 六、凭证与代理:非交互 shell 读不到 .zshrc(最隐蔽的坑)
这是第二个、也是最隐蔽的坑,根因和第三节的帮凶是同一个:WorkBuddy 的 Bash 是非交互 shell,根本不加载 `.zshrc`。
现象有两处。一是代理:`type proxy` 返回 not found,明明 `.zshrc` 里定义了 `proxy()` 函数。二是凭证:Typefully 的 key 我 `export` 在 `.zshrc` 里,结果脚本报"未找到 key"。一度以为是脚本 bug,后来才反应过来——交互 shell 才读 `.zshrc`,非交互的不读,所以 `.zshrc` 里 `export` 的任何东西,对 WorkBuddy 都不可见。
顺带挖出代理的真相:`.zshrc` 里真正的代理是 `http://127.0.0.1:7897` + `all_proxy=socks5://127.0.0.1:7897`;而环境变量里那个 `HTTP_PROXY=61745` 是别处注入的,只有 http、没有 socks5。codex imagegen 的子进程走 socks,61745 那套缺 socks,所以子进程联网直接挂——这也是第三节生图卡顿的帮凶之一。
凭证该放哪?两个治本办法:
- 环境变量:放 `~/.zshenv`。zsh 对所有调用都 sourcing,交互非交互通吃。
- 文件(最跨 agent,我最后选的):把 key 写进 `~/.config/typefully/key`。脚本直接 `fs.readFileSync` 读文件,完全不依赖 shell 加载——跟 Buffer 脚本读 `~/.claude.json` 是同一个思路(都是"读文件",不是"依赖环境变量被注入")。
我最后落了方案 B:把 Typefully key 写进 `~/.config/typefully/key`,权限 600。之后 WorkBuddy 跑 Typefully 零注入,`--check` 仅凭文件读取就连通。`.zshrc` 里那行 `export` 成了冗余,留着无害,删了更干净。
## 七、人工确认:全自动流水线上唯一的闸门
短推我有持续授权(贴链接即发,红线内容回退确认);长文则默认草稿 + 预览,确认后才排期。这条规则在 SKILL.md 里是最重语气("绝对不能"级别):海报 push 到公开图床、碰 Buffer / Typefully 的任何写入接口,都必须在我明确说"发"之后。
为什么这道闸门不能省:发推是不可逆的对外动作,AI 写的东西再靠谱,人设、立场、时机的最终责任在我。实际跑下来,确认环节平均花 10 秒,但它把"AI 替我发了不想发的东西"的概率压到零。自动化的目标从来不是消灭人的决策,是把人的决策压缩到只剩决策本身。
## 八、几个通用的经验
1. Skill 的本质是把 SOP 写成文档,而且这份文档能跨 agent 跑。 整条流水线逻辑就是一份 Markdown,AI 读得懂,人也读得懂,改起来就是编辑文档。这次更进一步:同一份 SKILL.md,Claude Code 自动加载成 skill,WorkBuddy 当手册读,都能执行同一条流水线。
2. 实测结论要回写。 Buffer 不转存图片、thread 字段校验、codex 需要 300s 超时、非交互 shell 读不到 `.zshrc`——这些踩出来的结论我全回写进了 SKILL.md 和一份 `docs/troubleshooting.md`。Skill 会随使用变聪明,前提是你把学到的东西存回去。
3. 连接层解耦 > 编排层差异。 把能力从"某个 harness 的 MCP 面板"下沉到"脚本 + 明文协议",Harness 就从 gatekeeper 退成 runtime。这正好印证我之前那条推文——Harness 决定能力怎么被用:能力本身可以被任何客户端复现,只是触发方式不同。Claude Code、WorkBuddy、Cowork、或者随便什么能跑 bash + node 的 agent,读同一份 SKILL.md 都能跑同一条流水线。
4. 凭证纪律由工具兜底。 聊天记录里出现过的 key 都应视为已泄露,用完轮换。把 key 放文件(如 `~/.config/typefully/key`)而非散落在 `.zshrc` 的环境变量里,不仅跨 agent 更稳,也更容易单独设 600 权限、单独轮换。
## 附:WorkBuddy 实测数据
| 指标 | 数值 |
| --- | --- |
| 短推首发 | 1 条(田柯宇世界模型创业,已发出) |
| 长文通道 | Typefully 连通验证通过(social set 320605 / @cxjwin) |
| codex imagegen 实际耗时 | ~224s(需 ≥300s 超时,否则 SIGKILL) |
| 代理 | 7897 + socks5 all_proxy(非交互 shell 需显式 export) |
| 新增基础设施 | buffer-post.mjs + typefully-post.mjs(零依赖 node) |
## 相关链接
- [@cxjwin](https://x.com/cxjwin)
- [944](https://x.com/cxjwin/status/2077303004735438982/analytics)
- [https://mcp.buffer.com/mcp](https://mcp.buffer.com/mcp)
- [https://api.typefully.com/v2](https://api.typefully.com/v2)
- [@cxjwin](https://x.com/@cxjwin)
- [@cxjwin](https://x.com/@cxjwin)
- [Upgrade to Premium](https://x.com/i/premium_sign_up)
- [4:03 PM · Jul 15, 2026](https://x.com/cxjwin/status/2077303004735438982)
- [944 Views](https://x.com/cxjwin/status/2077303004735438982/analytics)
- [View quotes](https://x.com/cxjwin/status/2077303004735438982/quotes)
---
*导出时间: 2026/7/15 22:28:13*