#!/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/kol-profile"
cat > "$DEST/kol-profile/SKILL.md" <<'SKILL_PAYLOAD_EOF'
---
name: kol-profile
description: 서지 코퍼스에서 연구자 프로파일과 KOL 지표를 산출한다. 저자 역할(제1·교신) 5단계 우선순위 판정, 경력 단계 분류(신진·전환기·확립), Rising star 선별, 병원·대학 이중 기관 집계, 다중 시트 Excel 산출. TRIGGER - "KOL", "핵심 연구자", "연구자 프로파일", "저자 실적 분석", "라이징 스타", 서지 데이터를 사람 단위로 재구성해야 할 때.
---

# 연구자 프로파일 · KOL 지표

## 언제 쓰나

논문 목록을 **사람 단위로 뒤집어** 누가 이 분야의 핵심인지 볼 때. 입력은 병합된 논문 JSON, 출력은 시트 5개짜리 Excel(Papers / KOL / Institutions / Rising / Summary)이다.

## 정본 코드

```
~/Documents/혜연/BTC_KOL_PoC/analyze_kol.py   1,046줄
  resolve_roles()     저자 역할 판정
  career_stage()      경력 단계 분류
  build_profiles()    연구자 프로파일
  write_excel()       다중 시트 산출
```

```bash
python3 analyze_kol.py --topic btc
python3 analyze_kol.py --selfcheck
```

저자 동일인 판정이 선행되어야 한다 — `[[author-disambiguate]]`.

## 역할 판정 — 5단계 우선순위

이 함수의 주석이 이 스킬에서 가장 값진 부분이다.

| 순위 | 근거 | 성격 |
|---|---|---|
| ① | WoS `RP` 필드 | 실측 · Clarivate 가 저자 순서까지 맞춰둠 |
| ② | OpenAlex `is_corresponding` | 실측 · 이름으로 맞춘 결과 |
| ③ | PDF 원문 ∪ 소속란 이메일 | 실측 · ⑤를 대체하는 것이 목적 |
| ④ | PubMed `Electronic address:` | 실측이나 **0.3% 만 존재** |
| ⑤ | 마지막 저자 | **추정 · 실측 대비 60.3% 오차** |

**②를 ①보다 뒤에 두는 이유**가 중요하다. 둘 다 실측이지만 WoS RP 는 저자 순서까지 맞춰진 값이고 OpenAlex 는 우리가 이름으로 맞춘 결과다. **같은 '실측'이라도 검증 단계를 더 거친 쪽을 먼저 쓴다.**

### ③은 합집합으로 쓴다

PDF 와 이메일이 서로 다른 사람을 가리키면 한쪽을 버리지 않고 **공동교신으로 본다.**

> 각각 독립 근거이고 둘 다 이름으로 검증된 값이라, 서로 다른 사람을 가리키면 한쪽을 버릴 게 아니라 공동교신으로 보는 편이 맞다 — 실측 사례가 그랬다(Clin Mol Hepatol 2026, 원문 표기 "Corresponding authors" 복수형).

**충돌을 오류로 처리하기 전에 둘 다 맞을 수 있는지 본다.**

## 경력 단계

제1저자 수(fa)와 교신저자 수(ca)로 나눈다.

```
ca == 0                      → 신진 (pre_transition)
ca >= 10 또는 ca/(fa+ca) > 0.5 → 확립 (established)
그 외                         → 전환기 (in_transition)
```

**교신저자 비중이 경력을 말해준다.** 1저자만 있으면 아직 남의 연구를 수행하는 단계, 교신이 늘면 자기 연구를 이끄는 단계다.

## Rising star 선별

```python
rising = kol_df[(kol_df["Total"] >= 5)              # 최소 실적
                & (kol_df["Recent_Share"] >= 0.6)   # 최근 편중
                & (kol_df["Recent_Corresponding"] >= 1)]  # 최근 교신 경험
```

세 조건을 **모두** 요구한다. 최근 비중만 보면 논문 2편짜리가 100%로 1등이 되고, 실적만 보면 옛날 사람이 올라온다. **교신 경험**을 넣어야 단순 참여자가 걸러진다.

`recent_from`(최근 실적 기준 연도)은 **고정값으로 두고 인자로 덮어쓸 수 있게** 한다 — 데이터에 의존하면 데이터가 바뀔 때마다 기준이 흔들려 비교가 안 된다.

## 기관은 두 단위로 낸다

```python
# 상위기관 — 병원 단위와 대학 단위 집계를 모두 낼 수 있게 한다.
# (서울아산병원은 울산대학교 계열, 삼성서울병원은 성균관대학교 계열)
```

병원별·대학별 순위가 다르게 나오고 둘 다 필요하다. `[[institution-resolve]]` 의 `parent_label` 을 써서 한 번에 낸다.

## 연구주제는 MeSH 로

```python
# ponytail: 수작업 키워드 분류표를 두지 않는다. MeSH는 NLM 인덱서가 이미 붙여둔
#   통제어휘이고, 질환을 바꿔도 그대로 동작한다.
#   한계 = MeSH 미부여 논문(최신·국내지, 약 19%)은 주제가 비게 된다.
```

**한계와 업그레이드 경로를 주석에 같이 적어 뒀다.** 19% 결측을 채우는 건 `[[paper-relevance-judge]]` 가 맡는다.

변별력 없는 MeSH(`GENERIC_MESH`)와 주제별 제외어(`mesh_exclude`)를 걷어낸다 — "Humans", "Male" 같은 게 상위 주제로 올라오면 표가 무의미하다.

## 함정

- 애매한 저자 묶음은 `ambig_df` 로 따로 시트를 낸다. 자동 판정을 숨기지 않는다.
- 지표를 내기 전에 `[[author-disambiguate]]` 결과를 먼저 검토한다. 저자가 잘못 묶이면 모든 지표가 틀린다.
- `--selfcheck` 로 로직을 먼저 검증하고 전량을 돌린다.

## 연관 skill

`[[author-disambiguate]]`(선행), `[[corresponding-author-verify]]`(역할 근거 공급), `[[institution-resolve]]`, `[[paper-relevance-judge]]`
SKILL_PAYLOAD_EOF

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