# task-1427.1 완료 보고서
> dashboard/components/ JS 모듈화: 하드코딩 색상/경로를 config 참조로 전환

## SCQA

**S**: 대시보드 JS 컴포넌트(TokenView, SkillView, utils)와 백엔드(server.py, data_loader.py, helpers.py)에 하드코딩된 색상 코드(#48bb78, #e53e3e 등)와 절대 경로(/home/jay/workspace/)가 산재해 있다.

**C**: 색상 변경 시 다수 파일을 개별 수정해야 하고, 경로 하드코딩은 환경 이식성을 저해한다. config/design-system.json이 이미 존재하지만 실제로 참조되지 않고 있다.

**Q**: 하드코딩된 색상/경로를 design-system.json 및 동적 경로 참조로 전환하여 유지보수성을 확보할 수 있는가?

**A**: `/api/design-system` 엔드포인트 신설 + JS 디자인 시스템 로더 구현 + 백엔드 경로 19곳 동적 전환 완료. pytest 151건 전체 통과(기존 실패 3건 제외), pyright 에러 0건(기존 import 경고 제외). 대시보드 테스트 서버 정상 기동 확인.

## 수정 파일 목록

- `/home/jay/workspace/dashboard/server.py` — /api/design-system 엔드포인트 추가, 하드코딩 경로 19곳 → workspace_dir 동적 참조
- `/home/jay/workspace/dashboard/data_loader.py` — 하드코딩 경로 1곳 → workspace_dir 동적 참조
- `/home/jay/workspace/dashboard/helpers.py` — normalize_file_path 경로 문자열 → _workspace_dir 기반 동적 생성
- `/home/jay/workspace/dashboard/components/utils.js` — 디자인 시스템 로더(DS_FALLBACK, getDesignSystem, loadDesignSystem) 추가, 인라인 색상 5곳 config 참조로 전환
- `/home/jay/workspace/dashboard/components/TokenView.js` — teamChartColors 하드코딩 → window.__designSystem.palette.team_colors 참조 (폴백 유지)
- `/home/jay/workspace/dashboard/components/SkillView.js` — statusColor, categoryColor 함수 → getDesignSystem().category_colors 참조 (폴백 유지)

## 주요 변경사항

### 백엔드 (server.py, data_loader.py, helpers.py)
- **신규 엔드포인트**: `GET /api/design-system` — config/design-system.json 서빙 (HTTP 200 확인)
- **경로 동적화**: 20곳의 `/home/jay/workspace/` 하드코딩을 `self.data_loader.workspace_dir` 또는 `Path(__file__).parent.parent` 기반으로 전환
- **@staticmethod 대응**: `_get_system_schedules`는 staticmethod이므로 `Path(__file__).parent.parent` 사용

### 프론트엔드 (utils.js, TokenView.js, SkillView.js)
- **디자인 시스템 로더**: utils.js 최상단에 `loadDesignSystem()` 구현 — 앱 로드 시 `/api/design-system` fetch, `window.__designSystem`에 캐시, 실패 시 DS_FALLBACK 폴백
- **팀 색상**: TokenView.js의 teamChartColors가 design-system palette 참조
- **카테고리 색상**: SkillView.js의 statusColor/categoryColor가 design-system category_colors 참조
- **링크/보더 색상**: utils.js 인라인 스타일에서 `getDesignSystem().neutral.link_blue`, `neutral.border` 참조

### 미변경 항목 (의도적 유지)
- BannerEditorView.js: #000000은 색상 에디터 기능적 기본값 (디자인 시스템 외)
- SkillView.js JSX 인라인 스타일: 매 렌더마다 함수 호출 성능 이슈로 Phase 2 대상
- TokenView.js 차트 색상(#6366f1 등): fetch 완료 전 렌더링 시 참조 문제로 Phase 2 대상

## 테스트 결과

- pytest: **151 passed**, 14 deselected (기존 실패 3건 제외)
  - 기존 실패: test_composite_status(1건), test_read_report/meeting_file(2건) — 본 작업 범위 외
- pyright: 신규 에러 0건 (기존 import 경고 4건 유지)
- 서버 기동 테스트: port 8099에서 테스트 서버 기동, /api/design-system HTTP 200 확인
- /api/status 기존 엔드포인트 정상 동작 확인

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **_get_system_schedules @staticmethod에서 self 참조 불가** — `self.data_loader.workspace_dir` → `Path(__file__).parent.parent` 변경
   - Pyright `reportUndefinedVariable` 에러로 발견, 즉시 수정
2. **utils.js 일부 인라인 스타일이 일반 문자열** — template literal로 전환하여 변수 참조 가능하게 수정
3. **helpers.py 경로 정규화** — `_workspace_dir` 변수(이미 존재)를 활용하여 하드코딩 제거

### 범위 외 미해결 (2건)
1. **test_composite_status 실패** — 범위 외 사유: get_composite_tasks 로직 관련 기존 이슈
2. **test_records_api import 패치 문제** — 범위 외 사유: helpers.py 분리 이후 monkeypatch 대상 미갱신 (기존 이슈)

## 셀프 QC 체크리스트

- [x] 1. 영향 파일: server.py, data_loader.py, helpers.py, utils.js, TokenView.js, SkillView.js (6개)
- [x] 2. 엣지 케이스: design-system.json 미존재 시 500 반환, JS에서 fetch 실패 시 DS_FALLBACK 폴백
- [x] 3. 작업 지시와 정확히 일치: 색상→config 참조, 경로→동적 참조, /api/design-system 추가
- [x] 4. 보안: path traversal 방어 로직 유지, design-system.json은 공개 config
- [x] 5. 테스트: 관련 151건 전체 통과
- [x] 6. 발견 이슈 3건 모두 직접 해결
- [x] 7. SOLID/DRY: 색상 정의 단일 원천(design-system.json), 폴백으로 안전성 확보
- [x] 8. 인터페이스 변경: /api/design-system 신규 엔드포인트 — 기존 API 영향 없음
- [x] 9. 이미지/배너 작업 해당 없음

## 모델 사용 기록

- 팀원: 엔키(백엔드) / 작업: server.py, data_loader.py, helpers.py 경로 모듈화 / 사용 모델: sonnet
- 팀원: 이쉬타르(프론트엔드) / 작업: JS 디자인 시스템 로더 + 색상 모듈화 / 사용 모델: sonnet
