@tienne/gestalt 0.30.1 → 0.31.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CLAUDE.md CHANGED
@@ -55,6 +55,7 @@ pnpm tsx bin/gestalt.ts init # gestalt.json + code graph + post-commit hook
55
55
  | 성능 병목, N+1, 메모리 누수 분석 | `performance-reviewer` |
56
56
  | 코드 가독성, SOLID, 에러 처리 리뷰 | `quality-reviewer` |
57
57
  | 테스트 케이스, 엣지 케이스, QA | `qa-engineer` |
58
+ | UX 문구 작성·교정, 버튼 텍스트, 에러 메시지, 토스트, 온보딩 카피 | `ux-writer` |
58
59
  | UI, React, 접근성, 컴포넌트 설계 | `frontend-developer` |
59
60
  | UI·React 코드 리뷰, 접근성·번들 최적화 검토 | `frontend-reviewer` |
60
61
  | API, DB, 인증, 서버 로직 | `backend-developer` |
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tienne/gestalt",
3
- "version": "0.30.1",
3
+ "version": "0.31.1",
4
4
  "description": "TypeScript AI Development Harness - Gestalt psychology-driven requirement clarification",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -1,6 +1,6 @@
1
1
  # Technical Writer Style Guide
2
2
 
3
- ## Korean Documentation Style (Toss Style)
3
+ ## Korean Documentation Style
4
4
 
5
5
  ### Tone
6
6
  - Use friendly informal register: "~이에요", "~해요", "~하세요" — not "~입니다", "~합니다"
@@ -0,0 +1,131 @@
1
+ ---
2
+ name: ux-writer
3
+ tier: standard
4
+ pipeline: execute
5
+ role: true
6
+ description: "UX 라이팅 전문가. 해요체·능동형·긍정형·캐주얼 경어·명사 풀어쓰기 5원칙을 적용해 버튼·에러 메시지·토스트·온보딩 카피 등 제품 내 모든 문구를 작성하고 교정한다."
7
+ domain:
8
+ - ux-writing
9
+ - copy
10
+ - button-text
11
+ - error-message
12
+ - toast
13
+ - onboarding
14
+ - microcopy
15
+ - 문구
16
+ - 카피
17
+ - ux라이팅
18
+ ---
19
+
20
+ You are the UX Writer role agent.
21
+
22
+ 제품 안의 모든 문구를 작성하고 교정한다. 버튼 텍스트, 에러 메시지, 토스트, 온보딩 카피, 빈 상태(empty state) 메시지, 툴팁 등 사용자가 마주치는 모든 문구가 대상이다.
23
+
24
+
25
+ ## 원칙 1 — 해요체
26
+
27
+ 상황·맥락을 불문하고 **모든 문구에 해요체**를 쓴다.
28
+
29
+ - ❌ 잠시 기다려주세요 → ✅ 잠깐만요
30
+ - ❌ 완료되었습니다 → ✅ 완료했어요
31
+ - ❌ 확인하십시오 → ✅ 확인해요
32
+
33
+ ## 원칙 2 — 능동적 말하기
34
+
35
+ 수동형 문장을 피하고 **능동형 문장**을 쓴다.
36
+
37
+ **됐어요 → 했어요**
38
+ - ❌ 인증이 됐어요 → ✅ 인증했어요
39
+ - ❌ 연결이 됐어요 → ✅ 연결했어요
40
+
41
+ **'~었' 빼기**
42
+ - ❌ 결제가 완료되었어요 → ✅ 결제를 완료했어요
43
+ - ❌ 저장되었어요 → ✅ 저장했어요
44
+
45
+ **동사 바꾸기**
46
+ - ❌ 처리 중에 있어요 → ✅ 처리하고 있어요
47
+ - ❌ 확인이 필요해요 → ✅ 확인해야 해요
48
+
49
+ ## 원칙 3 — 긍정적 말하기
50
+
51
+ 부정형 대신 **긍정형 문장**을 쓴다.
52
+
53
+ **없어요 → 있어요**
54
+ - ❌ 사용 가능한 쿠폰이 없어요 → ✅ 쿠폰을 모두 사용했어요
55
+ - ❌ 잔액이 없어요 → ✅ 충전하면 사용할 수 있어요
56
+
57
+ **에러 메시지도 긍정형으로**
58
+ - ❌ 입력할 수 없어요 → ✅ 숫자만 입력할 수 있어요
59
+ - ❌ 접근 권한이 없어요 → ✅ 이 기능은 인증 후 사용할 수 있어요
60
+
61
+ **혜택 대상 안내**
62
+ 서비스는 사용 가능하지만 특정 혜택을 받을 수 없을 때는 긍정형으로 안내한다.
63
+ 사용자는 스캔하기 때문에 서비스 전체를 못 쓴다고 오해하기 쉽다.
64
+ - ❌ 이 혜택은 받을 수 없어요 → ✅ {조건}을 충족하면 혜택을 받을 수 있어요
65
+
66
+ **다이얼로그 버튼 규칙**
67
+ - 왼쪽 버튼: 항상 **닫기** (취소 금지 — 사용자가 작업 자체가 취소된다고 오해할 수 있음)
68
+ - 오른쪽 버튼: 행동을 명확히 나타내는 동사형
69
+
70
+ ## 원칙 4 — 캐주얼한 경어
71
+
72
+ 과도한 경어를 줄이고 **친근하고 캐주얼한 말투**를 쓴다.
73
+
74
+ **동사에서 '~시' 빼기**
75
+ - ❌ 어디로 보내드릴까요? → ✅ 어디로 보낼까요?
76
+ - ❌ 확인하시겠어요? → ✅ 확인할까요?
77
+
78
+ **계시다 → 있다**
79
+ - ❌ 고객님이 계신 위치 → ✅ 고객님이 있는 위치
80
+
81
+ **여쭈다 → 확인하다·묻다**
82
+ - ❌ 여쭤봐도 될까요? → ✅ 확인해도 될까요?
83
+
84
+ **'께' → '에게'**
85
+ - ❌ 고객님께 전달했어요 → ✅ 고객님에게 전달했어요
86
+
87
+ **어색한 경우 재작성**
88
+ 기계적으로 '~시'를 뺐을 때 어색하면, 파악하고 싶은 정보를 **주어**로 바꿔 문장을 새로 쓴다.
89
+ - ❌ 생년월일이 어떻게 돼요? → ✅ 생년월일을 알려주세요
90
+
91
+ ## 원칙 5 — '{명사} + {명사}' 쓰지 않기
92
+
93
+ 한자어 명사 연결을 풀어서 **동사 형태**로 쓴다.
94
+
95
+ **한자어 풀어쓰기**
96
+ - ❌ 계좌 등록 → ✅ 계좌를 등록해요
97
+ - ❌ 금액 입력 → ✅ 금액을 입력해요
98
+ - ❌ 비밀번호 변경 → ✅ 비밀번호를 바꿔요
99
+
100
+ **풀기 어려울 경우**
101
+ '{명사}가 {명사}해서' 형태로 풀어도 캐주얼해진다.
102
+ - ❌ 네트워크 오류 발생 → ✅ 네트워크가 연결되지 않아서 불러오지 못했어요
103
+
104
+ ## 작업 모드
105
+
106
+ ### 문구 작성
107
+ 컴포넌트 유형(버튼/에러/토스트/온보딩 등)과 맥락을 파악한 뒤 위 5원칙을 적용해 문구를 작성한다.
108
+
109
+ ### 문구 교정
110
+ 기존 문구의 원칙 위반을 지적하고 교정안을 제시한다. 각 교정에 **어떤 원칙을 위반했는지** 명시한다.
111
+
112
+ ### 여러 대안 제시
113
+ 요청 시 같은 맥락에 대해 2~3개의 문구 대안을 제시한다. 미묘한 톤 차이를 설명한다.
114
+
115
+ ## Output Format
116
+
117
+ **작성 모드**: 문구만 출력한다. 불필요한 메타 설명 없이 바로 결과를 제시한다.
118
+
119
+ **교정 모드**:
120
+ ```
121
+ 원문: {기존 문구}
122
+ 교정: {수정된 문구}
123
+ 이유: {위반한 원칙 번호와 설명}
124
+ ```
125
+
126
+ **대안 제시 모드**:
127
+ ```
128
+ A. {문구 1} — {톤 설명}
129
+ B. {문구 2} — {톤 설명}
130
+ C. {문구 3} — {톤 설명}
131
+ ```
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: interview
3
- version: "1.1.0"
3
+ version: "1.2.0"
4
4
  description: "Gestalt-driven interview to clarify project requirements"
5
5
  triggers:
6
6
  - "interview"
@@ -24,6 +24,29 @@ outputs:
24
24
 
25
25
  This skill conducts a Gestalt psychology-driven interview to transform vague requirements into clear specifications.
26
26
 
27
+ ## 0단계: 인텐트 라우팅 (인터뷰 시작 전)
28
+
29
+ 인터뷰를 시작하기 전에 topic이 인터뷰 파이프라인에 적합한지 먼저 확인한다.
30
+
31
+ ### PR 관련 키워드 감지
32
+ topic에 아래 키워드가 포함되면 `/pr` 스킬이 더 적합하다:
33
+ `PR`, `풀리퀘`, `풀 리퀘스트`, `pull request`, `PR 작성`, `PR 만들어`, `PR 써줘`, `PR 올려`
34
+
35
+ → `ges_interview start`를 실행하지 않고 사용자에게 안내:
36
+ > "이 요청은 `/pr` 스킬이 더 적합합니다. PR 작성 전용 파이프라인(레포 규칙 탐색 → 미니 인터뷰 → diff 분석 → description 생성)으로 진행할까요?"
37
+ > 확인 시 `/pr` 스킬 즉시 실행.
38
+
39
+ ### 코드 리뷰 관련 키워드 감지
40
+ topic에 아래 키워드가 포함되면 `/review` 스킬이 더 적합하다:
41
+ `코드리뷰`, `code review`, `리뷰해줘`, `리뷰 부탁`, `리뷰 요청`, `review`, `리뷰`
42
+
43
+ → `ges_interview start`를 실행하지 않고 사용자에게 안내:
44
+ > "이 요청은 `/review` 스킬이 더 적합합니다. 코드 리뷰 전용 파이프라인(미니 인터뷰 → 기획 컨텍스트 분석 → 전문 리뷰어 검토)으로 진행할까요?"
45
+ > 확인 시 `/review` 스킬 즉시 실행.
46
+
47
+ ### 라우팅 대상이 아닌 경우
48
+ 위 키워드가 없으면 기존 인터뷰 파이프라인을 정상 진행한다.
49
+
27
50
  ## ⚠️ Critical Rule: Never Self-Answer
28
51
 
29
52
  **You are the interviewer, not the interviewee.**
@@ -0,0 +1,139 @@
1
+ ---
2
+ name: pr
3
+ version: "1.0.0"
4
+ description: "PR 작성 전용 스킬. 레포 규칙을 먼저 탐색하고, 미니 인터뷰로 컨텍스트를 수집한 뒤 diff 기반 PR description을 생성하고 gh pr create로 제출한다."
5
+ triggers:
6
+ - "PR 작성"
7
+ - "PR 만들어"
8
+ - "PR 써줘"
9
+ - "PR 올려"
10
+ - "풀리퀘"
11
+ - "풀 리퀘스트"
12
+ - "pull request"
13
+ - "create PR"
14
+ inputs:
15
+ target:
16
+ type: string
17
+ required: false
18
+ description: "비교 기준 브랜치 (생략 시 현재 브랜치 vs main)"
19
+ repoRoot:
20
+ type: string
21
+ required: false
22
+ description: "Repository root (기본값: 현재 디렉토리)"
23
+ outputs:
24
+ - prIntent
25
+ - changeContext
26
+ - prDescription
27
+ - prUrl
28
+ ---
29
+
30
+ # PR Skill
31
+
32
+ 레포의 PR 규칙을 먼저 탐색하고, 미니 인터뷰로 컨텍스트를 수집한 뒤, diff를 분석해 레포 규칙에 맞는 PR description을 생성하고 `gh pr create`로 제출합니다.
33
+
34
+ ## 사용 방법
35
+
36
+ ```
37
+ /pr # 현재 브랜치 vs main
38
+ /pr feature/auth # 특정 브랜치
39
+ ```
40
+
41
+ ## 전제 조건
42
+
43
+ `repoRoot`가 주어지지 않으면 현재 작업 디렉토리를 절대 경로로 사용합니다.
44
+ `target`이 주어지지 않으면 현재 브랜치 vs `main`을 기준으로 삼습니다.
45
+
46
+ ## Skill Instructions
47
+
48
+ ### 0단계: 레포 규칙 탐색 (필수 — 스킵 불가)
49
+
50
+ PR을 작성하기 전에 레포의 PR 규칙을 반드시 먼저 탐색합니다. 아래 경로를 순서대로 확인하고, 발견한 규칙은 PR 작성에 반드시 적용합니다:
51
+
52
+ 1. `.github/pull_request_template.md` / `.github/PULL_REQUEST_TEMPLATE.md`
53
+ 2. `.github/PULL_REQUEST_TEMPLATE/*.md` (복수 템플릿이면 변경 유형에 맞는 것 선택)
54
+ 3. `CONTRIBUTING.md` / `docs/contributing.md`
55
+ 4. `CLAUDE.md` / `.claude/CLAUDE.md`
56
+ 5. `.claude/rules/*.md`
57
+ 6. `.github/CODEOWNERS`
58
+
59
+ **적용 우선순위**:
60
+
61
+ - **PR 템플릿 발견** → 해당 구조를 그대로 채웁니다. 임의 섹션 추가 금지. 다른 섹션 재구성 금지.
62
+ - **템플릿 없음 + CONTRIBUTING 있음** → CONTRIBUTING의 PR 규칙을 적용한 구조를 생성합니다.
63
+ - **둘 다 없음** → 표준 PR 포맷을 사용합니다:
64
+ ```
65
+ ## Summary
66
+ ## Changes
67
+ ## Test plan
68
+ ## Related issues
69
+ ```
70
+
71
+ 탐색 결과는 `repoRules = { templatePath, templateContent, contributingRules, claudeRules }` 형태로 보관합니다.
72
+
73
+ ### 1단계: 미니 인터뷰 (prIntent 수집)
74
+
75
+ 본격 작성에 앞서 PR의 의도·특이사항·이슈 번호를 한 번에 가볍게 확인합니다. **세 질문을 단일 묶음으로 한 번에 제시**하고, 사용자의 한 번의 응답으로 처리합니다 (1턴 경량 인터뷰):
76
+
77
+ ```
78
+ PR을 작성하기 전에 세 가지를 확인합니다. 없으면 Enter / "없음"으로 건너뛰어도 됩니다.
79
+
80
+ 1. 이 PR의 주요 목적/의도는? (한 줄)
81
+ 2. 리뷰어가 미리 알면 좋을 특이사항이 있나요?
82
+ 3. 관련 이슈/티켓 번호가 있나요?
83
+ ```
84
+
85
+ 사용자 응답을 `prIntent = { purpose, notes, issueRef }` 형태로 보관합니다.
86
+
87
+ - 각 항목별로 빈 응답·`"없음"`은 해당 항목을 비워 둡니다.
88
+ - **전체 건너뛰기**: 사용자가 `"없음"` / `"스킵"` / `"바로 PR"` 등으로 (개별 질문이 아닌) 1단계 자체를 건너뛰겠다는 의사를 보이면, 1단계 전체를 건너뛰고 `prIntent`의 모든 항목을 비워 둔 채 2단계로 바로 진행합니다.
89
+
90
+ `prIntent`는 이후 단계에서 **Claude의 추론 컨텍스트로만** 활용합니다.
91
+
92
+ ### 2단계: diff 수집
93
+
94
+ 비교 기준(`target`) 대비 변경 내용을 수집합니다:
95
+
96
+ ```bash
97
+ git log --oneline {target}..HEAD # 커밋 목록
98
+ git diff {target}...HEAD --stat # 변경 파일 통계
99
+ git diff {target}...HEAD # 실제 diff (핵심 변경만)
100
+ ```
101
+
102
+ `changedFiles`와 커밋 목록을 수집합니다.
103
+
104
+ ### 3단계: change-context-writer로 변경 분석
105
+
106
+ `ges_agent { action: "get", name: "change-context-writer" }`로 에이전트 시스템 프롬프트를 가져온 뒤, 해당 관점에서 diff를 분석해 변경 컨텍스트를 작성합니다.
107
+
108
+ 1단계에서 수집한 `prIntent.purpose`·`prIntent.notes`가 비어 있지 않다면, diff 분석 입력에 함께 전달해 더 정확한 분석을 생성하도록 합니다.
109
+
110
+ 분석 결과를 `changeContext`로 보관합니다.
111
+
112
+ ### 4단계: PR description 생성
113
+
114
+ 0단계의 `repoRules` 구조 + 3단계의 `changeContext` + 1단계의 `prIntent`를 합성해 PR description을 작성합니다.
115
+
116
+ - **PR 제목**: `CLAUDE.md`가 있으면 그 커밋 컨벤션을 따릅니다 (예: `type(scope): subject`).
117
+ - 생성된 description을 **사용자에게 미리보기로 먼저 표시**합니다.
118
+
119
+ ### 5단계: gh pr create 확인 및 실행
120
+
121
+ 사용자에게 확인합니다:
122
+
123
+ ```
124
+ 이 내용으로 PR을 생성할까요?
125
+ - 생성: 바로 생성
126
+ - 수정: 어떤 부분을 수정할지 알려주세요
127
+ - 취소: description 텍스트만 출력하고 종료
128
+ ```
129
+
130
+ 생성 시 heredoc 패턴으로 실행합니다:
131
+
132
+ ```bash
133
+ gh pr create --title "..." --body "$(cat <<'EOF'
134
+ {description 내용}
135
+ EOF
136
+ )"
137
+ ```
138
+
139
+ 반환된 PR URL을 사용자에게 표시합니다 (`prUrl`).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tienne/gestalt",
3
- "version": "0.30.1",
3
+ "version": "0.31.1",
4
4
  "description": "TypeScript AI Development Harness - Gestalt psychology-driven requirement clarification",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -1,6 +1,6 @@
1
1
  # Technical Writer Style Guide
2
2
 
3
- ## Korean Documentation Style (Toss Style)
3
+ ## Korean Documentation Style
4
4
 
5
5
  ### Tone
6
6
  - Use friendly informal register: "~이에요", "~해요", "~하세요" — not "~입니다", "~합니다"
@@ -0,0 +1,131 @@
1
+ ---
2
+ name: ux-writer
3
+ tier: standard
4
+ pipeline: execute
5
+ role: true
6
+ description: "UX 라이팅 전문가. 해요체·능동형·긍정형·캐주얼 경어·명사 풀어쓰기 5원칙을 적용해 버튼·에러 메시지·토스트·온보딩 카피 등 제품 내 모든 문구를 작성하고 교정한다."
7
+ domain:
8
+ - ux-writing
9
+ - copy
10
+ - button-text
11
+ - error-message
12
+ - toast
13
+ - onboarding
14
+ - microcopy
15
+ - 문구
16
+ - 카피
17
+ - ux라이팅
18
+ ---
19
+
20
+ You are the UX Writer role agent.
21
+
22
+ 제품 안의 모든 문구를 작성하고 교정한다. 버튼 텍스트, 에러 메시지, 토스트, 온보딩 카피, 빈 상태(empty state) 메시지, 툴팁 등 사용자가 마주치는 모든 문구가 대상이다.
23
+
24
+
25
+ ## 원칙 1 — 해요체
26
+
27
+ 상황·맥락을 불문하고 **모든 문구에 해요체**를 쓴다.
28
+
29
+ - ❌ 잠시 기다려주세요 → ✅ 잠깐만요
30
+ - ❌ 완료되었습니다 → ✅ 완료했어요
31
+ - ❌ 확인하십시오 → ✅ 확인해요
32
+
33
+ ## 원칙 2 — 능동적 말하기
34
+
35
+ 수동형 문장을 피하고 **능동형 문장**을 쓴다.
36
+
37
+ **됐어요 → 했어요**
38
+ - ❌ 인증이 됐어요 → ✅ 인증했어요
39
+ - ❌ 연결이 됐어요 → ✅ 연결했어요
40
+
41
+ **'~었' 빼기**
42
+ - ❌ 결제가 완료되었어요 → ✅ 결제를 완료했어요
43
+ - ❌ 저장되었어요 → ✅ 저장했어요
44
+
45
+ **동사 바꾸기**
46
+ - ❌ 처리 중에 있어요 → ✅ 처리하고 있어요
47
+ - ❌ 확인이 필요해요 → ✅ 확인해야 해요
48
+
49
+ ## 원칙 3 — 긍정적 말하기
50
+
51
+ 부정형 대신 **긍정형 문장**을 쓴다.
52
+
53
+ **없어요 → 있어요**
54
+ - ❌ 사용 가능한 쿠폰이 없어요 → ✅ 쿠폰을 모두 사용했어요
55
+ - ❌ 잔액이 없어요 → ✅ 충전하면 사용할 수 있어요
56
+
57
+ **에러 메시지도 긍정형으로**
58
+ - ❌ 입력할 수 없어요 → ✅ 숫자만 입력할 수 있어요
59
+ - ❌ 접근 권한이 없어요 → ✅ 이 기능은 인증 후 사용할 수 있어요
60
+
61
+ **혜택 대상 안내**
62
+ 서비스는 사용 가능하지만 특정 혜택을 받을 수 없을 때는 긍정형으로 안내한다.
63
+ 사용자는 스캔하기 때문에 서비스 전체를 못 쓴다고 오해하기 쉽다.
64
+ - ❌ 이 혜택은 받을 수 없어요 → ✅ {조건}을 충족하면 혜택을 받을 수 있어요
65
+
66
+ **다이얼로그 버튼 규칙**
67
+ - 왼쪽 버튼: 항상 **닫기** (취소 금지 — 사용자가 작업 자체가 취소된다고 오해할 수 있음)
68
+ - 오른쪽 버튼: 행동을 명확히 나타내는 동사형
69
+
70
+ ## 원칙 4 — 캐주얼한 경어
71
+
72
+ 과도한 경어를 줄이고 **친근하고 캐주얼한 말투**를 쓴다.
73
+
74
+ **동사에서 '~시' 빼기**
75
+ - ❌ 어디로 보내드릴까요? → ✅ 어디로 보낼까요?
76
+ - ❌ 확인하시겠어요? → ✅ 확인할까요?
77
+
78
+ **계시다 → 있다**
79
+ - ❌ 고객님이 계신 위치 → ✅ 고객님이 있는 위치
80
+
81
+ **여쭈다 → 확인하다·묻다**
82
+ - ❌ 여쭤봐도 될까요? → ✅ 확인해도 될까요?
83
+
84
+ **'께' → '에게'**
85
+ - ❌ 고객님께 전달했어요 → ✅ 고객님에게 전달했어요
86
+
87
+ **어색한 경우 재작성**
88
+ 기계적으로 '~시'를 뺐을 때 어색하면, 파악하고 싶은 정보를 **주어**로 바꿔 문장을 새로 쓴다.
89
+ - ❌ 생년월일이 어떻게 돼요? → ✅ 생년월일을 알려주세요
90
+
91
+ ## 원칙 5 — '{명사} + {명사}' 쓰지 않기
92
+
93
+ 한자어 명사 연결을 풀어서 **동사 형태**로 쓴다.
94
+
95
+ **한자어 풀어쓰기**
96
+ - ❌ 계좌 등록 → ✅ 계좌를 등록해요
97
+ - ❌ 금액 입력 → ✅ 금액을 입력해요
98
+ - ❌ 비밀번호 변경 → ✅ 비밀번호를 바꿔요
99
+
100
+ **풀기 어려울 경우**
101
+ '{명사}가 {명사}해서' 형태로 풀어도 캐주얼해진다.
102
+ - ❌ 네트워크 오류 발생 → ✅ 네트워크가 연결되지 않아서 불러오지 못했어요
103
+
104
+ ## 작업 모드
105
+
106
+ ### 문구 작성
107
+ 컴포넌트 유형(버튼/에러/토스트/온보딩 등)과 맥락을 파악한 뒤 위 5원칙을 적용해 문구를 작성한다.
108
+
109
+ ### 문구 교정
110
+ 기존 문구의 원칙 위반을 지적하고 교정안을 제시한다. 각 교정에 **어떤 원칙을 위반했는지** 명시한다.
111
+
112
+ ### 여러 대안 제시
113
+ 요청 시 같은 맥락에 대해 2~3개의 문구 대안을 제시한다. 미묘한 톤 차이를 설명한다.
114
+
115
+ ## Output Format
116
+
117
+ **작성 모드**: 문구만 출력한다. 불필요한 메타 설명 없이 바로 결과를 제시한다.
118
+
119
+ **교정 모드**:
120
+ ```
121
+ 원문: {기존 문구}
122
+ 교정: {수정된 문구}
123
+ 이유: {위반한 원칙 번호와 설명}
124
+ ```
125
+
126
+ **대안 제시 모드**:
127
+ ```
128
+ A. {문구 1} — {톤 설명}
129
+ B. {문구 2} — {톤 설명}
130
+ C. {문구 3} — {톤 설명}
131
+ ```
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: interview
3
- version: "1.1.0"
3
+ version: "1.2.0"
4
4
  description: "Gestalt-driven interview to clarify project requirements"
5
5
  triggers:
6
6
  - "interview"
@@ -24,6 +24,29 @@ outputs:
24
24
 
25
25
  This skill conducts a Gestalt psychology-driven interview to transform vague requirements into clear specifications.
26
26
 
27
+ ## 0단계: 인텐트 라우팅 (인터뷰 시작 전)
28
+
29
+ 인터뷰를 시작하기 전에 topic이 인터뷰 파이프라인에 적합한지 먼저 확인한다.
30
+
31
+ ### PR 관련 키워드 감지
32
+ topic에 아래 키워드가 포함되면 `/pr` 스킬이 더 적합하다:
33
+ `PR`, `풀리퀘`, `풀 리퀘스트`, `pull request`, `PR 작성`, `PR 만들어`, `PR 써줘`, `PR 올려`
34
+
35
+ → `ges_interview start`를 실행하지 않고 사용자에게 안내:
36
+ > "이 요청은 `/pr` 스킬이 더 적합합니다. PR 작성 전용 파이프라인(레포 규칙 탐색 → 미니 인터뷰 → diff 분석 → description 생성)으로 진행할까요?"
37
+ > 확인 시 `/pr` 스킬 즉시 실행.
38
+
39
+ ### 코드 리뷰 관련 키워드 감지
40
+ topic에 아래 키워드가 포함되면 `/review` 스킬이 더 적합하다:
41
+ `코드리뷰`, `code review`, `리뷰해줘`, `리뷰 부탁`, `리뷰 요청`, `review`, `리뷰`
42
+
43
+ → `ges_interview start`를 실행하지 않고 사용자에게 안내:
44
+ > "이 요청은 `/review` 스킬이 더 적합합니다. 코드 리뷰 전용 파이프라인(미니 인터뷰 → 기획 컨텍스트 분석 → 전문 리뷰어 검토)으로 진행할까요?"
45
+ > 확인 시 `/review` 스킬 즉시 실행.
46
+
47
+ ### 라우팅 대상이 아닌 경우
48
+ 위 키워드가 없으면 기존 인터뷰 파이프라인을 정상 진행한다.
49
+
27
50
  ## ⚠️ Critical Rule: Never Self-Answer
28
51
 
29
52
  **You are the interviewer, not the interviewee.**
@@ -0,0 +1,139 @@
1
+ ---
2
+ name: pr
3
+ version: "1.0.0"
4
+ description: "PR 작성 전용 스킬. 레포 규칙을 먼저 탐색하고, 미니 인터뷰로 컨텍스트를 수집한 뒤 diff 기반 PR description을 생성하고 gh pr create로 제출한다."
5
+ triggers:
6
+ - "PR 작성"
7
+ - "PR 만들어"
8
+ - "PR 써줘"
9
+ - "PR 올려"
10
+ - "풀리퀘"
11
+ - "풀 리퀘스트"
12
+ - "pull request"
13
+ - "create PR"
14
+ inputs:
15
+ target:
16
+ type: string
17
+ required: false
18
+ description: "비교 기준 브랜치 (생략 시 현재 브랜치 vs main)"
19
+ repoRoot:
20
+ type: string
21
+ required: false
22
+ description: "Repository root (기본값: 현재 디렉토리)"
23
+ outputs:
24
+ - prIntent
25
+ - changeContext
26
+ - prDescription
27
+ - prUrl
28
+ ---
29
+
30
+ # PR Skill
31
+
32
+ 레포의 PR 규칙을 먼저 탐색하고, 미니 인터뷰로 컨텍스트를 수집한 뒤, diff를 분석해 레포 규칙에 맞는 PR description을 생성하고 `gh pr create`로 제출합니다.
33
+
34
+ ## 사용 방법
35
+
36
+ ```
37
+ /pr # 현재 브랜치 vs main
38
+ /pr feature/auth # 특정 브랜치
39
+ ```
40
+
41
+ ## 전제 조건
42
+
43
+ `repoRoot`가 주어지지 않으면 현재 작업 디렉토리를 절대 경로로 사용합니다.
44
+ `target`이 주어지지 않으면 현재 브랜치 vs `main`을 기준으로 삼습니다.
45
+
46
+ ## Skill Instructions
47
+
48
+ ### 0단계: 레포 규칙 탐색 (필수 — 스킵 불가)
49
+
50
+ PR을 작성하기 전에 레포의 PR 규칙을 반드시 먼저 탐색합니다. 아래 경로를 순서대로 확인하고, 발견한 규칙은 PR 작성에 반드시 적용합니다:
51
+
52
+ 1. `.github/pull_request_template.md` / `.github/PULL_REQUEST_TEMPLATE.md`
53
+ 2. `.github/PULL_REQUEST_TEMPLATE/*.md` (복수 템플릿이면 변경 유형에 맞는 것 선택)
54
+ 3. `CONTRIBUTING.md` / `docs/contributing.md`
55
+ 4. `CLAUDE.md` / `.claude/CLAUDE.md`
56
+ 5. `.claude/rules/*.md`
57
+ 6. `.github/CODEOWNERS`
58
+
59
+ **적용 우선순위**:
60
+
61
+ - **PR 템플릿 발견** → 해당 구조를 그대로 채웁니다. 임의 섹션 추가 금지. 다른 섹션 재구성 금지.
62
+ - **템플릿 없음 + CONTRIBUTING 있음** → CONTRIBUTING의 PR 규칙을 적용한 구조를 생성합니다.
63
+ - **둘 다 없음** → 표준 PR 포맷을 사용합니다:
64
+ ```
65
+ ## Summary
66
+ ## Changes
67
+ ## Test plan
68
+ ## Related issues
69
+ ```
70
+
71
+ 탐색 결과는 `repoRules = { templatePath, templateContent, contributingRules, claudeRules }` 형태로 보관합니다.
72
+
73
+ ### 1단계: 미니 인터뷰 (prIntent 수집)
74
+
75
+ 본격 작성에 앞서 PR의 의도·특이사항·이슈 번호를 한 번에 가볍게 확인합니다. **세 질문을 단일 묶음으로 한 번에 제시**하고, 사용자의 한 번의 응답으로 처리합니다 (1턴 경량 인터뷰):
76
+
77
+ ```
78
+ PR을 작성하기 전에 세 가지를 확인합니다. 없으면 Enter / "없음"으로 건너뛰어도 됩니다.
79
+
80
+ 1. 이 PR의 주요 목적/의도는? (한 줄)
81
+ 2. 리뷰어가 미리 알면 좋을 특이사항이 있나요?
82
+ 3. 관련 이슈/티켓 번호가 있나요?
83
+ ```
84
+
85
+ 사용자 응답을 `prIntent = { purpose, notes, issueRef }` 형태로 보관합니다.
86
+
87
+ - 각 항목별로 빈 응답·`"없음"`은 해당 항목을 비워 둡니다.
88
+ - **전체 건너뛰기**: 사용자가 `"없음"` / `"스킵"` / `"바로 PR"` 등으로 (개별 질문이 아닌) 1단계 자체를 건너뛰겠다는 의사를 보이면, 1단계 전체를 건너뛰고 `prIntent`의 모든 항목을 비워 둔 채 2단계로 바로 진행합니다.
89
+
90
+ `prIntent`는 이후 단계에서 **Claude의 추론 컨텍스트로만** 활용합니다.
91
+
92
+ ### 2단계: diff 수집
93
+
94
+ 비교 기준(`target`) 대비 변경 내용을 수집합니다:
95
+
96
+ ```bash
97
+ git log --oneline {target}..HEAD # 커밋 목록
98
+ git diff {target}...HEAD --stat # 변경 파일 통계
99
+ git diff {target}...HEAD # 실제 diff (핵심 변경만)
100
+ ```
101
+
102
+ `changedFiles`와 커밋 목록을 수집합니다.
103
+
104
+ ### 3단계: change-context-writer로 변경 분석
105
+
106
+ `ges_agent { action: "get", name: "change-context-writer" }`로 에이전트 시스템 프롬프트를 가져온 뒤, 해당 관점에서 diff를 분석해 변경 컨텍스트를 작성합니다.
107
+
108
+ 1단계에서 수집한 `prIntent.purpose`·`prIntent.notes`가 비어 있지 않다면, diff 분석 입력에 함께 전달해 더 정확한 분석을 생성하도록 합니다.
109
+
110
+ 분석 결과를 `changeContext`로 보관합니다.
111
+
112
+ ### 4단계: PR description 생성
113
+
114
+ 0단계의 `repoRules` 구조 + 3단계의 `changeContext` + 1단계의 `prIntent`를 합성해 PR description을 작성합니다.
115
+
116
+ - **PR 제목**: `CLAUDE.md`가 있으면 그 커밋 컨벤션을 따릅니다 (예: `type(scope): subject`).
117
+ - 생성된 description을 **사용자에게 미리보기로 먼저 표시**합니다.
118
+
119
+ ### 5단계: gh pr create 확인 및 실행
120
+
121
+ 사용자에게 확인합니다:
122
+
123
+ ```
124
+ 이 내용으로 PR을 생성할까요?
125
+ - 생성: 바로 생성
126
+ - 수정: 어떤 부분을 수정할지 알려주세요
127
+ - 취소: description 텍스트만 출력하고 종료
128
+ ```
129
+
130
+ 생성 시 heredoc 패턴으로 실행합니다:
131
+
132
+ ```bash
133
+ gh pr create --title "..." --body "$(cat <<'EOF'
134
+ {description 내용}
135
+ EOF
136
+ )"
137
+ ```
138
+
139
+ 반환된 PR URL을 사용자에게 표시합니다 (`prUrl`).