#!/bin/sh
# Claude Code Skill 설치 스크립트
# 생성: 2026-08-13 · Skill 1개 · 파일 1개
#
#   ./install-skills.sh            ~/.claude/skills/ 에 설치 (모든 프로젝트에서 사용)
#   ./install-skills.sh ./myrepo   ./myrepo/.claude/skills/ 에 설치 (그 저장소 전용)
set -e

DEST="${1:+$1/.claude/skills}"
DEST="${DEST:-$HOME/.claude/skills}"
mkdir -p "$DEST"
echo "설치 위치: $DEST"


mkdir -p "$DEST/bibliography-fetcher"
cat > "$DEST/bibliography-fetcher/SKILL.md" <<'SKILL_PAYLOAD_EOF'
---
name: bibliography-fetcher
description: PubMed My Bibliography URL에서 논문 목록을 자동으로 수집합니다. PMID 추출 후 PubMed efetch API로 상세 정보(저자, 저널, DOI, 초록 등)를 가져옵니다.
---

# PubMed Bibliography 논문 수집 스킬

PubMed My Bibliography 공개 URL에서 논문 PMID를 추출하고, PubMed efetch API로 상세 정보를 가져옵니다.
페이지네이션을 자동 처리하여 전체 논문 목록을 수집합니다.

## 사용법

### 1. API 엔드포인트 사용 (웹 앱 내)

```
POST /api/papers/bibliography/fetch
Content-Type: application/json

{
  "url": "https://www.ncbi.nlm.nih.gov/myncbi/{USER_ID}/bibliography/public/"
}
```

**응답:**
```json
{
  "papers": [...],
  "totalPages": 5,
  "totalPapers": 120,
  "nonPubmedCount": 3
}
```

### 2. TypeScript 유틸리티 직접 사용

```typescript
import {
  validateBibliographyUrl,
  extractPmidsFromHtml,
  getTotalPages,
  getBibliographyPageUrl,
  extractTotalPaperCount
} from "@/lib/bibliography-parser"

// URL 유효성 검증
const validation = validateBibliographyUrl(url)
if (!validation.valid) {
  console.error(validation.error)
}

// HTML에서 PMID 추출
const pmids = extractPmidsFromHtml(htmlContent)

// 총 페이지 수 확인
const totalPages = getTotalPages(htmlContent)

// 특정 페이지 URL 생성
const pageUrl = getBibliographyPageUrl(baseUrl, 3)
```

---

## 핵심 기능

1. **URL 유효성 검증** - `ncbi.nlm.nih.gov/myncbi/{USER_ID}/bibliography/public/` 형식 확인
2. **PMID 자동 추출** - HTML에서 `/pubmed/{PMID}/` 패턴 매칭
3. **페이지네이션 처리** - "Page X of Y" 또는 `?page=N` 링크에서 총 페이지 수 파악
4. **PubMed efetch API 연동** - PMID 목록을 배치(200개씩)로 상세 정보 조회
5. **SSL 우회** - 기관 네트워크의 SSL 프록시/방화벽 대응

## 수집되는 논문 정보

| 필드 | 설명 |
|------|------|
| `pmid` | PubMed ID |
| `title` | 논문 제목 |
| `authors` | 저자 목록 (이름, 소속, ORCID, 교신저자 여부) |
| `journal` | 저널명 (약어) |
| `journalInfo` | 저널 상세 (ISSN, eISSN, 정식명) |
| `year` | 출판년도 |
| `publicationInfo` | 출판 정보 (volume, issue, pages) |
| `doi` | DOI |
| `abstract` | 초록 (구조화된 초록 지원) |
| `keywords` | 키워드 |
| `meshTerms` | MeSH 용어 |
| `publicationType` | 논문 유형 (Journal Article 등) |

## Rate Limiting

- 페이지 간 500ms 간격
- PubMed efetch 배치 간 300ms 간격
- 배치 크기: 200개 PMID

## 트러블슈팅

### 1. 403 Forbidden

**원인:** 비공개 Bibliography
**해결:** 공개 URL 사용 확인 (`/bibliography/public/` 경로)

### 2. SSL 인증서 오류

**원인:** 기관 네트워크의 SSL 프록시
**해결:** 내부적으로 `rejectUnauthorized: false` 설정됨

### 3. PMID가 0개

**원인:** Bibliography에 PubMed 등록되지 않은 논문만 있거나, HTML 구조 변경
**해결:** `nonPubmedCount`로 비PubMed 논문 수 확인

### 4. XML 파싱 실패

**원인:** PubMed efetch API 응답 형식 변경
**해결:** 정규식 기반 파싱이므로 태그 구조 변경에 민감할 수 있음

---

## 관련 파일

| 파일 | 경로 | 설명 |
|------|------|------|
| 파서 유틸리티 | `src/lib/bibliography-parser.ts` | PMID 추출, URL 검증 |
| API 라우트 | `src/app/api/papers/bibliography/fetch/route.ts` | PubMed efetch 연동 |
| Skill 정의 | 이 문서 | |

---

## 업데이트 이력

- 2026-02: 스킬 등록
SKILL_PAYLOAD_EOF

echo ""
echo "완료 — Skill 1개를 설치했습니다."
echo "Claude Code를 다시 시작하면 인식됩니다."
