fceca88db4
feat(music-lab): pipeline 상태 머신
2026-05-07 16:40:31 +09:00
d66a321982
feat(music-lab): pipeline 5개 DB 테이블 + 헬퍼
...
YouTube 음악 파이프라인 Task 1 — 신규 5개 테이블과 헬퍼 함수 추가.
테이블:
- video_pipelines: 파이프라인 단위 상태 머신 + 메타/리뷰 JSON
- pipeline_jobs: 단계별 비동기 작업 상태/시간
- pipeline_feedback: 텔레그램 피드백 이력
- youtube_oauth_tokens: 채널 OAuth refresh/access 토큰
- youtube_setup: 단일 행 설정 (메타 템플릿/커버 프롬프트/리뷰 가중치/임계값/비주얼/공개정책)
헬퍼:
- create_pipeline / get_pipeline / update_pipeline_state / list_pipelines
- increment_feedback_count / record_feedback / get_feedback_history
- create_pipeline_job / update_pipeline_job / list_pipeline_jobs
- get_youtube_setup / update_youtube_setup
- upsert_oauth_token / get_oauth_token / delete_oauth_token
테스트:
- tests/test_pipeline_db.py: 7개 테스트 (생성/상태/피드백/잡/셋업/OAuth)
- tests/conftest.py: freezegun 기반 freezer fixture 추가
- requirements.txt: freezegun>=1.4 추가
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-07 16:37:11 +09:00
e03d074222
docs(plan): Music YouTube 파이프라인 구현 계획 — 16 task
...
스펙 2026-05-07-music-youtube-pipeline-design.md를 16개 task로 분해.
TDD 패턴: 각 task = 실패 테스트 → 구현 → 통과 → 커밋.
태스크 흐름:
1. DB 5개 테이블 + 헬퍼
2. 상태 머신
3. Storage + 커버 (DALL·E + 폴백)
4. 영상/썸네일 (FFmpeg)
5. 메타데이터 (Claude Haiku)
6. AI 검토 4축 (Claude Sonnet + 휴리스틱)
7. YouTube OAuth + 업로드
8. 오케스트레이터 + 13 엔드포인트
9. agent-office 자연어 의도 분류
10. youtube_publisher 에이전트 + 30s 폴링
11. web-ui api.js 헬퍼
12. SetupTab
13. PipelineTab + 카드
14. YoutubeTab 6 서브탭 + Library 트리거
15. docker-compose env + nginx
16. 통합 테스트 + 수동 E2E
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-07 16:23:46 +09:00
2eeb98a723
docs(spec): Music YouTube 파이프라인 단계별 승인 자동화 설계
...
트랙 → 영상 → 발행까지 단계별 텔레그램 승인 워크플로 설계.
- 6단계 진행 바: 커버/영상/썸네/메타/AI검토/발행
- 자연어 의도 분류 (화이트리스트 + LLM 폴백)
- 반려 시 사용자 피드백 반영 재생성 (5회 한도)
- AI 최종 검토 4축 가중평균 (메타/정책/시청/트렌드)
- music-lab 5개 신규 테이블 + 12개 엔드포인트
- agent-office youtube_publisher 에이전트 + scheduler 폴링
- web-ui SetupTab + PipelineTab 신규 + Library 트리거
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-07 16:13:29 +09:00
657ffdc55f
fix(agent-office): 아침 브리핑 직전 뉴스 스크랩 트리거 — 어제 뉴스 송출 방지
...
기존: stock-lab cron 스크랩(08:00)이 stock 에이전트 브리핑(07:30)보다 늦어
어제 8시 스크랩 결과만 DB에 있어 어제 뉴스가 요약·전송되었음.
수정: 에이전트 on_schedule에서 summarize 직전 /api/stock/scrap을 호출해
DB를 오늘 새벽 뉴스로 갱신한 뒤 요약. 스크랩 실패 시 경고 로그만 남기고
이전 데이터로 진행(브리핑 자체가 무산되는 것은 방지).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-07 15:31:55 +09:00
f54da7d46a
chore(harness): 프로젝트 settings.json — git/docker/pytest allowlist + 민감파일 deny
...
체크인되는 프로젝트 권한 설정. read-only 명령(status/diff/logs/ps 등)을
사전 승인하여 권한 프롬프트 감소. .env / *.pem / *.key / lotto.db / stock.db
deny로 비밀·DB 직접 읽기 차단.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-07 15:06:12 +09:00
dc92c3d42d
docs: 완료된 spec/plan 제거 + lotto 프리미엄 로드맵 보존
...
운영 중인 기능에 대한 design/plan 문서 일괄 삭제(20개 spec + 14개 plan).
미구현 pet-lab만 보존. lotto-premium-roadmap.md 신규 추가
(Phase 3 구독 모델 미구현 — STATUS.md에서 참조).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-07 15:06:04 +09:00
24a57f2b69
docs: STATUS.md — 서비스 현황 + 향후 계획 정리
...
10개 컨테이너 운영 상태와 Phase별 향후 작업 인덱스. CLAUDE.md를 보완.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-07 14:57:28 +09:00
b9d3242341
Merge branch 'feat/packs-lab-infra'
...
packs-lab 인프라 통합 + admin mint-token 구현 — 9 task TDD
- conftest.py로 테스트 HMAC secret 통일
- POST /api/packs/admin/mint-token 라우트 (Vercel HMAC → 일회성 upload 토큰)
- 기존 4 라우트 회귀 테스트 + DSM client mock 테스트
- Supabase pack_files DDL + 활성/삭제 인덱스
- docker-compose 18950 + nginx /api/packs/ 5GB streaming + env 8개
- PACK_BASE_DIR 환경변수화 (마운트 경로와 정합성 확보)
- web-backend CLAUDE.md 5곳 + workspace CLAUDE.md 1줄 갱신
- 24 tests passing
2026-05-06 03:35:37 +09:00
5e9a51c9e8
docs(claude): packs-lab 10번째 서비스로 등록 (포트/라우팅/API 표 + 신규 섹션)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-06 01:42:15 +09:00
5844567048
fix(packs-lab): PACK_BASE_DIR을 환경변수로 — 컨테이너 마운트 경로와 routes 정합성 확보
...
이전 docker-compose는 컨테이너 내부 /app/data/packs로 마운트하지만 routes.py는
/volume1/docker/webpage/media/packs를 하드코딩하고 있어 mismatch였다.
- routes.py: PACK_BASE_DIR = Path(os.getenv("PACK_BASE_DIR", "/app/data/packs"))
- docker-compose: PACK_BASE_DIR env 추가 + volume 마운트가 같은 경로 사용
- .env.example: PACK_BASE_DIR 신규 명시 (마운트 경로와 반드시 일치 안내)
2026-05-06 01:40:07 +09:00
0906c3ba35
chore(infra): packs-lab 서비스 통합 (compose 18950 + nginx 5GB streaming + env 7개)
...
- docker-compose.yml: 포트 18910→18950 수정, env 형식을 list 스타일로 통일,
TZ/UPLOAD_TOKEN_TTL_SEC 추가, volume 경로를 /app/data/packs으로 정정
- .env.example: packs-lab 섹션 신규 추가 (DSM_HOST/DSM_USER/DSM_PASS/
BACKEND_HMAC_SECRET/SUPABASE_URL/SUPABASE_SERVICE_KEY/UPLOAD_TOKEN_TTL_SEC/PACK_DATA_PATH)
- nginx/default.conf: 이전 커밋(9a0bbec )에 이미 포함 — 변경 없음
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-06 01:37:29 +09:00
ff4ef299ad
feat(packs-lab): Supabase pack_files DDL + 활성/삭제 인덱스
2026-05-06 01:35:19 +09:00
5ebcbae8b5
docs(packs-lab): routes 모듈 docstring 정리 (mint-token 추가, DSM 자동 만료 명시)
2026-05-06 01:34:47 +09:00
1cd3cf8830
test(packs-lab): DSM client mock 테스트 (login/share/logout 순서)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-06 01:33:11 +09:00
c18fd8e52b
test(packs-lab): upload size/replay + delete soft-delete + list filter 회귀 테스트
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-06 01:30:46 +09:00
dc482b32e4
feat(packs-lab): POST /api/packs/admin/mint-token 라우트 + 통합 테스트
...
MintTokenRequest/Response 스키마 추가, mint_token 라우트 구현 (HMAC 인증 + 확장자 검증 + JTI 발급), 테스트 3건 추가.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-06 01:27:43 +09:00
ef026e7ac6
test(packs-lab): conftest로 HMAC secret 통일
...
모든 테스트에서 BACKEND_HMAC_SECRET 환경변수와 auth._SECRET 모듈 캐시를
동일한 값으로 설정하는 autouse fixture 추가.
기존 test_auth.py / test_routes.py와 동일한 secret 값 사용.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-06 01:24:17 +09:00
80a54d056e
docs(plan): packs-lab 인프라 통합 + admin mint-token 구현 계획
...
9 task TDD 분할:
- Task 1: tests/conftest.py — autouse HMAC secret
- Task 2: admin mint-token (스키마 + 라우트 + 통합 테스트 3건)
- Task 3: 기존 4 라우트 회귀 테스트 (sign-link/upload/list/delete, 8건)
- Task 4: test_dsm_client.py — DSM 7.x mock (4건)
- Task 5: routes 모듈 docstring 정리
- Task 6: Supabase pack_files DDL
- Task 7: 인프라 통합 (compose 18950 + nginx 5GB streaming + env 7개)
- Task 8: CLAUDE.md 5곳 + workspace 1줄
- Task 9: 회귀 검증 + NAS 디렉토리 가이드
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-05 19:42:41 +09:00
83192eb66c
docs(spec): packs-lab 인프라 통합 + admin mint-token 설계
...
- POST /api/packs/admin/mint-token (Vercel HMAC → 일회성 upload 토큰)
- Supabase pack_files DDL + 활성/삭제 인덱스
- docker-compose 18950 + nginx 5GB streaming + .env.example 6+1 환경변수
- tests: routes 통합 + DSM client mock + autouse HMAC fixture
- CLAUDE.md: web-backend 5곳 + workspace 1곳 갱신
- DELETE 라우트 docstring 정리(자동 만료)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-05 18:51:24 +09:00
9a0bbeccd5
feat(packs-lab): docker-compose 서비스 + nginx 라우팅 (5GB body limit)
2026-05-02 08:57:36 +09:00
7a9690526a
test(packs-lab): routes 통합 테스트 (DSM·supabase mock)
2026-05-02 08:55:26 +09:00
7a7e3d1ce0
fix(packs-lab): 누락된 A1-A3 파일 복구 (Dockerfile + auth + DSM client + tests)
...
Tasks A1-A3 의 파일이 working tree에 있었으나 git에 stage되지 않은 상태에서
A4 commit이 진행되어 routes.py 의 import (auth, dsm_client)가 깨진 상태였음.
복구: 8 files 일괄 commit.
- packs-lab/Dockerfile
- packs-lab/app/__init__.py
- packs-lab/app/requirements.txt
- packs-lab/app/auth.py (HMAC verify_request_hmac + verify_upload_token)
- packs-lab/app/dsm_client.py (DSM 7.x Sharing.create wrapper)
- packs-lab/tests/{__init__.py, test_auth.py}
- packs-lab/pytest.ini
2026-05-02 08:53:26 +09:00
eb547a0367
feat(packs-lab): 4 라우트 — sign-link, upload, list, delete (HMAC + supabase)
2026-05-02 08:52:24 +09:00
096e291ed8
feat(music-lab): 다중 트랙 컴파일 백엔드 (FFmpeg concat+crossfade → MP4)
...
- db.py: compile_jobs 테이블 추가 + CRUD 5종 (create/get/list/update/delete)
- compiler.py: acrossfade 필터 체인 + 그라디언트 배경 + MP4 렌더링 워커
- main.py: /api/music/compile POST·GET·DELETE + /api/music/compiles GET + /api/music/compile/{id}/export GET
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-01 16:54:53 +09:00
7c8d079f74
fix(music-lab): trend report list에 top_genres/recommended_styles 포함
...
GET /api/music/market/report 응답에 top_genres, recommended_styles를 포함해
히스토리 리포트 클릭 시 장르 차트와 Suno 프롬프트가 비어 보이는 버그 수정.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-01 15:03:27 +09:00
85e5f96379
docs(plan): music YouTube 탭 프론트엔드 구현 플랜
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-01 14:40:04 +09:00
47a4b1e231
docs(spec): music YouTube 탭 프론트엔드 설계 스펙
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-01 14:32:32 +09:00
be0094b83f
feat: YouTube 수익화 파이프라인 — 영상 제작·수익 추적·시장 조사 에이전트
...
- music-lab: FFmpeg 비주얼라이저·슬라이드쇼 영상 제작 (video_producer.py)
- music-lab: 영상 프로젝트 6개 + 수익화 5개 + 시장조사 5개 API 추가
- music-lab: video_projects·revenue_records·market_trends·trend_reports DB 추가
- agent-office: YouTubeResearchAgent (YouTube API·pytrends·Billboard 수집, 09:00 daily)
- agent-office: youtube_researcher.py + /youtube/research API 2개 추가
- infra: Dockerfile ffmpeg + Nginx /media/videos/ + docker-compose 볼륨·환경변수
2026-05-01 12:50:38 +09:00
e948393906
docs(CLAUDE.md): YouTube 수익화 기능 — API·DB·환경변수·스케줄러 문서 업데이트
2026-05-01 12:37:30 +09:00
0beceefeef
fix(deploy): docker-compose에 PEXELS_API_KEY·YOUTUBE_DATA_API_KEY·VIDEO_DATA_DIR 환경변수 추가
2026-05-01 12:35:44 +09:00
355667cf9c
fix(music-lab): market API 타입 강화·ANTHROPIC_API_KEY call-time·HTTP 레이어 테스트 추가
2026-05-01 12:32:24 +09:00
26b9eea0dc
feat(music-lab): market_trends·trend_reports DB + market.py + /api/music/market 5개 API
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-01 12:26:37 +09:00
3b9dcfe0dd
fix(agent-office): YouTubeResearchAgent 품질 개선 (동시실행 가드·에러 로깅·타입 수정)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-01 12:22:33 +09:00
1d4354e402
feat(agent-office): YouTubeResearchAgent + 스케줄러 + /youtube/research API
...
- db.py: youtube_research_jobs 테이블 추가 + CRUD 3종 (add/update/get_latest)
- agents/youtube.py: YouTubeResearchAgent 신규 구현 (on_schedule/on_command/on_approval/_run_research/send_weekly_report)
- agents/__init__.py: YouTubeResearchAgent 등록
- scheduler.py: youtube_research(매일 09:00) + youtube_weekly_report(월 08:00) cron 추가
- main.py: POST /api/agent-office/youtube/research + GET /api/agent-office/youtube/research/status 엔드포인트 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-01 12:13:12 +09:00
8604c6292d
fix(agent-office): get_running_loop + pytrends timeout + UA 수정
...
- asyncio.get_event_loop() → asyncio.get_running_loop() (python 3.10+ 권장)
- TrendReq에 timeout=(5, 15) 추가 (connect, read timeout)
- User-Agent에서 'bot' 제거: 표준 Chrome UA로 변경
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-01 12:10:09 +09:00
21666f4372
feat(agent-office): youtube_researcher — YouTube API·pytrends·Billboard 수집
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-01 12:05:58 +09:00
f83b900320
fix: frontend 서비스에 /data/videos 볼륨 마운트 추가
2026-05-01 12:04:32 +09:00
a7b2fc0d9d
chore: FFmpeg 설치 + Nginx /media/videos/ + docker-compose volumes + 환경변수
2026-05-01 12:03:19 +09:00
327d0b4e81
fix(music-lab): VIDEO_DATA_DIR 기본값 통일 + lazy import 정리
...
- VIDEO_DATA_DIR 기본값을 /app/data/videos로 수정 (기존 /app/data에 videos 서브디렉토리를 중복 붙이던 버그 수정)
- delete_project, export_project의 경로에서 중복된 "videos" 서브디렉토리 제거
- create_project 내부의 get_track_by_id lazy import를 파일 상단 import 블록으로 이동
2026-05-01 12:01:59 +09:00
8e7a3806c5
feat(music-lab): 영상 프로젝트 6개 + 수익화 5개 API 추가
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-01 11:59:11 +09:00
abf475433b
fix(music-lab): xfade offset 누적 오차 수정 + 테스트 보강
...
- _build_slideshow_cmd: offset 공식을 `duration_per_image * i - xd * i`로 수정 (누적 전환 오차 제거)
- _generate_metadata: genre 빈 문자열일 때 yt_tags에 빈 문자열 삽입 방지
- test: VIDEO_DATA_DIR 패치를 monkeypatch로 교체 (자동 복원 보장)
- test: xfade offset 값 검증 테스트 추가 (29.00, 58.00)
- test: 미사용 import 제거 (pytest, sqlite3)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-01 11:56:41 +09:00
7336fd090e
feat(music-lab): video_producer — FFmpeg 비주얼라이저·슬라이드쇼 + Claude 메타데이터
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-01 11:49:42 +09:00
62d79b2669
fix(music-lab): revenue avg_rpm 공식 수정 + UNIQUE 제약 + 테스트 보강
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-01 11:46:00 +09:00
56fbe3fc4b
fix(agent-office): realestate 에이전트 텔레그램 명령 등록
...
AGENT_META + AGENT_COMMAND_MAP에 realestate 누락으로 /realestate 명령 인식 불가.
- /realestate matches → fetch_matches
- /realestate dashboard → dashboard
- /help에 청약 에이전트 항목 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-01 11:45:45 +09:00
a5495aeaa4
feat(music-lab): video_projects·revenue_records DB 마이그레이션 + CRUD
...
- init_db()에 video_projects, revenue_records 테이블 추가 (CREATE IF NOT EXISTS)
- video_projects CRUD: create/get/get_all/update_status/delete + get_track_by_id
- revenue_records CRUD: create/get_all/update/delete/get_revenue_dashboard (RPM 자동 계산)
- TDD: tests/test_db_video.py 5개 테스트 모두 PASSED
- pytest.ini 추가 (pythonpath=. 설정)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-01 11:41:07 +09:00
88b5ea9ce2
chore: .worktrees/ gitignore 추가
2026-05-01 11:36:56 +09:00
54d67f892c
docs(spec): music-lab YouTube 수익화 고도화 설계 문서 추가
...
시장 조사 자동화 + 영상 제작 파이프라인 + 수익화 추적 전체 설계.
Phase 1(영상 제작) → Phase 2(시장 조사) → Phase 3(YouTube API) 로드맵 포함.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-01 11:14:25 +09:00
8411e2c73e
feat(realestate): 결과발표 공고 매칭 점수 보존
...
run_matching() 대상을 '청약예정/청약중/결과발표'로 확장.
삭제는 '완료' 상태만 — 결과발표 단계의 매칭 기록은 유지.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-01 10:32:58 +09:00
86a6b75124
feat(realestate): API 수집 retry 로직 추가 (최대 2회, 지수 백오프)
...
페이지 요청 실패 시 즉시 중단 대신 1초·2초 대기 후 재시도.
2회 모두 실패 시에만 해당 엔드포인트 수집 종료, 나머지 엔드포인트 계속 진행.
JSON 파싱 오류는 재시도 없이 즉시 skip.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-01 10:32:26 +09:00