Community생산성 & 협업github.com

소셜 캘린더

하나의 콘텐츠를 여러 소셜 채널에 적합한 포스트로 변환하여 Airtable 소셜 캘린더에 승인을 위해 예약합니다.

소셜 캘린더란 무엇인가요?

이 스킬은 사용자가 제공한 단일 콘텐츠(기능 노트, 스크린샷, 뉴스 링크, 팟캐스트 클립, 고객 리뷰, 이벤트 사진, 데이터 포인트 등)를 여러 소셜 미디어 채널(LinkedIn, X, Instagram, Facebook, Threads, TikTok, YouTube, Bluesky, Substack, 임직원/창업자 프로필 등)에 맞는 포스트로 자동 변환하여 Airtable 캘린더에 예약 및 승인 워크플로우를 제공합니다. 사용자가 '이것에 대한 포스트를 예약해줘', '모든 채널에 게시해줘', '다음 주 캘린더를 채워줘' 등의 명령을 내리면, 전략 문서와 채널별 음성/규칙을 읽고, 기존 캘린더와 중복 및 간격을 확인한 후, 각 채널에 최적화된 포스트를 초안하고 이미지가 필요한 경우 미디어를 첨부합니다. 또한 포스트 승인, 이동, 거부 기능과 승인된 포스트를 실제 업로드-게시 도구로 전달하는 프로세스를 자동화합니다.

지원 대상~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에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

소셜 캘린더은(는) 무엇을 하나요?

하나의 콘텐츠를 여러 채널용 포스트로 변환하여 사람들이 승인할 수 있도록 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이 설정되어 있으면 사용합니다. 그렇지 않으면 작업 디렉토리, ./my-strategy/, ./strategy/에서 strategy.md를 찾습니다. 없으면 위치를 묻습니다. 사용자에게 아직 전략이 없으면 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. 포스트 유형 및 캠페인 식별

콘텐츠가 무엇인지 파악합니다: 기능 출시, 뉴스, 팟캐스트/비디오 클립, 고객 리뷰, 이벤트 사진, 데이터/텍스트 인사이트, 기사 홍보, 또는 기타. 각 유형이 어떻게 포스트가 되는지, 어떤 채널에 적합한지, 얼마나 퍼뜨려야 하는지 references/post-types.md를 참조하세요.

배치에 Campaign 레이블을 YYYY-MM <유형> <레이블> 형식으로 지정합니다. 예: 2026-11 Podcast Ep 12 또는 2026-11 Feature CSV export. 원본 입력을 Source에 넣습니다(링크, 파일 이름, 에피소드 또는 한 줄 메모).

답변이 포스트를 변경하는 경우에만 질문합니다. 예: 전략이 명확하지 않을 때 "어떤 채널?" 또는 "특정 날짜까지 엠바고인가요?". 그렇지 않으면 결정하고 결정한 내용을 말합니다.

3. 캘린더 확인

채우려는 기간(기본값: 다음 4주, 팟캐스트 클립은 더 길게) 동안 이미 계획된 내용을 나열합니다:

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

각 대상 채널에 대해 다음을 파악합니다:

  • 게시 빈도 간격. 채널 파일 목표 대비 주당 포스트 수. Rejected 및 Failed를 제외한 모든 상태를 계산합니다.
  • 충돌. 해당 채널에 이미 포스트가 있는 날짜. 기본값은 채널 파일에 달리 명시되지 않는 한 채널당 하루에 최대 하나의 포스트입니다.
  • 주제 혼합. 한 주에 특정 유형이 너무 많은 경우(세 개의 뉴스 포스트, 연속 두 개의 프로모션). 새 포스트를 더 가벼운 주로 이동합니다.
  • 중복. 동일한 메시지가 이미 예약되었거나 최근에 게시됨. create 명령은 유사성 검사를 실행합니다. check-duplicates로 단독 실행할 수 있습니다.

4. 포스트 초안 작성

날짜별, 채널별로 하나의 포스트를 작성합니다. 각 포스트는 해당 채널 파일을 따릅니다: 음성, 길이, 형식, 해시태그, 행동 유도. 모든 곳에 적용되는 규칙:

  • 소스 또는 전략 파일에 있는 사실만 사용합니다. 숫자, 인용구, 고객 이름 또는 결과를 만들지 마십시오.
  • 동일한 텍스트를 여러 채널에 붙여넣지 마십시오. 창업자의 프로필과 회사 페이지는 동일한 기능에 대해 다른 내용을 말합니다.
  • 직원 및 공동 창업자 채널은 해당 인물의 음성으로 작성되며 승인이 필요합니다. Owner를 채널 파일에 명명된 승인자로 설정합니다.
  • PostContent는 실제 줄바꿈이 포함된 최종 텍스트를 보유합니다. 이모지와 유니코드는 괜찮습니다. 해시태그는 일반적으로 채널 파일이 지정하는 대로 인라인으로, 보통 끝에 추가합니다.
  • LinkedIn과 X는 **text**를 리터럴 별표로 표시합니다. **bold**는 사람이 Markdown 인식 편집기(예: Substack)에 붙여넣는 채널에만 사용합니다. 채널 파일에 달리 명시된 경우 이를 따릅니다.
  • 길이 제한: X는 280자를 초과하는 모든 내용을 스레드로 분할하고, Threads는 500자, Bluesky는 300자입니다. 채널 파일이 스레드를 요청하지 않는 한 맞춰 작성합니다.
  • strategy.md의 작성 규칙을 따릅니다. 규칙이 없으면 평이하고 직접적인 문장을 작성하고 채우기, 과장된 단어 및 상투적인 문구를 건너뜁니다.

5. 날짜 선택

Scheduled for는 날짜만, YYYY-MM-DD 형식입니다. 시간은 채널의 Post time 및 Timezone에서 가져오므로 포스트에 시간을 넣지 마십시오.

  • 먼저 게시 빈도 간격을 채운 다음 나머지를 분산합니다. 하나의 항목에 대한 프로모션 포스트는 모두 같은 날이 아니라 2~3주에 걸쳐 게시합니다.
  • 뉴스는 당일 또는 다음 날에 나가거나 아예 나가지 않습니다.
  • 팟캐스트 클립은 약 3개월 동안 채널당 주당 대략 한두 개씩입니다.
  • 한 주에 걸쳐 유형을 혼합합니다: 교육, 참여, 제품, 사회적 증명.
  • 과거 날짜는 절대 사용하지 마십시오. 사용자가 요청하고 일일 실행이 이미 완료되었을 수 있음을 알고 있는 경우에만 오늘을 사용합니다.
  • 한 주가 가득 차면 포스트를 다음 주로 이동하고 보고서에 그렇게 말합니다.

6. 미디어 호스팅

Airtable은 공개 URL만 수집합니다. 로컬 경로와 file:// 링크는 자동으로 무시됩니다. 생성 배치의 이미지와 비디오는 로컬 경로일 수 있습니다. 스크립트는 먼저 catbox.moe에 업로드한 다음 공개 URL을 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. 보고

날짜별로 정렬된 생성된 각 레코드당 한 행씩 테이블로 마무리합니다:

날짜채널상태이름시작 줄

그 아래에 일반 문장으로 나열합니다: 건너뛴 채널과 이유, 이후 주로 연기된 포스트, 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의 복사본도 변경되도록 합니다.
  • **"이번 주에 뭐가 나가?"

Individual skills in this repo

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

관련 스킬