KainosPeople Archive
  • 인물
  • 인사이트
  • 프로젝트
  • 발견
  • 소개
인물인사이트프로젝트발견소개
AD
Kainos

시대를 초월한 거장들의 삶과 작품을 기록하고 탐구하는 인물 아카이브.

분야
화가 · Painters음악가 · Musicians과학자 · Scientists철학자 · Philosophers작가 · Writers감독 · Directors
콘텐츠
인사이트전체 인물프로젝트발견
Kainos
소개문의
© 2025 Kainos · People Archive. All rights reserved.
이용약관개인정보처리방침
Vibe Coding

콘텐츠 자동화 파이프라인

Claude Max + macOS launchd로 매일 자동 콘텐츠 생성. PR 리뷰 후 배포까지, 비용 0원으로 운영합니다

by Kainos·2026.4.8·8분 읽기

₩0
추가 비용
Claude Max 구독 활용
매일
자동화 주기
macOS launchd 스케줄
PR만
사람 개입
리뷰 후 머지로 배포

왜 만들었나

kainos.kr을 운영하면서 가장 힘든 부분은 콘텐츠를 꾸준히 채우는 것이었습니다. 화가, 음악가, 과학자 프로필 페이지를 하나씩 만들다 보면 하루가 금방 지나가고, 정작 새로운 기능을 추가하거나 사이트를 개선할 시간이 없었습니다.

Claude Max를 구독하고 있다는 사실을 깨달았습니다. 매달 $200을 내고 있는데, 저는 하루에 몇 시간만 쓰고 있었습니다. 나머지 시간에 Claude가 혼자 일하게 하면 어떨까?

그래서 만든 것이 이 파이프라인입니다. 매일 새벽에 Claude CLI가 자동으로 실행되어 인물 프로필 페이지를 생성하고, GitHub PR을 올립니다. 아침에 일어나면 Slack에 알림이 와 있고, PR을 검토해서 머지하면 Cloudflare가 자동으로 배포합니다.

전체 구조

schedule
매일 새벽 3시
macOS launchd가 스크립트 실행
terminal
Claude CLI 호출
claude -p로 프롬프트 실행, 콘텐츠 생성
edit_note
파일 생성
page.tsx, module.css, 데이터 파일 작성
call_split
GitHub PR 생성
feature 브랜치 → PR 자동 생성
notifications
Slack 알림
PR 링크와 미리보기를 개인 채널로 전송
check_circle
리뷰 & 머지
PR 확인 후 머지 → Cloudflare 자동 배포

준비물

✅ Mac (항상 켜져 있는 Mac Mini 권장)-
✅ Claude Max 구독$200/월
✅ Claude Code CLI 설치무료
✅ GitHub 계정 + gh CLI무료
✅ Slack 워크스페이스 (선택)무료

⚠️ Claude CLI는 Claude Max 플랜에서만 안정적으로 동작합니다. API 키를 쓰면 별도 요금이 발생하지만, Max 구독의 OAuth 토큰을 쓰면 추가 비용이 없습니다.

1단계: Claude CLI 설정

Claude Code CLI가 설치되어 있고 로그인된 상태여야 합니다. 비대화형 모드(-p 플래그)로 스크립트에서 호출합니다.

Claude CLI 설치 및 확인
# Claude Code CLI 설치
npm install -g @anthropic-ai/claude-code
# 로그인 (브라우저 열림)
claude login
# 비대화형 모드 테스트
claude -p "안녕하세요" --output-format text
# → 응답이 출력되면 성공

자동화 스크립트에서는 --dangerously-skip-permissions 플래그가 필요합니다. 대화형 승인 없이 파일을 쓸 수 있게 해줍니다.

비대화형 파일 생성 테스트
claude -p "test.txt 파일에 'Hello' 라고 써줘" \
--dangerously-skip-permissions \
--output-format text
cat test.txt # Hello 출력 확인

2단계: 자동화 스크립트

스크립트는 세 가지 역할을 합니다: Claude CLI 호출 → Git 브랜치 & PR 생성 → Slack 알림. 프로젝트 루트에 scripts/ 디렉토리를 만들고 아래 파일을 작성합니다.

scripts/generate-content.sh
#!/bin/bash
set -euo pipefail
# 설정
PROJECT_DIR="$HOME/Work/kainos-kr-web"
LOG_FILE="$PROJECT_DIR/logs/auto-generate.log"
DATE=$(date +"%Y-%m-%d")
BRANCH="auto/content-$DATE"
# 로그 디렉토리 생성
mkdir -p "$(dirname "$LOG_FILE")"
echo "[$DATE] 콘텐츠 생성 시작" >> "$LOG_FILE"
cd "$PROJECT_DIR"
# 1. 최신 코드 동기화
git checkout develop
git pull origin develop
# 2. 새 브랜치 생성
git checkout -b "$BRANCH"
# 3. Claude CLI로 콘텐츠 생성
claude -p "$(cat scripts/prompts/daily-content.md)" \
--dangerously-skip-permissions \
--output-format text >> "$LOG_FILE" 2>&1
# 4. 변경 사항 확인
if git diff --quiet && git diff --staged --quiet; then
echo "[$DATE] 변경 없음, 종료" >> "$LOG_FILE"
git checkout develop
git branch -d "$BRANCH"
exit 0
fi
# 5. 커밋 & PR 생성
git add -A
git commit -m "feat: 자동 생성 콘텐츠 $DATE"
git push origin "$BRANCH"
PR_URL=$(gh pr create \
--base develop \
--title "자동 생성: $DATE 콘텐츠" \
--body "Claude CLI가 자동 생성한 콘텐츠입니다. 검토 후 머지해주세요.")
echo "[$DATE] PR 생성: $PR_URL" >> "$LOG_FILE"
# 6. Slack 알림
bash scripts/notify-slack.sh "$PR_URL" "$DATE"
echo "[$DATE] 완료" >> "$LOG_FILE"
scripts/prompts/daily-content.md (프롬프트 예시)
src/data/painters.ts 파일을 읽고, hasPage가 false인 화가 중
아직 페이지가 없는 화가 1명을 선택해서 개별 프로필 페이지를 만들어줘.
기존 페이지 패턴은 src/app/(public)/painters/monet/ 를 참고하고,
동일한 구조로 새 화가의 page.tsx와 module.css를 생성해줘.
데이터 파일에서 해당 화가의 hasPage를 true로 변경하는 것도 잊지 마.
SEO를 위해 alternates.canonical도 반드시 설정해줘.

3단계: Slack 알림

PR이 생성되면 Slack으로 알림을 보냅니다. Incoming Webhook URL만 있으면 됩니다.

add_circle
Slack 앱 만들기
api.slack.com/apps → Create New App → From scratch
webhook
Incoming Webhooks 활성화
Features → Incoming Webhooks → On → Add New Webhook to Workspace
content_copy
Webhook URL 복사
https://hooks.slack.com/services/T.../B.../... 형태의 URL 복사
scripts/notify-slack.sh
#!/bin/bash
PR_URL="$1"
DATE="$2"
WEBHOOK_URL="https://hooks.slack.com/services/여기에/웹훅/URL"
curl -s -X POST "$WEBHOOK_URL" \
-H 'Content-type: application/json' \
--data "{
\"text\": \"🤖 자동 콘텐츠 PR이 생성됐습니다\",
\"attachments\": [{
\"color\": \"#795900\",
\"fields\": [
{\"title\": \"날짜\", \"value\": \"$DATE\", \"short\": true},
{\"title\": \"PR\", \"value\": \"<$PR_URL|PR 보기>\", \"short\": true}
]
}]
}"

4단계: macOS launchd 스케줄

macOS의 launchd는 cron보다 안정적인 스케줄러입니다. Mac이 절전 모드에서 깨어날 때도 실행 예약이 유지됩니다.

~/Library/LaunchAgents/kr.kainos.auto-content.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>kr.kainos.auto-content</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Users/kainos/Work/kainos-kr-web/scripts/generate-content.sh</string>
</array>
<!-- 매일 새벽 3시 실행 -->
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>3</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
<key>StandardOutPath</key>
<string>/Users/kainos/Work/kainos-kr-web/logs/launchd-out.log</string>
<key>StandardErrorPath</key>
<string>/Users/kainos/Work/kainos-kr-web/logs/launchd-err.log</string>
<!-- 환경변수 (PATH 포함 필수) -->
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin</string>
<key>HOME</key>
<string>/Users/kainos</string>
</dict>
</dict>
</plist>
launchd 등록 & 관리
# 등록
launchctl bootstrap gui/$(id -u) \
~/Library/LaunchAgents/kr.kainos.auto-content.plist
# 즉시 실행 (테스트)
launchctl kickstart -k gui/$(id -u)/kr.kainos.auto-content
# 상태 확인
launchctl list | grep kainos
# 해제 (중단)
launchctl bootout gui/$(id -u)/kr.kainos.auto-content

주의: PATH 환경변수를 반드시 명시해야 합니다. launchd는 기본 셸 환경을 상속받지 않아서 node, gh, claude 등의 명령어를 찾지 못합니다. which node로 실제 경로를 확인해서 추가하세요.

비용 분석

이 파이프라인의 핵심은 이미 구독 중인 Claude Max를 더 활용한다는 것입니다.

이 파이프라인 (Claude Max OAuth)
Max 구독 내에서 사용
추가 비용 없음
Anthropic API 키 사용
GPT-4급 모델 기준 페이지당 약 $0.02~0.05
사용량 과금
외부 자동화 서비스 (Zapier 등)
워크플로우 수에 따라 요금 증가
$20~100+/월

운영 팁

tune
프롬프트 반복 개선
처음엔 결과물이 불안정합니다. PR을 머지하거나 닫으면서 프롬프트를 계속 다듬으세요. 2주면 안정됩니다.
check_box
PR을 게이트로 활용
자동화가 완전히 믿기 어려울 때는 PR 리뷰를 필수로 두세요. 검토 없이 머지하면 예상치 못한 코드가 배포될 수 있습니다.
folder_open
logs/ 폴더 관리
로그가 쌓이면 용량을 차지합니다. launchd plist에 표준 출력 경로를 지정하고, 주기적으로 정리하거나 logrotate를 설정하세요.
error_outline
실패 알림 분리
스크립트 실패 시에도 Slack 알림이 오게 하세요. set -euo pipefail과 trap을 사용해 오류 발생 시 별도 메시지를 보낼 수 있습니다.

문제 해결

terminal
launchd가 실행되지 않음
launchctl list | grep kainos로 상태 확인. stderr 로그에서 원인 파악. PATH 누락이 가장 흔한 원인.
lock
claude 명령어를 찾을 수 없음
which claude로 실제 경로 확인 후 plist의 PATH에 추가. 보통 /opt/homebrew/bin 또는 /usr/local/bin.
link_off
gh pr create 실패
gh auth status로 인증 확인. gh auth login으로 재인증. 토큰 만료 시 주기적으로 갱신 필요.
sync_problem
Claude가 기존 파일과 다른 구조로 생성
프롬프트에 참고할 파일 경로를 구체적으로 명시하세요. '이 파일을 읽고 동일한 패턴으로'가 핵심입니다.

관련 도구

Claude CodeSlackCloudflareOpenClaw

참고: 이 파이프라인은 kainos.kr에서 실제로 운영 중입니다. Claude Max 구독의 개인 사용 범위 내에서 자동화하는 방식이며, 생성된 콘텐츠는 반드시 PR 리뷰를 거쳐 배포합니다.

← 이전버디 레전더리 뽑기목록다음 →Statusline 커스터마이징