-
防重複:grep "| <slug> |" docs/philip/syndication-log.md(完整欄位格式,避免前綴重疊的 slug 誤命中;檔案不存在視為無紀錄)。已有紀錄 → 停,回報既有 Medium URL,結束。無紀錄 → 接 Step 2。
-
跑 prep script(repo root):node .claude/skills/medium-syndicate/scripts/medium-prep.mjs <slug>,讀 JSON 輸出(title / description / tags / canonicalURL / outDir / risks)。注意 outDir 在 /tmp,macOS 重開機或隔夜可能被清——Step 7 要用時若檔案不在,重跑本步即可。接 Step 3。
-
原站上線確認:對 prep 輸出的 canonicalURL 跑 curl -sI 確認 200,再 curl -s 抓頁面 grep rel="canonical" 確認自我 canonical 存在。任一失敗 → 停(文章沒上線,先走發布流程),結束。通過 → 接 Step 4。
-
風險處理(開瀏覽器前在對話裡先做完):
risks.tableLines > 0 → Medium 編輯器不支援表格:把每個表格改寫成條列或段落,貼給使用者過目,等拍板才繼續;拍板後把定稿寫進 <outDir>/table-rewrites.md(Step 6 取用;/tmp 被清就重跑 Step 2 並重存)
risks.images 非空 → 列出哪幾張圖要在編輯器手動上傳,列完即續行
risks.codeBlocks 非空 → 列出區塊編號與語言,預告 Step 7 要逐塊重建,列完即續行
risks.externalLinks 僅供參考——貼渲染版會自動保留連結,不需處理
全部處理完 → 接 Step 5。
-
開瀏覽器:tabs_context_mcp 看現況 → 新分頁開 https://medium.com/new-story。出現登入頁 → 停,請使用者登入 Medium 後說「好了」再從本步重來(不代登入,這是流程唯一需要使用者操作的點)。已登入看到編輯器 → 接 Step 6。
-
內容注入(代發):
- 跑
node .claude/skills/medium-syndicate/scripts/medium-paste-html.mjs <slug>——抓已發布頁、剝 header/footer/H1、把程式碼區塊與表格換成 ⟦CODE-BLOCK-N⟧ / ⟦TABLE-N⟧ 佔位符,產出 <outDir>/paste.html
- 跑
bash .claude/skills/medium-syndicate/scripts/clipboard-html.sh <outDir>/paste.html 把 HTML 放進系統剪貼簿(輸出應含 «class HTML»)
- 標題用剪貼簿貼上、不要用
type(type 對混中英數標題會丟英文段,2026-06-13 實撞 MEMORY.md/25KB 被吞):printf '%s' '<title>' | pbcopy → JS 取 .graf--title 的 getBoundingClientRect() 拿實際座標(每分頁重讀,視窗大小變時座標會變;空標題塊要點靠左 placeholder 文字處 ≈ x=460,點中心 x=744 會落右側空白、focus 跑去內文)→ 真實 left_click 該座標 → type 一個字元喚醒草稿(fresh /new-story 未實例化時純 cmd+v 會被吞、URL 卡 /new-story;type 一字後 URL 變 /p/<id>/edit 才算醒;type 偶爾首發也被吞、重點重打一次)→ cmd+a 全選 → Delete → cmd+v 貼標題 → JS 讀 .graf--title 比對(NBSP 差異可接受,用 .replace(/ /g,' ') 正規化後比)。不符 → 重貼一次
- 重新
bash clipboard-html.sh <outDir>/paste.html 載回內文 HTML → 按 Return 在標題下建新塊(不要用 Down——單行標題按 Down 游標沒離開標題塊、貼上第一段會被吸進標題;Return 才建獨立新塊)→ cmd+v 貼內文 → JS 確認段落數與 paste.html 的 paragraphs 大致相符、無殘留 ⟦⟧ 佔位符、無「Something is wrong」存檔錯誤。明顯缺段 → 重貼一次;仍失敗 → 停,回報使用者
完成 → 接 Step 7。
-
佔位符重建:(code block 捷徑:純文字 code 不需語法高亮時,可在 paste.html 階段直接把 ⟦CODE-BLOCK-N⟧ 換成 <pre>...</pre> 一起貼,Medium 會自動轉成原生 code block〔class graf--preV2、2026-06-13 keep-the-wiki-alive 驗過〕,免本步逐塊重建;需語法高亮才走下面手動路徑。)每個 ⟦CODE-BLOCK-N⟧:點進該段選取整行刪除 → 打三個反引號觸發原生 code block → cat <outDir>/code-block-N.txt | pbcopy → cmd+V → 左上角下拉選語言(自動偵測常錯,必看)。每個 ⟦TABLE-N⟧:同法換成 Step 4 拍板的 table-rewrites.md 對應段落(pbcopy 純文字貼上)。全部換完 read_page 全文比對 body-no-frontmatter.md,確認無殘留佔位符、結尾段完整。接 Step 8。
-
canonical 硬閘(發布前必做):走「舊版 UI 路徑」(2026-06-29 驗證仍存在;新版「Customize canonical link」直接在三點 menu 找不到、別繞):編輯器右上三點 → More settings → 頁面捲到底找 Advanced Settings 區段(這是 collapsible、預設收合、右側有 > 箭頭——容易誤判成「沒這個選項」,必須先點標題展開)→ 展開後出現 Customize Canonical Link 段 → 勾「This story was originally published elsewhere」checkbox → URL 輸入欄出現 → 看 input 是否 disabled(read-only)判斷分支:(a) 新文剛勾:input editable + 預填 Medium-self URL → click input → cmd+a → type 原站 URL → click「Save canonical link」(b) 舊文補設(input disabled、button 顯示「Edit canonical link」而非「Save canonical link」)→ 先 click 「Edit canonical link」 進編輯模式 → input 變 editable → click input → cmd+a → type 原站 URL → click「Save canonical link」。出 toast「Canonical link successfully updated」即成。設不成功 → 停在這裡排查,不進 Step 9。成功 → 接 Step 9。
-
tags 與發布(代發):點 Publish 進發布設定 → 填最多 5 個 topics(從 prep 的 tags 對應,建議見 references/medium-mechanics.md 的 tag 段)→ 確認 canonical 提示仍在 → 點最終 Publish 送出(使用者已授權,2026-06-13)→ 從發布完成頁取得文章 URL。接 Step 10。
-
發布後驗證:對 Medium 文章 URL curl -s | grep -o '<link rel="canonical"[^>]*>'(或 view-source),確認指回原站。接 Step 11。
-
轉發紀錄落檔(副作用步驟,不可略過):append 到 docs/philip/syndication-log.md(不存在先建,表頭:# 轉發紀錄 + 欄位說明行):
- YYYY-MM-DD | <slug> | <Medium URL> | canonical=<驗證結果 ok/異常>
寫完 grep 回讀確認該行存在 → 給使用者驗收回報:Medium 文章 URL、canonical 實際值與原站 URL 的比對、佔位符重建數、全文比對結果。流程結束。