ソーシャルカレンダー は何をしますか?
1つのコンテンツを複数のチャンネル向けの投稿に変換し、承認用のAirtableカレンダーに登録します。公開は scripts/publish_approved.py を通じて行われ、承認済みの投稿をUpload-Postのスケジューラーに渡します。このスクリプトはユーザーがリクエストした場合にのみ実行します。
フィールド名、ステータス値、環境変数はリポジトリ内の docs/data-model.md から取得します。名前を変更しないでください。以下のスクリプトパスは、このスキルのフォルダからの相対パスです。
開始前に
AIRTABLE_TOKENとAIRTABLE_BASE_IDが設定されていることを確認します(環境変数、または作業ディレクトリ/リポジトリルートの.envファイル)。動作確認としてpython3 scripts/airtable_calendar.py channelsを実行します。テーブルがまだ存在しない場合は、リポジトリルートにあるscripts/setup_airtable.pyをユーザーに案内します。- 戦略フォルダを見つけます。
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 のいずれかで)、レポートでそれらを別途リストします。
公開への引き渡し
ユーザーが承認済み投稿のスケジュールを依頼した場合(「承認済みのものをすべてスケジュールして」、「これらを公開して」):
python3 scripts/publish_approved.py --sync --reconcile --mode schedule --dry-runを実行し、送信される内容(チャンネル、日時、メディアタイプ、テキストの最初の行)を表示します。- ユーザーが確認した後、
--dry-runなしで実行します。Upload-Postがスケジュールを保持し、投稿はScheduledになります。 - 承認済み投稿のスロットがすでに過ぎている場合は、その旨を伝え、
--mode nowを提案します。
ユーザーがスクリプトを実行するルーチンやcronを持っている場合もあります。その場合、承認済み投稿はあなたなしでスケジュールされます。再スケジュール、キャンセル、調整、および完全なフィールドマッピングについては references/publishing.md を参照してください。Upload-Postの呼び出しを自分で行うよりもスクリプトを優先してください。スクリプトは投稿ごとにトークンを消費しないためです。
この会話でユーザーが依頼していないものは、決して公開またはスケジュールしないでください。To approve でレコードを書き込むことが、このスキルの正常な終了です。