@su-record/vibe 1.2.18 → 1.3.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/commands/vibe.run.md +301 -78
- package/.claude/commands/vibe.verify.md +167 -81
- package/.claude/settings.json +0 -63
- package/.claude/settings.local.json +2 -1
- package/README.md +114 -36
- package/package.json +1 -1
- package/templates/feature-template.md +46 -20
- package/templates/hooks-template.json +89 -1
|
@@ -5,7 +5,9 @@ argument-hint: "feature name" or --phase N
|
|
|
5
5
|
|
|
6
6
|
# /vibe.run
|
|
7
7
|
|
|
8
|
-
Execute
|
|
8
|
+
Execute **Scenario-Driven Implementation** with automatic quality verification.
|
|
9
|
+
|
|
10
|
+
> **핵심 원칙**: 시나리오가 곧 구현 단위이자 검증 기준. 모든 시나리오 통과 = 품질 보장.
|
|
9
11
|
|
|
10
12
|
## Usage
|
|
11
13
|
|
|
@@ -18,6 +20,92 @@ Execute implementation based on SPEC (Implementation Agent with Multi-Model Orch
|
|
|
18
20
|
|
|
19
21
|
---
|
|
20
22
|
|
|
23
|
+
## **Scenario-Driven Development (SDD)**
|
|
24
|
+
|
|
25
|
+
> 비개발자도 품질을 신뢰할 수 있도록, **시나리오 = 구현 = 검증**을 자동화
|
|
26
|
+
|
|
27
|
+
### 핵심 흐름
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
31
|
+
│ SCENARIO-DRIVEN IMPLEMENTATION │
|
|
32
|
+
│ │
|
|
33
|
+
│ Feature 파일 로드 │
|
|
34
|
+
│ ↓ │
|
|
35
|
+
│ ┌──────────────────────────────────────────────────────────┐ │
|
|
36
|
+
│ │ Scenario 1: Happy Path │ │
|
|
37
|
+
│ │ Given → When → Then │ │
|
|
38
|
+
│ │ ↓ │ │
|
|
39
|
+
│ │ [구현] → [즉시 검증] → ✅ Pass │ │
|
|
40
|
+
│ └──────────────────────────────────────────────────────────┘ │
|
|
41
|
+
│ ↓ │
|
|
42
|
+
│ ┌──────────────────────────────────────────────────────────┐ │
|
|
43
|
+
│ │ Scenario 2: Edge Case │ │
|
|
44
|
+
│ │ Given → When → Then │ │
|
|
45
|
+
│ │ ↓ │ │
|
|
46
|
+
│ │ [구현] → [즉시 검증] → ❌ Fail → [수정] → ✅ Pass │ │
|
|
47
|
+
│ └──────────────────────────────────────────────────────────┘ │
|
|
48
|
+
│ ↓ │
|
|
49
|
+
│ ┌──────────────────────────────────────────────────────────┐ │
|
|
50
|
+
│ │ Scenario N: ... │ │
|
|
51
|
+
│ │ [구현] → [즉시 검증] → ✅ Pass │ │
|
|
52
|
+
│ └──────────────────────────────────────────────────────────┘ │
|
|
53
|
+
│ ↓ │
|
|
54
|
+
│ ┌──────────────────────────────────────────────────────────┐ │
|
|
55
|
+
│ │ 📊 QUALITY REPORT │ │
|
|
56
|
+
│ │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │ │
|
|
57
|
+
│ │ 시나리오: 5/5 통과 ✅ │ │
|
|
58
|
+
│ │ 품질 점수: 94/100 │ │
|
|
59
|
+
│ │ 빌드: ✅ | 테스트: ✅ │ │
|
|
60
|
+
│ └──────────────────────────────────────────────────────────┘ │
|
|
61
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 시나리오 = 구현 단위
|
|
65
|
+
|
|
66
|
+
**기존 방식 (Phase 기반)**:
|
|
67
|
+
```
|
|
68
|
+
Phase 1 → Phase 2 → Phase 3 → ... → 마지막에 검증
|
|
69
|
+
↓
|
|
70
|
+
"어디서 잘못됐지?"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**SDD 방식 (Scenario 기반)**:
|
|
74
|
+
```
|
|
75
|
+
Scenario 1 → 구현 → 검증 ✅
|
|
76
|
+
Scenario 2 → 구현 → 검증 ✅
|
|
77
|
+
Scenario 3 → 구현 → 검증 ❌ → 수정 → ✅
|
|
78
|
+
...
|
|
79
|
+
전체 통과 = 품질 보장
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### 검증 자동화
|
|
83
|
+
|
|
84
|
+
각 시나리오 구현 후 **자동 검증**:
|
|
85
|
+
|
|
86
|
+
| 검증 항목 | 자동 체크 |
|
|
87
|
+
|-----------|-----------|
|
|
88
|
+
| Given (전제조건) | 상태/데이터 준비 확인 |
|
|
89
|
+
| When (행동) | 기능 실행 가능 여부 |
|
|
90
|
+
| Then (결과) | 예상 결과 일치 여부 |
|
|
91
|
+
| 코드 품질 | 복잡도, 스타일, 보안 |
|
|
92
|
+
|
|
93
|
+
### 실패 시 자동 수정
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
Scenario 검증 실패
|
|
97
|
+
↓
|
|
98
|
+
[원인 분석] - 어떤 Then 조건이 실패?
|
|
99
|
+
↓
|
|
100
|
+
[수정 구현] - 해당 부분만 수정
|
|
101
|
+
↓
|
|
102
|
+
[재검증] - 다시 체크
|
|
103
|
+
↓
|
|
104
|
+
통과할 때까지 반복 (최대 3회)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
21
109
|
## **ULTRAWORK Mode** (ulw)
|
|
22
110
|
|
|
23
111
|
> Include `ultrawork` or `ulw` in your command to activate **maximum performance mode**.
|
|
@@ -231,31 +319,89 @@ validate_code_quality: Verify quality after implementation
|
|
|
231
319
|
|
|
232
320
|
## Process
|
|
233
321
|
|
|
234
|
-
### 1.
|
|
322
|
+
### 1. Load SPEC + Feature
|
|
235
323
|
|
|
236
|
-
|
|
324
|
+
```
|
|
325
|
+
📄 .vibe/specs/{feature-name}.md → SPEC (구조, 제약, 컨텍스트)
|
|
326
|
+
📄 .vibe/features/{feature-name}.feature → Feature (시나리오 = 구현 단위)
|
|
327
|
+
```
|
|
237
328
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
| `<constraints>` | Constraints |
|
|
244
|
-
| `<output_format>` | Files to create/modify |
|
|
245
|
-
| `<acceptance>` | Verification criteria |
|
|
329
|
+
**Feature 파일이 없으면 에러**:
|
|
330
|
+
```
|
|
331
|
+
❌ Feature 파일이 없습니다.
|
|
332
|
+
먼저 /vibe.spec "{feature-name}"을 실행하세요.
|
|
333
|
+
```
|
|
246
334
|
|
|
247
|
-
|
|
248
|
-
- External LLM enablement (`models.gpt.enabled`, `models.gemini.enabled`)
|
|
335
|
+
### 2. Scenario 목록 추출
|
|
249
336
|
|
|
250
|
-
|
|
337
|
+
Feature 파일에서 모든 Scenario 추출:
|
|
251
338
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
- Use as test cases
|
|
339
|
+
```markdown
|
|
340
|
+
## Scenarios to Implement
|
|
255
341
|
|
|
256
|
-
|
|
342
|
+
| # | Scenario | Status |
|
|
343
|
+
|---|----------|--------|
|
|
344
|
+
| 1 | 유효한 로그인 성공 | ⬜ |
|
|
345
|
+
| 2 | 잘못된 비밀번호 에러 | ⬜ |
|
|
346
|
+
| 3 | 이메일 형식 검증 | ⬜ |
|
|
347
|
+
| 4 | 비밀번호 찾기 링크 | ⬜ |
|
|
257
348
|
|
|
258
|
-
|
|
349
|
+
Total: 4 scenarios
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### 3. Scenario-by-Scenario Implementation (핵심)
|
|
353
|
+
|
|
354
|
+
**각 시나리오마다**:
|
|
355
|
+
|
|
356
|
+
```
|
|
357
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
358
|
+
🎯 Scenario 1/4: 유효한 로그인 성공
|
|
359
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
360
|
+
|
|
361
|
+
Given: 사용자가 등록되어 있다
|
|
362
|
+
When: 유효한 이메일과 비밀번호로 로그인
|
|
363
|
+
Then: 로그인 성공 + JWT 토큰 반환
|
|
364
|
+
|
|
365
|
+
[Step 1] 구현 분석...
|
|
366
|
+
- 필요한 파일: auth.service.ts, login.controller.ts
|
|
367
|
+
- 관련 코드 탐색 중...
|
|
368
|
+
|
|
369
|
+
[Step 2] 구현 중...
|
|
370
|
+
✅ auth.service.ts - login() 메서드 추가
|
|
371
|
+
✅ login.controller.ts - POST /login 엔드포인트
|
|
372
|
+
|
|
373
|
+
[Step 3] 검증 중...
|
|
374
|
+
✅ Given: 테스트 사용자 생성 가능
|
|
375
|
+
✅ When: 로그인 API 호출 성공
|
|
376
|
+
✅ Then: JWT 토큰 반환 확인
|
|
377
|
+
|
|
378
|
+
✅ Scenario 1 통과!
|
|
379
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
**실패 시**:
|
|
383
|
+
|
|
384
|
+
```
|
|
385
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
386
|
+
🎯 Scenario 2/4: 잘못된 비밀번호 에러
|
|
387
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
388
|
+
|
|
389
|
+
[Step 3] 검증 중...
|
|
390
|
+
✅ Given: 테스트 사용자 존재
|
|
391
|
+
✅ When: 잘못된 비밀번호로 로그인 시도
|
|
392
|
+
❌ Then: "Invalid credentials" 에러 메시지
|
|
393
|
+
실제: "Error occurred" 반환됨
|
|
394
|
+
|
|
395
|
+
[자동 수정 1/3]
|
|
396
|
+
원인: 에러 메시지 하드코딩 안됨
|
|
397
|
+
수정: auth.service.ts line 42
|
|
398
|
+
|
|
399
|
+
[재검증]
|
|
400
|
+
✅ Then: "Invalid credentials" 에러 메시지
|
|
401
|
+
|
|
402
|
+
✅ Scenario 2 통과! (수정 1회)
|
|
403
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
404
|
+
```
|
|
259
405
|
|
|
260
406
|
---
|
|
261
407
|
|
|
@@ -363,24 +509,66 @@ Phase N Complete → Next Phase
|
|
|
363
509
|
3. **Constraint compliance**: Check `<constraints>`
|
|
364
510
|
4. **Run verification**: Execute verification commands
|
|
365
511
|
|
|
366
|
-
### 4.
|
|
512
|
+
### 4. Quality Report (자동 생성)
|
|
513
|
+
|
|
514
|
+
모든 시나리오 완료 후 **품질 리포트 자동 생성**:
|
|
515
|
+
|
|
516
|
+
```
|
|
517
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
518
|
+
│ 📊 QUALITY REPORT: login │
|
|
519
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
520
|
+
│ │
|
|
521
|
+
│ ✅ 시나리오: 4/4 통과 │
|
|
522
|
+
│ │
|
|
523
|
+
│ ┌───────────────────────────────────────────────────────────┐ │
|
|
524
|
+
│ │ # │ Scenario │ Status │ Retries │ │ │
|
|
525
|
+
│ │───│───────────────────────────│────────│─────────│ │ │
|
|
526
|
+
│ │ 1 │ 유효한 로그인 성공 │ ✅ │ 0 │ │ │
|
|
527
|
+
│ │ 2 │ 잘못된 비밀번호 에러 │ ✅ │ 1 │ │ │
|
|
528
|
+
│ │ 3 │ 이메일 형식 검증 │ ✅ │ 0 │ │ │
|
|
529
|
+
│ │ 4 │ 비밀번호 찾기 링크 │ ✅ │ 0 │ │ │
|
|
530
|
+
│ └───────────────────────────────────────────────────────────┘ │
|
|
531
|
+
│ │
|
|
532
|
+
│ 📈 품질 점수: 94/100 │
|
|
533
|
+
│ │
|
|
534
|
+
│ ┌─────────────────────────────────────────────────────────┐ │
|
|
535
|
+
│ │ 항목 │ 결과 │ 비고 │ │
|
|
536
|
+
│ │───────────────────│───────│─────────────────────────────│ │
|
|
537
|
+
│ │ 빌드 │ ✅ │ npm run build 성공 │ │
|
|
538
|
+
│ │ 테스트 │ ✅ │ 12/12 통과 │ │
|
|
539
|
+
│ │ 타입 검사 │ ✅ │ 에러 0개 │ │
|
|
540
|
+
│ │ 복잡도 │ ✅ │ 모든 함수 ≤20줄 │ │
|
|
541
|
+
│ │ 보안 │ ✅ │ 취약점 0개 │ │
|
|
542
|
+
│ └─────────────────────────────────────────────────────────┘ │
|
|
543
|
+
│ │
|
|
544
|
+
│ ⏱️ 총 소요: 3m 42s │
|
|
545
|
+
│ │
|
|
546
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
**사용자가 확인할 것**:
|
|
550
|
+
- 시나리오 통과율 (4/4 = 100%)
|
|
551
|
+
- 품질 점수 (94/100)
|
|
552
|
+
- 빌드/테스트 상태
|
|
367
553
|
|
|
368
|
-
|
|
369
|
-
- [ ] Each criterion pass status
|
|
370
|
-
- [ ] Tests pass
|
|
371
|
-
- [ ] Build succeeds
|
|
554
|
+
**이것만 보면 품질을 신뢰할 수 있음.**
|
|
372
555
|
|
|
373
|
-
### 5. Update
|
|
556
|
+
### 5. Update Feature File
|
|
557
|
+
|
|
558
|
+
시나리오 상태 자동 업데이트:
|
|
374
559
|
|
|
375
|
-
Check completed Tasks:
|
|
376
560
|
```markdown
|
|
377
|
-
##
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
561
|
+
## Coverage
|
|
562
|
+
|
|
563
|
+
| Scenario | SPEC AC | Status |
|
|
564
|
+
|----------|---------|--------|
|
|
565
|
+
| 유효한 로그인 성공 | AC-1 | ✅ |
|
|
566
|
+
| 잘못된 비밀번호 에러 | AC-2 | ✅ |
|
|
567
|
+
| 이메일 형식 검증 | AC-3 | ✅ |
|
|
568
|
+
| 비밀번호 찾기 링크 | AC-4 | ✅ |
|
|
569
|
+
|
|
570
|
+
**Last verified**: 2024-01-15 14:32
|
|
571
|
+
**Quality score**: 94/100
|
|
384
572
|
```
|
|
385
573
|
|
|
386
574
|
## TRUST 5 Principles
|
|
@@ -410,69 +598,104 @@ Follow during implementation:
|
|
|
410
598
|
## Example
|
|
411
599
|
|
|
412
600
|
```
|
|
413
|
-
User: /vibe.run "
|
|
601
|
+
User: /vibe.run "login"
|
|
414
602
|
|
|
415
603
|
Claude:
|
|
416
|
-
📄
|
|
604
|
+
📄 Loading SPEC: .vibe/specs/login.md
|
|
605
|
+
📄 Loading Feature: .vibe/features/login.feature
|
|
417
606
|
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
607
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
608
|
+
📋 Scenarios to Implement
|
|
609
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
421
610
|
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
611
|
+
| # | Scenario | Status |
|
|
612
|
+
|---|----------|--------|
|
|
613
|
+
| 1 | 유효한 로그인 성공 | ⬜ |
|
|
614
|
+
| 2 | 잘못된 비밀번호 에러 | ⬜ |
|
|
615
|
+
| 3 | 이메일 형식 검증 | ⬜ |
|
|
616
|
+
| 4 | 비밀번호 찾기 링크 | ⬜ |
|
|
425
617
|
|
|
426
|
-
|
|
427
|
-
- Phase 1: Project setup (3 tasks)
|
|
428
|
-
- Phase 2: Game logic (5 tasks)
|
|
429
|
-
- Phase 3: UI/UX (3 tasks)
|
|
430
|
-
- Phase 4: Testing (2 tasks)
|
|
618
|
+
Total: 4 scenarios
|
|
431
619
|
|
|
432
|
-
|
|
620
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
621
|
+
🎯 Scenario 1/4: 유효한 로그인 성공
|
|
622
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
433
623
|
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
- Checking TypeScript configuration standards
|
|
438
|
-
- Finding game loop conventions
|
|
624
|
+
Given: 사용자가 등록되어 있다
|
|
625
|
+
When: 유효한 이메일과 비밀번호로 로그인
|
|
626
|
+
Then: 로그인 성공 + JWT 토큰 반환
|
|
439
627
|
|
|
440
|
-
|
|
441
|
-
|
|
628
|
+
⚡ [PARALLEL] 탐색 중...
|
|
629
|
+
✅ 탐색 완료 (2.1s)
|
|
442
630
|
|
|
443
|
-
🔨
|
|
444
|
-
|
|
631
|
+
🔨 구현 중...
|
|
632
|
+
✅ auth.service.ts - login() 추가
|
|
633
|
+
✅ auth.controller.ts - POST /login
|
|
445
634
|
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
635
|
+
🔍 검증 중...
|
|
636
|
+
✅ Given: OK
|
|
637
|
+
✅ When: OK
|
|
638
|
+
✅ Then: OK
|
|
450
639
|
|
|
451
|
-
|
|
640
|
+
✅ Scenario 1 통과!
|
|
452
641
|
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
642
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
643
|
+
🎯 Scenario 2/4: 잘못된 비밀번호 에러
|
|
644
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
645
|
+
|
|
646
|
+
🔨 구현 중...
|
|
647
|
+
✅ auth.service.ts - 비밀번호 검증 로직
|
|
458
648
|
|
|
459
|
-
|
|
649
|
+
🔍 검증 중...
|
|
650
|
+
✅ Given: OK
|
|
651
|
+
✅ When: OK
|
|
652
|
+
❌ Then: "Invalid credentials" 에러 메시지
|
|
653
|
+
실제: "Error" 반환
|
|
460
654
|
|
|
461
|
-
|
|
462
|
-
|
|
655
|
+
🔄 자동 수정 1/3...
|
|
656
|
+
수정: auth.service.ts line 42
|
|
463
657
|
|
|
464
|
-
|
|
658
|
+
🔍 재검증...
|
|
659
|
+
✅ Then: OK
|
|
465
660
|
|
|
466
|
-
✅
|
|
467
|
-
📊 Verifying Acceptance Criteria...
|
|
468
|
-
✅ Game start/end works
|
|
469
|
-
✅ Ball-paddle collision handling
|
|
470
|
-
✅ Score display
|
|
471
|
-
✅ npm run build succeeds
|
|
661
|
+
✅ Scenario 2 통과! (수정 1회)
|
|
472
662
|
|
|
473
|
-
|
|
663
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
664
|
+
🎯 Scenario 3/4: 이메일 형식 검증
|
|
665
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
666
|
+
|
|
667
|
+
🔨 구현 중...
|
|
668
|
+
🔍 검증 중...
|
|
669
|
+
✅ Scenario 3 통과!
|
|
670
|
+
|
|
671
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
672
|
+
🎯 Scenario 4/4: 비밀번호 찾기 링크
|
|
673
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
674
|
+
|
|
675
|
+
🔨 구현 중...
|
|
676
|
+
🔍 검증 중...
|
|
677
|
+
✅ Scenario 4 통과!
|
|
678
|
+
|
|
679
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
680
|
+
│ 📊 QUALITY REPORT: login │
|
|
681
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
682
|
+
│ │
|
|
683
|
+
│ ✅ 시나리오: 4/4 통과 │
|
|
684
|
+
│ │
|
|
685
|
+
│ | # | Scenario | Status | Retries | │
|
|
686
|
+
│ |---|───────────────────────|───────|─────────| │
|
|
687
|
+
│ | 1 | 유효한 로그인 성공 | ✅ | 0 | │
|
|
688
|
+
│ | 2 | 잘못된 비밀번호 에러 | ✅ | 1 | │
|
|
689
|
+
│ | 3 | 이메일 형식 검증 | ✅ | 0 | │
|
|
690
|
+
│ | 4 | 비밀번호 찾기 링크 | ✅ | 0 | │
|
|
691
|
+
│ │
|
|
692
|
+
│ 📈 품질 점수: 94/100 │
|
|
693
|
+
│ 빌드: ✅ | 테스트: ✅ | 타입: ✅ │
|
|
694
|
+
│ │
|
|
695
|
+
│ ⏱️ 총 소요: 3m 42s │
|
|
696
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
474
697
|
|
|
475
|
-
|
|
698
|
+
🎉 구현 완료! 모든 시나리오 통과.
|
|
476
699
|
```
|
|
477
700
|
|
|
478
701
|
### Phase-specific Execution
|
|
@@ -5,7 +5,9 @@ argument-hint: "feature name"
|
|
|
5
5
|
|
|
6
6
|
# /vibe.verify
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
**품질 검증 자동화** - 비개발자도 품질을 신뢰할 수 있도록.
|
|
9
|
+
|
|
10
|
+
> 모든 시나리오 통과 = 품질 보장
|
|
9
11
|
|
|
10
12
|
## Usage
|
|
11
13
|
|
|
@@ -13,72 +15,134 @@ Verify implementation based on Feature scenarios.
|
|
|
13
15
|
/vibe.verify "feature-name"
|
|
14
16
|
```
|
|
15
17
|
|
|
16
|
-
##
|
|
18
|
+
## 핵심 원칙
|
|
17
19
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
```
|
|
21
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
22
|
+
│ 비개발자가 알아야 할 것 │
|
|
23
|
+
│ │
|
|
24
|
+
│ ✅ 시나리오 4/4 통과 │
|
|
25
|
+
│ 📈 품질 점수: 94/100 │
|
|
26
|
+
│ │
|
|
27
|
+
│ 이것만 보면 됨. 나머지는 시스템이 알아서. │
|
|
28
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
29
|
+
```
|
|
21
30
|
|
|
22
31
|
## Process
|
|
23
32
|
|
|
24
33
|
### 1. Load Feature File
|
|
25
34
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
35
|
+
```
|
|
36
|
+
📄 .vibe/features/{feature-name}.feature → 시나리오 목록
|
|
37
|
+
📄 .vibe/specs/{feature-name}.md → 검증 기준 (참조)
|
|
38
|
+
```
|
|
29
39
|
|
|
30
|
-
|
|
40
|
+
**Feature 파일이 없으면**:
|
|
41
|
+
```
|
|
42
|
+
❌ Feature 파일이 없습니다.
|
|
43
|
+
먼저 /vibe.spec "{feature-name}"을 실행하세요.
|
|
44
|
+
```
|
|
31
45
|
|
|
32
|
-
|
|
33
|
-
2. **When** (Action) - Execute feature
|
|
34
|
-
3. **Then** (Result) - Verify expected result
|
|
46
|
+
### 2. Scenario-by-Scenario Verification
|
|
35
47
|
|
|
36
|
-
|
|
48
|
+
각 시나리오별 자동 검증:
|
|
37
49
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
50
|
+
```
|
|
51
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
52
|
+
🔍 Scenario 1/4: 유효한 로그인 성공
|
|
53
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
41
54
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
55
|
+
Given: 사용자가 등록되어 있다
|
|
56
|
+
→ 검증: 사용자 생성 API 존재? ✅
|
|
57
|
+
→ 검증: 테스트 사용자 데이터? ✅
|
|
45
58
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
59
|
+
When: 유효한 이메일과 비밀번호로 로그인
|
|
60
|
+
→ 검증: POST /login 엔드포인트? ✅
|
|
61
|
+
→ 검증: 요청 처리 로직? ✅
|
|
49
62
|
|
|
50
|
-
|
|
63
|
+
Then: 로그인 성공 + JWT 토큰 반환
|
|
64
|
+
→ 검증: 성공 응답 코드 200? ✅
|
|
65
|
+
→ 검증: JWT 토큰 포함? ✅
|
|
51
66
|
|
|
52
|
-
|
|
53
|
-
|
|
67
|
+
✅ Scenario 1 통과!
|
|
68
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
69
|
+
```
|
|
54
70
|
|
|
55
|
-
|
|
56
|
-
- **Total Scenarios**: N
|
|
57
|
-
- **Passed**: N ✅
|
|
58
|
-
- **Failed**: N ❌
|
|
59
|
-
- **Quality Score**: XX/100
|
|
71
|
+
### 3. Verification Methods (자동 선택)
|
|
60
72
|
|
|
61
|
-
|
|
73
|
+
| 방법 | 조건 | 검증 내용 |
|
|
74
|
+
|------|------|-----------|
|
|
75
|
+
| **테스트 실행** | 테스트 파일 존재 시 | `npm test`, `pytest` 등 실행 |
|
|
76
|
+
| **코드 분석** | 항상 | 구현 여부, 로직 확인 |
|
|
77
|
+
| **빌드 검증** | 빌드 스크립트 존재 시 | 컴파일 에러 확인 |
|
|
78
|
+
| **타입 검사** | TypeScript 등 | 타입 에러 확인 |
|
|
62
79
|
|
|
63
|
-
###
|
|
64
|
-
- Given: Verified
|
|
65
|
-
- When: Implemented
|
|
66
|
-
- Then: Works
|
|
67
|
-
- **Verification**: AC-1 satisfied
|
|
80
|
+
### 4. Quality Report (자동 생성)
|
|
68
81
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
82
|
+
```
|
|
83
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
84
|
+
│ 📊 VERIFICATION REPORT: login │
|
|
85
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
86
|
+
│ │
|
|
87
|
+
│ ✅ 시나리오: 4/4 통과 (100%) │
|
|
88
|
+
│ │
|
|
89
|
+
│ ┌───────────────────────────────────────────────────────────┐ │
|
|
90
|
+
│ │ # │ Scenario │ Given │ When │ Then │ Status │ │
|
|
91
|
+
│ │───│───────────────────────│───────│──────│──────│────────│ │
|
|
92
|
+
│ │ 1 │ 유효한 로그인 성공 │ ✅ │ ✅ │ ✅ │ ✅ │ │
|
|
93
|
+
│ │ 2 │ 잘못된 비밀번호 에러 │ ✅ │ ✅ │ ✅ │ ✅ │ │
|
|
94
|
+
│ │ 3 │ 이메일 형식 검증 │ ✅ │ ✅ │ ✅ │ ✅ │ │
|
|
95
|
+
│ │ 4 │ 비밀번호 찾기 링크 │ ✅ │ ✅ │ ✅ │ ✅ │ │
|
|
96
|
+
│ └───────────────────────────────────────────────────────────┘ │
|
|
97
|
+
│ │
|
|
98
|
+
│ 📈 품질 점수: 94/100 │
|
|
99
|
+
│ │
|
|
100
|
+
│ ┌─────────────────────────────────────────────────────────┐ │
|
|
101
|
+
│ │ 항목 │ 결과 │ 상세 │ │
|
|
102
|
+
│ │───────────────────│───────│─────────────────────────────│ │
|
|
103
|
+
│ │ 빌드 │ ✅ │ 성공 │ │
|
|
104
|
+
│ │ 테스트 │ ✅ │ 12/12 통과 │ │
|
|
105
|
+
│ │ 타입 검사 │ ✅ │ 에러 0개 │ │
|
|
106
|
+
│ │ 복잡도 │ ✅ │ 모든 함수 ≤20줄 │ │
|
|
107
|
+
│ │ 코드 커버리지 │ ⚠️ │ 78% (목표: 80%) │ │
|
|
108
|
+
│ └─────────────────────────────────────────────────────────┘ │
|
|
109
|
+
│ │
|
|
110
|
+
│ 📋 권장 사항: │
|
|
111
|
+
│ - 코드 커버리지 2% 추가 필요 (auth.service.ts line 45-52) │
|
|
112
|
+
│ │
|
|
113
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
114
|
+
```
|
|
74
115
|
|
|
75
|
-
|
|
76
|
-
- Complexity: ✅ Appropriate
|
|
77
|
-
- Test Coverage: XX%
|
|
78
|
-
- Error Handling: ✅
|
|
116
|
+
### 실패 시 리포트
|
|
79
117
|
|
|
80
|
-
|
|
81
|
-
|
|
118
|
+
```
|
|
119
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
120
|
+
│ 📊 VERIFICATION REPORT: login │
|
|
121
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
122
|
+
│ │
|
|
123
|
+
│ ❌ 시나리오: 3/4 통과 (75%) │
|
|
124
|
+
│ │
|
|
125
|
+
│ ┌───────────────────────────────────────────────────────────┐ │
|
|
126
|
+
│ │ # │ Scenario │ Given │ When │ Then │ Status │ │
|
|
127
|
+
│ │───│───────────────────────│───────│──────│──────│────────│ │
|
|
128
|
+
│ │ 1 │ 유효한 로그인 성공 │ ✅ │ ✅ │ ✅ │ ✅ │ │
|
|
129
|
+
│ │ 2 │ 잘못된 비밀번호 에러 │ ✅ │ ✅ │ ✅ │ ✅ │ │
|
|
130
|
+
│ │ 3 │ 이메일 형식 검증 │ ✅ │ ✅ │ ✅ │ ✅ │ │
|
|
131
|
+
│ │ 4 │ 비밀번호 찾기 링크 │ ✅ │ ❌ │ - │ ❌ │ │
|
|
132
|
+
│ └───────────────────────────────────────────────────────────┘ │
|
|
133
|
+
│ │
|
|
134
|
+
│ ❌ 실패 상세: │
|
|
135
|
+
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
|
|
136
|
+
│ Scenario 4: 비밀번호 찾기 링크 │
|
|
137
|
+
│ │
|
|
138
|
+
│ When: "비밀번호 찾기" 클릭 │
|
|
139
|
+
│ ❌ 문제: 링크가 구현되지 않음 │
|
|
140
|
+
│ 📍 위치: LoginForm.tsx line 42 │
|
|
141
|
+
│ 💡 수정: "Forgot password" 링크 추가 필요 │
|
|
142
|
+
│ │
|
|
143
|
+
│ 🔧 자동 수정 실행: /vibe.run "login" --fix │
|
|
144
|
+
│ │
|
|
145
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
82
146
|
```
|
|
83
147
|
|
|
84
148
|
## Input
|
|
@@ -99,40 +163,62 @@ For each Scenario:
|
|
|
99
163
|
User: /vibe.verify "login"
|
|
100
164
|
|
|
101
165
|
Claude:
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
-
|
|
135
|
-
|
|
166
|
+
📄 Loading Feature: .vibe/features/login.feature
|
|
167
|
+
🔍 검증 시작...
|
|
168
|
+
|
|
169
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
170
|
+
🔍 Scenario 1/4: 유효한 로그인 성공
|
|
171
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
172
|
+
✅ Given: 사용자 등록 - OK
|
|
173
|
+
✅ When: 로그인 시도 - OK
|
|
174
|
+
✅ Then: JWT 토큰 반환 - OK
|
|
175
|
+
✅ 통과!
|
|
176
|
+
|
|
177
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
178
|
+
🔍 Scenario 2/4: 잘못된 비밀번호 에러
|
|
179
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
180
|
+
✅ Given: OK
|
|
181
|
+
✅ When: OK
|
|
182
|
+
✅ Then: OK
|
|
183
|
+
✅ 통과!
|
|
184
|
+
|
|
185
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
186
|
+
🔍 Scenario 3/4: 이메일 형식 검증
|
|
187
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
188
|
+
✅ Given: OK
|
|
189
|
+
✅ When: OK
|
|
190
|
+
✅ Then: OK
|
|
191
|
+
✅ 통과!
|
|
192
|
+
|
|
193
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
194
|
+
🔍 Scenario 4/4: 비밀번호 찾기 링크
|
|
195
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
196
|
+
✅ Given: OK
|
|
197
|
+
❌ When: "비밀번호 찾기" 링크 - 없음
|
|
198
|
+
- Then: (스킵)
|
|
199
|
+
❌ 실패!
|
|
200
|
+
|
|
201
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
202
|
+
│ 📊 VERIFICATION REPORT: login │
|
|
203
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
204
|
+
│ │
|
|
205
|
+
│ ❌ 시나리오: 3/4 통과 (75%) │
|
|
206
|
+
│ │
|
|
207
|
+
│ | # | Scenario | Status | │
|
|
208
|
+
│ |---|───────────────────────|────────| │
|
|
209
|
+
│ | 1 | 유효한 로그인 성공 | ✅ | │
|
|
210
|
+
│ | 2 | 잘못된 비밀번호 에러 | ✅ | │
|
|
211
|
+
│ | 3 | 이메일 형식 검증 | ✅ | │
|
|
212
|
+
│ | 4 | 비밀번호 찾기 링크 | ❌ | │
|
|
213
|
+
│ │
|
|
214
|
+
│ 📈 품질 점수: 75/100 │
|
|
215
|
+
│ │
|
|
216
|
+
│ ❌ 수정 필요: │
|
|
217
|
+
│ - Scenario 4: LoginForm.tsx에 "Forgot password" 링크 추가 │
|
|
218
|
+
│ │
|
|
219
|
+
│ 🔧 자동 수정: /vibe.run "login" --fix │
|
|
220
|
+
│ │
|
|
221
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
136
222
|
```
|
|
137
223
|
|
|
138
224
|
## Next Step
|
package/.claude/settings.json
CHANGED
|
@@ -48,68 +48,5 @@
|
|
|
48
48
|
],
|
|
49
49
|
"deny": [],
|
|
50
50
|
"ask": []
|
|
51
|
-
},
|
|
52
|
-
"hooks": {
|
|
53
|
-
"SessionStart": [
|
|
54
|
-
{
|
|
55
|
-
"hooks": [
|
|
56
|
-
{
|
|
57
|
-
"type": "prompt",
|
|
58
|
-
"prompt": "Call mcp__vibe__start_session to restore previous session context."
|
|
59
|
-
}
|
|
60
|
-
]
|
|
61
|
-
}
|
|
62
|
-
],
|
|
63
|
-
"UserPromptSubmit": [
|
|
64
|
-
{
|
|
65
|
-
"matcher": "ultrawork|ulw|울트라워크",
|
|
66
|
-
"hooks": [
|
|
67
|
-
{
|
|
68
|
-
"type": "prompt",
|
|
69
|
-
"prompt": "🚀 ULTRAWORK MODE DETECTED. You MUST: (1) Use PARALLEL Task calls for ALL exploration, (2) Enable Boulder Loop - auto-continue through ALL phases without pausing, (3) Auto-retry on errors up to 3 times, (4) Run mcp__vibe__auto_save_context at 70%+ context, (5) Do NOT ask for confirmation between phases. Keep rolling until ALL acceptance criteria pass."
|
|
70
|
-
}
|
|
71
|
-
]
|
|
72
|
-
}
|
|
73
|
-
],
|
|
74
|
-
"PostToolUse": [
|
|
75
|
-
{
|
|
76
|
-
"matcher": "Write|Edit",
|
|
77
|
-
"hooks": [
|
|
78
|
-
{
|
|
79
|
-
"type": "prompt",
|
|
80
|
-
"prompt": "Silently check .vibe/rules/quality/checklist.md. Fix critical issues (syntax errors, security vulnerabilities) inline. Do NOT stop to report - continue your current task."
|
|
81
|
-
}
|
|
82
|
-
]
|
|
83
|
-
}
|
|
84
|
-
],
|
|
85
|
-
"Notification": [
|
|
86
|
-
{
|
|
87
|
-
"matcher": "context_window_70",
|
|
88
|
-
"hooks": [
|
|
89
|
-
{
|
|
90
|
-
"type": "prompt",
|
|
91
|
-
"prompt": "Context at 70%. You still have headroom - don't rush or produce sloppy work. But start being selective about file reads. If ULTRAWORK mode: run mcp__vibe__auto_save_context now."
|
|
92
|
-
}
|
|
93
|
-
]
|
|
94
|
-
},
|
|
95
|
-
{
|
|
96
|
-
"matcher": "context_window_85",
|
|
97
|
-
"hooks": [
|
|
98
|
-
{
|
|
99
|
-
"type": "prompt",
|
|
100
|
-
"prompt": "Context at 85%. IMMEDIATELY run mcp__vibe__auto_save_context with urgency='high'. Summarize current progress and next steps. Compress verbose outputs."
|
|
101
|
-
}
|
|
102
|
-
]
|
|
103
|
-
},
|
|
104
|
-
{
|
|
105
|
-
"matcher": "context_window_95",
|
|
106
|
-
"hooks": [
|
|
107
|
-
{
|
|
108
|
-
"type": "prompt",
|
|
109
|
-
"prompt": "Context at 95% - CRITICAL. Run mcp__vibe__auto_save_context with urgency='critical' NOW. Save all progress, blockers, and next steps. Prepare for session transition. If in ULTRAWORK mode, the next session will auto-restore and continue."
|
|
110
|
-
}
|
|
111
|
-
]
|
|
112
|
-
}
|
|
113
|
-
]
|
|
114
51
|
}
|
|
115
52
|
}
|
package/README.md
CHANGED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
**SPEC-driven AI coding framework (Claude Code 전용)**
|
|
4
4
|
|
|
5
|
-
SPEC 문서 하나로 AI가 바로
|
|
5
|
+
SPEC 문서 하나로 AI가 바로 구현하고, **시나리오별 자동 검증**으로 품질을 보장하는 프레임워크.
|
|
6
|
+
|
|
7
|
+
> **품질은 사용자가 신경 쓰는 게 아니라, 시스템이 보장하는 것.**
|
|
6
8
|
|
|
7
9
|
[](https://www.npmjs.com/package/@su-record/vibe)
|
|
8
10
|
[](https://opensource.org/licenses/MIT)
|
|
@@ -12,12 +14,12 @@ SPEC 문서 하나로 AI가 바로 구현하는 2-step 워크플로우.
|
|
|
12
14
|
|
|
13
15
|
## Features
|
|
14
16
|
|
|
15
|
-
-
|
|
17
|
+
- **시나리오 주도 개발 (SDD)**: 각 시나리오 = 구현 단위 = 검증 단위
|
|
18
|
+
- **BDD 자동 검증**: Given/When/Then 단계별 자동 품질 검증
|
|
19
|
+
- **품질 보장 시스템**: 비개발자도 품질을 신뢰할 수 있는 자동화
|
|
16
20
|
- **ULTRAWORK Mode**: `ulw` 한 단어로 모든 최적화 자동 활성화
|
|
17
|
-
- **Boulder Loop**: 모든
|
|
21
|
+
- **Boulder Loop**: 모든 시나리오 완료까지 자동 진행
|
|
18
22
|
- **병렬 서브에이전트**: Haiku 3+ 동시 탐색으로 ~3배 속도 향상
|
|
19
|
-
- **PTCF 구조**: Persona, Task, Context, Format - Gemini 프롬프트 최적화
|
|
20
|
-
- **코딩 규칙 내장**: `.vibe/rules/` - 품질 기준, 복잡도 제한, 안티패턴
|
|
21
23
|
- **자동 컨텍스트 관리**: 70%+ 시 자동 압축/저장
|
|
22
24
|
- **36개 MCP 도구**: @su-record/hi-ai 통합
|
|
23
25
|
|
|
@@ -63,19 +65,33 @@ cd my-project
|
|
|
63
65
|
│ /vibe.spec "기능명" │
|
|
64
66
|
│ ↓ 대화형 요구사항 수집 │
|
|
65
67
|
│ ↓ .vibe/specs/{기능명}.md (PTCF 구조) │
|
|
66
|
-
│ ↓ .vibe/features/{기능명}.feature (BDD)
|
|
68
|
+
│ ↓ .vibe/features/{기능명}.feature (BDD 시나리오) │
|
|
67
69
|
├─────────────────────────────────────────────────────┤
|
|
68
70
|
│ /vibe.run "기능명" ultrawork │
|
|
69
|
-
│ ↓
|
|
70
|
-
│ ↓
|
|
71
|
-
│ ↓
|
|
71
|
+
│ ↓ 시나리오별 구현 + 즉시 검증 (SDD) │
|
|
72
|
+
│ ↓ Scenario 1 → 구현 → ✅ → Scenario 2 → ... │
|
|
73
|
+
│ ↓ 실패 시 자동 재시도 (최대 3회) │
|
|
72
74
|
├─────────────────────────────────────────────────────┤
|
|
73
75
|
│ /vibe.verify "기능명" │
|
|
74
|
-
│ ↓
|
|
75
|
-
│ ↓ 품질
|
|
76
|
+
│ ↓ Given/When/Then 단계별 검증 │
|
|
77
|
+
│ ↓ 품질 리포트 자동 생성 │
|
|
76
78
|
└─────────────────────────────────────────────────────┘
|
|
77
79
|
```
|
|
78
80
|
|
|
81
|
+
### 시나리오 주도 개발 (SDD)
|
|
82
|
+
|
|
83
|
+
> **각 시나리오가 곧 구현 단위이자 검증 단위입니다.**
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
Feature 로드 → Scenario 1 [구현→검증] → Scenario 2 [구현→검증] → ... → 품질 리포트
|
|
87
|
+
↓ ↓
|
|
88
|
+
✅ 통과 시 다음 ❌ 실패 시 수정 후 재검증
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
비개발자도 시나리오 통과율만 보면 품질을 알 수 있습니다:
|
|
92
|
+
- ✅ 4/4 시나리오 통과 = 품질 보장
|
|
93
|
+
- 📈 품질 점수: 94/100
|
|
94
|
+
|
|
79
95
|
---
|
|
80
96
|
|
|
81
97
|
## Commands
|
|
@@ -152,27 +168,71 @@ cd my-project
|
|
|
152
168
|
|
|
153
169
|
### Boulder Loop
|
|
154
170
|
|
|
155
|
-
시지푸스처럼 바위를 굴리듯, **모든
|
|
171
|
+
시지푸스처럼 바위를 굴리듯, **모든 시나리오가 통과될 때까지** 자동으로 진행:
|
|
156
172
|
|
|
157
173
|
```
|
|
158
|
-
|
|
159
|
-
↓
|
|
160
|
-
[
|
|
161
|
-
[
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
174
|
+
Scenario 1 → Scenario 2 → Scenario 3 → ... → Scenario N
|
|
175
|
+
↓ ↓ ↓ ↓
|
|
176
|
+
[탐색+구현] [탐색+구현] [탐색+구현] [탐색+구현]
|
|
177
|
+
[즉시 검증] [즉시 검증] [즉시 검증] [즉시 검증]
|
|
178
|
+
✅ ✅ ✅ ✅
|
|
179
|
+
↓
|
|
180
|
+
🎉 품질 보장 완료!
|
|
165
181
|
```
|
|
166
182
|
|
|
167
183
|
### 일반 모드 vs ULTRAWORK
|
|
168
184
|
|
|
169
185
|
| 항목 | 일반 모드 | ULTRAWORK |
|
|
170
186
|
|------|----------|-----------|
|
|
171
|
-
|
|
|
172
|
-
|
|
|
187
|
+
| 시나리오 전환 | 일시정지 가능 | 자동 진행 |
|
|
188
|
+
| 검증 실패 | 보고 후 중단 | 자동 재시도 (3회) |
|
|
173
189
|
| 컨텍스트 70%+ | 경고만 | 자동 압축/저장 |
|
|
174
190
|
| 탐색 방식 | 순차 가능 | **강제 병렬** |
|
|
175
|
-
| 완료 조건 |
|
|
191
|
+
| 완료 조건 | 시나리오별 | 전체 시나리오 통과까지 |
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## BDD 자동 검증
|
|
196
|
+
|
|
197
|
+
### 품질 리포트 예시
|
|
198
|
+
|
|
199
|
+
`/vibe.verify` 실행 시 자동 생성되는 품질 리포트:
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
203
|
+
│ 📊 VERIFICATION REPORT: login │
|
|
204
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
205
|
+
│ │
|
|
206
|
+
│ ✅ 시나리오: 4/4 통과 (100%) │
|
|
207
|
+
│ │
|
|
208
|
+
│ | # | Scenario | Given | When | Then | Status | │
|
|
209
|
+
│ |---|───────────────────────|───────|──────|──────|────────| │
|
|
210
|
+
│ | 1 | 유효한 로그인 성공 | ✅ | ✅ | ✅ | ✅ | │
|
|
211
|
+
│ | 2 | 잘못된 비밀번호 에러 | ✅ | ✅ | ✅ | ✅ | │
|
|
212
|
+
│ | 3 | 이메일 형식 검증 | ✅ | ✅ | ✅ | ✅ | │
|
|
213
|
+
│ | 4 | 비밀번호 찾기 링크 | ✅ | ✅ | ✅ | ✅ | │
|
|
214
|
+
│ │
|
|
215
|
+
│ 📈 품질 점수: 94/100 │
|
|
216
|
+
│ │
|
|
217
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### 검증 실패 시
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
❌ Scenario 4: 비밀번호 찾기 링크
|
|
224
|
+
|
|
225
|
+
When: "비밀번호 찾기" 클릭
|
|
226
|
+
❌ 문제: 링크가 구현되지 않음
|
|
227
|
+
📍 위치: LoginForm.tsx line 42
|
|
228
|
+
💡 수정: "Forgot password" 링크 추가 필요
|
|
229
|
+
|
|
230
|
+
🔧 자동 수정: /vibe.run "login" --fix
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
비개발자가 알아야 할 것:
|
|
234
|
+
- ✅ 시나리오 4/4 통과 → **품질 보장됨**
|
|
235
|
+
- ❌ 시나리오 3/4 통과 → **수정 필요** (자동 수정 가능)
|
|
176
236
|
|
|
177
237
|
---
|
|
178
238
|
|
|
@@ -202,6 +262,31 @@ project/
|
|
|
202
262
|
|
|
203
263
|
---
|
|
204
264
|
|
|
265
|
+
## Feature 파일 (BDD 시나리오)
|
|
266
|
+
|
|
267
|
+
```gherkin
|
|
268
|
+
# .vibe/features/login.feature
|
|
269
|
+
|
|
270
|
+
Feature: 로그인
|
|
271
|
+
|
|
272
|
+
Scenario: 유효한 로그인 성공
|
|
273
|
+
Given 사용자가 등록되어 있다
|
|
274
|
+
# 검증: 사용자 생성 API 존재
|
|
275
|
+
When 유효한 이메일과 비밀번호로 로그인
|
|
276
|
+
# 검증: POST /login 엔드포인트
|
|
277
|
+
Then 로그인 성공 + JWT 토큰 반환
|
|
278
|
+
# 검증: 200 응답 + 토큰 포함
|
|
279
|
+
|
|
280
|
+
Scenario: 잘못된 비밀번호 에러
|
|
281
|
+
Given 사용자가 등록되어 있다
|
|
282
|
+
When 잘못된 비밀번호로 로그인
|
|
283
|
+
Then 401 에러 + "비밀번호가 틀립니다" 메시지
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
각 시나리오의 Given/When/Then이 자동 검증 포인트가 됩니다.
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
205
290
|
## SPEC Document (PTCF Structure)
|
|
206
291
|
|
|
207
292
|
```markdown
|
|
@@ -217,16 +302,16 @@ AI의 역할과 전문성 정의
|
|
|
217
302
|
- 배경, 목적
|
|
218
303
|
- 기술 스택
|
|
219
304
|
- 관련 코드
|
|
220
|
-
- 디자인 레퍼런스
|
|
221
305
|
</context>
|
|
222
306
|
|
|
223
307
|
## Task
|
|
224
308
|
<task>
|
|
225
|
-
###
|
|
226
|
-
|
|
227
|
-
|
|
309
|
+
### Scenario 1: {시나리오명}
|
|
310
|
+
Given: {전제 조건}
|
|
311
|
+
When: {사용자 행동}
|
|
312
|
+
Then: {예상 결과}
|
|
228
313
|
|
|
229
|
-
###
|
|
314
|
+
### Scenario 2: {시나리오명}
|
|
230
315
|
...
|
|
231
316
|
</task>
|
|
232
317
|
|
|
@@ -236,17 +321,10 @@ AI의 역할과 전문성 정의
|
|
|
236
321
|
- 에러 메시지 한글화
|
|
237
322
|
</constraints>
|
|
238
323
|
|
|
239
|
-
## Output Format
|
|
240
|
-
<output_format>
|
|
241
|
-
- 생성할 파일
|
|
242
|
-
- 수정할 파일
|
|
243
|
-
- 검증 명령어
|
|
244
|
-
</output_format>
|
|
245
|
-
|
|
246
324
|
## Acceptance Criteria
|
|
247
325
|
<acceptance>
|
|
248
|
-
- [ ]
|
|
249
|
-
- [ ]
|
|
326
|
+
- [ ] Scenario 1 통과
|
|
327
|
+
- [ ] Scenario 2 통과
|
|
250
328
|
</acceptance>
|
|
251
329
|
```
|
|
252
330
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
# Feature: {기능명}
|
|
2
2
|
|
|
3
|
+
> 이 파일은 **품질 보장의 핵심**입니다. 모든 시나리오 통과 = 기능 완성.
|
|
4
|
+
|
|
3
5
|
**SPEC**: `.vibe/specs/{기능명}.md`
|
|
6
|
+
**Last verified**: -
|
|
7
|
+
**Quality score**: -
|
|
8
|
+
|
|
9
|
+
---
|
|
4
10
|
|
|
5
11
|
## User Story
|
|
6
12
|
|
|
@@ -12,59 +18,79 @@
|
|
|
12
18
|
|
|
13
19
|
## Scenarios
|
|
14
20
|
|
|
21
|
+
> 각 시나리오가 구현 단위이자 검증 단위입니다.
|
|
22
|
+
|
|
15
23
|
### Scenario 1: {Happy Path - 정상 케이스}
|
|
16
24
|
|
|
17
25
|
```gherkin
|
|
18
26
|
Scenario: {시나리오 제목}
|
|
19
27
|
Given {전제 조건}
|
|
28
|
+
# 검증: {무엇을 확인하는가}
|
|
20
29
|
When {사용자 행동}
|
|
30
|
+
# 검증: {어떤 기능이 실행되는가}
|
|
21
31
|
Then {예상 결과}
|
|
32
|
+
# 검증: {무엇이 보이거나 반환되는가}
|
|
22
33
|
```
|
|
23
34
|
|
|
24
|
-
|
|
35
|
+
**SPEC AC**: #1
|
|
36
|
+
**Status**: ⬜
|
|
25
37
|
|
|
26
38
|
---
|
|
27
39
|
|
|
28
|
-
### Scenario 2: {Edge Case -
|
|
40
|
+
### Scenario 2: {Edge Case - 에러 케이스}
|
|
29
41
|
|
|
30
42
|
```gherkin
|
|
31
43
|
Scenario: {에러 시나리오 제목}
|
|
32
44
|
Given {전제 조건}
|
|
33
|
-
When {잘못된 입력}
|
|
34
|
-
Then {에러 처리}
|
|
45
|
+
When {잘못된 입력 또는 예외 상황}
|
|
46
|
+
Then {에러 메시지 또는 적절한 처리}
|
|
35
47
|
```
|
|
36
48
|
|
|
37
|
-
|
|
49
|
+
**SPEC AC**: #2
|
|
50
|
+
**Status**: ⬜
|
|
38
51
|
|
|
39
52
|
---
|
|
40
53
|
|
|
41
|
-
### Scenario
|
|
54
|
+
### Scenario 3: {Boundary Case - 경계 케이스}
|
|
42
55
|
|
|
43
56
|
```gherkin
|
|
44
|
-
Scenario
|
|
57
|
+
Scenario: {경계값 테스트}
|
|
45
58
|
Given {전제 조건}
|
|
46
|
-
When
|
|
47
|
-
Then
|
|
48
|
-
|
|
49
|
-
Examples:
|
|
50
|
-
| input | output |
|
|
51
|
-
| value1 | result1 |
|
|
52
|
-
| value2 | result2 |
|
|
59
|
+
When {경계값 입력}
|
|
60
|
+
Then {적절한 처리}
|
|
53
61
|
```
|
|
54
62
|
|
|
63
|
+
**SPEC AC**: #3
|
|
64
|
+
**Status**: ⬜
|
|
65
|
+
|
|
55
66
|
---
|
|
56
67
|
|
|
57
|
-
## Coverage
|
|
68
|
+
## Coverage Summary
|
|
58
69
|
|
|
59
|
-
| Scenario | SPEC
|
|
60
|
-
|
|
61
|
-
|
|
|
62
|
-
|
|
|
70
|
+
| # | Scenario | SPEC AC | Status | Retries |
|
|
71
|
+
|---|----------|---------|--------|---------|
|
|
72
|
+
| 1 | {Happy Path} | AC-1 | ⬜ | - |
|
|
73
|
+
| 2 | {Edge Case} | AC-2 | ⬜ | - |
|
|
74
|
+
| 3 | {Boundary Case} | AC-3 | ⬜ | - |
|
|
75
|
+
|
|
76
|
+
**Total**: 0/3 통과 (0%)
|
|
63
77
|
|
|
64
78
|
---
|
|
65
79
|
|
|
66
|
-
## Verification
|
|
80
|
+
## Verification Commands
|
|
67
81
|
|
|
68
82
|
```bash
|
|
83
|
+
# 전체 검증
|
|
69
84
|
/vibe.verify "{기능명}"
|
|
85
|
+
|
|
86
|
+
# 실패 시 자동 수정
|
|
87
|
+
/vibe.run "{기능명}" --fix
|
|
70
88
|
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Notes
|
|
93
|
+
|
|
94
|
+
- 시나리오 추가/수정 시 Coverage Summary도 함께 업데이트
|
|
95
|
+
- Given/When/Then 각각에 검증 포인트 명시
|
|
96
|
+
- 모든 시나리오 통과 시 품질 보장됨
|
|
@@ -1,12 +1,100 @@
|
|
|
1
1
|
{
|
|
2
2
|
"hooks": {
|
|
3
|
+
"SessionStart": [
|
|
4
|
+
{
|
|
5
|
+
"hooks": [
|
|
6
|
+
{
|
|
7
|
+
"type": "command",
|
|
8
|
+
"command": "echo '[SESSION START] If mcp__vibe__start_session is available, call it to restore previous context.'"
|
|
9
|
+
}
|
|
10
|
+
]
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"PreToolUse": [
|
|
14
|
+
{
|
|
15
|
+
"matcher": "Bash",
|
|
16
|
+
"hooks": [
|
|
17
|
+
{
|
|
18
|
+
"type": "command",
|
|
19
|
+
"command": "echo '[BASH CHECK] Be cautious with destructive commands (rm -rf, git push --force, drop table). Verify paths before deletion.'"
|
|
20
|
+
}
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
],
|
|
3
24
|
"UserPromptSubmit": [
|
|
4
25
|
{
|
|
5
26
|
"matcher": "ultrawork|ulw|울트라워크",
|
|
6
27
|
"hooks": [
|
|
7
28
|
{
|
|
8
29
|
"type": "command",
|
|
9
|
-
"command": "echo '
|
|
30
|
+
"command": "echo '[ULTRAWORK MODE] Use PARALLEL Task calls. Auto-continue through ALL phases. Auto-retry on errors up to 3 times. Run mcp__vibe__auto_save_context at 70%+ context. Do NOT ask for confirmation between phases.'"
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"matcher": "analyze|분석|analysis",
|
|
36
|
+
"hooks": [
|
|
37
|
+
{
|
|
38
|
+
"type": "command",
|
|
39
|
+
"command": "echo '[ANALYZE MODE] Thoroughly examine the codebase. Use mcp__vibe__analyze_complexity and mcp__vibe__find_references for deep analysis.'"
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"matcher": "debug|디버그|debugging",
|
|
45
|
+
"hooks": [
|
|
46
|
+
{
|
|
47
|
+
"type": "command",
|
|
48
|
+
"command": "echo '[DEBUG MODE] Focus on finding root cause. Check logs, trace execution flow, verify assumptions step by step.'"
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"matcher": "test|테스트|testing",
|
|
54
|
+
"hooks": [
|
|
55
|
+
{
|
|
56
|
+
"type": "command",
|
|
57
|
+
"command": "echo '[TEST MODE] Write comprehensive tests. Cover edge cases, error scenarios, and happy paths.'"
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
"PostToolUse": [
|
|
63
|
+
{
|
|
64
|
+
"matcher": "Write|Edit",
|
|
65
|
+
"hooks": [
|
|
66
|
+
{
|
|
67
|
+
"type": "command",
|
|
68
|
+
"command": "echo '[CODE CHECK] Review for issues: unused imports, syntax errors, incomplete implementation. If any found, fix immediately in next edit. Continue with task until complete.'"
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
"Notification": [
|
|
74
|
+
{
|
|
75
|
+
"matcher": "context_window_70",
|
|
76
|
+
"hooks": [
|
|
77
|
+
{
|
|
78
|
+
"type": "command",
|
|
79
|
+
"command": "echo '[CONTEXT 70%] Start being selective about file reads. If ULTRAWORK mode: run mcp__vibe__auto_save_context now.'"
|
|
80
|
+
}
|
|
81
|
+
]
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"matcher": "context_window_85",
|
|
85
|
+
"hooks": [
|
|
86
|
+
{
|
|
87
|
+
"type": "command",
|
|
88
|
+
"command": "echo '[CONTEXT 85%] IMMEDIATELY run mcp__vibe__auto_save_context with urgency=high.'"
|
|
89
|
+
}
|
|
90
|
+
]
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"matcher": "context_window_95",
|
|
94
|
+
"hooks": [
|
|
95
|
+
{
|
|
96
|
+
"type": "command",
|
|
97
|
+
"command": "echo '[CONTEXT 95% CRITICAL] Run mcp__vibe__auto_save_context with urgency=critical NOW. Prepare for session transition.'"
|
|
10
98
|
}
|
|
11
99
|
]
|
|
12
100
|
}
|