Community生產力與協作github.com

faloppad/social-calendar

將一則內容(功能筆記、螢幕截圖、新聞連結、Podcast 片段、客戶評論、活動照片、數據資料點)轉換為各個相關頻道的社群媒體貼文,以各頻道的語氣撰寫,並排入 Airtable 社群行事曆以供審核。

social-calendar 是什麼?

此技能旨在協助使用者將任何形式的內容(例如功能筆記、新聞連結、Podcast 片段、客戶評論、活動照片或數據資料點)快速轉換為多個社群平台的貼文,並將它們排入 Airtable 進行審核與排程。它支援 LinkedIn、X、Instagram、Facebook、Threads、TikTok、YouTube、Bluesky、Substack 以及員工/創辦人個人檔案等平台。技能會先閱讀儲存在本機的「策略」與「頻道」設定檔,以了解每個帳號的語氣與發布規則,再根據 Airtable 中的行事曆檢查發文頻率間隔、避免內容重複與碰撞,最後以 JSON 批次檔透過指令稿建立貼文紀錄。它也能處理圖片上傳、排程檢查、貼文移動與拒絕等後續流程,並在獲得使用者明確授權後,將已核准的貼文交給上傳排程器發布。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/faloppad/agent-social-calendar/tree/main/skills/social-calendar

Installed? Explore more 生產力與協作 skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

社群行事曆

將一則內容轉換為多個頻道的貼文,並放入 Airtable 行事曆供人員審核。發佈作業透過 scripts/publish_approved.py 執行,它會將已核准的貼文交給 Upload-Post 的排程器。你只在使用者提出要求時執行此指令稿。

欄位名稱、狀態值與環境變數均來自 repo 中的 docs/data-model.md。請勿重新命名。以下指令稿路徑皆相對於此技能所屬的資料夾。

開始之前

  1. 確認 AIRTABLE_TOKEN 與 AIRTABLE_BASE_ID 已設定(環境變數或位於工作目錄 / repo 根目錄的 .env 檔案中)。執行 python3 scripts/airtable_calendar.py channels 作為一次煙霧測試。若資料表尚未存在,請引導使用者執行 repo 根目錄的 scripts/setup_airtable.py。
  2. 找到策略資料夾。若設定了 STRATEGY_DIR 則使用該路徑。否則依序查詢工作目錄下的 strategy.md、./my-strategy/ 與 ./strategy/。若不存在,詢問策略檔案位置。若使用者尚無策略檔案,提議複製 templates/strategy.md 與 templates/channels/_channel-template.md,並在開始撰寫任何貼文前一起填入內容。

若 Airtable MCP 連接器可用,你亦可使用它來取代指令稿進行讀寫。此文件中的規則仍然適用。詳見 references/airtable.md。

工作流程

1. 讀取策略與頻道檔案

完整讀取 strategy.md:目標、OKR、受眾、內容支柱、全域規則。接著列出 channels/*.md,並閱讀此內容可能投放之頻道的對應檔案。每個頻道檔案包含該帳號的語氣、目標、發文頻率、格式、注意事項以及範例貼文。

將頻道檔案與 Airtable 中的 Channels 資料表列透過 Channel file 欄位進行比對。只有 Airtable 中狀態為 Active 的頻道才能接收貼文。若某頻道檔案找不到對應的 Channels 列,請告知使用者並跳過該頻道。

2. 識別貼文類型與行銷活動

判斷內容的性質:功能發布、新聞、Podcast 或影片片段、客戶評論、活動照片、數據或文字見解、文章推廣,或其他類型。閱讀 references/post-types.md,了解各類型如何轉化為貼文、適合哪些頻道以及應在多大時間範圍內散布。

為此批次賦予一個行銷活動標籤,格式為 YYYY-MM <類型> <標籤>,例如 2026-11 Podcast Ep 12 或 2026-11 Feature CSV export。將原始輸入放入 Source 欄位(連結、檔案名稱、集數或一行備註)。

僅當答案會改變貼文內容時才提問,例如「投放哪些頻道?」(當策略未明確指示時),或「此內容是否有發布時間限制?」。否則自行決定並告知你的決策。

3. 檢視行事曆

列出即將填入時間段內(預設未來 4 週,Podcast 片段則更長)已規劃的內容:

python3 scripts/airtable_calendar.py list --from today --to +28 --json > /tmp/calendar.json

針對每個目標頻道,確定:

  • 發文頻率間隔。 每週貼文數相較於頻道檔案目標。計算時排除狀態為 Rejected 與 Failed 的貼文。
  • 時間碰撞。 該頻道當日是否已有貼文。預設為每個頻道每天最多一篇貼文,除非頻道檔案另有規定。
  • 主題混合。 一週內是否有太多同一類型的貼文(例如三篇新聞、連續兩則促銷)。將新貼文移至較空的一週。
  • 重複內容。 相同的訊息是否已排程或近期已發布。create 指令會執行相似度檢查。你也可以單獨使用 check-duplicates 指令執行此檢查。

4. 草擬貼文

每個頻道、每個日期撰寫一篇貼文。每篇貼文都需遵循對應頻道檔案的規定:語氣、長度、格式、話題標籤、行動呼籲。以下是適用於所有貼文的規則:

  • 僅使用來源檔案或策略檔案中的事實。請勿憑空捏造數字、引言、客戶名稱或結果。
  • 請勿在不同頻道貼上相同文字。創辦人的個人檔案與公司頁面對同一功能的描述應有所不同。
  • 員工與共同創辦人頻道需以該人員的語氣撰寫,並需要他們的核准。將 Owner 設為頻道檔案中指定的核可人。
  • PostContent 欄位應包含最終文字,並使用真實的換行符號。Emoji 與 Unicode 皆可使用。話題標籤通常放在內文中,通常位於結尾,依頻道檔案規定。
  • LinkedIn 與 X 會將 **text** 顯示為星號。僅當頻道使用者會將內容貼入支援 Markdown 的編輯器時(例如 Substack),才使用 **粗體**。若頻道檔案另有規定,則依其規定。
  • 字數限制:X 超過 280 字會自動成串,Threads 為 500,Bluesky 為 300。除非頻道檔案要求使用串文,否則請使貼文符合長度限制。
  • 遵循 strategy.md 中的寫作規則。若策略檔案中無相關規則,請使用簡潔直接的句子,並避免填充物、空泛詞語與套話。

5. 選擇日期

Scheduled for 僅包含日期,格式為 YYYY-MM-DD。時間來自頻道的 Post time 與 Timezone 欄位,因此請勿在貼文中加入時間。

  • 先填補發文頻率間隔,再散布其餘貼文。單一項目的推廣貼文應分散於 2 至 3 週內,而非集中在同一天。
  • 新聞應於當天或隔天發布,否則不予發布。
  • Podcast 片段約以每個頻道每週一至兩則,持續約 3 個月。
  • 將不同類型的貼文混合於一週內:教育、互動、產品、社會證明。
  • 切勿使用過去的日期。僅在使用者明確要求且知曉當日排程可能已執行完畢時,才使用「今天」這個日期。
  • 若某週已滿,將貼文移至下一週,並於報告中說明。

6. 處理媒體檔案

Airtable 僅能接收公開 URL。本機路徑與 file:// 連結會被默默忽略。批次建立貼文時使用的圖片與影片可以為本機路徑。指令稿會先將它們上傳至 catbox.moe,再將公開 URL 傳遞給 Airtable,Airtable 會將檔案複製到自己的儲存空間。Catbox 的上傳內容是公開且無法刪除的,因此請勿用於任何機密內容。如有此情況,請要求使用者改用其他主機。詳情請見 references/airtable.md。

對於需要視覺元素的文字或數據貼文(例如 Instagram、TikTok 或頻道檔案要求的情況),請製作一張簡單的圖片。請遵循 references/visuals.md。

7. 建立紀錄

將批次內容以 JSON 列表格式寫入,使用 Posts 欄位名稱:

[
  {
    "Name": "Feature - CSV export",
    "Status": "To approve",
    "Scheduled for": "2026-11-12",
    "Channel": "Brightloop LinkedIn",
    "PostContent": "You can now export any report to CSV.\n\nOne click, top right.",
    "Media": ["/tmp/csv-export.png"],
    "Source": "Release note 2026-11-10",
    "Campaign": "2026-11 Feature CSV export",
    "Owner": "[email protected]"
  }
]

狀態選擇方式如下:

情況狀態
準備好讓擁有者審閱(預設)To approve
Instagram、TikTok、YouTube 或 Pinterest 的貼文尚無媒體Needs media
使用者想先來回修改文字Draft
使用者明確為自己的頻道核准(見下方說明)Approved

先進行模擬執行,向使用者展示計畫,然後再建立:

python3 scripts/airtable_calendar.py create /tmp/batch.json --dry-run
python3 scripts/airtable_calendar.py create /tmp/batch.json

create 指令會驗證欄位名稱、狀態、日期與頻道名稱;將僅限圖片平台中缺乏媒體的貼文降級為 Needs media 狀態;並在偵測到可能的重複內容時拒絕寫入。請修正批次內容,或在使用者確認後傳遞 --allow-duplicates 參數。每次寫入以 10 筆為一批。已儲存在 CSV 中的計畫(包含欄位:Date, Channel, Content Type, Post Text, Hashtags, Image Suggestion)可直接使用 --csv 參數匯入。

8. 回報結果

最後提供一個表格,每個已建立的紀錄佔一列,按日期排序:

日期頻道狀態名稱開場白

在表格下方,以簡潔的句子列出:跳過的頻道與原因、延至後續一週的貼文、狀態為 Needs media 的貼文及其所需內容,以及任何需要擁有者檢查的事項(主張、姓名、連結)。

其他請求

  • 「為這些貼文加上圖片。」 執行 python3 scripts/airtable_calendar.py attach <record_id> <file or URL>。狀態為 Needs media 的貼文會自動變更為 To approve。
  • 「移動這則貼文」、「拒絕那則。」 執行 update <record_id> --set "Scheduled for=2026-11-20" 或 --set Status=Rejected。若貼文狀態已是 Scheduled,則後續需執行 python3 scripts/publish_approved.py --sync,以便 Upload-Post 端的副本也同步更新。
  • 「這週有哪些貼文要發布?」 執行 list --from today --to +7,並按頻道與日期進行摘要。
  • 策略或語氣的變更。 編輯 Markdown 檔案,而非 Airtable。每週的 social-calendar-review 技能會負責提出這些編輯建議。

代表使用者核准

僅當使用者明確提出要求(例如「核准我的貼文」、「這些可以直接發布」),且僅針對使用者本人為 Owner 的頻道。絕對不要核准員工或共同創辦人個人檔案的貼文,即使對方隨口提及也不行。請引導使用者去找該人員處理。將這些貼文設為 Approved(可在建立時設定,或使用 update <record_id> --set Status=Approved 指令事後設定),並在報告中將它們獨立列出。

交接給發布程序

當使用者要求排程已核准的貼文時(例如「排程所有已核准的貼文」、「把這些發出去」):

  1. 執行 python3 scripts/publish_approved.py --sync --reconcile --mode schedule --dry-run,並顯示它將傳送的內容:頻道、日期與時間、媒體類型、文字第一行。
  2. 使用者確認後,不加 --dry-run 參數再次執行。Upload-Post 會保存排程,貼文狀態將變為 Scheduled。
  3. 若任何已核准貼文的時間段已過,請告知使用者,並提供 --mode now 選項。

使用者可能也有例行工作或定時任務正在執行該指令稿,在這種情況下,已核准的貼文會自動被排程,無需你介入。請閱讀 references/publishing.md 以了解重新排程、取消、調節以及完整的欄位對應。優先使用指令稿而非自行呼叫 Upload-Post API,因為指令稿在每次貼文上不會耗費 token。

永遠不要發布或排程任何使用者未在此對話中要求的內容。 建立狀態為 To approve 的貼文紀錄是此技能的正常終結點。

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

相關技能