From change-overview
현재 브랜치의 변경사항을 분석하여 클래스 관계도 + 구현 요약을 시각적으로 출력합니다. 코드 변경이 많을 때 무엇이 어떻게 변경되었는지 한눈에 파악하는 데 사용합니다. "변경 요약", "변경사항 정리", "클래스 구조도", "구현 요약", "코드 변경 분석", "change overview", "what changed", "diff summary", "PR summary", "summarize changes", "implementation summary", "show me the diff" 등의 요청 시 반드시 이 스킬을 사용하세요. 브랜치 간 diff를 보거나 변경 내용을 리뷰하려는 의도가 보이면 적극 트리거하세요.
How this skill is triggered — by the user, by Claude, or both
Slash command
/change-overview:change-overviewThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
현재 브랜치의 변경사항을 분석하여 **클래스 관계도**, **Before/After 비교**, **시그널/이벤트 플로우**, **핵심 API 변경**을 터미널에 시각적으로 출력한다.
현재 브랜치의 변경사항을 분석하여 클래스 관계도, Before/After 비교, 시그널/이벤트 플로우, 핵심 API 변경을 터미널에 시각적으로 출력한다.
이 스킬은 READ-ONLY이며 파일을 수정하지 않는다.
프로젝트의 주요 언어(커밋 메시지, 주석, README 등)를 감지하여 출력 언어를 결정한다. 코드 식별자(클래스명, 메서드명)는 항상 원문 그대로 사용한다.
CURRENT=$(git branch --show-current)
# detached HEAD 처리
if [ -z "$CURRENT" ]; then
echo "Detached HEAD — comparing against HEAD~10 (최근 10커밋)"
BASE=$(git rev-parse HEAD~10 2>/dev/null || git rev-list --max-parents=0 HEAD)
else
# 가장 가까운 remote 브랜치 찾기 (최대 50개만 비교하여 성능 확보)
BEST_REF=""
BEST_COUNT=999999
while read ref; do
[[ "$ref" == "origin/HEAD" ]] && continue
[[ "$ref" == "origin/$CURRENT" ]] && continue
COUNT=$(git rev-list --count "$ref..HEAD" 2>/dev/null) || continue
if (( COUNT < BEST_COUNT )); then
BEST_COUNT=$COUNT
BEST_REF=$ref
fi
done < <(git for-each-ref --sort=-committerdate --count=50 --format='%(refname:short)' refs/remotes/origin/)
if [ -z "$BEST_REF" ]; then
BEST_REF="origin/main"
fi
BASE=$(git merge-base HEAD "$BEST_REF")
echo "Branch: $CURRENT vs $BEST_REF (base: ${BASE:0:8})"
fi
git diff $BASE...HEAD --stat
git diff $BASE...HEAD --shortstat
git diff $BASE...HEAD --diff-filter=A --name-only # 신규
git diff $BASE...HEAD --diff-filter=D --name-only # 삭제
git diff $BASE...HEAD --diff-filter=M --name-only # 수정
**Agent(subagent_type="Explore")**를 사용하여 변경된 헤더 파일(.h, .hpp, .ts, .py 등)을 분석한다.
각 헤더/인터페이스 파일에서 추출:
implements, Python: ABC)@Inject/@Autowired 등)소스 파일에서 추출:
Unicode box-drawing 문자로 터미널에 클래스 관계도를 그린다.
박스 스타일:
[NEW]: 신규 클래스[MOD]: 수정된 클래스[DEL]: 삭제된 클래스화살표 스타일:
──▷ 상속 (inheritance)──● 조합/소유 (composition/owns)──▶ 의존 (dependency/uses)──→ 시그널/이벤트 (signal/event flow)출력 예시:
┌────────────────────────────────────────────────────┐
│ UserService [NEW] │
│ : IUserService │
├────────────────────────────────────────────────────┤
│ + CreateUser(CreateUserDto) │
│ + FindById(string) : User │
│ + UpdateProfile(string, UpdateDto) │
└────────────────────────────┬───────────────────────┘
│ ──▶ uses
▼
┌────────────────────────────────────────────────────┐
│ UserRepository [NEW] │
│ : IUserRepository │
├────────────────────────────────────────────────────┤
│ + Save(User) : User │
│ + FindById(string) : User? │
│ + Delete(string) : bool │
└────────────────────────────────────────────────────┘
관계도 가독성 규칙:
20개 이상 파일 변경 시: 모듈(디렉토리) 단위로 먼저 요약하고, 핵심 모듈만 클래스 단위로 상세 표시.
클래스가 없는 변경 (config, script, YAML 등): 박스 대신 파일 단위 요약 리스트로 표시:
설정/스크립트 변경
───────────────────────────────────────────
webpack.config.js [MOD] — output path를 dist/에서 build/로 변경
.github/workflows/ci.yml [NEW] — GitHub Actions CI 파이프라인 추가
package.json [MOD] — eslint 9.x 업그레이드
아키텍처가 크게 변경된 경우 테이블 형태로 비교:
Before/After 비교
═══════════════════════════════════════════════════════════════
BEFORE: MonolithService (1461줄)
├── 데이터 처리
├── 비즈니스 로직
└── UI 렌더링
AFTER:
├── DataProcessor (550줄) [NEW] ← 데이터 처리만 추출
└── BusinessLogic (987줄) [NEW] ← 비즈니스 로직 분리
변경 이유: SRP — 데이터 처리와 비즈니스 로직 분리
═══════════════════════════════════════════════════════════════
또는 여러 클래스가 변경된 경우 요약 테이블 사용:
| 클래스 | 변경 | 줄 수 | 요약 |
|------------------------|--------|-------|-------------------------------|
| MonolithService | DEL | -1461 | DataProcessor + BusinessLogic로 분리 |
| DataProcessor | NEW | +550 | 순수 데이터 처리 로직 |
| BusinessLogic | NEW | +987 | 비즈니스 로직 + 이벤트 연동 |
| MainScreen | MOD | +12 | 새 서비스 통합 |
Before/After 판단 기준:
변경이 minor한 경우(버그 수정, 리팩토링 수준)에는 이 섹션을 생략한다.
변경된 클래스가 signal, event emitter, 콜백, 옵저버를 사용하는 경우:
Signal Flow:
DataProcessor::dataReady
──→ EventBus::OnDataProcessed
──→ BusinessLogic::HandleData (결과 처리)
──→ MainScreen::RefreshView (UI 갱신)
signal/event가 없으면 이 섹션을 생략한다.
각 신규/수정 클래스에 대해 무엇을, 왜, 어떻게 구현했는지 2~4문장으로 설명한다.
리스트 형식으로 작성 (카드/박스 형태 사용 금지):
구현 상세
───────────────────────────────────────────────────────
DataProcessor [NEW] (550줄)
MonolithService에서 데이터 처리 로직을 추출한 순수 프로세서.
도메인 타입에 의존하지 않아 향후 다른 모듈에서도 재사용 가능.
Process(input)로 데이터를 받고, 14개 설정 옵션을 setter로 제어.
BusinessLogic [NEW] (987줄)
DataProcessor 위에 도메인 로직을 관리하는 서비스.
HandleData에서 검증/변환 후 eventBus를 통해 결과 전파.
가독성 규칙:
┌─ ... ─┐ └─ ... ─┘) 사용 금지. 단순 구분선(───) + 들여쓰기만 사용.작성 기준:
코드 스니펫이 필요하면 핵심 시그니처 1~3줄만 인라인으로 포함. 전체 코드 붙여넣기 금지.
═══════════════════════════════════════
변경 통계: N파일 (+X -Y줄), 커밋 M개
신규 모듈: ModuleA, ModuleB
수정 모듈: ModuleC, ModuleD
삭제 모듈: (없음)
═══════════════════════════════════════
핵심 결정:
• 결정 1에 대한 설명
• 결정 2에 대한 설명
═══════════════════════════════════════
핵심 결정: git 커밋 메시지와 코드 변경 패턴에서 추론한 주요 설계 결정을 3~5개 bullet으로 정리.
| 상황 | 동작 |
|---|---|
| 변경 파일 0개 | "변경사항이 없습니다." 메시지만 출력하고 종료 |
| 클래스 없는 변경만 (config, script, docs) | Step 4 관계도를 생략하고, 파일 단위 요약 리스트 + Step 8 통계만 출력 |
| Detached HEAD | 최근 10커밋을 범위로 사용, 사용자에게 범위를 안내 |
| remote 브랜치 없음 | origin/main 또는 origin/master로 fallback, 없으면 root commit 대비 |
| 바이너리 파일 변경 | diff 불가 표시 후 파일명과 크기 변화만 기록 |
/change-overview — 인자 없이 실행하면 터미널 텍스트로 출력.
┌ ─ ┐ │ └ ┘ ├ ┤ ┬ ┴ ┼) 사용./change-overview --html — HTML 파일을 생성하고 브라우저로 연다.
Step 13 (데이터 수집/분석)은 동일하게 수행한 뒤, Step 48의 결과를 HTML로 렌더링한다.
HTML 생성 절차:
$TEMP/change-overview-<branch>.html (또는 %TEMP%)$TMPDIR/change-overview-<branch>.html/tmp/change-overview-<branch>.htmlstart <path>open <path>xdg-open <path>HTML 구조 — 단일 페이지 스크롤 (탭 사용 금지):
모든 섹션을 하나의 페이지에 순서대로 배치한다. 탭으로 분리하면 전환하며 봐야 하는 불편함이 있으므로 스크롤로 전체를 한 번에 파악할 수 있어야 한다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Change Overview: [branch]</title>
<script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
<style>/* 다크 테마, 단일 페이지 레이아웃 */</style>
</head>
<body>
<!-- 상단 배너: 브랜치, 날짜, 파일/줄 통계 -->
<!-- 섹션 1: 통계 + 핵심 결정 (요약 먼저) -->
<!-- 섹션 2: 클래스 관계도 (Mermaid classDiagram) -->
<!-- 섹션 3: Before/After 비교 (있는 경우만) -->
<!-- 섹션 4: 이벤트 플로우 (있는 경우만) -->
<!-- 섹션 5: 구현 상세 -->
</body>
</html>
각 섹션 렌더링 방식:
| 섹션 | 렌더링 |
|---|---|
| 통계 + 핵심 결정 | 요약 배너 아래에 바로 표시. 파일/줄 수, 핵심 결정 bullet list |
| 관계도 | Mermaid.js classDiagram — 클래스 박스, 상속/조합/의존 화살표, [NEW]/[MOD] 스타일 |
| Before/After | Before/After 트리 나란히 배치, 아래에 요약 테이블 |
| 이벤트 플로우 | Mermaid.js sequenceDiagram — 시그널 발신→수신 순서 |
| 구현 상세 | 클래스별 들여쓰기 리스트, 코드 스니펫은 <pre><code> |
Mermaid classDiagram 예시:
classDiagram
class UserService {
<<NEW>>
+CreateUser(CreateUserDto)
+FindById(string) User
}
class UserRepository {
<<NEW>>
+Save(User) User
+FindById(string) User
}
UserService --> UserRepository : uses
UserService ..|> IUserService : implements
스타일 가이드:
#1e1e2e), 밝은 텍스트 (#cdd6f4)#a6e3a1), [MOD] 클래스: 노랑 테두리 (#f9e2af), [DEL]: 빨강 취소선중요: HTML은 외부 CDN(Mermaid.js)만 사용하는 단일 파일이어야 한다. 별도 CSS/JS 파일을 생성하지 않는다.
이 스킬은 언어에 구애받지 않는다. 클래스 구조 분석 시 프로젝트의 주요 언어를 자동 감지하여 적절한 패턴을 사용한다:
| 언어 | 클래스/타입 감지 | 의존성 감지 | 이벤트 감지 |
|---|---|---|---|
| C++ | class, 상속 :, virtual/override | #include, 생성자 주입 | connect(), std::function, 콜백, 옵저버 |
| TypeScript/JavaScript | class, interface, implements | import, constructor injection | EventEmitter, on(), addEventListener() |
| Python | class, 상속 (Base), @dataclass | import, __init__ 파라미터 | signal, emit(), 콜백 패턴 |
| Java/Kotlin | class, interface, implements, extends | import, @Inject, @Autowired | @EventListener, Observer |
| Go | type struct, interface embedding | import, 생성자 패턴 | channel, callback |
| Rust | struct, impl, trait | use, 생성자 패턴 | channel, callback |
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub gomgomi/claude-change-overview-plugin --plugin change-overview