diff --git a/.claude/commands/pr.md b/.claude/commands/pr.md new file mode 100644 index 0000000..67f2a40 --- /dev/null +++ b/.claude/commands/pr.md @@ -0,0 +1,41 @@ +--- +description: 현재 브랜치로 Pull Request를 생성한다 (.github PR 템플릿 기반) +argument-hint: '[base 브랜치 — 생략 시 main]' +--- + +현재 브랜치의 변경으로 Pull Request를 만든다. 본문 구조의 단일 출처는 `.github/pull_request_template.md`이며, 이 커맨드는 그것을 채울 뿐 규칙을 다시 정의하지 않는다. + +## 절차 + +1. **base 결정** — 인자로 받은 브랜치, 없으면 `main`. `origin/`가 있으면 그것을 기준으로 삼는다. 현재 브랜치가 base면 "생성할 변경이 없다"고 알리고 멈춘다. +2. **맥락 수집** + - `git log origin/..HEAD --oneline` — 커밋들이 곧 의도다 + - `git diff origin/..HEAD --stat` — 변경 파일 + - 커밋 본문에서 결정·이탈을 읽는다 +3. **본문 작성** — `.github/pull_request_template.md`를 읽어 각 섹션을 diff·커밋을 근거로 채운다. + - **의도적으로 안 한 것 / 후속**, **검증**, **공개 패키지 영향** 세 곳은 반드시 채운다 — diff에 담기지 않는 정보다 + - 확실치 않으면 추측하지 말고 사용자에게 묻는다 + - diff·커밋에서 그대로 읽히는 것은 중복하지 않는다(의도·제외·검증 결과 위주) + - 해당 없는 섹션은 템플릿 주석대로 삭제한다 +4. **제목** — 지배적 변경으로 type을 정한다. 형식은 템플릿 상단 주석(Conventional Commits + 한국어 요약)을 따른다. squash 병합이라 이 제목이 그대로 main의 커밋이자 릴리즈 노트 한 줄이 된다. +5. **범위 체크** — 템플릿의 범위 목록을 `git diff --stat` 경로와 대조해 체크한다. 추측으로 체크하지 않는다. +6. **공개 패키지 영향** — `apps/zpl-core`·`apps/react-zpl`을 건드렸으면 필수다. + - 공개 API가 바뀌었는지: 두 패키지의 `src/index.ts` 및 재export 경로의 diff로 판단한다 + - **생성되는 ZPL 문자열이 달라지는지**: 이 레포에서 사실상 breaking change 판정 기준이다. 달라지면 before/after를 본문에 적는다 + - 버전·태그가 필요한지 (`zpl-core/vX.Y.Z` · `react-zpl/vX.Y.Z` 태그가 npm 발행을 트리거한다) +7. **검증** — `pnpm verify` 결과를 본문에 **값으로** 적는다. 못 돌렸으면 그 이유를 적는다. 통과 여부를 추측해 적지 않는다. +8. **라벨** — `gh label list`로 레포에 정의된 라벨 중에서 고른다. 어떤 라벨이 맞는지 애매하면 임의로 정하지 말고 사용자에게 묻는다. +9. **스크린샷 / 생성된 ZPL** — 다음에 해당할 때만 채운다. + - `apps/zpl-viewer`·`demos` UI가 바뀌면 스크린샷 + - 생성되는 ZPL이 바뀌면 before/after를 코드블록으로 (스크린샷보다 이쪽이 리뷰에 쓸모 있다) + - 둘 다 아니면 섹션을 삭제한다 +10. **다이어그램(mermaid)** — 기본은 **넣지 않는다**. 그림을 위한 그림은 노이즈다. 렌더 파이프라인(React 트리 → `LabelRootNode` → ZPL 문자열) 자체의 흐름이 바뀐 PR에 한해 `flowchart` 하나만 인라인한다. +11. **확인 후 생성** — 초안(제목·본문·라벨)을 사용자에게 보여주고 **승인받은 뒤에만** 실행한다. + - 브랜치가 원격에 없으면 먼저 `git push -u origin ` (승인 후) + - `gh pr create --base --title "…" --body "…" --assignee @me` 후 필요하면 `gh pr edit --add-label