@tienne/gestalt 0.33.3 → 0.34.0
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 +1 -0
- package/dist/package.json +1 -1
- package/dist/role-agents/presentation-designer/AGENT.md +2 -0
- package/dist/role-agents/product-planner/AGENT.md +2 -0
- package/dist/role-agents/technical-writer/references/ai-tell-quick-rules.md +1 -0
- package/dist/role-agents/technical-writer/references/author-voice.md +1 -0
- package/dist/role-agents/technical-writer/references/style-guide.md +1 -0
- package/dist/role-agents/ux-writer/AGENT.md +5 -0
- package/dist/role-agents/video-summarizer/AGENT.md +4 -0
- package/dist/skills/review/SKILL.md +80 -8
- package/package.json +1 -1
- package/role-agents/presentation-designer/AGENT.md +2 -0
- package/role-agents/product-planner/AGENT.md +2 -0
- package/role-agents/technical-writer/references/ai-tell-quick-rules.md +1 -0
- package/role-agents/technical-writer/references/author-voice.md +1 -0
- package/role-agents/technical-writer/references/style-guide.md +1 -0
- package/role-agents/ux-writer/AGENT.md +5 -0
- package/role-agents/video-summarizer/AGENT.md +4 -0
- package/skills/review/SKILL.md +80 -8
package/CLAUDE.md
CHANGED
|
@@ -89,3 +89,4 @@ skills/ — build-graph, blast-radius, diff-radius
|
|
|
89
89
|
- LLM 호출: temperature 0.3, JSON 응답 파싱 + fallback
|
|
90
90
|
- 해상도 점수 ≥ 0.8 = 요구사항 충분히 명확
|
|
91
91
|
- 테스트 DB: `.gestalt-test/xxx-${randomUUID()}.db` 고유 경로 (병렬 안전)
|
|
92
|
+
- 한글 산문에서 가운뎃점(·) 나열 절제 → 쉼표나 "A랑 B하고 C"로 (표·용어 목록은 예외). 룰은 `ai-tell-quick-rules.md` C-12, `style-guide.md`에 정의
|
package/dist/package.json
CHANGED
|
@@ -205,6 +205,8 @@ Reveal.initialize({
|
|
|
205
205
|
|
|
206
206
|
프레젠테이션은 **워딩이 먼저, 디자인이 나중**이다. 순서를 지키지 않으면 디자인에 워딩을 끼워 맞추게 된다.
|
|
207
207
|
|
|
208
|
+
슬라이드 한글 텍스트에서 가운뎃점(·)으로 항목을 압축하지 않는다. "A·B·C" 대신 쉼표나 줄바꿈으로 푼다 — 사람은 산문에서 가운뎃점을 거의 안 쓴다 (불릿 라벨 같은 짧은 목록은 예외). 워딩 초안 단계의 technical-writer도 style-guide의 같은 규칙을 따른다.
|
|
209
|
+
|
|
208
210
|
### Phase 1: technical-writer (워딩 초안)
|
|
209
211
|
|
|
210
212
|
프레젠테이션 작성 요청이 들어오면, 디자인 작업 전에 반드시 `technical-writer` 관점을 먼저 확보해야 한다.
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
| C-9 | 숫자 괄호 인덱싱 "(1)·(2)·(3)" | S2 | 본문에 녹이거나 단순 줄바꿈 |
|
|
51
51
|
| C-10 | 콜론 부제 헤딩 "X: Y" 반복 | S1 | 헤딩 짧게 또는 평서 헤딩으로 |
|
|
52
52
|
| C-11 | 연결어미 뒤 쉼표 (-고/-며/-지만/-며서/-아서/-어서 직후 쉼표) | S1 | 쉼표 제거. 6+회=강한 신호. KatFish 4.84배 분리도 |
|
|
53
|
+
| C-12 | 가운뎃점(·) 나열 남발 — 본문 산문에서 "A·B·C"로 항목 압축 | S2 | 쉼표나 구어 연결로 풀기("A, B, C" / "A랑 B하고 C"). 사람은 산문에서 가운뎃점을 거의 안 쓴다. 단 표 안 압축, 용어 목록, 굳어진 합성어("입출력")는 예외 |
|
|
53
54
|
|
|
54
55
|
## D. AI 특유의 관용구 (Signature Phrases)
|
|
55
56
|
|
|
@@ -143,6 +143,7 @@ ghost 는 button의 ghost variant 를 위한 토큰입니다.
|
|
|
143
143
|
반대로 두 레지스터 모두에서 **제거**할 진짜 AI-tell:
|
|
144
144
|
- "결론적으로", "요약하자면", "이를 통해", "~를 수행합니다" 의인화 주어
|
|
145
145
|
- 과장 어휘("핵심적으로", "시사하는 바가 크다"), 콜론 부제, 이모지 남발, 문두 접속사 반복
|
|
146
|
+
- **가운뎃점(·) 나열 남발** — 본문에서 "A·B·C" 압축은 기계 티. 쉼표나 "A랑 B하고 C"로 푼다 (ai-tell C-12)
|
|
146
147
|
- **`c:`/`r:` 접두어, `[출처]` 대괄호 태깅, "…권장." 체언 종지** — Claude가 만든 가짜 시그니처
|
|
147
148
|
|
|
148
149
|
---
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
- 번역체 금지 — "API 키를 이용한 사용자 인증 처리가 완료된 후" → "API 키로 인증한 후"
|
|
41
41
|
- 용어 일관성 — 같은 개념에 다른 단어 혼용 금지
|
|
42
42
|
- 약어: 첫 등장 시 `SSR(Server-Side Rendering)` 형식
|
|
43
|
+
- 가운뎃점(·) 절제 — 본문에서 "A·B·C" 압축 나열 대신 쉼표나 "A랑 B하고 C"로 푼다. 사람은 산문에서 가운뎃점을 거의 안 쓴다 (표·용어 목록은 예외). 자세히는 `ai-tell-quick-rules.md` C-12
|
|
43
44
|
|
|
44
45
|
### Technical Term Handling
|
|
45
46
|
|
|
@@ -101,6 +101,11 @@ You are the UX Writer role agent.
|
|
|
101
101
|
'{명사}가 {명사}해서' 형태로 풀어도 캐주얼해진다.
|
|
102
102
|
- ❌ 네트워크 오류 발생 → ✅ 네트워크가 연결되지 않아서 불러오지 못했어요
|
|
103
103
|
|
|
104
|
+
## 원칙 6 — 가운뎃점(·) 절제
|
|
105
|
+
|
|
106
|
+
문구에서 "A·B·C"로 항목을 압축하지 않는다. 쉼표나 "A랑 B"처럼 푼다 — 사람은 가운뎃점을 거의 안 쓴다.
|
|
107
|
+
- ❌ 이름·전화번호·이메일을 입력해요 → ✅ 이름, 전화번호, 이메일을 입력해요
|
|
108
|
+
|
|
104
109
|
## 작업 모드
|
|
105
110
|
|
|
106
111
|
### 문구 작성
|
|
@@ -75,6 +75,10 @@ URL인지 로컬 경로인지 먼저 판별하고, 로컬 경로면 다운로드
|
|
|
75
75
|
- **인터뷰**: 질문, 답변, 게스트, 인터뷰
|
|
76
76
|
- 위 어디에도 해당하지 않으면 **일반**으로 처리한다.
|
|
77
77
|
|
|
78
|
+
## 한글 작성 규칙
|
|
79
|
+
|
|
80
|
+
요약 본문에서 가운뎃점(·)으로 항목을 압축하지 않는다. "A·B·C" 대신 쉼표나 "A랑 B하고 C"로 푼다 — 사람은 산문에서 가운뎃점을 거의 안 쓴다 (표나 용어 목록은 예외).
|
|
81
|
+
|
|
78
82
|
## 출력 MD 구조
|
|
79
83
|
|
|
80
84
|
아래 템플릿으로 작성한다. 유형에 따라 마지막에 추가 섹션을 붙인다.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: review
|
|
3
3
|
version: "1.0.0"
|
|
4
|
-
description: "PR·브랜치·커밋의 변경사항을 3종 리뷰 에이전트(보안·성능·품질)로 검토하고, humanize-monolith로 리포트를
|
|
4
|
+
description: "PR·브랜치·커밋의 변경사항을 3종 리뷰 에이전트(보안·성능·품질)로 검토하고, humanize-monolith로 리포트를 다듬은 뒤, PR 대상이면 code-review-writer가 작성한 인라인 코멘트로 게시한다."
|
|
5
5
|
triggers:
|
|
6
6
|
- "PR 리뷰"
|
|
7
7
|
- "브랜치 리뷰"
|
|
@@ -11,6 +11,10 @@ triggers:
|
|
|
11
11
|
- "review branch"
|
|
12
12
|
- "이 브랜치 리뷰"
|
|
13
13
|
- "변경사항 리뷰"
|
|
14
|
+
- "PR에 코멘트 남겨줘"
|
|
15
|
+
- "리뷰 코멘트 달아줘"
|
|
16
|
+
- "PR에 인라인 코멘트"
|
|
17
|
+
- "리뷰 결과 PR에 게시"
|
|
14
18
|
inputs:
|
|
15
19
|
target:
|
|
16
20
|
type: string
|
|
@@ -25,12 +29,13 @@ outputs:
|
|
|
25
29
|
- changeContext
|
|
26
30
|
- reviewReport
|
|
27
31
|
- verdict
|
|
32
|
+
- postedReview
|
|
28
33
|
---
|
|
29
34
|
|
|
30
35
|
# Review Skill
|
|
31
36
|
|
|
32
37
|
execute 세션 없이 PR·브랜치·커밋의 변경사항을 직접 리뷰 파이프라인에 주입해 검토합니다.
|
|
33
|
-
변경 파일을 수집하고, 3종 리뷰 에이전트(보안·성능·품질)로 다각도 리뷰한 뒤, Pass/Block 판정과 마크다운 리포트를 생성합니다.
|
|
38
|
+
변경 파일을 수집하고, 3종 리뷰 에이전트(보안·성능·품질)로 다각도 리뷰한 뒤, Pass/Block 판정과 마크다운 리포트를 생성합니다. 리뷰 대상이 GitHub PR이면 `code-review-writer` 에이전트가 작성한 인라인 코멘트로 PR에 게시까지 이어집니다.
|
|
34
39
|
|
|
35
40
|
## 사용 방법
|
|
36
41
|
|
|
@@ -182,14 +187,71 @@ humanize-monolith는 두 룰북을 함께 적용합니다.
|
|
|
182
187
|
|
|
183
188
|
즉 리뷰 파이프라인 리포트도 인라인 코멘트와 동일하게 voice + 음차가 함께 처리됩니다.
|
|
184
189
|
|
|
185
|
-
윤문된 리포트를 사용자에게
|
|
186
|
-
- `approved: true` → 리뷰 통과. 리포트를
|
|
187
|
-
- `approved: false` → critical/high 이슈가 남아 Block 상태입니다.
|
|
190
|
+
윤문된 리포트를 사용자에게 표시합니다. 그다음 대상이 GitHub PR이면 4.7단계로, 아니면 결과 표시로 넘어갑니다.
|
|
191
|
+
- `approved: true` → 리뷰 통과. 리포트를 보여줍니다.
|
|
192
|
+
- `approved: false` → critical/high 이슈가 남아 Block 상태입니다.
|
|
188
193
|
|
|
189
|
-
###
|
|
194
|
+
### 4.7단계: 인라인 코멘트 게시 (code-review-writer)
|
|
190
195
|
|
|
191
|
-
|
|
192
|
-
|
|
196
|
+
리뷰 대상이 GitHub PR이면, 4단계에서 병합한 이슈를 **리포트로 끝내지 않고 PR에 인라인 코멘트로 게시**합니다. 이 단계의 코멘트 본문은 반드시 `code-review-writer` 에이전트가 작성합니다 — Claude가 즉흥으로 쓰지 않습니다. 그래야 어투가 매 리뷰마다 일정하게 유지됩니다.
|
|
197
|
+
|
|
198
|
+
#### 진입 경로 두 가지
|
|
199
|
+
|
|
200
|
+
이 단계는 `/review`를 처음부터 돌린 흐름뿐 아니라, **대화 도중 "이제 PR에 코멘트 남겨줘"처럼 게시만 따로 요청**받았을 때도 진입점이 됩니다 (위 triggers의 "PR에 코멘트 남겨줘" 등). 두 경우 모두 아래 **신선도 가드를 먼저 통과해야** 게시할 수 있습니다.
|
|
201
|
+
|
|
202
|
+
#### 신선도 가드 (stale consensus 게시 금지)
|
|
203
|
+
|
|
204
|
+
게시 직전에, 게시하려는 consensus가 **현재 diff와 일치하는지** 반드시 확인합니다. 리뷰를 끝낸 뒤 코드가 바뀌었거나(커밋 추가·로컬 수정), 애초에 활성 리뷰 세션이 없으면 그 consensus는 stale이므로 **그대로 올리지 않습니다.**
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
# 리뷰 시점 대비 PR head·작업트리가 바뀌었는지 확인
|
|
208
|
+
gh pr view <target> --json headRefOid
|
|
209
|
+
git rev-parse HEAD && git status --porcelain
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
판단 기준:
|
|
213
|
+
|
|
214
|
+
- **이번 세션에 방금 리뷰를 끝냈고 그 뒤 diff 변화가 없다** → consensus가 신선함. 곧장 게시 진행.
|
|
215
|
+
- **리뷰 후 코드가 바뀌었다 / 활성 리뷰 세션이 없다 / 다른 세션의 오래된 결과다** → consensus가 stale. **게시하지 말고**, 1단계(blast_radius)부터 현재 diff로 리뷰 파이프라인(1~4단계)을 다시 돌린 뒤, 새로 나온 consensus로 4.7을 진행합니다. 사용자에게 "변경이 있어 현재 코드로 다시 리뷰한 뒤 게시할게요"라고 한 줄 알립니다.
|
|
216
|
+
|
|
217
|
+
즉 인라인 코멘트는 **언제 요청받든 항상 "현재 diff 기준 consensus + code-review-writer voice"** 로만 게시됩니다. 옛 리뷰 메모리를 그대로 옮겨 적거나 Claude가 손으로 코멘트를 짜는 경로는 없습니다.
|
|
218
|
+
|
|
219
|
+
**PR 식별.** 먼저 대상이 PR인지 확인합니다.
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
gh pr view <target> --json number,headRefName,baseRefName,url 2>/dev/null
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
`target`이 브랜치면 그 브랜치의 PR을, 생략됐으면 현재 브랜치의 PR을 찾습니다. PR이 없으면(로컬 브랜치·커밋 범위 등) 이 단계를 통째로 건너뛰고 결과 표시로 갑니다.
|
|
226
|
+
|
|
227
|
+
**게시 확인.** PR이 식별되면 사용자에게 한 번 확인합니다: **"발견된 이슈 N건을 PR #<number>에 인라인 코멘트로 게시할까요?"** 동의하지 않으면 리포트만 보여주고 종료합니다.
|
|
228
|
+
|
|
229
|
+
**코멘트 본문 작성 (code-review-writer).** `ges_agent { action: "get", name: "code-review-writer" }`로 에이전트 시스템 프롬프트를 가져온 뒤, 그 관점에서 4단계 `mergedIssues`의 각 이슈를 인라인 코멘트 본문으로 작성합니다. 이슈의 `file`·`line`·`severity`는 그대로 두고, `message`·`suggestion`을 에이전트 voice로 다듬어 코멘트 본문을 만듭니다.
|
|
230
|
+
|
|
231
|
+
- code-review-writer는 `author-voice.md`(제안형·온기·물결·이모지)와 `ai-tell-quick-rules.md`(음차 교정)를 이미 내장하므로 **별도 humanize-monolith 패스를 거치지 않습니다.**
|
|
232
|
+
- 에이전트 룰에 따라 `c:`/`r:` 접두어, `[출처]` 태깅, "…권장." 체언 종지는 쓰지 않습니다. 이건 Claude artifact이지 실제 리뷰어 어투가 아닙니다.
|
|
233
|
+
- severity는 본문 첫 줄에 `[critical]`처럼 대괄호 라벨로만 표기합니다.
|
|
234
|
+
|
|
235
|
+
**게시 (gh api).** 작성한 코멘트를 한 번의 리뷰로 묶어 게시합니다. 이슈마다 개별 호출하지 않고 `comments` 배열로 모읍니다.
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
gh api repos/{owner}/{repo}/pulls/{number}/reviews \
|
|
239
|
+
-f event=COMMENT \
|
|
240
|
+
-f body="<요약 한 줄 — code-review-writer가 작성한 overall summary>" \
|
|
241
|
+
--input <(jq -n '{ comments: [ { path: "...", line: 42, side: "RIGHT", body: "..." } ] }')
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
- `line`은 diff의 **우측(신규) 라인**을 기준으로 하고 `side: "RIGHT"`를 명시합니다. 삭제된 라인을 짚어야 하면 `side: "LEFT"`를 씁니다.
|
|
245
|
+
- 라인 매핑이 불확실한 이슈(파일 전반·구조적 지적 등)는 인라인 대신 리뷰 `body` 요약에 한 줄로 넣습니다. 임의 라인에 억지로 붙이지 않습니다.
|
|
246
|
+
- 게시 후 리뷰 URL을 사용자에게 보여줍니다.
|
|
247
|
+
|
|
248
|
+
JSON 제어문자가 깨지지 않도록 코멘트 본문은 셸 변수 echo 파이프 대신 `jq`로 직접 조립하거나 파일로 떨궈 `--input`으로 전달합니다.
|
|
249
|
+
|
|
250
|
+
### 5단계: 수정 확인 (review_fix, opt-in)
|
|
251
|
+
|
|
252
|
+
자동 수정은 기본 동작이 아닙니다. 4.7단계로 인라인 코멘트를 게시했거나 리포트를 보여준 뒤, 사용자가 **명시적으로 수정을 요청할 때만** 진행합니다 ("고쳐줘"·"수정해줘" 등). Block 상태라도 먼저 자동 수정을 들이밀지 않습니다.
|
|
253
|
+
|
|
254
|
+
요청을 받으면 `review_fix`로 수정 컨텍스트를 받아 critical/high 이슈를 수정합니다:
|
|
193
255
|
|
|
194
256
|
```
|
|
195
257
|
ges_execute {
|
|
@@ -227,3 +289,13 @@ ges_execute {
|
|
|
227
289
|
|
|
228
290
|
{report 마크다운}
|
|
229
291
|
```
|
|
292
|
+
|
|
293
|
+
4.7단계에서 인라인 코멘트를 게시했으면, 리포트 끝에 게시 결과를 한 줄로 덧붙입니다.
|
|
294
|
+
|
|
295
|
+
```
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
**인라인 코멘트**: PR #<number>에 <N>건 게시 완료 → <리뷰 URL>
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
PR이 아니거나 사용자가 게시를 거절했으면 이 블록을 생략합니다.
|
package/package.json
CHANGED
|
@@ -205,6 +205,8 @@ Reveal.initialize({
|
|
|
205
205
|
|
|
206
206
|
프레젠테이션은 **워딩이 먼저, 디자인이 나중**이다. 순서를 지키지 않으면 디자인에 워딩을 끼워 맞추게 된다.
|
|
207
207
|
|
|
208
|
+
슬라이드 한글 텍스트에서 가운뎃점(·)으로 항목을 압축하지 않는다. "A·B·C" 대신 쉼표나 줄바꿈으로 푼다 — 사람은 산문에서 가운뎃점을 거의 안 쓴다 (불릿 라벨 같은 짧은 목록은 예외). 워딩 초안 단계의 technical-writer도 style-guide의 같은 규칙을 따른다.
|
|
209
|
+
|
|
208
210
|
### Phase 1: technical-writer (워딩 초안)
|
|
209
211
|
|
|
210
212
|
프레젠테이션 작성 요청이 들어오면, 디자인 작업 전에 반드시 `technical-writer` 관점을 먼저 확보해야 한다.
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
| C-9 | 숫자 괄호 인덱싱 "(1)·(2)·(3)" | S2 | 본문에 녹이거나 단순 줄바꿈 |
|
|
51
51
|
| C-10 | 콜론 부제 헤딩 "X: Y" 반복 | S1 | 헤딩 짧게 또는 평서 헤딩으로 |
|
|
52
52
|
| C-11 | 연결어미 뒤 쉼표 (-고/-며/-지만/-며서/-아서/-어서 직후 쉼표) | S1 | 쉼표 제거. 6+회=강한 신호. KatFish 4.84배 분리도 |
|
|
53
|
+
| C-12 | 가운뎃점(·) 나열 남발 — 본문 산문에서 "A·B·C"로 항목 압축 | S2 | 쉼표나 구어 연결로 풀기("A, B, C" / "A랑 B하고 C"). 사람은 산문에서 가운뎃점을 거의 안 쓴다. 단 표 안 압축, 용어 목록, 굳어진 합성어("입출력")는 예외 |
|
|
53
54
|
|
|
54
55
|
## D. AI 특유의 관용구 (Signature Phrases)
|
|
55
56
|
|
|
@@ -143,6 +143,7 @@ ghost 는 button의 ghost variant 를 위한 토큰입니다.
|
|
|
143
143
|
반대로 두 레지스터 모두에서 **제거**할 진짜 AI-tell:
|
|
144
144
|
- "결론적으로", "요약하자면", "이를 통해", "~를 수행합니다" 의인화 주어
|
|
145
145
|
- 과장 어휘("핵심적으로", "시사하는 바가 크다"), 콜론 부제, 이모지 남발, 문두 접속사 반복
|
|
146
|
+
- **가운뎃점(·) 나열 남발** — 본문에서 "A·B·C" 압축은 기계 티. 쉼표나 "A랑 B하고 C"로 푼다 (ai-tell C-12)
|
|
146
147
|
- **`c:`/`r:` 접두어, `[출처]` 대괄호 태깅, "…권장." 체언 종지** — Claude가 만든 가짜 시그니처
|
|
147
148
|
|
|
148
149
|
---
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
- 번역체 금지 — "API 키를 이용한 사용자 인증 처리가 완료된 후" → "API 키로 인증한 후"
|
|
41
41
|
- 용어 일관성 — 같은 개념에 다른 단어 혼용 금지
|
|
42
42
|
- 약어: 첫 등장 시 `SSR(Server-Side Rendering)` 형식
|
|
43
|
+
- 가운뎃점(·) 절제 — 본문에서 "A·B·C" 압축 나열 대신 쉼표나 "A랑 B하고 C"로 푼다. 사람은 산문에서 가운뎃점을 거의 안 쓴다 (표·용어 목록은 예외). 자세히는 `ai-tell-quick-rules.md` C-12
|
|
43
44
|
|
|
44
45
|
### Technical Term Handling
|
|
45
46
|
|
|
@@ -101,6 +101,11 @@ You are the UX Writer role agent.
|
|
|
101
101
|
'{명사}가 {명사}해서' 형태로 풀어도 캐주얼해진다.
|
|
102
102
|
- ❌ 네트워크 오류 발생 → ✅ 네트워크가 연결되지 않아서 불러오지 못했어요
|
|
103
103
|
|
|
104
|
+
## 원칙 6 — 가운뎃점(·) 절제
|
|
105
|
+
|
|
106
|
+
문구에서 "A·B·C"로 항목을 압축하지 않는다. 쉼표나 "A랑 B"처럼 푼다 — 사람은 가운뎃점을 거의 안 쓴다.
|
|
107
|
+
- ❌ 이름·전화번호·이메일을 입력해요 → ✅ 이름, 전화번호, 이메일을 입력해요
|
|
108
|
+
|
|
104
109
|
## 작업 모드
|
|
105
110
|
|
|
106
111
|
### 문구 작성
|
|
@@ -75,6 +75,10 @@ URL인지 로컬 경로인지 먼저 판별하고, 로컬 경로면 다운로드
|
|
|
75
75
|
- **인터뷰**: 질문, 답변, 게스트, 인터뷰
|
|
76
76
|
- 위 어디에도 해당하지 않으면 **일반**으로 처리한다.
|
|
77
77
|
|
|
78
|
+
## 한글 작성 규칙
|
|
79
|
+
|
|
80
|
+
요약 본문에서 가운뎃점(·)으로 항목을 압축하지 않는다. "A·B·C" 대신 쉼표나 "A랑 B하고 C"로 푼다 — 사람은 산문에서 가운뎃점을 거의 안 쓴다 (표나 용어 목록은 예외).
|
|
81
|
+
|
|
78
82
|
## 출력 MD 구조
|
|
79
83
|
|
|
80
84
|
아래 템플릿으로 작성한다. 유형에 따라 마지막에 추가 섹션을 붙인다.
|
package/skills/review/SKILL.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: review
|
|
3
3
|
version: "1.0.0"
|
|
4
|
-
description: "PR·브랜치·커밋의 변경사항을 3종 리뷰 에이전트(보안·성능·품질)로 검토하고, humanize-monolith로 리포트를
|
|
4
|
+
description: "PR·브랜치·커밋의 변경사항을 3종 리뷰 에이전트(보안·성능·품질)로 검토하고, humanize-monolith로 리포트를 다듬은 뒤, PR 대상이면 code-review-writer가 작성한 인라인 코멘트로 게시한다."
|
|
5
5
|
triggers:
|
|
6
6
|
- "PR 리뷰"
|
|
7
7
|
- "브랜치 리뷰"
|
|
@@ -11,6 +11,10 @@ triggers:
|
|
|
11
11
|
- "review branch"
|
|
12
12
|
- "이 브랜치 리뷰"
|
|
13
13
|
- "변경사항 리뷰"
|
|
14
|
+
- "PR에 코멘트 남겨줘"
|
|
15
|
+
- "리뷰 코멘트 달아줘"
|
|
16
|
+
- "PR에 인라인 코멘트"
|
|
17
|
+
- "리뷰 결과 PR에 게시"
|
|
14
18
|
inputs:
|
|
15
19
|
target:
|
|
16
20
|
type: string
|
|
@@ -25,12 +29,13 @@ outputs:
|
|
|
25
29
|
- changeContext
|
|
26
30
|
- reviewReport
|
|
27
31
|
- verdict
|
|
32
|
+
- postedReview
|
|
28
33
|
---
|
|
29
34
|
|
|
30
35
|
# Review Skill
|
|
31
36
|
|
|
32
37
|
execute 세션 없이 PR·브랜치·커밋의 변경사항을 직접 리뷰 파이프라인에 주입해 검토합니다.
|
|
33
|
-
변경 파일을 수집하고, 3종 리뷰 에이전트(보안·성능·품질)로 다각도 리뷰한 뒤, Pass/Block 판정과 마크다운 리포트를 생성합니다.
|
|
38
|
+
변경 파일을 수집하고, 3종 리뷰 에이전트(보안·성능·품질)로 다각도 리뷰한 뒤, Pass/Block 판정과 마크다운 리포트를 생성합니다. 리뷰 대상이 GitHub PR이면 `code-review-writer` 에이전트가 작성한 인라인 코멘트로 PR에 게시까지 이어집니다.
|
|
34
39
|
|
|
35
40
|
## 사용 방법
|
|
36
41
|
|
|
@@ -182,14 +187,71 @@ humanize-monolith는 두 룰북을 함께 적용합니다.
|
|
|
182
187
|
|
|
183
188
|
즉 리뷰 파이프라인 리포트도 인라인 코멘트와 동일하게 voice + 음차가 함께 처리됩니다.
|
|
184
189
|
|
|
185
|
-
윤문된 리포트를 사용자에게
|
|
186
|
-
- `approved: true` → 리뷰 통과. 리포트를
|
|
187
|
-
- `approved: false` → critical/high 이슈가 남아 Block 상태입니다.
|
|
190
|
+
윤문된 리포트를 사용자에게 표시합니다. 그다음 대상이 GitHub PR이면 4.7단계로, 아니면 결과 표시로 넘어갑니다.
|
|
191
|
+
- `approved: true` → 리뷰 통과. 리포트를 보여줍니다.
|
|
192
|
+
- `approved: false` → critical/high 이슈가 남아 Block 상태입니다.
|
|
188
193
|
|
|
189
|
-
###
|
|
194
|
+
### 4.7단계: 인라인 코멘트 게시 (code-review-writer)
|
|
190
195
|
|
|
191
|
-
|
|
192
|
-
|
|
196
|
+
리뷰 대상이 GitHub PR이면, 4단계에서 병합한 이슈를 **리포트로 끝내지 않고 PR에 인라인 코멘트로 게시**합니다. 이 단계의 코멘트 본문은 반드시 `code-review-writer` 에이전트가 작성합니다 — Claude가 즉흥으로 쓰지 않습니다. 그래야 어투가 매 리뷰마다 일정하게 유지됩니다.
|
|
197
|
+
|
|
198
|
+
#### 진입 경로 두 가지
|
|
199
|
+
|
|
200
|
+
이 단계는 `/review`를 처음부터 돌린 흐름뿐 아니라, **대화 도중 "이제 PR에 코멘트 남겨줘"처럼 게시만 따로 요청**받았을 때도 진입점이 됩니다 (위 triggers의 "PR에 코멘트 남겨줘" 등). 두 경우 모두 아래 **신선도 가드를 먼저 통과해야** 게시할 수 있습니다.
|
|
201
|
+
|
|
202
|
+
#### 신선도 가드 (stale consensus 게시 금지)
|
|
203
|
+
|
|
204
|
+
게시 직전에, 게시하려는 consensus가 **현재 diff와 일치하는지** 반드시 확인합니다. 리뷰를 끝낸 뒤 코드가 바뀌었거나(커밋 추가·로컬 수정), 애초에 활성 리뷰 세션이 없으면 그 consensus는 stale이므로 **그대로 올리지 않습니다.**
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
# 리뷰 시점 대비 PR head·작업트리가 바뀌었는지 확인
|
|
208
|
+
gh pr view <target> --json headRefOid
|
|
209
|
+
git rev-parse HEAD && git status --porcelain
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
판단 기준:
|
|
213
|
+
|
|
214
|
+
- **이번 세션에 방금 리뷰를 끝냈고 그 뒤 diff 변화가 없다** → consensus가 신선함. 곧장 게시 진행.
|
|
215
|
+
- **리뷰 후 코드가 바뀌었다 / 활성 리뷰 세션이 없다 / 다른 세션의 오래된 결과다** → consensus가 stale. **게시하지 말고**, 1단계(blast_radius)부터 현재 diff로 리뷰 파이프라인(1~4단계)을 다시 돌린 뒤, 새로 나온 consensus로 4.7을 진행합니다. 사용자에게 "변경이 있어 현재 코드로 다시 리뷰한 뒤 게시할게요"라고 한 줄 알립니다.
|
|
216
|
+
|
|
217
|
+
즉 인라인 코멘트는 **언제 요청받든 항상 "현재 diff 기준 consensus + code-review-writer voice"** 로만 게시됩니다. 옛 리뷰 메모리를 그대로 옮겨 적거나 Claude가 손으로 코멘트를 짜는 경로는 없습니다.
|
|
218
|
+
|
|
219
|
+
**PR 식별.** 먼저 대상이 PR인지 확인합니다.
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
gh pr view <target> --json number,headRefName,baseRefName,url 2>/dev/null
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
`target`이 브랜치면 그 브랜치의 PR을, 생략됐으면 현재 브랜치의 PR을 찾습니다. PR이 없으면(로컬 브랜치·커밋 범위 등) 이 단계를 통째로 건너뛰고 결과 표시로 갑니다.
|
|
226
|
+
|
|
227
|
+
**게시 확인.** PR이 식별되면 사용자에게 한 번 확인합니다: **"발견된 이슈 N건을 PR #<number>에 인라인 코멘트로 게시할까요?"** 동의하지 않으면 리포트만 보여주고 종료합니다.
|
|
228
|
+
|
|
229
|
+
**코멘트 본문 작성 (code-review-writer).** `ges_agent { action: "get", name: "code-review-writer" }`로 에이전트 시스템 프롬프트를 가져온 뒤, 그 관점에서 4단계 `mergedIssues`의 각 이슈를 인라인 코멘트 본문으로 작성합니다. 이슈의 `file`·`line`·`severity`는 그대로 두고, `message`·`suggestion`을 에이전트 voice로 다듬어 코멘트 본문을 만듭니다.
|
|
230
|
+
|
|
231
|
+
- code-review-writer는 `author-voice.md`(제안형·온기·물결·이모지)와 `ai-tell-quick-rules.md`(음차 교정)를 이미 내장하므로 **별도 humanize-monolith 패스를 거치지 않습니다.**
|
|
232
|
+
- 에이전트 룰에 따라 `c:`/`r:` 접두어, `[출처]` 태깅, "…권장." 체언 종지는 쓰지 않습니다. 이건 Claude artifact이지 실제 리뷰어 어투가 아닙니다.
|
|
233
|
+
- severity는 본문 첫 줄에 `[critical]`처럼 대괄호 라벨로만 표기합니다.
|
|
234
|
+
|
|
235
|
+
**게시 (gh api).** 작성한 코멘트를 한 번의 리뷰로 묶어 게시합니다. 이슈마다 개별 호출하지 않고 `comments` 배열로 모읍니다.
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
gh api repos/{owner}/{repo}/pulls/{number}/reviews \
|
|
239
|
+
-f event=COMMENT \
|
|
240
|
+
-f body="<요약 한 줄 — code-review-writer가 작성한 overall summary>" \
|
|
241
|
+
--input <(jq -n '{ comments: [ { path: "...", line: 42, side: "RIGHT", body: "..." } ] }')
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
- `line`은 diff의 **우측(신규) 라인**을 기준으로 하고 `side: "RIGHT"`를 명시합니다. 삭제된 라인을 짚어야 하면 `side: "LEFT"`를 씁니다.
|
|
245
|
+
- 라인 매핑이 불확실한 이슈(파일 전반·구조적 지적 등)는 인라인 대신 리뷰 `body` 요약에 한 줄로 넣습니다. 임의 라인에 억지로 붙이지 않습니다.
|
|
246
|
+
- 게시 후 리뷰 URL을 사용자에게 보여줍니다.
|
|
247
|
+
|
|
248
|
+
JSON 제어문자가 깨지지 않도록 코멘트 본문은 셸 변수 echo 파이프 대신 `jq`로 직접 조립하거나 파일로 떨궈 `--input`으로 전달합니다.
|
|
249
|
+
|
|
250
|
+
### 5단계: 수정 확인 (review_fix, opt-in)
|
|
251
|
+
|
|
252
|
+
자동 수정은 기본 동작이 아닙니다. 4.7단계로 인라인 코멘트를 게시했거나 리포트를 보여준 뒤, 사용자가 **명시적으로 수정을 요청할 때만** 진행합니다 ("고쳐줘"·"수정해줘" 등). Block 상태라도 먼저 자동 수정을 들이밀지 않습니다.
|
|
253
|
+
|
|
254
|
+
요청을 받으면 `review_fix`로 수정 컨텍스트를 받아 critical/high 이슈를 수정합니다:
|
|
193
255
|
|
|
194
256
|
```
|
|
195
257
|
ges_execute {
|
|
@@ -227,3 +289,13 @@ ges_execute {
|
|
|
227
289
|
|
|
228
290
|
{report 마크다운}
|
|
229
291
|
```
|
|
292
|
+
|
|
293
|
+
4.7단계에서 인라인 코멘트를 게시했으면, 리포트 끝에 게시 결과를 한 줄로 덧붙입니다.
|
|
294
|
+
|
|
295
|
+
```
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
**인라인 코멘트**: PR #<number>에 <N>건 게시 완료 → <리뷰 URL>
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
PR이 아니거나 사용자가 게시를 거절했으면 이 블록을 생략합니다.
|