# task-493.1: 대시보드 유실 기능 복원 보고서

## SCQA

**S**: 대시보드(server.py 1230줄, index.html 1072줄)가 React+Tailwind+SSE 구조로 정상 운영 중이며, TeamCard/ProjectView/SystemView/ArchiveView 등 핵심 기능이 동작하고 있다.

**C**: 대시보드 개선 과정에서 2가지 기능이 유실되었다: (1) 작업 상세 모달 (task-430.1 구현분) — 프로젝트뷰에서 작업 클릭 시 보고서/지시서를 모달로 표시하는 기능, (2) 프로젝트별 안건(To-Do) 시스템 (task-431.1 구현분) — todo.json 기반 안건 CRUD 및 프로젝트뷰 안건 섹션.

**Q**: 기존 기능을 깨뜨리지 않고 유실된 2가지 기능을 현재 대시보드에 복원할 수 있는가?

**A**: 양쪽 기능 모두 복원 완료. server.py에 7개 메서드/엔드포인트, index.html에 3개 컴포넌트를 추가. pytest 13/13 통과, 기존 API 9개 전체 200 응답, 신규 API 4개 정상 동작, pyright 에러 0건.

---

## 작업 내용

### 기능 1: 작업 상세 모달

**server.py 변경:**
- `DataLoader.get_task_detail(task_id)` 메서드 추가 — task-timers.json 조회 + reports/tasks 마크다운 파일 읽기, 9개 필드(report, task_spec 등) 반환
- `GET /api/task-detail/<task_id>` 엔드포인트 — Simple HTTP + FastAPI 양쪽 모드

**index.html 변경:**
- `TaskDetailModal` 컴포넌트 추가 — API fetch, 로딩 스피너, 상태 badge, marked.js+DOMPurify 마크다운 렌더링
- `ProjectView` 수정 — `selectedTaskId` state, 작업 행 클릭 시 모달 표시, task_id 파란색+호버 효과

### 기능 2: 프로젝트별 안건(To-Do) 시스템

**server.py 변경:**
- `DataLoader.load_todo()` 메서드 추가 — todo.json 로드, `self.todo_data`에 저장, `reload_all()`에 통합
- `GET /api/todo` 엔드포인트 — project 파라미터 필터링 지원
- `POST /api/todo`, `PUT /api/todo`, `DELETE /api/todo` 엔드포인트 — CRUD 지원
- `do_POST`, `do_PUT`, `do_DELETE`, `do_OPTIONS` 메서드 추가 — CORS preflight 포함
- `_read_body()`, `_send_cors_headers()` 헬퍼 메서드 추가

**index.html 변경:**
- `IssueItem` 컴포넌트 추가 — 안건 행, sub_items 펼침/접힘, 진행률 바
- `ProjectView`에 안건 섹션 추가 — linked_tasks/sub_items.task_id 기반 프로젝트 매핑
- `Dashboard.fetchData`에 `/api/todo` 추가, `todoData` state 추가

---

## 수정 파일 목록

- `/home/jay/workspace/dashboard/server.py` (1230줄 → 1562줄, +332줄)
- `/home/jay/workspace/dashboard/index.html` (1072줄 → 1279줄, +207줄)

---

## 테스트 결과

### pytest (정량)
- `tests/test_task_detail.py`: 5/5 통과 (get_task_detail 메서드 단위 테스트)
- `tests/test_todo_api.py`: 8/8 통과 (load_todo, reload_all 통합, 필터링)
- 전체: **13/13 통과** (0.05초)

### API 테스트 (정량)
- `GET /api/task-detail/task-430.1` → 200, 9개 필드(task_id/status/team_id/report/task_spec 등) 정상
- `GET /api/task-detail/task-99999.1` → 404 (존재하지 않는 task)
- `GET /api/todo` → 200, 9건 안건 반환
- `GET /api/todo?project=InsuRo` → 200, 3건 필터링 정상
- 기존 API 9개 → 전체 200 응답 (stats, teams, tasks, tech-debt, ci-status, member-status, bot-activity, recent-tasks, status)

### 정적 분석 (정량)
- pyright: 0 errors, 0 warnings
- black: OK (스타일 준수)
- isort: OK (import 순서 준수)

---

## 발견 이슈

1. **API 계약 불일치 수정**: 초기 구현에서 필드명(report_content/task_content)이 기존 테스트 계약(report/task_spec)과 불일치 → 테스트에 맞춰 수정 완료. `desc` → `description` fallback 로직도 추가.
2. **todo POST/PUT/DELETE 수동 미테스트**: UI에서 안건 생성/수정/삭제 UI 없음 (읽기 전용). API 코드 리뷰로 로직 검증. CLI(todo-manager.py)로 데이터 관리 가능.
3. **프론트엔드 렌더링 미확인**: 브라우저 접속 필요한 UI 테스트(모달, 안건 펼침/접힘)는 자동화 불가. API 응답 기반 데이터 흐름은 정상 확인.

---

## 비고
- marked.js, DOMPurify CDN은 기존에 이미 포함되어 있어 추가 불필요
- todo.json 파일 및 todo-manager.py CLI는 기존 그대로 활용 (수정 없음)
- CORS 헤더를 모든 HTTP 메서드에 적용하여 크로스오리진 요청 지원
