feat(sprint-003): sister detail + org chart + settings viewer

Sprint 002 non-blocking:
- API_URL/POLL_INTERVAL lib/config.ts 공통 추출
- 폴링 간격 NEXT_PUBLIC_POLL_INTERVAL_MS env화

Sprint 003 본문:
- TASK-008: SisterDetailService (config/sessions/subagents/activity 조회)
- TASK-008: GET /api/sisters/:name/{config,sessions,subagents,activity}
- TASK-008: GET /api/org → 조직도 + 파이프라인 데이터
- TASK-009: /sisters 목록 페이지 (카드 클릭 → 상세 이동)
- TASK-009: /sisters/[name] 상세 페이지 (탭: 개요/설정/세션/서브에이전트)
- TASK-009: SisterCard → /sisters/:name 링크 연결
- TASK-010: /org 조직도 페이지 (OrgTree 컴포넌트, 호버 팝업)
- TASK-011: /settings 설정 뷰어 페이지 (자매 선택 드롭다운)
- 테스트 16/16 pass, FE build 성공 (7 routes)
This commit is contained in:
2026-04-04 11:55:14 +09:00
parent dd6a2595f7
commit 4015e5f22f
20 changed files with 1553 additions and 8 deletions

View File

@@ -1,12 +1,39 @@
import { Controller, Get } from '@nestjs/common';
import { Controller, Get, Param } from '@nestjs/common';
import { SistersService } from './sisters.service';
import { SisterDetailService } from './sister-detail.service';
const VALID_NAMES = ['harang', 'narang', 'darang', 'erang'] as const;
type SisterName = (typeof VALID_NAMES)[number];
@Controller('api/sisters')
export class SistersController {
constructor(private readonly sistersService: SistersService) {}
constructor(
private readonly sistersService: SistersService,
private readonly sisterDetail: SisterDetailService,
) {}
@Get()
async getSistersStatus() {
return this.sistersService.getAllSistersStatus();
}
@Get(':name/config')
async getSisterConfig(@Param('name') name: string) {
return this.sisterDetail.getSisterConfig(name as SisterName);
}
@Get(':name/sessions')
async getSisterSessions(@Param('name') name: string) {
return this.sisterDetail.getSisterSessions(name as SisterName);
}
@Get(':name/subagents')
async getSisterSubagents(@Param('name') name: string) {
return this.sisterDetail.getSisterSubagents(name as SisterName);
}
@Get(':name/activity')
async getSisterActivity(@Param('name') name: string) {
return this.sisterDetail.getSisterActivityLog(name as SisterName);
}
}