원클릭으로
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로 확인