我把發文流程開源了






我每天發文都在跑同一套流程:寫完 source.md,讓 AI 產出 Threads、Facebook、LinkedIn 三份草稿,自己看過一遍,再讓瀏覽器把文貼上去。跑久了才發現一件事——這套流程跟我寫什麼內容其實沒關係。它不是我文章的一部分,是一套可以整個搬走的工具。
所以我把它整理成 social-publish-kit 開源出來:https://github.com/dawson54068/social-publish-kit
這篇分享:三行指令怎麼裝起來、為什麼「一份 source 發三個平台、平台檔不重寫」是整套的核心、為什麼發佈那一步我一定要卡一關人工確認,還有把它搬出來最花時間的其實是拔東西、不是寫新功能。
三行指令先裝起來
先講怎麼跑起來。需要 Node.js 20 以上:
corepack yarn install
corepack yarn playwright install chromium
corepack yarn setup-browser --platforms threads,facebook,linkedin
第三行會開一份獨立的瀏覽器設定檔,讓你手動登入 Threads、Facebook、LinkedIn。登一次,之後都用同一份。
然後跑內容:
corepack yarn workflow --content-dir content/example # 只驗證跟預覽
corepack yarn workflow --content-dir content/example --render-images # 順便產圖
corepack yarn workflow --content-dir content/example --publish --yes # 設定開啟後才會真的發出去
上面這三行裡,前兩行都不會發任何東西,只做驗證、預覽跟產圖。這是預設行為,不是你要另外選的選項。
但要先說清楚:我沒有在別人的機器上測過。所以你裝的時候,很可能需要請 AI 幫你調成你的環境跑得動的樣子,直接讓它引導你走一遍設定就好。有些設定檔是一次性的,設完之後就不用再碰。
為什麼決定把它開源
其實是被問出來的。上次去中正高工上課,有學員問我這套流程能不能自己裝一份。那之前我一直把它當成「我自己的工作流」,沒想過它可以是別人的——有人開口要,我才動手把它從個人設定裡拆出來。
說起來這套東西的起點沒什麼大道理:就是每天發文太累。以前文章寫完之後,還要手動把內容複製貼上到三個平台,一天一次、天天都要。我不想再把時間花在這段複製貼上,才開始一點一點把它交出去。
它到底是什麼
用一句話講:可攜式的社群寫作技能,加上一套中間要卡一關人工確認的瀏覽器發佈流程。
分成兩半來看。
寫作那一半是一組 skill(AI 用的招式檔——一份 markdown,AI 讀完照著做):platform-adapter 把單一 source.md 轉成各平台草稿、threads-optimizer 跟 facebook-optimizer、linkedin-optimizer 是舊的改寫路徑(現在預設不走,保留給需要重寫的人)、source-crosscheck 對照原稿檢查、proofreading 做繁體中文校對、image-prompt 跟 image-slides 產圖片提示詞、image-gen 把提示詞渲染成 PNG、social-content-pipeline 把上面這些串成一套流程。
發佈那一半是 social-browser-publisher 這個 skill,加上它驅動的一支本機 Node/Playwright(微軟做的瀏覽器自動化工具)執行器,負責預覽、登入設定,以及真的把文貼上去。
專案裡同時放了 .claude-plugin/plugin.json 跟 .codex-plugin/plugin.json,所以 Claude Code 跟 Codex 都可以把專案根目錄整個當外掛裝。Gemini CLI 和 Antigravity 不讀 plugin.json,那邊要把 skills/ 底下的資料夾連結過去——要用 symlink(捷徑,指向原本的資料夾,不是另存一份),不要用複製。執行器跟 package.json 在專案根目錄、在 skills/ 外面,只複製技能資料夾的話,發佈那一半會找不到可以跑的根目錄。
一份 source 發三個平台,平台檔不重寫
這是整套設計的核心。
source.md 是唯一的事實來源,三份平台檔案都是從它衍生出來的,只做平台逼你做的結構調整——Threads 要切成多則、FB 跟 LinkedIn 把連結挪去第一則留言、純文字平台要把 Markdown 語法拿掉。內容本身不重寫、不加料、不縮短。
聽起來很基本,但只要你讓 AI「幫我改寫成更適合 Threads 的版本」,它就會開始自由發揮:補上一句你沒說過的結論、把三個例子縮成兩個、把你的數字四捨五入。等你發現的時候,三個平台講的已經是三件不太一樣的事。
所以才需要 source-crosscheck。它的工作只有一件:把平台檔案拿回去對照 source.md,找出被改掉或憑空長出來的事實。再加上 proofreading 檢查繁體中文的用字跟術語,這兩關是內容出門前的品管。
發之前一定要有人看過
自動發文最可怕的不是做不到,是它做到了但你沒看過。
所以發佈這條路徑是刻意做得難走的。要真的發出去,三個條件必須同時成立:
- 平台草稿檔案存在,而且通過長度檢查
config.json沒有把publishers_enabled關成false(範例設定檔預設就是false,照著複製的人要自己改成true),或你明確加上--force- 指令同時包含
--publish和--yes
少任何一項,它就只會驗證跟預覽。這不是防呆,是防我自己——防我半夜順手敲了一行指令,隔天早上才發現三個平台都貼出去了。
瀏覽器那一邊也是一樣的做法:它用專屬的 Playwright 設定檔(會保留登入狀態、跟你的 Chrome 各自獨立),不會接上、複製或關掉你平常在用的 Chrome。你日常的分頁、登入狀態、密碼,跟它沒有交集。
Day 220 寫的那次,我差一步就把身分證字號連著證書照片發出去,是 AI 在執行任務途中順手抓到的。那次之後我更確定:流程裡有沒有一關「人一定要看過」,就是會不會出事的分水嶺。
搬出來的時候,最花時間的是拔東西
要把一套自己天天在跑的流程變成別人裝得起來的東西,寫新功能不是重點,拔掉舊東西才是。
專案裡不放帳號的登入憑證(token)、不放私人分析資料、不放個人品牌檔案、不放本機的絕對路徑,也不放特定發佈者的檔案名稱。原本寫死在流程裡的網域、作者、內容 ID、分析資料、語氣設定、瀏覽器設定,全部收進一份設定合約(docs/config-contract.md),照著它填 config.json 就好。
有一條規則我覺得比設定檔本身重要:就算完全沒有設定檔,技能還是要能跑,沒設定到的功能就直接略過,不要報錯停下來。不然「可攜」就會變成「先花兩小時填設定才能開始」。
跟之前那幾篇差在哪
我寫過幾篇跟這套流程有關的:Day 149 講 Workflow 跟 Skill 的分工,順帶解釋我的 /content-pipeline 為什麼還是用 skill 跑;Day 208 講我把整套流程搬進瀏覽器、用 Studio 遙控 Claude Code。
那些寫的是「我怎麼用」——架在我的機器、我的網域、我自己的私人網路上,你看完知道原理,但裝不起來。這篇是「你怎麼裝」。從前者走到後者,做的就是上面那件事:拔東西。
一套只有我能跑的流程,跟一套誰都能裝的流程,中間差的不是程式碼,是把寫死的東西拔乾淨。
最近開始做免費的一對一諮詢,幫你把 AI 接進自己的工作流——有需要的話可以約:https://www.dawsonwang.com/
social-publish-kit:https://github.com/dawson54068/social-publish-kit 授權:MIT Day 149 Workflow 跟 Skill 終於分家 Day 208 瀏覽器當 Claude Code 的遙控器 Day 220 差一步就把身分證字號發出去