# 대시보드 All Stop 버튼 구현 (시스템뷰 탭)

## 개요
서버의 모든 Claude Code 프로세스를 대시보드 시스템뷰에서 한 번에 강제 종료할 수 있는 "All Stop" 버튼을 구현한다.

## 배경
Claude Max 200 플랜의 5시간 윈도우 토큰 한도가 100%에 도달하면, cokacdir 관리 봇은 알아서 kill되지만, **별도 탭에서 직접 실행한 Claude Code 프로세스** (InsuWiki 정제, 네이버 블로그 작성 등)는 LLM 호출만 실패하면서 프로세스가 폭주한다. 현재 이 프로세스를 죽이려면 서버 재부팅이 필요.

## 구현 요구사항

### 1. 백엔드 API
**파일**: `dashboard/server.py`

`POST /api/system/all-stop` 엔드포인트 추가:

1. `ps -eo pid,args --no-headers`로 모든 프로세스 목록 수집
2. `claude` 키워드가 포함된 프로세스 필터링 (grep -v grep, grep -v dashboard)
3. 각 프로세스 PID + args를 `logs/all-stop.log`에 기록
4. 각 프로세스에 SIGTERM 전송
5. 3초 대기 후 생존 프로세스에 SIGKILL
6. task-timers.json에서 status=running인 태스크 전부 end 처리 (task-timer.py end 호출)
7. 결과 반환: `{"status": "ok", "killed": N, "failed": M, "tasks_ended": [...]}`

**주의사항**:
- 대시보드 자체 프로세스(dashboard/server.py)는 kill 대상에서 제외
- `pkill -f claude`가 아니라 프로세스 목록 수집 → 로그 → 개별 kill 순서
- JSON 응답이 유효해야 함

### 2. 프론트엔드 UI
**파일**: `dashboard/components/SystemView.js`

- 와치독 모니터링 섹션 옆 또는 상단에 빨간 "Emergency All Stop" 버튼 추가
- 버튼 스타일: 빨간 배경, 흰 글씨, 눈에 띄는 크기
- 클릭 시 **confirm 다이얼로그**: "모든 Claude 프로세스를 강제 종료합니다. 계속하시겠습니까?"
- confirm 후 `POST /api/system/all-stop` 호출
- 응답 결과를 알림으로 표시: "N개 프로세스 종료, M개 태스크 정리"

### 3. 보안
- 실수 방지를 위한 2단계 확인 (버튼 → confirm → 실행)

## 검증 시나리오

1. **API 기본**: `curl -X POST http://localhost:8000/api/system/all-stop` 호출 시 JSON 응답 반환하면 성공. claude 프로세스 없을 때 `{"status":"ok","killed":0}` 반환.
2. **로그 기록**: 실행 후 `logs/all-stop.log`에 타임스탬프+PID+args 기록되면 성공
3. **UI 확인**: 시스템뷰 탭에 빨간 버튼 표시되고, 클릭 시 confirm 뜨면 성공
4. **task-timer 정리**: running 태스크가 있는 상태에서 all-stop 실행 시 completed로 변경되면 성공
5. **대시보드 생존**: all-stop 실행 후에도 대시보드 자체는 계속 동작하면 성공
6. **회귀**: 기존 시스템뷰 기능 (와치독 등) 정상 동작하면 성공