코드 변경·diff·브랜치·PR 해설서를 만드는 기본 스킬입니다 ("diff 교육자료", "이 변경 설명해줘", "PR 해설", "코드 변경 문서화"). 마크다운 + 다이어그램 DSL만 작성하면 render.py가 CSS/JS/목차/퀴즈/git 자동추출까지 처리해 작성량이 84% 줄고 diff가 원본과 어긋나지 않습니다. 해설서 요청에는 특별한 이유가 없는 한 이 스킬을 사용하세요 — HTML을 손으로 써야 하는 예외적인 경우에만 explain-diff-html-plain 을 씁니다.
How this skill is triggered — by the user, by Claude, or both
Slash command
/moonklabs-dev-workflow:explain-diff-htmlThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
지정된 코드 변경에 대해 풍부하고 대화형인 해설서를 만든다.
지정된 코드 변경에 대해 풍부하고 대화형인 해설서를 만든다.
HTML/CSS/JS를 손으로 작성하면 안 된다. 실측 결과 손으로 쓴 55KB 문서 중 실제 내용은 18%뿐이고 나머지 82%(CSS 21% · 다이어그램 마크업 18% · JS 17% · 코드블록 14% …)는 매번 동일한 형식이었다.
대신 마크다운 문서 하나를 작성하고 렌더러를 돌린다:
python render.py doc.md --open # render.py는 이 SKILL.md와 같은 디렉터리에 있다
실측 증폭비 6.3배 — 작성량이 84% 줄고, 문서 간 디자인이 완전히 일관되며, diff를 손으로 옮겨 적지 않으므로 원본과 어긋날 수 없다.
정확한 문법 레퍼런스가 필요하면 python render.py --help(docstring 전문)를 읽어라.
무엇을 설명할지부터 정한다 — 아래 넷은 서로 배타적이다:
| 요청 | 의미 | gitdiff의 rev: |
|---|---|---|
| "이 브랜치/변경 설명해줘" (기본값) | 베이스(기본 main) 대비 브랜치 | rev: main..HEAD |
| "PR #123 해설" | 해당 PR의 diff + 메타데이터 | gh pr checkout 123 후 rev: <base>..HEAD; 제목/설명은 gh pr view 123으로 확보 |
| "스테이징된 변경" | index vs HEAD | rev: --staged |
| "워킹트리 변경(아직 add 안 함)" | 워크트리 vs HEAD | rev: HEAD |
특별한 언급이 없으면 브랜치 비교로 간주한다. git diff --stat이 비어 있으면(변경 없음) 문서를 만들지 말고
그대로 "변경 없음"을 보고한다 — 빈 해설서를 만들지 마라. PR 메타데이터를 가져올 수 없으면 diff만으로
작성하고, 아래 근거 원칙에 따라 동기(motive) 관련 문장은 쓰지 않는다.
언어: 본문·다이어그램·퀴즈는 사용자 대화 언어(기본 한국어). 코드 식별자·기술 용어는 원형 유지.
마틴 클렙만(Martin Kleppmann)처럼 명확하고 흐르는 클래식한 문체로, 섹션 전환을 매끄럽게.
---
title: 문서 제목
kicker: 상단 라벨 · 프로젝트명
subtitle: 리드 문단 — 독자를 끌어들이는 질문이면 더 좋다
slug: url-slug
repo: /절대/경로/저장소 # gitdiff·snippet 이 사용
meta:
- 2026-07-21
- "브랜치 `feature/x`"
---
## 배경 {#bg}
!lede 이 줄은 리드 문단(큰 글씨)이 된다.
### 소제목 {#bg-what}
본문은 **마크다운**이다. `인라인 코드`, [링크](url), 목록, 파이프 표를 지원한다.
## = 섹션(자동으로 "Part N" 번호 + 목차 항목), ### = 하위 목차 항목.
{#id}로 앵커를 명시하고, 생략하면 자동 부여된다.
모든 지시자는 마지막에 :: 캡션 줄을 둘 수 있다. 스타일 토큰: hi ok no wa.
```flow 그림 1 — 피드의 기본 구조
앱 (v0.2.0) | 4시간마다 체크 | hi
GET beta.yml | 피드에서 매니페스트
:: 캡션은 다이어그램이 말하려는 바를 한 문장으로.
```
```stack 그림 2 — 단계별 누적
창 열기 #1 > 리스너 6개 > 타이머 1개 [ok]
한 번 더 > 리스너 18개 [no]
```
```uiwin 앱 이름
win: ① 변경 전
banner: 새 버전 준비됐어요. | btn: 지금 재시작
stub
win: ② 변경 후
banner.mute: 수집이 끝나면 재시작할 수 있어요. | btn.gone: 지금 재시작
```
```gitdiff desktop/src/main.ts
rev: 25c7a47..HEAD
grep: updaterHandle # 이 문자열을 포함한 hunk 만 (선택)
context: 3 # (선택)
cap: 캡션 # (선택)
```
```snippet desktop/src/updater.ts:55-67
lang: ts
```
```code ts 제목
직접 쓴 코드 (git 에 없을 때만)
```
```callout warn 놓치기 쉬운 곳
본문은 **마크다운**. 종류: info · warn · bad · good
```
```quiz
Q: 질문? `인라인 코드` 사용 가능
- 오답
* 정답 (별표가 정답 표시)
- 오답
> 해설 — 왜 그런지 설명한다.
---
Q: 다음 문제
...
```
```html
<p>DSL로 표현 못 하는 경우의 탈출구 — 원시 HTML을 그대로 통과시킨다.</p>
```
gitdiff/snippet으로 가져와라. 손으로 옮겨 적지 마라 — 토큰 낭비이고 원본과 어긋난다.
code 지시자는 git에 없는 내용에만 쓴다.flow·stack·uiwin 몇 종을 반복 재사용하는
편이, 매번 새로운 그림을 만드는 것보다 독자가 읽기 쉽다. ASCII 다이어그램은 절대 쓰지 마라.callout으로 강조한다.git log, git diff --stat, 주변 코드 탐색). 변경이
없으면 여기서 멈추고 "변경 없음"을 보고한다./tmp에 둔다.python render.py doc.md --open (render.py는 이 SKILL.md와 같은 디렉터리)
/tmp/YYYY-MM-DD-explanation-<slug>.html (날짜 접두사 → 시간순 정렬 + 저장소 밖).--repo로 저장소를 덮어쓸 수 있고, --seed로 퀴즈 셔플을 고정할 수 있다.rev/파일 경로/grep 불일치).npx claudepluginhub moonklabs/skills --plugin moonklabs-dev-workflowGuides collaborative design exploration before implementation: explores context, asks clarifying questions, proposes approaches, and writes a design doc for user approval.
Creates structured, bite-sized implementation plans from specs or requirements before writing code. Useful for breaking down multi-step tasks into testable steps with file structure and task boundaries.
Resolves in-progress git merge or rebase conflicts by analyzing history, understanding intent, and preserving both changes where possible. Runs automated checks after resolution.