solmate-skills 2.0.4 → 2.0.6
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/AGENTS.md +19 -6
- package/README.md +71 -8
- package/bin/cli.js +42 -2
- package/docs-business/agents/openai.yaml +4 -0
- package/docs-dev/SKILL.md +17 -0
- package/docs-dev/agents/openai.yaml +4 -0
- package/docs-pitch/agents/openai.yaml +4 -0
- package/docs-plan/SKILL.md +34 -5
- package/docs-plan/agents/openai.yaml +4 -0
- package/ext-k-skill/scripts/check-setup.sh +29 -0
- package/ext-k-skill/scripts/run-k-skill-proxy.sh +15 -0
- package/ext-k-skill/scripts/validate-skills.sh +56 -0
- package/hooks/install.sh +157 -0
- package/hooks/suggest-skills.sh +109 -0
- package/hooks/verify-suggest.sh +42 -0
- package/hooks/watch-files.sh +96 -0
- package/manage-collaboration/agents/openai.yaml +4 -0
- package/manage-decisions/agents/openai.yaml +4 -0
- package/manage-skills/SKILL.md +8 -1
- package/manage-skills/agents/openai.yaml +4 -0
- package/package.json +1 -1
- package/role-team-lead/agents/openai.yaml +4 -0
- package/role-team-member/agents/openai.yaml +4 -0
- package/rules-dev/agents/openai.yaml +4 -0
- package/rules-docs/agents/openai.yaml +4 -0
- package/rules-product/SKILL.md +105 -6
- package/rules-product/agents/openai.yaml +4 -0
- package/rules-react/SKILL.md +10 -7
- package/rules-react/agents/openai.yaml +4 -0
- package/rules-react/scripts/fetch-stitch.sh +30 -0
- package/rules-workflow/SKILL.md +17 -2
- package/rules-workflow/agents/openai.yaml +4 -0
- package/tools-obsidian/agents/openai.yaml +4 -0
- package/tools-shadcn/agents/openai.yaml +4 -0
- package/tools-shadcn/scripts/verify-setup.sh +134 -0
- package/verify-code/SKILL.md +17 -1
- package/verify-code/agents/openai.yaml +4 -0
- package/verify-docs/SKILL.md +38 -5
- package/verify-docs/agents/openai.yaml +4 -0
- package/verify-drizzle-schema/agents/openai.yaml +4 -0
- package/verify-implementation/SKILL.md +66 -12
- package/verify-implementation/agents/openai.yaml +4 -0
- package/verify-performance/SKILL.md +16 -0
- package/verify-performance/agents/openai.yaml +4 -0
- package/verify-security/agents/openai.yaml +4 -0
- package/verify-skills/SKILL.md +179 -0
- package/verify-skills/agents/openai.yaml +4 -0
- package/verify-ui/SKILL.md +128 -0
- package/verify-ui/agents/openai.yaml +4 -0
|
@@ -5,35 +5,89 @@ disable-model-invocation: true
|
|
|
5
5
|
argument-hint: "[선택사항: 특정 verify 스킬 이름]"
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# 구현 검증 (Master
|
|
8
|
+
# 구현 검증 (Master)
|
|
9
9
|
|
|
10
10
|
## 목적
|
|
11
11
|
|
|
12
|
-
프로젝트에 존재하는 모든 `verify-*` 스킬을 동적으로 탐색하여 순차적으로 실행하고 통합 검증을 수행합니다.
|
|
12
|
+
프로젝트에 존재하는 모든 `verify-*` 스킬을 동적으로 탐색하여 순차적으로 실행하고 통합 검증을 수행합니다. 기본 순서를 따르되, 변경 파일과 프로젝트 특성에 따라 해당 없는 스킬은 `N/A - 사유`로 기록합니다.
|
|
13
13
|
|
|
14
|
-
## 실행
|
|
14
|
+
## 기본 실행 순서
|
|
15
15
|
|
|
16
|
-
|
|
|
17
|
-
|
|
18
|
-
|
|
|
16
|
+
| 순서 | 스킬 | 목적 |
|
|
17
|
+
|---:|---|---|
|
|
18
|
+
| 1 | `verify-docs` | 문서 구조, Backlog Context Lock, UI-First Gate 검증 |
|
|
19
|
+
| 2 | `verify-ui` | 구현 UI와 화면 문서, 사용자 동선, 상태별 UI 일치 검증 |
|
|
20
|
+
| 3 | `verify-code` | 코드 품질, 타입, 로직, 사이드 이펙트 검증 |
|
|
21
|
+
| 4 | `verify-security` | 인증·인가·입력·시크릿·OWASP 보안 검증 |
|
|
22
|
+
| 5 | `verify-performance` | Lighthouse, Core Web Vitals, 렌더링·번들 검증 |
|
|
23
|
+
| 6 | `verify-drizzle-schema` | DB 스키마 변경 시 명세·관계·인덱스 검증 |
|
|
24
|
+
| 7 | `verify-skills` | solmate-skills 패키지 자체 변경 시 스킬 메타데이터·CLI·패키징 검증 |
|
|
19
25
|
|
|
20
26
|
## 워크플로우
|
|
21
27
|
|
|
28
|
+
### Step 0: Flow 위치 확인
|
|
29
|
+
검증을 시작하기 전에 `rules-product`의 `Flow Status Block` 형식으로 현재 위치를 보고합니다. 일반적으로 현재 위치는 `Phase 5 — 품질 검증`입니다.
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
[Flow]
|
|
33
|
+
현재: Phase 5 — 품질 검증
|
|
34
|
+
Gate: Quality Gate 진행 중
|
|
35
|
+
완료: Phase 1, Phase 2, UI-First Gate, Pre-Code Technical Brief, Phase 3, Phase 4
|
|
36
|
+
다음: Phase 6 — 최종 전달물 또는 Handoff
|
|
37
|
+
필요 확인: Fail 항목 또는 N/A 처리 사유
|
|
38
|
+
권장 스킬: /verify-implementation
|
|
39
|
+
```
|
|
40
|
+
|
|
22
41
|
### Step 1: 동적 스킬 탐색
|
|
23
|
-
`.agent/skills
|
|
42
|
+
`.agent/skills/`, `.claude/commands/`, 또는 현재 저장소 하위의 `verify-*` 패턴을 탐색합니다.
|
|
43
|
+
|
|
44
|
+
### Step 2: 변경 파일 기반 실행 계획 수립
|
|
45
|
+
`git diff --name-only HEAD` 기준으로 실행 대상을 정합니다.
|
|
24
46
|
|
|
25
|
-
|
|
26
|
-
|
|
47
|
+
- 문서 변경: `verify-docs`
|
|
48
|
+
- TS/TSX/JS/JSX 변경: `verify-code`
|
|
49
|
+
- TSX/JSX 화면 변경: `verify-ui`
|
|
50
|
+
- auth/api/middleware/env/db 변경: `verify-security`
|
|
51
|
+
- page/layout/image/font/bundle 관련 변경: `verify-performance`
|
|
52
|
+
- schema/migration 변경: `verify-drizzle-schema`
|
|
53
|
+
- `SKILL.md`, `agents/openai.yaml`, `bin/cli.js`, `README.md`, `AGENTS.md`, `package.json` 변경: `verify-skills`
|
|
27
54
|
|
|
28
|
-
### Step 3:
|
|
55
|
+
### Step 3: 순차 실행
|
|
56
|
+
기본 실행 순서대로 각 스킬의 `Workflow`, `Exceptions`, `Related Files`를 파싱하여 개별 검사를 수행합니다. 앞 단계가 Fail이면 뒤 단계는 실행하되, 해당 Fail이 뒤 단계 판단을 왜곡하는 경우 `Blocked - 사유`로 표시합니다.
|
|
57
|
+
|
|
58
|
+
### Step 4: 통합 보고서 생성
|
|
29
59
|
PASS/FAIL 통계와 발견된 이슈 목록을 생성합니다.
|
|
60
|
+
보고서 상단에는 `Flow Status Block`을 다시 포함하고, Gate 상태를 `통과`, `미통과`, `Blocked`, `N/A` 중 하나로 표시합니다.
|
|
30
61
|
|
|
31
|
-
### Step
|
|
62
|
+
### Step 5: 수정 옵션 제공
|
|
32
63
|
자동 수정 또는 개별 수정을 사용자에게 제안합니다.
|
|
33
64
|
|
|
34
|
-
### Step
|
|
65
|
+
### Step 6: 수정 적용 및 재검증
|
|
35
66
|
수정이 적용된 경우 해당 스킬을 다시 실행하여 통과 여부를 최종 확인합니다.
|
|
36
67
|
|
|
68
|
+
## 보고 형식
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
## 통합 구현 검증 결과
|
|
72
|
+
|
|
73
|
+
| 순서 | 스킬 | 결과 | 비고 |
|
|
74
|
+
|---:|---|:---:|---|
|
|
75
|
+
| 1 | verify-docs | Pass / Fail / N/A | |
|
|
76
|
+
| 2 | verify-ui | Pass / Fail / N/A | |
|
|
77
|
+
| 3 | verify-code | Pass / Fail / N/A | |
|
|
78
|
+
| 4 | verify-security | Pass / Fail / N/A | |
|
|
79
|
+
| 5 | verify-performance | Pass / Fail / N/A | |
|
|
80
|
+
| 6 | verify-drizzle-schema | Pass / Fail / N/A | |
|
|
81
|
+
| 7 | verify-skills | Pass / Fail / N/A | |
|
|
82
|
+
|
|
83
|
+
### 배포/PR 차단 항목
|
|
84
|
+
- [높음] ...
|
|
85
|
+
|
|
86
|
+
### 재검증 필요 항목
|
|
87
|
+
- ...
|
|
88
|
+
```
|
|
89
|
+
|
|
37
90
|
## 예외사항
|
|
38
91
|
1. **자기 자신** (`verify-implementation`)은 실행 대상에서 제외.
|
|
39
92
|
2. **관리 스킬** (`manage-skills` 등)은 `verify-`로 시작하지 않으므로 제외.
|
|
93
|
+
3. **해당 없음**: DB, UI, 패키지 메타데이터 등 변경 범위와 관련 없는 검증은 `N/A - 사유`로 기록.
|
|
@@ -176,6 +176,20 @@ npx lighthouse http://localhost:3000 --view --output=html
|
|
|
176
176
|
|
|
177
177
|
---
|
|
178
178
|
|
|
179
|
+
## Check 7: 상태별 UI 성능
|
|
180
|
+
|
|
181
|
+
UI-First Gate에서 정의한 로딩, 빈 상태, 오류 상태가 성능과 레이아웃 안정성을 해치지 않는지 확인한다.
|
|
182
|
+
|
|
183
|
+
- 로딩 스켈레톤 또는 placeholder가 최종 콘텐츠와 유사한 크기를 가져 CLS를 줄이는지 점검한다.
|
|
184
|
+
- 빈 상태와 오류 상태가 이미지·아이콘·폰트를 과도하게 로드하지 않는지 확인한다.
|
|
185
|
+
- 모바일 첫 화면에서 핵심 CTA가 로딩 상태 또는 오류 배너에 밀려 사라지지 않는지 확인한다.
|
|
186
|
+
- 체크:
|
|
187
|
+
- [ ] 로딩 상태가 최종 레이아웃과 유사한 공간을 예약하는가?
|
|
188
|
+
- [ ] 빈/오류 상태가 불필요한 대형 에셋을 초기 로드하지 않는가?
|
|
189
|
+
- [ ] 상태 전환이 CLS 또는 긴 INP를 유발하지 않는가?
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
179
193
|
## 보고 형식
|
|
180
194
|
|
|
181
195
|
```
|
|
@@ -196,6 +210,7 @@ npx lighthouse http://localhost:3000 --view --output=html
|
|
|
196
210
|
|------|-----------|------|:---------:|
|
|
197
211
|
| src/pages/Home.tsx | 이미지 최적화 | <img> 직접 사용, LCP 지연 가능성 | LCP |
|
|
198
212
|
| src/app/layout.tsx | 폰트 최적화 | Google Fonts <link> 직접 로드 | CLS·FCP |
|
|
213
|
+
| src/components/List.tsx | 상태별 UI 성능 | Empty state 전환 시 레이아웃 시프트 가능 | CLS |
|
|
199
214
|
|
|
200
215
|
### 수정 권장 우선순위
|
|
201
216
|
1. [높음] ...
|
|
@@ -216,6 +231,7 @@ npx lighthouse http://localhost:3000 --view --output=html
|
|
|
216
231
|
## 관련 스킬
|
|
217
232
|
|
|
218
233
|
- `verify-code`: 코드 품질 전반 리뷰
|
|
234
|
+
- `verify-ui`: 화면 상태와 사용자 동선 검증
|
|
219
235
|
- `verify-security`: 보안 취약점 점검
|
|
220
236
|
- `rules-dev`: 렌더링 전략·코드 스플리팅 컨벤션 기준
|
|
221
237
|
- `verify-implementation`: 전체 verify-* 통합 실행 시 포함 대상
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: verify-skills
|
|
3
|
+
description: solmate-skills 패키지 자체를 검증합니다. SKILL.md frontmatter, agents/openai.yaml, CLI 목록, README/AGENTS 스킬 목록, 버전 문구, npm pack dry-run을 점검합니다. 스킬 추가·수정 후, 배포 전, 또는 "스킬 패키지 검증" 요청 시 사용합니다.
|
|
4
|
+
argument-hint: "[선택사항: 특정 스킬 이름 또는 점검 영역]"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 스킬 패키지 검증 스킬 (verify-skills)
|
|
8
|
+
|
|
9
|
+
`solmate-skills` 저장소 자체의 배포 품질과 스킬 메타데이터 정합성을 검증한다.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 실행 시점
|
|
14
|
+
|
|
15
|
+
- 새 스킬 추가 또는 기존 스킬 수정 후
|
|
16
|
+
- `bin/cli.js`, `README.md`, `AGENTS.md`, `package.json` 수정 후
|
|
17
|
+
- npm 배포 또는 태그 생성 전
|
|
18
|
+
- `rules-workflow` Step 17 또는 `verify-implementation` 실행 시
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Step 0: 검증 범위 확정
|
|
23
|
+
|
|
24
|
+
인자가 있으면 해당 스킬 또는 영역만 점검한다. 없으면 루트 패키지 전체를 점검한다.
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
find . -maxdepth 2 -name SKILL.md -print | sort
|
|
28
|
+
node bin/cli.js list
|
|
29
|
+
git status --short
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Check 1: 스킬 디렉터리와 CLI 목록
|
|
35
|
+
|
|
36
|
+
- 루트의 설치 가능한 스킬은 `SKILL.md`가 있는 디렉터리여야 한다.
|
|
37
|
+
- `.claude`, `.codex`, `hooks`, `bin`, `node_modules` 같은 비스킬 디렉터리가 CLI 목록에 나오면 Fail이다.
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
node bin/cli.js list
|
|
41
|
+
find . -maxdepth 2 -name SKILL.md -print | sed 's#^\./##; s#/SKILL.md$##' | sort
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
- 체크:
|
|
45
|
+
- [ ] CLI 목록이 실제 `SKILL.md` 보유 디렉터리와 일치하는가?
|
|
46
|
+
- [ ] 비스킬 디렉터리가 설치 대상으로 노출되지 않는가?
|
|
47
|
+
- [ ] 새 verify 스킬이 README와 AGENTS 목록에 반영되었는가?
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Check 2: SKILL.md frontmatter
|
|
52
|
+
|
|
53
|
+
- 모든 `SKILL.md`가 YAML frontmatter를 갖고, `name`, `description`이 유효한지 확인한다.
|
|
54
|
+
- `name`은 소문자 hyphen-case여야 한다.
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
python3 -c 'import pathlib, yaml, re
|
|
58
|
+
for p in pathlib.Path(".").glob("*/SKILL.md"):
|
|
59
|
+
text=p.read_text()
|
|
60
|
+
m=re.match(r"^---\n(.*?)\n---", text, re.S)
|
|
61
|
+
assert m, f"frontmatter missing: {p}"
|
|
62
|
+
data=yaml.safe_load(m.group(1))
|
|
63
|
+
assert data.get("name") and data.get("description"), f"name/description missing: {p}"
|
|
64
|
+
assert re.match(r"^[a-z0-9-]+$", data["name"]), f"bad name: {p}"
|
|
65
|
+
print("frontmatter ok")'
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
- 체크:
|
|
69
|
+
- [ ] 모든 `SKILL.md` frontmatter가 파싱되는가?
|
|
70
|
+
- [ ] `name`과 폴더명이 불필요하게 어긋나지 않는가?
|
|
71
|
+
- [ ] `description`이 사용 시점을 충분히 설명하는가?
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Check 3: agents/openai.yaml
|
|
76
|
+
|
|
77
|
+
- 루트에서 직접 추적하는 스킬은 `agents/openai.yaml`을 갖는 것이 원칙이다. `git ls-files -s`에서 mode `160000`으로 표시되는 gitlink 외부 확장은 제외한다.
|
|
78
|
+
- `interface.display_name`, `short_description`, `default_prompt`가 있어야 하며, `default_prompt`에는 `$skill-name`이 포함되어야 한다.
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
python3 -c 'import pathlib, subprocess, yaml
|
|
82
|
+
bad=[]
|
|
83
|
+
gitlinks=set()
|
|
84
|
+
for line in subprocess.run(["git", "ls-files", "-s"], capture_output=True, text=True).stdout.splitlines():
|
|
85
|
+
parts=line.split()
|
|
86
|
+
if len(parts) >= 4 and parts[0] == "160000":
|
|
87
|
+
gitlinks.add(parts[3])
|
|
88
|
+
for skill in [p.parent for p in pathlib.Path(".").glob("*/SKILL.md")]:
|
|
89
|
+
if skill.as_posix() in gitlinks:
|
|
90
|
+
continue
|
|
91
|
+
meta=skill/"agents/openai.yaml"
|
|
92
|
+
if not meta.exists():
|
|
93
|
+
bad.append(f"missing openai.yaml: {skill}")
|
|
94
|
+
continue
|
|
95
|
+
data=yaml.safe_load(meta.read_text())
|
|
96
|
+
interface=data.get("interface", {})
|
|
97
|
+
prompt=interface.get("default_prompt", "")
|
|
98
|
+
if "$"+skill.name not in prompt:
|
|
99
|
+
bad.append(f"default_prompt missing ${skill.name}: {meta}")
|
|
100
|
+
if not (25 <= len(interface.get("short_description", "")) <= 64):
|
|
101
|
+
bad.append(f"bad short_description: {meta}")
|
|
102
|
+
print("metadata ok" if not bad else "\n".join(bad))'
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
- 체크:
|
|
106
|
+
- [ ] 각 스킬에 `agents/openai.yaml`이 있는가?
|
|
107
|
+
- [ ] `short_description` 길이가 25-64자인가?
|
|
108
|
+
- [ ] `default_prompt`가 해당 `$skill-name`을 명시하는가?
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Check 4: README, AGENTS, package 버전 동기화
|
|
113
|
+
|
|
114
|
+
- `package.json` 버전과 README의 최신 버전 문구가 일치하는지 확인한다.
|
|
115
|
+
- README와 AGENTS의 verify 목록이 실제 `verify-*` 디렉터리와 맞는지 확인한다.
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
node -p "require('./package.json').version"
|
|
119
|
+
grep -n "What's New in" README.md
|
|
120
|
+
find . -maxdepth 1 -type d -name 'verify-*' -exec basename {} \; | sort
|
|
121
|
+
grep -n "verify-" README.md AGENTS.md
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
- 체크:
|
|
125
|
+
- [ ] README 최신 버전 문구가 `package.json`과 일치하는가?
|
|
126
|
+
- [ ] README Available Skills에 새 스킬이 반영되었는가?
|
|
127
|
+
- [ ] AGENTS.md 품질 검증 목록에 새 verify 스킬이 반영되었는가?
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Check 5: 패키징 검증
|
|
132
|
+
|
|
133
|
+
- npm 패키징 dry-run이 통과해야 한다.
|
|
134
|
+
- 사용자 홈 npm 캐시 권한 문제를 피하려면 임시 캐시를 사용할 수 있다.
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
npm_config_cache=/private/tmp/solmate-npm-cache npm pack --dry-run
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
- 체크:
|
|
141
|
+
- [ ] dry-run이 성공하는가?
|
|
142
|
+
- [ ] tarball 내용에 새 스킬 파일과 `agents/openai.yaml`이 포함되는가?
|
|
143
|
+
- [ ] dry-run 후 실제 `.tgz` 파일이 작업트리에 남지 않았는가?
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 보고 형식
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
## 스킬 패키지 검증 결과
|
|
151
|
+
|
|
152
|
+
| 검사 항목 | 결과 | 비고 |
|
|
153
|
+
|:---|:---:|:---|
|
|
154
|
+
| CLI 목록 | Pass / Fail | |
|
|
155
|
+
| SKILL.md frontmatter | Pass / Fail | |
|
|
156
|
+
| agents/openai.yaml | Pass / Fail | |
|
|
157
|
+
| README/AGENTS 동기화 | Pass / Fail | |
|
|
158
|
+
| npm pack dry-run | Pass / Fail | |
|
|
159
|
+
|
|
160
|
+
### 수정 필요 항목
|
|
161
|
+
- [높음] ...
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## Exceptions
|
|
167
|
+
|
|
168
|
+
1. **gitlink 외부 확장**: `ext-*`가 gitlink 또는 외부 소스 묶음이면 루트 저장소의 `agents/openai.yaml` 필수 대상에서 제외할 수 있다.
|
|
169
|
+
2. **실험 중인 로컬 스킬**: 배포 대상이 아니라고 명시된 로컬 실험 폴더는 CLI 설치 대상에서 제외되어야 한다.
|
|
170
|
+
3. **npm 캐시 권한 문제**: 사용자 홈 npm 캐시 권한 오류는 코드 Fail이 아니며, 임시 캐시로 재검증한다.
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## 관련 스킬
|
|
175
|
+
|
|
176
|
+
- `manage-skills`: verify 스킬 드리프트 탐지
|
|
177
|
+
- `skill-creator`: 스킬 구조와 metadata 작성 기준
|
|
178
|
+
- `verify-docs`: 문서 레이어 검증
|
|
179
|
+
- `verify-implementation`: 전체 verify 스킬 통합 실행
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: verify-ui
|
|
3
|
+
description: UI 구현이 docs/02_UI_Screens의 화면 설계, 사용자 동선, 데이터 흐름, 로딩·빈 상태·오류 상태와 일치하는지 검증합니다. React/TSX 화면 구현 후, UI-First Gate 확인 후, 또는 "UI 검증", "UX 확인", "화면이 문서와 맞는지 봐줘" 요청 시 사용합니다.
|
|
4
|
+
argument-hint: "[선택사항: 점검할 화면, 라우트, 컴포넌트 경로]"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# UI 구현 검증 스킬 (verify-ui)
|
|
8
|
+
|
|
9
|
+
구현된 화면이 UI-First Gate에서 합의한 화면 구조, 사용자 동선, 데이터 흐름, 상태별 UI를 실제로 반영하는지 검증한다.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 실행 시점
|
|
14
|
+
|
|
15
|
+
- React/TSX 화면 또는 컴포넌트 구현 후
|
|
16
|
+
- `rules-workflow` Step 15 사용자 사용 흐름 확인 시
|
|
17
|
+
- `docs/02_UI_Screens/` 문서와 구현 결과의 일치 여부를 확인할 때
|
|
18
|
+
- PR 전 UI/UX 회귀 점검 시
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Step 0: 검증 범위 확정
|
|
23
|
+
|
|
24
|
+
인자가 있으면 해당 화면·라우트·컴포넌트에 집중한다. 없으면 변경된 UI 파일과 관련 문서를 먼저 찾는다.
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
git diff --name-only HEAD
|
|
28
|
+
find docs/02_UI_Screens -maxdepth 1 -type f -name '*.md' 2>/dev/null
|
|
29
|
+
find . -path '*/src/*' \( -name '*.tsx' -o -name '*.jsx' \) 2>/dev/null
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
검증 전 `docs/02_UI_Screens/00_SCREEN_FLOW.md`, `01_UI_DESIGN.md`, 관련 `XX_PROTOTYPE_REVIEW.md`, 백로그 항목의 `Related UI Docs`를 읽는다.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Check 1: 화면 구조 일치
|
|
37
|
+
|
|
38
|
+
- 구현된 화면의 주요 영역, 정보 위계, CTA가 UI 문서와 일치하는지 확인한다.
|
|
39
|
+
- 화면에 필요한 헤더, 내비게이션, 주요 콘텐츠, 보조 액션, 피드백 영역이 빠지지 않았는지 점검한다.
|
|
40
|
+
- 체크:
|
|
41
|
+
- [ ] 주요 화면과 컴포넌트가 문서의 화면 목록과 대응되는가?
|
|
42
|
+
- [ ] CTA 문구와 위치가 사용자 흐름상 자연스러운가?
|
|
43
|
+
- [ ] 문서에 없는 큰 UI 변경이 있다면 관련 문서가 업데이트되었는가?
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Check 2: 사용자 동선
|
|
48
|
+
|
|
49
|
+
- 진입, 다음 행동, 뒤로가기/취소, 완료, 이탈 경로가 구현되어 있는지 확인한다.
|
|
50
|
+
- 링크, 버튼, 폼 제출, 모달, 탭, 라우팅이 `00_SCREEN_FLOW.md`의 흐름과 맞는지 점검한다.
|
|
51
|
+
- 체크:
|
|
52
|
+
- [ ] 핵심 사용자 여정이 끊기지 않는가?
|
|
53
|
+
- [ ] 주요 CTA가 실제 라우트 또는 상태 변경과 연결되는가?
|
|
54
|
+
- [ ] 실패 또는 취소 후 사용자가 회복할 경로가 있는가?
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Check 3: 데이터 흐름과 상태
|
|
59
|
+
|
|
60
|
+
- 화면별 입력 데이터, 표시 데이터, 저장/전송 데이터가 문서와 일치하는지 확인한다.
|
|
61
|
+
- mock data, API 응답, 폼 상태, 파생 상태가 화면 요구사항을 과소/과대 구현하지 않는지 점검한다.
|
|
62
|
+
- 체크:
|
|
63
|
+
- [ ] 화면에서 필요한 데이터가 모두 표시되는가?
|
|
64
|
+
- [ ] 입력값 검증과 제출 상태가 사용자에게 보이는가?
|
|
65
|
+
- [ ] 문서상 필요 없는 민감 데이터나 내부 상태가 노출되지 않는가?
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Check 4: 상태별 UI
|
|
70
|
+
|
|
71
|
+
- 로딩, 빈 상태, 오류 상태, 권한 없음, 비활성 상태가 구현되어 있는지 확인한다.
|
|
72
|
+
- 상태별 문구가 사용자의 다음 행동을 안내하는지 점검한다.
|
|
73
|
+
- 체크:
|
|
74
|
+
- [ ] Loading state가 존재하고 레이아웃을 크게 흔들지 않는가?
|
|
75
|
+
- [ ] Empty state가 원인과 다음 행동을 설명하는가?
|
|
76
|
+
- [ ] Error state에 재시도, 이동, 문의 등 회복 경로가 있는가?
|
|
77
|
+
- [ ] Disabled state가 시각적으로만 아니라 실제 상호작용도 막는가?
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Check 5: 접근성과 반응형
|
|
82
|
+
|
|
83
|
+
- 키보드 탐색, label, aria 속성, focus 상태, 색 대비, 모바일 레이아웃을 확인한다.
|
|
84
|
+
- 체크:
|
|
85
|
+
- [ ] 버튼과 입력 요소에 접근 가능한 이름이 있는가?
|
|
86
|
+
- [ ] 폼 입력에 label 또는 aria-label이 있는가?
|
|
87
|
+
- [ ] 모달/드롭다운/탭이 키보드로 조작 가능한가?
|
|
88
|
+
- [ ] 모바일에서 텍스트, CTA, 주요 콘텐츠가 겹치거나 잘리지 않는가?
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 보고 형식
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
## UI 검증 결과
|
|
96
|
+
|
|
97
|
+
### PASS 항목
|
|
98
|
+
- (문제 없는 흐름과 화면 요약)
|
|
99
|
+
|
|
100
|
+
### 개선 필요 항목
|
|
101
|
+
| 위치 | 영역 | 내용 | 심각도 |
|
|
102
|
+
|------|------|------|:------:|
|
|
103
|
+
| src/app/page.tsx:42 | 상태별 UI | Empty state 미구현 | 중 |
|
|
104
|
+
| src/components/Form.tsx:18 | 접근성 | input label 누락 | 중 |
|
|
105
|
+
|
|
106
|
+
### 문서 동기화 필요
|
|
107
|
+
- 구현이 문서와 다르면 수정할 문서 또는 코드 위치를 명시한다.
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
심각도 기준: **높음** (핵심 동선 차단) / **중** (사용성 또는 문서 불일치) / **낮음** (개선 권장)
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Exceptions
|
|
115
|
+
|
|
116
|
+
1. **초기 스파이크 UI**: 명시적으로 탐색용 스파이크라고 표시된 코드는 낮은 심각도로 보고하되, PR 전에는 문서 동기화를 요구한다.
|
|
117
|
+
2. **관리자 내부 화면**: 공개 사용자 화면보다 시각 완성도 기준은 낮출 수 있으나, 상태별 UI와 접근성 기준은 유지한다.
|
|
118
|
+
3. **외부 임베드 UI**: 지도, 결제, 인증 위젯 등 외부 위젯 내부 UI는 제외하되, 로딩·오류·복귀 경로는 검증한다.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## 관련 스킬
|
|
123
|
+
|
|
124
|
+
- `docs-plan`: UI-First Gate와 UI 문서 작성 기준
|
|
125
|
+
- `rules-react`: React 화면 구현 기준
|
|
126
|
+
- `verify-docs`: UI 문서와 백로그 구조 검증
|
|
127
|
+
- `verify-code`: 코드 품질 검토
|
|
128
|
+
- `verify-performance`: 화면 성능 검증
|