diff --git a/journey/plans/251117_claude_robeing_diary_시스템_계획.md b/journey/plans/251117_claude_robeing_diary_시스템_계획.md index 63a63f3..20fb36c 100644 --- a/journey/plans/251117_claude_robeing_diary_시스템_계획.md +++ b/journey/plans/251117_claude_robeing_diary_시스템_계획.md @@ -88,15 +88,107 @@ --- +## 구현 상세 + +### DB 테이블 스키마 + +**robeing_diary 테이블**: +```sql +CREATE TABLE robeing_diary ( + id SERIAL PRIMARY KEY, + date DATE NOT NULL, + robeing_id VARCHAR(50) NOT NULL, + summary TEXT, + dominant_emotion VARCHAR(50), + stats JSONB DEFAULT '{}', + full_content TEXT NOT NULL, + created_at TIMESTAMPTZ DEFAULT NOW(), + UNIQUE(date, robeing_id) +); +CREATE INDEX idx_robeing_diary_date ON robeing_diary(date DESC); +CREATE INDEX idx_robeing_diary_robeing ON robeing_diary(robeing_id); +``` + +**activity_log 테이블**: +```sql +CREATE TABLE activity_log ( + id SERIAL PRIMARY KEY, + robeing_id VARCHAR(50) NOT NULL, + activity_type VARCHAR(50) NOT NULL, -- 'skill', 'scheduler', 'internal' + skill_name VARCHAR(100), + status VARCHAR(20) NOT NULL, -- 'success', 'error', 'partial' + result_summary TEXT, + error_message TEXT, + metadata JSONB DEFAULT '{}', + created_at TIMESTAMPTZ DEFAULT NOW() +); +CREATE INDEX idx_activity_log_robeing_date ON activity_log(robeing_id, created_at DESC); +CREATE INDEX idx_activity_log_type ON activity_log(activity_type); +``` + +**참고**: `rb8001/app/state/database.py:44-57` (ConversationLog 모델), `rb8001/app/models/intent_review_model.py:11-32` (IntentReviewQueue 모델) + +### 스킬 실행 로그 기록 + +**위치**: 스킬 실행 래퍼 함수 또는 미들웨어 +- `rb8001/app/services/skills/` 내 각 스킬의 `handle()` 메서드 시작/종료 시 기록 +- 또는 `rb8001/app/router/router.py`의 스킬 호출 부분에 데코레이터/미들웨어 추가 + +**기록 내용**: 스킬명, 실행 시간, 결과(success/error), 에러 메시지(있을 경우), 메타데이터 + +### API 엔드포인트 + +**rb8001**: `GET /api/diary/{date}?robeing_id=rb8001` +- 요청: `date` (YYYY-MM-DD), `robeing_id` (선택, 기본값: rb8001) +- 응답: `{"date": "2025-12-09", "robeing_id": "rb8001", "content": "# 로빙 일기...", "summary": "...", "dominant_emotion": "happiness"}` +- 구현 위치: `rb8001/app/router/diary.py` (새 파일) 또는 `rb8001/app/router/router.py` + +**참고**: `rb8001/app/state/state_service.py:179-207` (conversation 로그 API 패턴) + +### 스케줄러 등록 + +**위치**: `rb8001/main.py:146-195` (startup_event 함수) +- `rb8001/app/scheduler/jobs/diary_generator.py` 생성 +- `scheduler.add_job(diary_generator.generate_diary, 'cron', hour=2, minute=0, id='daily_diary')` 등록 + +**참고**: `rb8001/app/scheduler/jobs/naverworks_briefing.py` (스케줄러 작업 예시) + +### LLM 프롬프트 템플릿 + +**입력**: 집계된 데이터 (JSON) +**출력**: 마크다운 형식 일기 +**템플릿 구조**: +``` +다음 데이터를 바탕으로 로빙의 하루 일기를 작성하세요: +- 대화: {conversations_summary} +- 활동: {activities_summary} +- 감정: {emotions_summary} +- 문제: {issues_summary} +- 성장: {growth_summary} + +형식: +# 로빙 일기 – {date} +## 오늘 한 일 +... +## 감정 상태 +... +## 문제와 배운 점 +... +## 내일 계획 +... +``` + +--- + ## 구현 단계 -1. **DB 테이블 생성**: `robeing_diary` 테이블, `activity_log` 테이블 생성 +1. **DB 테이블 생성**: `robeing_diary`, `activity_log` 테이블 생성 스크립트 작성 2. **활동 로그 기록**: 스킬 실행 시 `activity_log`에 자동 기록 로직 추가 -3. **Diary Aggregator 구현**: 모든 데이터 소스 집계 로직 구현 -4. **일기 생성 로직**: LLM으로 일기 텍스트 생성, `robeing_diary`에 저장 -5. **API 엔드포인트**: rb8001에 `/api/diary/{date}` 추가 (마크다운 동적 생성) -6. **관리자 대시보드**: admin-dashboard에 일기 목록/상세 페이지 추가 -7. **스케줄러 등록**: 매일 오전 2시 또는 3시에 전날 일기 생성 +3. **Diary Aggregator 구현**: `rb8001/app/services/diary/aggregator.py` 생성, 모든 데이터 소스 집계 +4. **일기 생성 로직**: `rb8001/app/services/diary/generator.py` 생성, LLM으로 일기 텍스트 생성 +5. **스케줄러 등록**: `rb8001/app/scheduler/jobs/diary_generator.py` 생성, `main.py`에 등록 +6. **API 엔드포인트**: `rb8001/app/router/diary.py` 생성, `/api/diary/{date}` 구현 +7. **관리자 대시보드**: admin-dashboard에 일기 목록/상세 페이지 추가 8. **DOCS 동기화 스크립트**: 선택적으로 별도 스크립트로 DOCS 동기화 ---