## 2026-04-14 — 파이프라인 제거 + 커밋 상세 패널 + 실행 분석 대시보드 + CLI 설치 체크 + 브라우저 알림 + Git 브랜치 컨텍스트 메뉴

### 배경

사용하지 않는 파이프라인(다단계 순차/병렬 실행) 기능을 전면 제거하여 코드베이스를 경량화. Git 패널에서 커밋을 클릭하면 변경 파일 목록과 diff를 볼 수 있는 커밋 상세 패널 추가. 프로젝트별 실행 통계와 비용 추적을 위한 분석 대시보드 추가. CLI 도구 미설치 시 cryptic spawn 오류 대신 설정 패널에서 설치 상태를 사전 감지. 긴 태스크/토론 완료를 OS 레벨 알림으로 수신. Git 사이드바 브랜치에 VS Code 스타일 컨텍스트 메뉴 추가.

### 주요 변경

#### 1. 파이프라인 기능 전면 제거 (`28a9e9d`)

파이프라인(다단계 순차/병렬 실행) 관련 코드를 서버·클라이언트·DB에서 완전히 삭제. 2,278줄 감소.

- **서버**: `pipeline-orchestrator.ts`, `routes/pipelines.ts` 삭제
- **서버**: `index.ts`에서 파이프라인 라우터 마운트 및 stale recovery 로직 제거
- **서버**: `discussion-orchestrator.ts` — 동시 실행 카운트에서 파이프라인 제외 (todos + discussions만 계산)
- **DB**: `pipelines`, `pipeline_phases`, `pipeline_logs` 3개 테이블 제거 (14 → 11 테이블)
- **클라이언트**: `PipelineDetail`, `PipelineForm`, `PipelineItem`, `PipelineList`, `PhaseTimeline` 5개 컴포넌트 삭제
- **클라이언트**: `App.tsx` 파이프라인 라우트 제거, `ProjectDetail.tsx` 파이프라인 탭 제거
- **클라이언트**: `api/pipelines.ts` 삭제, `types.ts` 파이프라인 타입 제거
- **i18n**: 파이프라인 관련 번역 키 94개 제거
- **WebSocket**: 파이프라인 이벤트 타입 제거

#### 1-2. 실행 분석 대시보드 — 비용/토큰 비정규화 추적 (`7bd9126`)

프로젝트별 태스크 실행 통계(성공률, CLI별 비용 분해, 일별 활동 차트)를 표시하는 Analytics 탭 추가. `todos.total_cost_usd`/`total_tokens` 비정규화 컬럼으로 JSON 파싱 없이 순수 SQL 집계.

- **DB**: `todos`에 `total_cost_usd` (REAL), `total_tokens` (INTEGER) 컬럼 추가
- **서버**: `orchestrator.ts` — 성공/실패 양쪽 경로에서 비정규화 cost/token 값 저장
- **서버**: `GET /api/projects/:id/analytics` — 기간 필터(7d/30d/90d/all), summary/CLI별 분해/일별 집계/상태 분포
- **클라이언트**: `AnalyticsPanel.tsx` 신규 — summary 카드 + 바 차트 + 툴팁 (이후 4/16에 Recharts로 교체)
- **클라이언트**: `ProjectDetail`에 Analytics 탭 추가
- **i18n**: 한/영 번역 22개 키

#### 1-3. CLI 설치 상태 체크 (`dc2f0cc`)

프로젝트 설정 열릴 때 `--version`으로 CLI 가용성 확인 후 설치 가이드 표시. 태스크 실행 전 사전 감지.

- **서버**: `cli-status.ts` 신규 — 병렬 version 체크 + 60초 캐싱
- **서버**: `GET /api/cli/status`, `POST /api/cli/status/refresh`
- **클라이언트**: `ProjectHeader`에 CLI 상태 인디케이터(녹색/빨강 + 버전) + 미설치 시 npm install 명령 배너 + refresh 버튼

#### 1-4. 브라우저 알림 — 태스크/토론 완료 (`34ef7ec`)

긴 작업 완료를 OS 레벨 알림으로 수신. 사이드바 토글 + localStorage 영속.

- **클라이언트**: `useNotification` 훅 신규 — Context + Provider (useTheme 패턴), permission 요청 플로우, stable `sendNotification` ref
- **클라이언트**: `Sidebar`에 bell 아이콘 토글 (on일 때 accent fill, 차단 시 tooltip)
- **클라이언트**: `ProjectDetail`(todo + discussion), `DiscussionDetail` — completed/failed 이벤트에 알림 디스패치
- **i18n**: 알림 메시지/토글 라벨

#### 1-5. Git 브랜치 컨텍스트 메뉴 (`eb2fd88`)

Git 사이드바 브랜치에 우클릭 VS Code 스타일 컨텍스트 메뉴 추가.

- **클라이언트**: 로컬 브랜치 메뉴 — checkout, merge into current, rebase onto, fetch, pull, push, rename, delete
- **클라이언트**: 원격 브랜치 메뉴 — local tracking으로 checkout, merge, fetch
- **클라이언트**: 브랜치 rename 모달 (Enter 지원, 현재 이름 prefill)
- **서버**: `worktree-manager.ts` — `gitRenameBranch`, `gitRebase` 메서드
- **서버**: `POST /api/projects/:id/git-branch-rename`, `/git-rebase`
- **클라이언트**: 뷰포트 인식 메뉴 포지셔닝 (화면 가장자리 자동 조정)

#### 1-6. 프로젝트 open-folder 버튼 (`7acc782`)

- **서버**: `POST /api/projects/open-folder` — OS별 파일 탐색기 열기 (Windows/macOS/Linux)
- **클라이언트**: `ProjectHeader` 경로를 텍스트에서 폴더 아이콘 + 클릭 가능 버튼으로 교체

#### 1-7. Gemini headless 모드 Windows 수정 (`81fcce7`, `dc70fcf`)

Windows에서 Gemini CLI가 `-p ""` 형식 인자를 해석하지 못해 headless 모드가 실패하던 문제 해결.

- **서버**: `cli-adapters.ts` — Gemini가 `--prompt=`(equals 형식)으로 prompt를 전달하도록 변경
- **서버**: headless mode에서 `-p` flag에 빈 문자열 전달

#### 2. 커밋 상세 패널 — 파일 목록 + Diff 뷰어 (`1828a7b`)

Git 패널의 커밋 로그에서 커밋을 클릭하면 변경 파일 목록과 파일별 diff를 표시하는 분할 뷰 추가.

- **서버**: `GET /api/projects/:id/git-commit-files` — 커밋의 변경 파일 목록 (status, additions, deletions)
- **서버**: `GET /api/projects/:id/git-commit-diff` — 커밋의 파일별 diff 조회
- **서버**: `worktree-manager.ts` — `getCommitFiles()`, `getCommitDiff()` 메서드 추가. `git diff-tree` 기반, root 커밋/merge 커밋 자동 감지 처리
- **클라이언트**: `GitStatusPanel.tsx` — `CommitFileList` (파일 사이드바) + `CommitDiffViewer` (diff 메인 영역) 내부 컴포넌트 추가. 커밋 클릭 시 토글, 파일 선택 시 diff 표시, 첫 파일 자동 선택
- **클라이언트**: `api/projects.ts` — `getCommitFiles()`, `getCommitDiff()` API 함수 + `CommitFile` 인터페이스 추가
- **i18n**: 커밋 상세 관련 번역 키 추가 (changedFiles, loadingFiles, noFilesChanged, selectFileToViewDiff, loadingDiff 등)

### 수정된 주요 파일

| 파일 | 변경 내용 |
|------|----------|
| `src/server/services/pipeline-orchestrator.ts` | **삭제** — 파이프라인 오케스트레이터 |
| `src/server/routes/pipelines.ts` | **삭제** — 파이프라인 REST 라우트 |
| `src/server/index.ts` | 파이프라인 라우터/recovery 제거 |
| `src/server/db/schema.ts` | pipelines, pipeline_phases, pipeline_logs 테이블 제거 |
| `src/server/db/queries.ts` | 파이프라인 쿼리 함수 제거 |
| `src/server/services/discussion-orchestrator.ts` | 동시 실행 카운트에서 파이프라인 제외 |
| `src/server/routes/projects.ts` | `git-commit-files`, `git-commit-diff` 엔드포인트 추가 |
| `src/server/services/worktree-manager.ts` | `getCommitFiles()`, `getCommitDiff()` 메서드 추가 |
| `src/client/src/components/GitStatusPanel.tsx` | 커밋 상세 패널 (CommitFileList + CommitDiffViewer) 추가 |
| `src/client/src/api/projects.ts` | 커밋 상세 API 함수 + CommitFile 타입 추가 |
| `src/client/src/i18n.tsx` | 파이프라인 키 제거, 커밋 상세 키 추가 |

### 아키텍처 결정

1. **파이프라인 완전 제거**: 파이프라인은 TODO의 의존성 체인 기능과 역할이 중복되어 활용도가 낮았으므로 전면 제거. DB 테이블 3개, 서비스 1개, 라우트 1개, 컴포넌트 5개가 삭제되어 유지보수 부담 감소
2. **커밋 diff-tree 기반 조회**: `git show` 대신 `git diff-tree`를 사용하여 name-status와 numstat를 별도 파싱. root 커밋(부모 없음)은 `--root` 플래그, merge 커밋은 first-parent 대비 diff로 처리
3. **내부 컴포넌트 패턴**: CommitFileList/CommitDiffViewer를 별도 파일이 아닌 `GitStatusPanel.tsx` 내부 컴포넌트로 구현. Git 패널에서만 사용되므로 파일 분리 불필요

---
