# SPRINT-008: 실시간 전환 + 설정 + 자매 강화 ## 목표 모든 하드코딩 데이터를 실시간 전환 + 설정 페이지 구현 + 자매 프로필 강화 ## 태스크 ### TASK-028: 자매 실시간 데이터 (Uptime/시스템 정보) - SistersService 확장: - SSH로 실제 uptime 조회: `cat /proc/uptime` - CPU 사용률: `top -bn1 | grep Cpu` - 메모리: `free -m` - 디스크: `df -h /` - API 응답에 시스템 정보 추가: ```json { "uptime": "342:12:05", "cpu": 23.4, "memory": { "used": 1024, "total": 4096 }, "disk": { "used": "12G", "total": "50G" } } ``` - 자매 페이지(/sisters): 실제 Uptime 표시 (하드코딩 제거) - 자매 카드: Capacity → 실제 CPU/메모리 기반 - WebSocket: 30초마다 자매 상태 업데이트에 시스템 정보 포함 ### TASK-029: 자매 프로필 사진 API - API: `GET /api/sisters/:name/avatar` - SSH로 각 자매 서버에서 프로필 사진 가져오기: - 경로: `~/.openclaw/avatar.png` 또는 `~/.openclaw/avatar.jpg` - SCP/SSH cat으로 바이너리 전송 - 캐싱: 메모리 캐시 (5분 TTL) — 매번 SSH 호출 방지 - 대체(fallback): 프로필 사진 없으면 이름 이니셜 아바타 생성 - FE: 자매 카드/상세 페이지에서 아바타 이미지 교체 ### TASK-030: 설정 페이지 BE + FE - SystemSettings 테이블 (Prisma): ``` model SystemSettings { id Int @id @default(autoincrement()) key String @unique value String @db.Text updatedAt DateTime @updatedAt } ``` - API: - `GET /api/admin/settings` — 전체 설정 조회 - `PUT /api/admin/settings` — 설정 일괄 저장 - 설정 항목 (settings-design.md 기반): - 강제 2FA (boolean) - 세션 유효 시간 (number, 분) - IP 화이트리스트 (boolean) - 자동 백업 (boolean) - 백업 주기 (string, HH:mm) - 보관 주기 (number, 일) - 대기열 경고 임계값 (number) - 자동 스케일링 (boolean) - CPU 임계값 (number, %) - 레이턴시 경보 (number, ms) - 노드 오프라인 알림 (boolean) - FE /settings 페이지: - 마운트 시 설정 로드 (API fetch) - 토글/인풋 변경 → 로컬 state - "설정 저장" → PUT API → 성공 토스트 - "초기화" → 기본값 복원 ### TASK-031: 하드코딩 제거 + 스켈레톤 UI **대상 목록:** | 페이지 | 하드코딩 항목 | 전환 방식 | |--------|-------------|-----------| | `/` (대시보드) | 상태 카드 값 ([ON]/[84]/[--]/[12]) | → /api/sisters 실시간 | | `/` (대시보드) | ONGOING PROJECTS 목록 | → /api/projects 실시간 | | `/` (대시보드) | ACTIVITY FEED | → /api/activities 실시간 | | `/sisters` | Uptime, Load Index, Sync Log | → TASK-028 API | | `/org` | 조직도 데이터 | → /api/org (이미 연동, 확인만) | | `/settings` | 토글/인풋 값 | → TASK-030 API | | `/activities` | 전체 로그 테이블 | → /api/activities (TASK-027에서 연동) | - 모든 API 호출에 **스켈레톤 UI** 추가: - 카드 스켈레톤: 회색 박스 펄스 애니메이션 - 테이블 스켈레톤: 행 placeholder - 타임라인 스켈레톤: 도트 + 라인 placeholder - 에러 상태: "데이터를 불러올 수 없습니다" fallback UI ## 의존성 - Sprint 007 완료 필요 (Gitea 데이터 + 활동 로그가 있어야 실시간 전환 가능) - TASK-028, TASK-029는 독립적 (병렬 가능) - TASK-030은 독립적 - TASK-031은 TASK-028 + TASK-030 완료 후 최종 정리 ## 검증 기준 - 자매 페이지에서 실제 Uptime/CPU/메모리 표시 - 프로필 사진 정상 렌더링 (없으면 이니셜 fallback) - 설정 저장/로드/초기화 정상 동작 + 토스트 - 모든 페이지에서 하드코딩 0건 (curl/검색으로 확인) - 스켈레톤 UI 동작 (느린 네트워크에서 확인) - npm run build 성공 + 테스트 통과 - **외부 URL QA 필수**