WordPress + Avada 테마 기반 블로그의 마크다운 콘텐츠 발행 및 관리를 위한 CLI 도구
blog/
├── packages/ # 소스 코드 (TypeScript, monorepo)
│ ├── cli/ # CLI 도구 (사용자 인터페이스)
│ ├── core/ # 핵심 로직 (WordPress API, 번역, 이미지)
│ └── shared/ # 공유 타입 및 유틸리티
│
├── content/ # 블로그 콘텐츠 (마크다운)
│ ├── posts/ # 블로그 포스트 (ko/, en/)
│ ├── pages/ # 고정 페이지
│ └── templates/ # 포스트 템플릿
│
├── docs/ # 프로젝트 문서
│ ├── guides/ # 사용 가이드
│ ├── specs/ # 기술 스펙
│ ├── planning/ # 기획 문서
│ ├── prompts/ # 프롬프트 템플릿
│ └── archive/ # 완료된 작업 문서
│
├── scripts/ # 스크립트 (WordPress 설정)
├── config/ # 설정 파일
├── wordpress-plugin/ # WordPress 플러그인
├── CLAUDE.md # Claude Code 작업 가이드
├── CHANGELOG.md # 변경 로그
└── README.md # 이 파일
- 초안 생성: 템플릿 기반 블로그 포스트 초안 작성
- 초안 수정: 콘텐츠 개선 및 리파인
- 템플릿 시스템: 다양한 콘텐츠 유형별 맞춤 템플릿
- 한영 번역 & 발행: 한글 포스트 발행 시 영문 번역 및 발행 지원
- 번역 엔진 통합: 고품질 번역 지원
- 8단계 품질 검증: 라인 수, 코드 블록, SEO 키워드, 제목 길이 검증
- SEO 최적화: 영문 SEO에 최적화된 제목/요약 생성
- Polylang 연결: 한영 포스트 연결로 언어 전환 지원
- 마크다운 발행: 마크다운 → WordPress HTML 변환 및 업로드
- 🖼️ 이미지 업로드 (Epic 12.0): 로컬 이미지를 WordPress 미디어 라이브러리에 업로드
- 중복 이미지 감지 및 재사용
- 마크다운 경로 변환 (로컬 → WordPress CDN URL)
- 업로드 진행률 및 결과 리포트
- 📚 시리즈 관리 (PRD 0014): 시리즈 포스트 발행 시 네비게이션 생성
- 파일명에서 시리즈 정보 감지 (
day1,day-2등) - docs/ 폴더 시리즈 계획서 탐색 및 파싱
- 시리즈 목차 마크다운 생성 및 삽입
- 한영 링크 변환 (영문 발행 시 URL 치환)
- 번역 배너 삽입 (영문 포스트 상단)
- GitHub 링크 삽입 (TL;DR 섹션 뒤)
- 파일명에서 시리즈 정보 감지 (
- SEO 지원: 메타 태그, Open Graph, Twitter Card 생성
- 광고 삽입: Google AdSense 코드 최적 위치 삽입
- 포스트 관리: 목록 조회, 삭제, 상태 변경
- SEO 분석: 키워드 밀도, 섹션 분포, SEO 점수 분석 및 개선 제안
- 분석 대시보드: 조회수, 댓글, 인기 포스트 통계
- 트렌드 모니터링: Reddit, Hacker News, Twitter 실시간 트렌드 추적
- 키워드 점수: 트렌드 토픽의 영향력 자동 계산
- 길이별 가중치: 포스트 길이에 따른 동적 SEO 목표 조정
- 💰 키워드 수익성 분석 (Epic 8.0): Google Ads API를 통한 검색량·CPC·경쟁도 데이터 기반 주제 선정
- Live Reload: 파일 변경 시 브라우저 자동 새로고침
- WordPress 스타일: 실제 블로그와 동일한 스타일 프리뷰
- 광고 위치 표시: AdSense 삽입 위치 시각화
- Node.js 20 이상
- pnpm 9 이상
- WordPress 사이트 (REST API 활성화)
git clone https://github.com/dh1789/blog.git
cd blogpnpm installcp .env.example .env.env 파일 편집:
# WordPress 연결
WORDPRESS_URL=https://your-blog.com
WORDPRESS_USERNAME=your-username
WORDPRESS_APP_PASSWORD=your-application-password
# LLM API Key (번역 지원)
ANTHROPIC_API_KEY=sk-ant-xxxxx
# Google AdSense
ADSENSE_CLIENT_ID=ca-pub-xxxxxxxxxx
ADSENSE_SLOT_ID=xxxxxxxxxx
# Google Ads API (선택사항 - Epic 8.0 키워드 수익성 분석)
GOOGLE_ADS_DEVELOPER_TOKEN=ABcdEFghIJklMNopQRst
GOOGLE_ADS_CLIENT_ID=123456789-abc.apps.googleusercontent.com
GOOGLE_ADS_CLIENT_SECRET=GOCSPX-Abc123...
GOOGLE_ADS_REFRESH_TOKEN=1//0abcdefg...
GOOGLE_ADS_CUSTOMER_ID=1234567890pnpm buildcd packages/cli
pnpm link --global이제 blog 명령어를 전역에서 사용할 수 있습니다.
VPS에 WordPress + Avada 테마를 자동으로 설치합니다.
- Ubuntu 20.04 또는 22.04 LTS VPS
- 도메인 (Cloudflare 등록 권장)
- Cloudflare Origin Certificate
상세 가이드: docs/VULTR_VPS_SETUP.md
# Cloudflare 대시보드에서 인증서 발급
# SSL/TLS → Origin Server → Create Certificate (15 years)
# 로컬에 저장
cd scripts/wordpress-setup
# cert.pem, key.pem 파일 저장# config.sh 편집
vim scripts/wordpress-setup/config.sh
# 도메인, 관리자 정보 입력
DOMAIN="your-domain.com"
ADMIN_EMAIL="your-email@gmail.com"
ADMIN_PASSWORD="SecurePassword123"# 압축
cd scripts
tar -czf wordpress-setup.tar.gz wordpress-setup/
# VPS로 전송
scp wordpress-setup.tar.gz root@YOUR_VPS_IP:/root/# VPS SSH 접속
ssh root@YOUR_VPS_IP
# 압축 해제 및 실행
cd /root
tar -xzf wordpress-setup.tar.gz
cd wordpress-setup
sudo bash setup.sh설치 시간: 5-10분 자동 구성: LEMP + WordPress + Cloudflare SSL + Redis 캐싱 + Avada 테마
- 도메인: https://beomanro.com
- 설치 완료: 2025-11-02
- 구성: Vultr VPS (Tokyo) + Cloudflare + Avada
# 기본 초안 생성
blog draft create "Next.js 14 완벽 가이드" "Next.js, React, SSR" --words 2000
# 한국어로 생성
blog draft create "Next.js 14 가이드" "Next.js, 리액트" --language ko
# 커스텀 템플릿 사용
blog draft create "제품 리뷰" "리뷰, 평가" --template review
# 초안 수정
blog draft refine content/drafts/my-post.md "SEO 키워드 추가 및 더 전문적인 톤으로 수정"# 기본 프리뷰 (포트 3000)
blog preview content/posts/my-post.md
# 커스텀 포트, 광고 위치 표시
blog preview content/posts/my-post.md --port 8080 --show-ads
# 브라우저 자동 열기 비활성화
blog preview content/posts/my-post.md --no-browser# 즉시 발행
blog publish content/posts/my-post.md
# 초안으로 저장
blog publish content/posts/my-post.md --draft
# 시뮬레이션 (업로드 안 함)
blog publish content/posts/my-post.md --dry-run
# 영어 콘텐츠 발행
blog publish content/posts/en/guide.md --language en
# 영어 포스트 발행 + 자동 언어 연결 (Polylang)
blog publish content/posts/en/guide.md --link-to 29
# 한글 Post ID 29와 자동으로 연결됨
# 🆕 기존 포스트 강제 업데이트 (PRD 0014)
blog publish content/posts/my-post.md --force
# 기존 포스트 발견 시 확인 프롬프트 없이 바로 업데이트
# 🆕 로컬 이미지 자동 업로드 (Epic 12.0)
blog publish content/posts/my-post.md --upload-images
# 실행 흐름:
# 1. 마크다운에서 이미지 경로 파싱 (, <img src="path">)
# 2. 각 이미지의 중복 여부 확인 (WordPress 미디어 라이브러리)
# 3. 신규 이미지만 업로드, 중복은 기존 URL 재사용
# 4. 마크다운 경로를 WordPress URL로 자동 변환
# 5. HTML 재생성 및 발행이미지 업로드 출력 예시:
=== 이미지 자동 업로드 ===
⠹ 이미지 경로 파싱 중...
⠹ 로컬 이미지 3개 발견
발견된 이미지: ./images/screenshot.png, ./images/diagram.jpg, ../shared/logo.png
⠹ 이미지 업로드 중: screenshot.png
✓ 업로드: screenshot.png → https://beomanro.com/wp-content/uploads/2025/11/screenshot.png
⠹ 이미지 업로드 중: diagram.jpg
↻ 중복: diagram.jpg → 기존 URL 재사용
⠹ 이미지 업로드 중: logo.png
✓ 업로드: logo.png → https://beomanro.com/wp-content/uploads/2025/11/logo.png
=== 이미지 업로드 리포트 ===
총 이미지: 3
성공: 3
✔ 이미지 업로드 완료
# 포스트 목록 조회
blog list
# 발행된 포스트만
blog list --status publish
# 최근 20개
blog list --limit 20
# 포스트 삭제
blog delete 123
# 강제 삭제 (확인 없이)
blog delete 123 --force
# 🆕 포스트 상태 조회 (PRD 0014)
blog status my-post-slug
# 포스트 상태 변경
blog status my-post-slug --publish # 발행
blog status my-post-slug --draft # 초안으로 변경
# 언어별 조회
blog status my-post-slug --language ko한글 포스트 발행 시 영문 번역 및 발행을 지원합니다.
# 기본 사용: 한글 포스트 발행 → 번역 → 영문 발행 → 언어 연결
blog publish content/posts/ko/my-post.md
# 실행 흐름:
# 1. 한글 포스트 파싱 및 SEO 검증
# 2. WordPress에 한글 포스트 발행 (ID: 29)
# 3. ✨ 번역 시작
# 4. 번역 품질 검증 (8단계)
# 5. 검증 통과 시 영문 포스트 발행 (ID: 26)
# 6. Polylang으로 언어 연결: 한글(29) ↔ 영문(26)
# 번역 비활성화 (한글만 발행)
blog publish content/posts/ko/my-post.md --no-translate
# 초안으로 저장 (번역도 초안)
blog publish content/posts/ko/my-post.md --draft품질 검증 기준:
- ✅ 라인 수: 50-150% 범위 (너무 짧거나 길면 에러)
- ✅ 코드 블록: 완전 보존 (개수 일치)
- ✅ SEO 키워드: 모든 태그 포함 여부
- ✅ 키워드 밀도: 0.5-2.5% 권장
- ✅ 제목 길이: ≤60자 (SEO 최적)
- ✅ 링크/헤딩: 구조 보존
출력 예시:
=== 자동 번역 시작 ===
⠹ 한글 포스트 번역 중...
✔ 번역 품질 검증 통과
=== 번역 품질 메트릭 ===
라인 수 차이: 8.5%
코드 블록 보존: 3개
메타데이터 완전성: ✓
SEO 최적화: ✓
제목 길이: 58자
Excerpt 길이: 285자/300자
✔ 영어 포스트 발행 완료! (ID: 26)
✔ 언어 연결 완료: 한글(29) ↔ 영문(26)
실패 처리:
- 번역 실패 시: 한글 포스트만 발행, 에러 메시지 출력
- 검증 실패 시: 한글 포스트만 발행, 검증 이슈 상세 출력
- 연결 실패 시: 양쪽 포스트 발행 성공, 수동 연결 가이드 제공
Polylang 플러그인을 사용하는 WordPress 사이트에서 한글/영문 포스트를 수동으로 연결합니다.
# 방법 1: 발행 시 자동 연결 (권장)
# 1. 먼저 한글 포스트 발행
blog publish content/posts/ko/my-post.md
# → Post ID: 29
# 2. 영문 포스트 발행 + 자동 연결
blog publish content/posts/en/my-post.md --link-to 29
# → Post ID: 26, 자동으로 ID 29와 연결됨
# 방법 2: 별도 명령어로 연결
# 이미 발행된 포스트들을 나중에 연결
blog link-translations --ko 29 --en 26기능:
- ✅ WordPress REST API를 통한 Polylang meta 필드 자동 업데이트
- ✅ 양방향 연결 (한국어 ↔ 영어)
- ✅ 자동 에러 처리 및 사용자 친화적 메시지
- ✅ 연결 실패 시에도 포스트 발행은 성공 처리
워크플로우 예시:
# 1. 한글 포스트 작성 및 발행
blog publish content/posts/ko/nodejs-cli-guide.md
# ✔ 포스트 발행 완료! (ID: 100)
# 2. 영문 번역
blog translate content/posts/ko/nodejs-cli-guide.md --target en
# ✔ 번역 파일 생성: content/posts/en/build-nodejs-cli-tools.md
# 3. 영문 발행 + 자동 연결
blog publish content/posts/en/build-nodejs-cli-tools.md --link-to 100
# ✔ 포스트 발행 완료! (ID: 101)
# ✔ 언어 연결 완료: 한글(100) ↔ 영문(101)# Reddit과 Hacker News 트렌드
blog trending
# Twitter 포함
blog trending --sources reddit,hackernews,twitter
# 키워드 필터링
blog trending --keywords "AI,Machine Learning" --limit 20
# 최소 점수 필터
blog trending --min-score 50
# 🆕 수익성 데이터 포함 (Epic 8.0)
blog trending --revenue --limit 10
# 결과를 JSON으로 저장
blog trending --revenue --output keyword-analysis.json
# 테이블 형식으로 출력
blog trending --revenue --format table수익성 분석 출력 예시:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
트렌드 토픽 (수익성 분석 포함)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. TypeScript 5.3: What's New (reddit)
📊 트렌드: 85.2 | 💰 수익성: 72.4 | 🎯 종합: 80.0
├─ 검색량: 5,400/월
├─ CPC: $2.35
├─ 경쟁도: MEDIUM (50)
└─ 수익성 평가: 높은 검색량, 적정 CPC, 중간 경쟁도
설정 방법: GOOGLE_ADS_SETUP.md 참고
# 월간 분석 (기본)
blog analytics
# 주간 분석
blog analytics --period week
# 인기 포스트 20개, 댓글순 정렬
blog analytics --limit 20 --sort-by comments# 기본 SEO 분석
blog analyze-seo content/posts/my-post.md
# 상세 분석 (섹션별 키워드 분포 표시)
blog analyze-seo content/posts/my-post.md --verbose
# JSON 형식 출력 (프로그래밍 용도)
blog analyze-seo content/posts/my-post.md --json분석 결과:
- SEO 점수: 100점 만점 (제목, 요약, 콘텐츠 길이, 키워드 밀도, 섹션 분포, 제목/요약 키워드 포함 여부)
- 키워드 밀도: 각 키워드의 출현 횟수 및 밀도 (최적 범위: 0.5-2.5%)
- 섹션 분포: H2 섹션별 키워드 분포 현황
- 개선 제안: 구체적인 키워드 추가/제거 위치 및 횟수 제안
길이별 가중치:
- 1500+ 줄: 0.7x (목표 밀도: 0.35-1.75%)
- 1000-1500 줄: 0.8x (목표 밀도: 0.40-2.00%)
- 500-1000 줄: 0.9x (목표 밀도: 0.45-2.25%)
- 500 줄 미만: 1.0x (목표 밀도: 0.50-2.50%)
# WordPress 연결 설정
blog config---
title: "포스트 제목 (SEO 최적화)"
description: "메타 설명 (150-160자)"
keywords: ["키워드1", "키워드2", "키워드3"]
tags: ["태그1", "태그2"]
categories: ["카테고리1"]
slug: "custom-url-slug"
language: "ko"
---
# 메인 제목
소개 내용...
## 첫 번째 섹션
내용...
## 두 번째 섹션
내용...자동 처리되는 기능:
- ✅ SEO 메타 태그 자동 생성
- ✅ Open Graph 태그 (소셜 미디어 공유)
- ✅ Twitter Card 태그
- ✅ Google AdSense 코드 삽입 (첫 H2 뒤, 중간 위치)
- ✅ 키워드 밀도 체크 (0.5-2.5%)
- ✅ 한글 slug → 영문 자동 변환
blog/
├── packages/
│ ├── cli/ # CLI 명령어
│ │ ├── src/
│ │ │ ├── commands/ # 각 명령어 구현
│ │ │ │ ├── draft/ # AI 초안 생성
│ │ │ │ ├── analytics.ts
│ │ │ │ ├── trending.ts
│ │ │ │ ├── preview.ts
│ │ │ │ └── publish.ts
│ │ │ └── index.ts # CLI 진입점
│ │ └── package.json
│ ├── core/ # 핵심 로직
│ │ ├── src/
│ │ │ ├── wordpress.ts # WordPress API
│ │ │ ├── markdown.ts # 마크다운 처리
│ │ │ ├── claude.ts # AI 초안 생성
│ │ │ ├── seo.ts # SEO 자동화
│ │ │ ├── trending.ts # 트렌드 모니터링
│ │ │ ├── analytics.ts # 분석 대시보드
│ │ │ ├── preview.ts # 프리뷰 서버
│ │ │ ├── ads.ts # 광고 삽입
│ │ │ └── templates.ts # 템플릿 시스템
│ │ └── package.json
│ └── shared/ # 공유 타입
│ ├── src/
│ │ ├── types.ts # TypeScript 타입
│ │ └── schemas.ts # Zod 스키마
│ └── package.json
├── content/
│ ├── drafts/ # 초안 저장
│ └── posts/ # 발행 준비된 포스트
│ ├── ko/ # 한국어
│ └── en/ # 영어
├── prompts/ # 프롬프트 템플릿
│ ├── blog-post.txt
│ ├── review.txt
│ └── tutorial.txt
├── .env.example
└── package.json
# 전체 테스트
pnpm test
# 커버리지 측정
pnpm test --coverage
# 특정 패키지 테스트
cd packages/core
pnpm test테스트 현황:
- ✅ Core: 112 tests, 82% coverage
- ✅ CLI: 55 tests, 67% coverage
- ✅ Total: 167 tests
# 개발 모드 (watch)
pnpm dev
# 빌드
pnpm build
# 타입 체크
pnpm typecheck
# 린트
pnpm lint
# 포맷팅
pnpm format- Runtime: Node.js 20+
- Language: TypeScript 5.3+
- Package Manager: pnpm (workspace)
- Testing: Vitest
- WordPress: WordPress REST API, WPAPI
- Framework: Commander.js (CLI)
- Preview: Express, Socket.io, Chokidar
- SEO: Marked, transliteration
- Trending: Reddit API, Hacker News API, Twitter API
- Terminal UI: Chalk, Ora
- 초안 생성 (draft create, draft refine)
- WordPress 발행 (publish)
- 기본 CLI 구조
- 실시간 프리뷰 서버
- Live Reload
- 광고 위치 시각화
- SEO 메타 태그 자동 생성
- Open Graph & Twitter Card
- 키워드 밀도 체크
- Slug 자동 변환
- 트렌드 모니터링 (Reddit, HN, Twitter)
- 분석 대시보드
- Vitest 설정
- 단위 테스트 (167 tests)
- 커버리지 측정 (82% core, 67% CLI)
- 통합 테스트
- CLI 검증
- 사용자 가이드
- Google Ads API 연동
- 키워드 수익성 분석 (검색량, CPC, 경쟁도)
- trending 명령어 --revenue 플래그
- 캐싱 시스템
- 종합 문서화
- WordOps 기반 자동 설치 스크립트
- Cloudflare Origin Certificate SSL 설정
- 방화벽(UFW) 자동 구성
- Avada 테마 자동 설치
- VPS 실제 배포 검증 (beomanro.com)
- 완전 자동화 (5-10분 설치)
- Polylang 자동 언어 연결
-
link-translations명령어 구현 -
publish --link-to옵션 통합 - WordPress REST API 기반 양방향 연결
- 완전 자동화 워크플로우
- 번역 엔진 통합
- 8단계 품질 검증 시스템
- 라인 수 검증 (50-150% 범위)
- 코드 블록 보존
- SEO 키워드 보존
- 키워드 밀도 검증 (0.5-2.5%)
- 제목 길이 검증 (≤60자)
- 링크/헤딩 구조 보존
- SEO 최적화 영문 제목/요약 생성
-
publish --no-translate플래그 - 번역 → 발행 → Polylang 연결 워크플로우
- 종합 테스트 (39 tests: translator 12, validation 19, wordpress 8)
- 문서화 및 사용 가이드
- WordPress Media API 클라이언트 구현
-
findMediaByFilename(): 중복 이미지 검색 - 기존
uploadMedia()활용
-
- 이미지 경로 파싱 및 URL 변환
-
parseImagePaths(): 마크다운/HTML 이미지 경로 추출 -
replaceImageUrls(): 로컬 경로 → WordPress URL 변환 -
resolveImagePath(): 상대 경로 → 절대 경로 변환
-
- CLI 통합
-
--upload-images플래그 추가 - 자동 업로드 워크플로우 구현
- 진행률 표시 및 결과 리포트
-
- 종합 테스트 (42 tests: findMediaByFilename 5, markdown 29, 기존 유지)
- 문서화 (README.md, CLAUDE.md)
- 일괄 업로드/업데이트
- 스케줄 발행
- 성능 분석 (Core Web Vitals)
- 추가 언어 지원 (일본어, 중국어)
- GitHub Actions CI/CD
This project uses workflow templates from ai-dev-tasks licensed under Apache-2.0.
Modified files:
create-prd.md- PRD generation guide adapted for Korean blog automation with AskUserQuestion tool integrationgenerate-tasks.md- Task generation guide with enhanced testing requirementsprocess-task-list.md- Task management guide with strengthened test execution policy
Original license: Apache-2.0
MIT License - 자세한 내용은 LICENSE 파일 참조
이슈와 PR을 환영합니다!
이슈를 통해 문의해주세요.