---
name: dacon-uploaddata
description: Dacon 공모전 데이터를 압축 해제하고 Hugging Face Hub에 업로드. "/dacon-uploaddata", "데이콘 데이터 업로드", "upload dacon data" 요청에 사용.
version: 1.0.0
---

# dacon-data Skill

Dacon 공모전 데이터를 압축 해제하고 Hugging Face Hub에 업로드하는 스킬입니다.

## Trigger

- `/dacon-uploaddata`
- "upload dacon data"
- "데이콘 데이터 업로드"
- "dacon data to huggingface"

## Prerequisites

### 1. 의존성 설치
```bash
uv pip install -r ~/.claude/skills/dacon-data/requirements.txt
```

### 2. Hugging Face 토큰 설정 (최초 1회)
```bash
uv run python ~/.claude/skills/dacon-data/scripts/setup_auth.py
```
- 토큰 발급: https://huggingface.co/settings/tokens
- 필요 권한: **write** (데이터셋 업로드용)

## Workflow

이 스킬이 트리거되면 다음 단계를 수행합니다:

### Step 1: 아카이브 파일 확인

프로젝트 루트에서 `open.zip` 파일을 찾습니다.

```bash
ls -la open.zip 2>/dev/null || ls -la *.zip 2>/dev/null || echo "No archive found"
```

- 파일이 있으면 → 계속
- 파일이 없으면 → AskUserQuestion으로 경로 입력 요청

### Step 2: HF 토큰 확인

토큰이 설정되어 있는지 확인합니다:
- `~/.claude/skills/dacon-data/config/.hf_token`
- 환경변수 `HF_TOKEN`
- `~/.cache/huggingface/token`

토큰이 없으면 setup_auth.py 실행을 안내합니다.

### Step 3: 레포지토리 정보 수집

AskUserQuestion을 사용하여 다음 정보를 수집합니다:

```
질문 1: "HF 레포지토리 ID를 입력하세요"
- header: "Repo ID"
- 형식: username/dataset-name
- 기본 네임스페이스: gamma4638
- 예시: gamma4638/dacon-competition-2024, gamma4638/challenge-hai

질문 2: "레포지토리 공개 설정"
- header: "Visibility"
- options:
  - Private (Recommended): 비공개 - 본인만 접근 가능
  - Public: 공개 - 누구나 접근 가능
```

**참고**: 레포지토리는 자동으로 생성됩니다. HF 웹사이트에서 미리 만들 필요가 없습니다.

### Step 4: 데이터 업로드 실행

수집한 정보로 업로드 스크립트를 실행합니다:

```bash
uv run python ~/.claude/skills/dacon-data/scripts/upload_data.py \
  --archive ./open.zip \
  --dest ./data \
  --repo-id {repo_id} \
  {--private 또는 --public}
```

### Step 5: 결과 보고

업로드 완료 후 다음 정보를 사용자에게 알립니다:
- ✅ 압축 해제 완료: `./data/` 폴더
- ✅ 업로드 완료: HF Hub URL
- 🗑️ `open.zip` 삭제 완료

## CLI 직접 사용

스킬 대신 CLI로 직접 실행할 수도 있습니다:

```bash
# 기본 사용
uv run python ~/.claude/skills/dacon-data/scripts/upload_data.py \
  --archive ./open.zip \
  --dest ./data \
  --repo-id gamma4638/my-dataset

# 공개 레포지토리로 업로드
uv run python ~/.claude/skills/dacon-data/scripts/upload_data.py \
  --archive ./open.zip \
  --dest ./data \
  --repo-id gamma4638/my-dataset \
  --public

# 아카이브 유지 (삭제하지 않음)
uv run python ~/.claude/skills/dacon-data/scripts/upload_data.py \
  --archive ./open.zip \
  --dest ./data \
  --repo-id gamma4638/my-dataset \
  --keep-archive

# 이미 압축 해제된 데이터 업로드
uv run python ~/.claude/skills/dacon-data/scripts/upload_data.py \
  --skip-extract \
  --dest ./data \
  --repo-id gamma4638/my-dataset
```

## CLI 옵션

| 옵션 | 설명 | 기본값 |
|------|------|--------|
| `--archive` | 아카이브 파일 경로 | `open.zip` |
| `--dest` | 압축 해제 대상 디렉토리 | `./data` |
| `--repo-id` | HF 레포지토리 ID (필수) | - |
| `--private` | 비공개 레포지토리 | `True` |
| `--public` | 공개 레포지토리 | `False` |
| `--keep-archive` | 업로드 후 아카이브 유지 | `False` |
| `--skip-extract` | 압축 해제 건너뛰기 | `False` |
| `--commit-message` | 커밋 메시지 | "Upload Dacon competition dataset" |

## 지원 아카이브 포맷

- `.zip`
- `.tar`, `.tar.gz`, `.tgz`, `.tar.bz2`
- `.7z`
- `.rar`

포맷은 Magic bytes로 자동 감지됩니다 (확장자에 의존하지 않음).

## 문제 해결

### 토큰 오류
```bash
# 토큰 재설정
uv run python ~/.claude/skills/dacon-data/scripts/setup_auth.py
```

### 압축 해제 오류 (7z/rar)
```bash
# 추가 의존성 설치
uv pip install py7zr rarfile
```

### 업로드 실패 (대용량 파일)
- `upload_folder()` API가 자동으로 멀티파트 업로드를 처리합니다
- 네트워크 오류 시 재시도하면 이어서 업로드됩니다 (이미 업로드된 파일은 건너뜀)

### 네임스페이스 권한 오류 (403 Forbidden)
```
You don't have the rights to create a dataset under the namespace "xxx"
```
- **원인**: HF 토큰의 사용자명과 레포지토리 네임스페이스가 불일치
- **해결**: 토큰 사용자명(gamma4638)과 일치하는 네임스페이스 사용
- 확인 방법: `huggingface-cli whoami` 또는 스크립트 실행 시 "✅ 인증됨: {username}" 메시지 확인

### 타임아웃 오류
- 대용량 파일 업로드 시 네트워크 타임아웃이 발생할 수 있음
- 재시도하면 이미 업로드된 파일은 건너뛰고 나머지만 업로드됨

## 주요 특징

### 레포지토리 자동 생성
- HF 웹사이트에서 미리 레포지토리를 만들 필요가 없습니다
- `create_repo(exist_ok=True)` API가 자동으로 생성하거나 기존 레포지토리를 사용합니다

### 재시도 안전성
- HF Hub API는 파일 해시를 비교하여 이미 업로드된 파일을 건너뜁니다
- 네트워크 오류 시 안전하게 재시도할 수 있습니다
- "No files have been modified since last commit" 메시지는 정상입니다

### API 호환성
- `upload_folder()`가 `upload_large_folder()`보다 더 안정적인 인터페이스를 제공합니다
- `HfApi(token=token)` 생성자에서 토큰을 전달하면 이후 모든 API 호출에 자동 적용됩니다
