ワンクリックで
boolti-create-pr
불티 프로젝트의 컨벤션에 맞춰 Pull Request를 생성한다. "PR 만들어줘", "develop에 PR 올려줘", "풀리퀘스트 생성해줘", "PR 올려줘", "이거 PR 보내줘" 등 PR 생성 요청에 트리거.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
불티 프로젝트의 컨벤션에 맞춰 Pull Request를 생성한다. "PR 만들어줘", "develop에 PR 올려줘", "풀리퀘스트 생성해줘", "PR 올려줘", "이거 PR 보내줘" 등 PR 생성 요청에 트리거.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
불티 Android 앱 릴리즈 오케스트레이터. 배포 경로 선택 → Pre-release 검증 → 버전 상향 → QA 친화 릴리즈 노트 초안 생성까지 수행한 뒤, 사용자 승인을 받으면 배포 경로별 sub-skill(`boolti-app-distribution`, 추후 `boolti-play-console`)에 위임한다. "릴리즈 준비해줘", "테스터 배포해줘", "릴리즈 노트 써줘", "버전 올려줘", "릴리즈 빌드" 등 릴리즈 전체 흐름을 요청할 때 트리거.
이미 빌드된 불티 Android APK/AAB를 Firebase App Distribution으로 업로드한다. 오케스트레이터 `boolti-release`에서 호출되거나, "이 APK 테스터한테 배포해줘", "빌드된 거 App Distribution에 올려줘", "Firebase App Distribution 배포" 같은 요청에 단독 트리거. 빌드·릴리즈 노트 생성은 수행하지 않고, 인라인으로 받은 릴리즈 노트를 그대로 `--release-notes`로 전달한다.
불티 AppTracker(Mixpanel) 이벤트 구현을 공식 컨벤션에 맞게 검증·제안한다. `AppTracker.view/click/impression/search/complete`, `Screen.X`, `Role.X` 등 트래킹 코드를 추가·수정·리뷰할 때, 또는 "트래킹 추가해줘", "이벤트 로깅", "Mixpanel 이벤트 검증", "AppTracker 리뷰" 같은 요청에 트리거.
불티 프로젝트의 기능 개발(새 화면, ViewModel/Repository/UseCase, API 연동, 디자인 적용 등 신규 작업)을 phase 기반 계획에 따라 컨벤션을 지키며 진행한다. 단순 버그 수정·문구 변경·소규모 리팩토링에는 사용하지 않는다. 키워드: 기능 추가, 화면 추가, feature 구현, plan, planning.
피그마 디자인을 불티 프로젝트 Compose 화면으로 1:1 구현한다. Figma URL이 포함된 요청 또는 "이 디자인 구현해줘", "피그마대로 만들어줘", "디자인 적용해줘" 같은 요청에 트리거. 디자인 컨텍스트 추출 → 불티 디자인 시스템 매핑 → boolti-feature-planner 워크플로우 위임 순서로 진행.
| name | boolti-create-pr |
| description | 불티 프로젝트의 컨벤션에 맞춰 Pull Request를 생성한다. "PR 만들어줘", "develop에 PR 올려줘", "풀리퀘스트 생성해줘", "PR 올려줘", "이거 PR 보내줘" 등 PR 생성 요청에 트리거. |
불티 프로젝트의 Pull Request 생성 전 과정을 컨벤션에 맞춰 처리한다. Pre-flight 검증 → 티켓 추출 → 변경 요약 → 제목/바디 생성 → 원격 동기화 → 리뷰어·레이블·마일스톤 결정 → PR 생성까지 한 번에.
gh pr create를 호출하지 않는다..github/pull_request_template.md 구조를 존중한다.[Boolti-XXX] 제목 형식. 티켓 번호가 있으면 대괄호에 감싸 맨 앞에 붙이고 한 칸 띄운 뒤 요약을 쓴다. (예: [Boolti-470] 공연장 탭 추가)Boolti-XXX는 이 저장소 GitHub Issue #XXX를 가리키는 내부 표기일 뿐이다. Jira나 다른 트래커 언급 금지.아래 순서를 반드시 지킨다.
| 검증 | 명령 | 실패 시 |
|---|---|---|
현재 브랜치가 develop/main이 아님 | git branch --show-current | 중단. 사용자에게 feature 브랜치로 이동하라고 안내 |
| 커밋이 존재 (base와 diff 있음) | git log develop..HEAD --oneline | 중단. 커밋할 내용이 있는지 확인 |
| 워킹 트리가 clean | git status --porcelain | 사용자에게 알리고 커밋/스태시 여부 확인 (임의 커밋 금지) |
| 동일 브랜치로 열린 PR이 없음 | gh pr list --head <branch> --state open --json number | 이미 있으면 URL 안내 후 중단. 업데이트는 git push만 하면 된다고 안내 |
| Quality Gate 통과 | bash .claude/skills/boolti-feature-planner/scripts/quality-gate.sh --no-test | 실패 항목 보고 후 중단. 사용자가 fix 요청하면 먼저 해결 |
| AppTracker 변경 검증 | 아래 "AppTracker 검증" 절 참고 | 스킬 실행 → 지적 사항 반영 → 재시도 |
Quality Gate 스크립트가 없거나 실행이 어려운 환경이면 최소한 ./gradlew assembleDebug --quiet는 통과해야 한다.
이번 PR의 커밋(develop..HEAD)에 Mixpanel/AppTracker 관련 변경이 있으면 boolti-mixpanel-validator 스킬을 먼저 실행해 컨벤션을 검증한다.
검사 방법:
# 1) 트래커 모듈 변경 여부
git diff develop...HEAD --name-only | grep -E '^common/tracker/'
# 2) AppTracker 호출 추가/수정 여부 (.kt/.kts)
git diff develop...HEAD -U0 -- '*.kt' '*.kts' \
| grep -E '^\+[^+]' \
| grep -E 'AppTracker\.|\btrackEvent\('
둘 중 하나라도 매치되면:
Skill 도구로 boolti-mixpanel-validator 호출, 해당 변경 파일을 검토.매치가 없으면 이 단계는 통과 처리.
커밋 시점에도
PreToolUse훅(.claude/hooks/check-apptracker-before-commit.sh)이 같은 검사를 수행한다. PR 단계의 이 절차는 커밋이 훅 밖에서 이뤄졌을 가능성을 커버하는 2차 방어선이다.
현재 브랜치명을 파싱한다.
git branch --show-current
브랜치 카테고리 → 레이블 매핑 (카테고리는 슬래시 앞부분):
| 카테고리 | 레이블 |
|---|---|
feature | feat |
fix / hotfix | bug |
refactor | refactor |
chore | chore |
style | style |
enhance / enhancement | enhancement |
docs | documentation |
qa | 변경 성격에 맞는 레이블 (bug, refactor, style …) |
release | chore (또는 무레이블) |
제목에는 카테고리가 드러나지 않는다 (형식은 [Boolti-XXX] 요약뿐).
슬래시 뒷부분(슬러그)에서 이슈 번호 추출:
다음 패턴을 순서대로 시도해 첫 매칭된 숫자를 이슈 번호로 채택한다.
Boolti-<숫자> — 예: feature/Boolti-470 → 470Boolti-<숫자>-<suffix> — 예: feature/Boolti-444-textfield → 444enhance/463 → 463\d+ — 예: qa/pre-questions-2 → 2 (주의: 의미 없는 숫자일 수 있으므로 항상 사용자에게 확인)번호가 없는 케이스 (예: qa/search-navigation, qa/prequestion-spec-change, release/1.13.0):
AskUserQuestion으로 사용자에게 묻는다.[Boolti-<번호>] 요약, 바디는 Closes #<번호>.Issue 섹션은 생략한다.release 브랜치 특수 처리 (release/x.y.z):
[Boolti-<번호>] <version> 릴리즈 (릴리즈 티켓이 있는 경우) 또는 <version> 릴리즈.main일 가능성이 높다. 반드시 사용자에게 base 브랜치를 확인한다 (기본 develop 그대로 가면 안 됨).카테고리가 모호하거나 매핑 불가 (예: 브랜치가 mangbaam/test 같은 임시 이름):
AskUserQuestion으로 확인.다음 정보를 모아 PR 바디를 작성한다.
git log develop..HEAD --pretty=format:'%s' --no-merges # 커밋 메시지
git diff develop...HEAD --stat # 파일 변경량
git diff develop...HEAD --name-only # 변경 파일 목록
요약 규칙 (핵심은 짧게 쓰기):
작업 내용은 최대 3~4개 bullet, 각 bullet은 한 줄. 장황한 서술·여러 절·긴 예시 금지.리뷰 포인트 섹션을 추가한다. (없으면 생략)
리뷰 포인트에 stub 상태를 반드시 남긴다.형식 (컨벤션, 예외 없음): [Boolti-<번호>] <간결한 한국어 요약>
규칙:
[Boolti-XXX] 대괄호 prefix를 붙인다. [ 와 번호 사이·] 와 제목 사이 공백 형식을 지킨다.feat: / fix: / refactor: 같은 prefix를 붙이지 않는다 (대괄호 티켓 번호만 사용).예시:
[Boolti-470] 공연장 찾기 배너 및 검색 결과 공연장 탭 추가[Boolti-467] 다이얼로그 제목 크기 변경[Boolti-451] 사전 질문 API 스펙 변경 대응[Boolti-434] ShowItemV2 디자인 적용저장소 템플릿(.github/pull_request_template.md)을 기준으로 간결하게 쓴다.
기본 구조 (리뷰 포인트는 필요할 때만):
## Issue
- Closes #<티켓 숫자>
## 작업 내용
- <한 줄 요약 bullet 1>
- <한 줄 요약 bullet 2>
- <한 줄 요약 bullet 3>
## 리뷰 포인트 (선택, 강조할 게 있을 때만)
- <특히 봐야 할 변경 1>
- <위험 요소 / stub / TODO / 호환성 메모>
<img src="" width="300" />
세부 규칙:
Issue: Closes #<num> — 불티는 GitHub Issues만 쓴다. 연결할 이슈가 없으면 섹션 자체를 생략.작업 내용:
리뷰 포인트 (있을 때만 추가):
presentation/**의 .kt 변경) 사용자에게 스크린샷·영상 첨부를 요청한다.<img src="" width="300" />를 남겨 나중에 채울 수 있게 한다.width="300" 기본 유지.<img> 자리는 생략해도 된다.git rev-parse --abbrev-ref --symbolic-full-name @{u} 2>/dev/null
git push -u origin <branch> 실행 (사용자 확인 후).git push 실행 (확인 후).리뷰어는 현재 Git user를 제외한 나머지 한 명이다.
gh api user -q '.login'
리뷰어 풀 {mangbaam, HamBP}에서 현재 사용자를 빼고 남은 한 명을 지정. 현재 사용자가 풀에 없으면 (예: 새 팀원이 push) mangbaam과 HamBP를 둘 다 리뷰어로 지정한다.
| 항목 | 기본값 |
|---|---|
| base | develop (release 브랜치는 main 가능성 있음 — 확인) |
| reviewer | mangbaam/HamBP 중 현재 Git user를 제외한 사람 |
| assignee | 현재 Git user |
| label | Step 2의 매핑 |
| draft | 기본 false. 사용자가 draft를 명시했거나 커밋/작업 내용에 WIP 표시가 있을 때만 --draft |
커밋 메시지에 WIP가 있거나 사용자가 "초안/임시/draft"를 언급하면 WIP 레이블과 --draft 둘 다 적용.
모든 PR에 마일스톤을 반드시 지정한다.
정책:
1.15.0).Tools 마일스톤.gift, ticketing, login, payment 등 주제/영역 기반의 기존 마일스톤은 모두 폐기됐다. 후보로 제시하지 않는다.실행 순서:
gh api "repos/:owner/:repo/milestones?state=open" -q '.[] | {number,title}'
.claude/**, docs/**, scripts/**, .github/**, 루트 md 파일에만 한정 → Toolsapp/, presentation/, domain/, data/, common/, tosspayments/ 등) → 현재 앱 버전 마일스톤AskUserQuestion으로 마일스톤을 묻는다. 열린 마일스톤 목록을 옵션으로 제시하되, 2의 추정 결과를 default로.--milestone "<title>"로 PR 생성 시 전달.gh pr create 실행 전에 아래 포맷으로 사용자에게 미리보기를 보여주고 승인을 받는다. 원시 마크다운을 코드 블록에 가두지 않고, 채팅 렌더링이 되도록 구조화한다.
포맷 규칙:
═ 구분선으로 감싸 미리보기 영역을 시각적으로 분리■ 상위, ▌ 하위)로 표현
■ 제목, ■ 메타 — 최상위 섹션▌ Issue, ▌ 작업 내용, ▌ 스킬 사용 가이드, ▌ 리뷰 포인트 — 바디 내부 섹션## Issue 등 마크다운 헤더가 들어가지만, 터미널에서 ##는 시각적으로 튀지 않으므로 미리보기에선 아이콘 마커로 치환| 항목 | 값 | 표로, 바디 헤더와의 구분은 ─ 가로선으로`로, 경로/값 강조는 ` 사용<img src="" width="300" />)도 미리보기 하단에 표기템플릿:
═══════════════════ PR 미리보기 ═══════════════════
■ 제목
[Boolti-XXX] <요약>
■ 메타
| 항목 | 값 |
|---|---|
| base | develop |
| reviewer | ... |
| assignee | ... |
| label | ... |
| milestone | ... |
─────────────────── 바디 ────────────────────
▌ Issue
▌ 작업 내용
▌ 리뷰 포인트 (있을 때만)
══════════════════════════════════════════════════
미리보기를 보여준 뒤 명시적 승인을 받는다. "이대로 진행", "좋아", "OK" 같은 명시적 OK 전에는 Step 8로 넘어가지 않는다.
수정 요청이 들어오면 반영 후 미리보기 전체를 다시 출력해 재확인. 부분만 조각내서 보여주지 않는다.
왜 이렇게? 채팅 화면에서
#/##마크다운 헤더는 렌더링돼도 시각적으로 크게 튀지 않아 섹션 경계가 흐려진다. 아이콘 마커(■,▌) + 가로 구분선(═,─)은 monospace 렌더링에서도 계층이 또렷이 보이므로 사용자가 한눈에 구조를 파악할 수 있다.
HEREDOC으로 본문을 전달해 포맷 보존한다. Step 7에서 결정한 reviewer/assignee/label/milestone을 모두 옵션으로 전달한다.
gh pr create \
--base develop \
--reviewer <7a에서 선정> \
--assignee <현재 Git user> \
--label <매핑된 레이블> \
--milestone "<7b에서 선택한 마일스톤>" \
--title "[Boolti-<번호>] <요약>" \
--body "$(cat <<'EOF'
## Issue
- Closes #<번호>
## 작업 내용
- ...
## 리뷰 포인트
- ...
<img src="" width="300" />
EOF
)"
옵션 조건부 처리:
--draft: 7a의 판단에 따라 추가--milestone: 항상 지정 (정책). 마일스톤 없이 PR을 만들지 않는다리뷰 포인트에 stub/TODO가 있었다면 후속 작업을 언급.gh pr checks <번호> 실행.작업 내용은 한 줄 bullet 3~4개 이내, 리뷰어가 10초 만에 핵심을 파악할 수 있는 분량리뷰 포인트 섹션 사용. 할 말 없으면 섹션 자체를 생략[Boolti-XXX] 요약 형식. feat:/fix: 같은 conventional prefix 금지Closes #<숫자> 표준 사용--body "..."만 쓰다가 줄바꿈 깨뜨리지 않기feat, bug, refactor, chore, style, enhancement, documentation, WIP — 이 집합에만 존재)mangbaam/HamBP 중 현재 Git user를 제외한 사람 자동 지정1.15.0) 또는 Tools 마일스톤을 고른다gift, ticketing, login 등 영역/주제 기반)은 사용도 추천도 하지 않기--base main 사용 금지 (항상 develop). main으로 올려야 하는 릴리즈 PR은 별도 요청 시에만gh pr create 실행 금지. 아이콘 마커(■, ▌) + 구분선 포맷을 지킨다git commit / git push --force 실행 금지qa/search-navigation, feature/add-logger): GitHub 이슈 번호가 있는지 사용자에게 확인. 있으면 [Boolti-<번호>] 요약, 없으면 대괄호 없이 요약만.enhance/463): Boolti- 없어도 그 숫자를 이슈 번호로 사용 → [Boolti-463] ....-suffix가 붙은 경우 (예: feature/Boolti-444-textfield, feature/Boolti-422-navigation3): Boolti- 다음의 첫 숫자 그룹만 이슈 번호, suffix는 무시.feature/Boolti-405-api, feature/Boolti-405-2): 같은 이슈 번호를 쓰되, 이미 그 이슈로 merge된 PR이 있는지 gh pr list --search "Boolti-405" 로 확인해 본 다음 후속 PR임을 바디에 명시.qa/*): 한 번에 여러 QA 수정이 묶이는 경우가 많다. 티켓 번호가 있으면 [Boolti-XXX] QA 이슈 대응, 작업 내용 섹션에 항목별 bullet 나열.release/x.y.z): 제목 [Boolti-<번호>] <version> 릴리즈 (릴리즈 티켓이 있을 때) 또는 <version> 릴리즈. 레이블 chore. 마일스톤은 해당 버전. base는 main일 가능성이 높으므로 반드시 사용자에게 확인한 뒤 --base 옵션을 결정.Tools.리뷰 포인트에 영향 범위와 호환성 명시.[Boolti-<번호>] <원 PR 요약> revert. 바디에 원 PR 링크 필수..claude/skills/boolti-feature-planner/scripts/quality-gate.shgh label list로 확인