---
name: hestia
description: >
  코드베이스 청소 + 위생 점검 (헤스티아 — 화로의 여신). Dead Code 탐지,
  미사용 export/의존성/파일 제거, LOC 측정, 코드 건강도 보고.
  "정리해줘", "dead code", "코드 위생", "쓸모없는 코드" 요청에 실행.
  /hestia로 실행.
triggers:
  - "hestia"
  - "헤스티아"
  - "코드 정리"
  - "코드 줄여"
  - "dead code"
  - "쓸모없는 코드"
  - "코드 위생"
  - "code hygiene"
  - "unused"
  - "entropy"
  - "정리해줘"
auto_apply: false
license: MIT
metadata:
  version: "1.0.0"
---

# Hestia (헤스티아) — 화로의 여신, 코드 위생 관리자

> **헤스티아(Hestia)**: 올림포스 12신 중 하나, 화로와 가정의 여신.
> 화로를 깨끗이 유지하듯, 코드베이스에서 쓸모없는 것을 찾아 치운다.
> 조용하지만 빠지면 집이 무너진다.
>
> **argos가 "빠진 걸 찾고", hestia는 "남은 걸 치운다."**

## Quick Start

```
/hestia                         # 전체 스캔 + 정리
/hestia scan                    # 스캔만 (보고만, 삭제 안 함)
/hestia clean                   # 스캔 + 자동 삭제
/hestia src/                    # 특정 디렉토리만
/hestia --dry-run               # 삭제 대상 미리보기 (실행 안 함)
```

**공식 호출명:** `/hestia` (별칭: `헤스티아`, `코드 정리`, `dead code`)

## 파이프라인 위치

```
/agent-team → /argos → /minos → /hestia → /clio
  구현          감리      QA      정리       기록
                                  ↑
                          "argos/minos 통과 후, clio 기록 전"
```

**또는 독립 실행** — 언제든 `/hestia`로 현재 코드베이스 점검 가능.

---

## Phase 1: 측정 (Before)

변경 전 현재 상태를 측정합니다. 측정 없는 정리는 감이지 사실이 아닙니다.

```bash
# 총 LOC (프로덕션 코드만, 테스트 제외)
find src/ app/ lib/ -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.java" -o -name "*.cs" \
  | grep -v "__test__\|\.test\.\|\.spec\.\|_test\." \
  | xargs wc -l 2>/dev/null | tail -1

# 파일 수
find src/ app/ lib/ -type f \( -name "*.ts" -o -name "*.tsx" -o -name "*.py" \) | wc -l

# 책임 분리 검토용 대형 파일
find src/ -type f \( -name "*.ts" -o -name "*.py" \) \
  -exec awk 'END{print NR,FILENAME}' {} \; | sort -nr | head -20
```

```
📏 현재 상태:
  LOC: {N}줄
  파일: {M}개
  책임 분리 검토 대상 파일: {K}개
```

---

## Phase 2: 스캔 (Dead Code 탐지)

### 2-1. 미사용 Export

```bash
# TypeScript/JavaScript
npx ts-prune 2>/dev/null | grep -v "used in module" | head -30

# 결과 예시:
# src/utils/format.ts:15 - formatCurrency (unused)
# src/services/legacy.ts:3 - OldService (unused)
```

### 2-2. 미사용 의존성

```bash
# package.json 기반
npx depcheck 2>/dev/null | head -20

# Python
pip-extra-reqs --ignore-requirement=dev src/ 2>/dev/null

# 결과 예시:
# Unused dependencies: lodash, moment, classnames
# Missing dependencies: (none)
```

### 2-3. 미사용 파일

```bash
# import 체인에 없는 파일
npx unimported 2>/dev/null | head -20

# 결과 예시:
# src/components/OldButton.tsx - not imported anywhere
# src/utils/deprecated.ts - not imported anywhere
```

### 2-4. Dead Code 마커

```bash
# 삭제 예고된 코드
grep -rn "@deprecated\|TODO.*remove\|TODO.*delete\|HACK\|FIXME\|XXX" \
  --include="*.{ts,tsx,py,java,cs}" src/ app/ lib/ 2>/dev/null | head -20

# 호환성 코드
grep -rn "backwards.*compat\|legacy.*shim\|// old\|// deprecated" \
  --include="*.{ts,tsx,py,java,cs}" src/ 2>/dev/null | head -20
```

### 2-5. 빈 파일/폴더

```bash
find src/ app/ lib/ -empty -type f 2>/dev/null
find src/ app/ lib/ -empty -type d 2>/dev/null
```

### 2-6. 사전 미등재 도메인 식별자 (도메인사전 있을 때만)

`docs/domain-dictionary.md`가 있으면 코드의 클래스/함수/타입명 중 사전에 없는 도메인 식별자를 보고합니다. 삭제 대상 ❌ — 사전 갱신 트리거일 뿐.

```bash
# 대문자로 시작하는 식별자 추출 (도메인 명사 후보)
grep -rE "^(export\s+)?(class|interface|type|enum)\s+[A-Z]\w+" --include="*.ts" --include="*.tsx" src/ \
  | grep -oE "(class|interface|type|enum)\s+[A-Z]\w+" | sort -u
```

각 식별자에 대해:
- 사전 영문 식별자 목록과 대조
- 사전에 없으면 → 보고 (도메인 신규 용어인지 / 기술 인프라 용어인지 사용자 판단)

**출력 분류:**
- 도메인 신규 용어 (예: `class Voucher`) → 사전 갱신 권장
- 기술 인프라 용어 (예: `class CacheManager`) → 사전 외 정상

기술 인프라 용어 휴리스틱: `Manager`, `Handler`, `Factory`, `Builder`, `Cache`, `Queue`, `Worker`, `Pool`, `Adapter` 같은 GoF/구조 패턴 접미사가 붙으면 인프라로 분류.

### 스캔 결과 보고

```
🔍 Hestia 스캔 결과
━━━━━━━━━━━━━━━━━━━
  미사용 export:     {N}개
  미사용 의존성:     {N}개
  미사용 파일:       {N}개
  @deprecated 마커:  {N}개
  빈 파일/폴더:      {N}개
  사전 미등재 도메인: {N}개  (사전 있을 때만)
  ──────────────────
  총 정리 대상:      {N}건
```

**`scan` 모드면 여기서 종료.** `clean` 모드면 Phase 3으로 진행.

---

## Phase 3: 정리 (Clean)

### 삭제 전 안전 체크

| 확인 | 방법 | 불합격 시 |
|------|------|----------|
| git 상태 깨끗한가? | `git status --porcelain` | 커밋 먼저 |
| 테스트 통과하나? | 프로젝트 테스트 명령 실행 | 테스트 먼저 수정 |
| 브랜치 분리? | 현재 브랜치 확인 | 정리용 브랜치 생성 권장 |

### 삭제 순서 (안전한 것부터)

```
1단계: 빈 파일/폴더 삭제           (위험도: 없음)
2단계: 미사용 의존성 제거           (위험도: 낮음, package.json만)
3단계: 미사용 파일 삭제             (위험도: 낮음, import 체인에 없음)
4단계: 미사용 export 삭제           (위험도: 중간, 동적 import 가능성)
5단계: @deprecated 코드 제거        (위험도: 중간, 외부 사용자 확인 필요)
```

### 각 삭제 후 검증

```bash
# 삭제할 때마다
# 1. 타입 체크
npx tsc --noEmit 2>&1 || echo "타입 에러 발생 — revert"

# 2. 테스트
npm test 2>&1 || echo "테스트 실패 — revert"

# 실패 시 즉시 revert
git checkout -- {삭제한 파일}
```

**원칙: 삭제 → 검증 → 실패 시 되돌리기.** 한꺼번에 삭제하지 않고, 단계별로 검증합니다.

---

## Phase 4: 측정 (After) + 보고

```bash
# 동일 명령 재실행
find src/ app/ lib/ -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.java" -o -name "*.cs" \
  | grep -v "__test__\|\.test\.\|\.spec\.\|_test\." \
  | xargs wc -l 2>/dev/null | tail -1
```

### 최종 보고

```
🏠 Hestia 정리 완료
━━━━━━━━━━━━━━━━━━━━━
  Before: {N} LOC, {M} files
  After:  {N'} LOC, {M'} files
  Delta:  -{차이} LOC (-{퍼센트}%), -{파일} files

  삭제 내역:
    🗑️ 미사용 export {N}개 제거
    🗑️ 미사용 의존성 {N}개 제거
    🗑️ 미사용 파일 {N}개 삭제
    🗑️ @deprecated 코드 {N}건 제거
    ⏭️ 건너뜀 {N}건 (동적 참조 가능성)

  테스트: {PASS / 삭제 전으로 revert된 항목 N건}

다음 단계:
  /commit     → 정리 결과 커밋
  /clio       → 최종 기록
```

---

## 옵션

| 옵션 | 설명 | 기본값 |
|------|------|--------|
| `scan` | 스캔만 (삭제 안 함) | 기본 모드 |
| `clean` | 스캔 + 자동 삭제 | - |
| `--dry-run` | 삭제 대상 미리보기 | false |
| `--skip-deps` | 의존성 검사 건너뜀 | false |
| `--skip-tests` | 삭제 후 테스트 검증 건너뜀 (비권장) | false |

---

## 하지 않는 것

- **리팩토링 안 함** — 로직 변경, 함수 분리, 구조 개선은 범위 밖
- **마이그레이션 안 함** — 라이브러리 교체는 `/deprecate`
- **기능 추가 안 함** — 누락된 기능 구현은 `/argos` Healer
- **설계 판단 안 함** — "이 기능이 필요한가?"는 사용자 결정

**헤스티아는 오직 "아무도 안 쓰는 것을 치우는 것"만 합니다.**

---

## Related Files

| 파일 | 역할 |
|------|------|
| `skills/deprecation-and-migration/SKILL.md` | 라이브러리 교체/마이그레이션 (별도 스킬) |
| `skills/argos/SKILL.md` | 감리 — 누락 탐지 + Healer (채우기) |
| `skills/clio/SKILL.md` | 최종 기록 (정리 후 기록) |
| `skills/code-reviewer/SKILL.md` | 코드 품질 리뷰 |
