ソーシャルカレンダー

1つのコンテンツ(機能ノート、スクリーンショット、ニュースリンク、ポッドキャストクリップ、カスタマーレビュー、イベント写真、データポイント)を、各チャンネルのトーンに沿ったソーシャルメディア投稿に変換し、承認用のAirtableソーシャルカレンダーにスケジュールします。

ソーシャルカレンダー とは?

このスキルは、1つのコンテンツから複数のソーシャルメディアチャンネル(LinkedIn、X、Instagram、Facebook、Threads、TikTok、YouTube、Bluesky、Substack、従業員/創業者プロフィール)向けの投稿を生成し、承認プロセスを管理するためのものです。ユーザーが「これを投稿して」、「全チャンネルにこれを投稿」、「ポッドキャストを使い回して」、「来週のカレンダーを埋めて」といったリクエストをした際に起動します。まず戦略ドキュメントと各チャンネルのガイドラインを読み込み、投稿タイプを特定し、既存のカレンダーを確認して重複やギャップを分析します。次に、各チャンネルのトーンに合わせた投稿をドラフトし、画像が必要な場合は生成・ホスティングし、Airtableにレコードを作成します。承認はユーザー明示的な指示に基づいてのみ行われ、承認後は `scripts/publish_approved.py` スクリプトを使用してUpload-Postのスケジューラーに連携します。このスキルは、Claude Codeや類似のAIエージェント環境で動作し、Airtable MCPコネクターも利用可能です。

対応~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に質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

ソーシャルカレンダー は何をしますか?

1つのコンテンツを複数のチャンネル向けの投稿に変換し、承認用のAirtableカレンダーに登録します。公開は scripts/publish_approved.py を通じて行われ、承認済みの投稿をUpload-Postのスケジューラーに渡します。このスクリプトはユーザーがリクエストした場合にのみ実行します。

フィールド名、ステータス値、環境変数はリポジトリ内の docs/data-model.md から取得します。名前を変更しないでください。以下のスクリプトパスは、このスキルのフォルダからの相対パスです。

開始前に

  1. AIRTABLE_TOKEN と AIRTABLE_BASE_ID が設定されていることを確認します(環境変数、または作業ディレクトリ/リポジトリルートの .env ファイル)。動作確認として python3 scripts/airtable_calendar.py channels を実行します。テーブルがまだ存在しない場合は、リポジトリルートにある 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 をリストし、このコンテンツが投稿される可能性のあるチャンネルのファイルを読みます。各チャンネルファイルには、そのアカウントのトーン、目標、頻度、フォーマット、禁止事項、および例となる投稿が含まれています。

チャンネルファイルをChannelsテーブルの Channel file フィールドで行と照合します。Airtableで Active ステータスのチャンネルのみが投稿を受け取れます。チャンネルファイルに対応するChannels行がない場合は、その旨を伝えてスキップします。

2. 投稿タイプとキャンペーンを特定する

コンテンツが何であるかを特定します:機能発表、ニュース、ポッドキャストまたはビデオクリップ、カスタマーレビュー、イベント写真、データまたはテキストのインサイト、記事プロモーション、その他。各タイプがどのように投稿になるか、どのチャンネルが適しているか、どの程度拡散するかについては references/post-types.md を参照します。

バッチに YYYY-MM <タイプ> <ラベル> の形式で Campaign ラベルを付けます。例:2026-11 Podcast Ep 12 または 2026-11 Feature CSV export。生の入力を Source に入れます(リンク、ファイル名、エピソード、または1行のメモ)。

回答によって投稿が変わる場合にのみ質問します。例:「どのチャンネル?」(戦略から明らかでない場合)、「これは特定日までEmbargoですか?」。それ以外の場合は、自分で決定し、何を決定したかを伝えます。

3. カレンダーを確認する

これから埋めようとしている期間(デフォルトは今後4週間、ポッドキャストクリップの場合はより長く)に既に計画されているものをリストします:

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

対象の各チャンネルについて、以下を把握します:

  • 頻度のギャップ。 チャンネルファイルの目標に対する週あたりの投稿数。Rejected と Failed を除くすべてのステータスをカウントします。
  • 衝突。 そのチャンネルですでに投稿がある日。デフォルトでは、チャンネルファイルで特に指定がない限り、チャンネルあたり1日最大1投稿です。
  • トピックのミックス。 1週間に同じタイプが多すぎる場合(ニュース投稿3つ、プロモーションが2つ連続など)。新しい投稿はより空いている週に回します。
  • 重複。 同じメッセージがすでにスケジュールされているか、最近公開されたもの。create コマンドは類似性チェックを実行します。単独で実行するには check-duplicates を使用します。

4. 投稿をドラフトする

チャンネルと日付ごとに1つの投稿を書きます。各投稿はそのチャンネルのファイルに従います:トーン、長さ、フォーマット、ハッシュタグ、行動喚起。すべてに適用されるルール:

  • ソースまたは戦略ファイルにある事実のみを使用します。数値、引用、顧客名、結果を捏造しないでください。
  • 同じテキストをチャンネル間で貼り付けないでください。創業者のプロフィールと会社ページでは、同じ機能について異なることを言います。
  • 従業員および共同創業者のチャンネルは、その人の声で書かれ、その人の承認が必要です。Owner をチャンネルファイルに指定された承認者に設定します。
  • PostContent には実際の改行を含む最終テキストを入れます。絵文字とUnicodeは問題ありません。ハッシュタグはインラインで、通常はチャンネルファイルの指示に従って最後に配置します。
  • LinkedInとXでは **text** はアスタリスクとして表示されます。**bold** は人間がMarkdown対応エディタに貼り付けるチャンネル(Substackなど)でのみ使用します。チャンネルファイルで別の指示がある場合はそれに従います。
  • 文字数制限:Xは280文字を超えるとスレッドに分割、Threadsは500、Blueskyは300。チャンネルファイルがスレッドを要求しない限り、収まるように書きます。
  • strategy.md の文章ルールに従います。ルールがない場合は、平易で直接的な文章を書き、空語、誇大広告、決まり文句は避けます。

5. 日付を選ぶ

Scheduled for は日付のみ、YYYY-MM-DD 形式です。時刻はチャンネルの Post time と Timezone から来るので、投稿に時刻を入れないでください。

  • まず頻度のギャップを埋め、残りを分散させます。1つのアイテムのプロモーション投稿は2〜3週間にわたって行い、同じ日にすべて配置しないでください。
  • ニュースは当日または翌日に出すか、出さないかのどちらかです。
  • ポッドキャストクリップは、約3ヶ月にわたって週に1つまたは2つ程度、チャンネルごとに投稿します。
  • 1週間の中でタイプを混ぜます:教育、エンゲージメント、プロダクト、ソーシャルプルーフ。
  • 過去の日付は絶対に使用しないでください。今日の日付は、ユーザーが明示的に要求し、当日の公開が既に行われている可能性があることを理解している場合にのみ使用します。
  • 週がいっぱいの場合は、投稿を翌週に移動し、レポートでその旨を伝えます。

6. メディアをホスティングする

Airtableは公開URLのみを取り込みます。ローカルパスや file:// リンクは無視されます。作成バッチ内の画像やビデオはローカルパスで指定できます。スクリプトはまずそれらをcatbox.moeにアップロードし、公開URLをAirtableに渡します。Airtableはファイルを自身のストレージにコピーします。Catboxへのアップロードは公開され、削除できません。機密情報には使用しないでください。その場合はユーザーに別のホストを尋ねます。詳細は references/airtable.md を参照してください。

ビジュアルが必要なテキスト/データ投稿(Instagram、TikTok、またはチャンネルファイルで要求されている場合)については、シンプルな画像を作成します。references/visuals.md に従ってください。

7. レコードを作成する

Postsフィールド名を使用して、JSONリストとしてバッチを書き込みます:

[
  {
    "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件ずつのバッチで書き込みます。Date, Channel, Content Type, Post Text, Hashtags, Image Suggestion の列を持つCSVに保存された計画は、--csv で直接取り込めます。

8. レポートを返す

作成されたレコードごとに1行、日付順に並べたテーブルで締めくくります:

日付チャンネルステータス名前最初の行

その下に、平文でリストします:スキップしたチャンネルとその理由、後日の週に移動した投稿、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 を実行し、チャンネルと日付ごとに要約します。
  • 戦略やトーンの変更。 Airtableではなく、markdownファイルを編集します。毎週の 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 を提案します。

ユーザーがスクリプトを実行するルーチンやcronを持っている場合もあります。その場合、承認済み投稿はあなたなしでスケジュールされます。再スケジュール、キャンセル、調整、および完全なフィールドマッピングについては references/publishing.md を参照してください。Upload-Postの呼び出しを自分で行うよりもスクリプトを優先してください。スクリプトは投稿ごとにトークンを消費しないためです。

この会話でユーザーが依頼していないものは、決して公開またはスケジュールしないでください。To approve でレコードを書き込むことが、このスキルの正常な終了です。

Individual skills in this repo

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

関連スキル