Files
hanarang-dashboard/.plans/sprints/SPRINT-008.md
harang-ai b469a1337a 📋 Sprint 006~008 계획 추가
- SPRINT-006: 버그 수정 3건 + JWT 인증 시스템 (초대 코드 가입)
- SPRINT-007: Gitea 연동 + 활동 로그 실시간화
- SPRINT-008: 실시간 전환 + 설정 구현 + 자매 강화 + 스켈레톤 UI
2026-04-04 14:53:42 +09:00

100 lines
3.8 KiB
Markdown

# 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 필수**