# 대시보드 All Stop 버튼 구현

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

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

## 구현 요구사항

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

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

```python
@app.route('/api/system/all-stop', methods=['POST'])
def all_stop():
    """서버의 모든 Claude Code 프로세스를 강제 종료"""
    # 1. 현재 실행 중인 모든 claude 프로세스 목록 수집
    #    ps -eo pid,args --no-headers | grep claude | grep -v grep
    
    # 2. 각 프로세스에 SIGTERM 전송
    #    kill PID
    
    # 3. 3초 대기 후 생존 프로세스에 SIGKILL
    #    kill -9 PID
    
    # 4. 모든 running task의 timer end 처리
    #    task-timers.json에서 status=running인 태스크 전부 end
    
    # 5. 결과 반환
    #    killed 수, 실패 수, 처리된 task 목록
    
    return jsonify({
        "status": "ok",
        "killed": N,
        "failed": M,
        "tasks_ended": ["task-1775", "task-1776", ...]
    })
```

**주의사항**:
- 아누 세션(cokacdir 관리)은 kill 대상에 포함해도 됨 (어차피 토큰 한도면 전부 먹통)
- `pkill -f claude`가 아니라 **프로세스 목록을 먼저 수집 → 로그 기록 → 개별 kill** 순서
- kill 전에 프로세스 목록을 로그에 남겨야 나중에 뭘 죽였는지 추적 가능
- 로그 파일: `logs/all-stop.log`

### 2. 프론트엔드 UI
**파일**: `dashboard/components/SystemView.js` (또는 해당 컴포넌트)

- 시스템 관리 섹션에 빨간 "Emergency All Stop" 버튼 추가
- 클릭 시 확인 다이얼로그: "모든 Claude 프로세스를 강제 종료합니다. 계속하시겠습니까?"
- 실행 후 결과 표시: "N개 프로세스 종료, M개 태스크 정리"

### 3. 보안
- 별도 인증 없음 (대시보드 접근 = 내부 네트워크)
- 다만 실수 방지를 위해 **2단계 확인** 필요 (버튼 클릭 → 확인 다이얼로그 → 실행)

## 검증 시나리오

1. **기본 동작**: All Stop 실행 시 서버의 모든 claude 프로세스가 종료되고, JSON 응답에 killed 수가 표시되면 성공
2. **task-timer 정리**: running 상태였던 task들이 all-stop 후 completed/failed로 변경되면 성공
3. **로그 기록**: `logs/all-stop.log`에 종료된 프로세스 목록(PID, args)이 기록되면 성공
4. **프로세스 없는 경우**: claude 프로세스가 없을 때 실행해도 에러 없이 `{"killed": 0}` 반환하면 성공
5. **UI 확인 다이얼로그**: 버튼 클릭 시 확인 창이 뜨고, 취소하면 API 호출 안 되면 성공
6. **회귀**: 기존 대시보드 기능(워치독, 팀 상태 등)이 정상 동작하면 성공