@su-record/vibe 2.2.4 → 2.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/settings.json +0 -117
- package/.claude/settings.local.json +2 -1
- package/.claude/vibe/rules/languages/dart-flutter.md +509 -0
- package/.claude/vibe/rules/languages/go.md +396 -0
- package/.claude/vibe/rules/languages/java-spring.md +586 -0
- package/.claude/vibe/rules/languages/kotlin-android.md +491 -0
- package/.claude/vibe/rules/languages/python-django.md +371 -0
- package/.claude/vibe/rules/languages/python-fastapi.md +386 -0
- package/.claude/vibe/rules/languages/rust.md +425 -0
- package/.claude/vibe/rules/languages/swift-ios.md +516 -0
- package/.claude/vibe/rules/languages/typescript-nextjs.md +441 -0
- package/.claude/vibe/rules/languages/typescript-node.md +375 -0
- package/.claude/vibe/rules/languages/typescript-nuxt.md +521 -0
- package/.claude/vibe/rules/languages/typescript-react-native.md +446 -0
- package/.claude/vibe/rules/languages/typescript-react.md +525 -0
- package/.claude/vibe/rules/languages/typescript-vue.md +353 -0
- package/README.md +96 -96
- package/commands/vibe.analyze.md +14 -73
- package/commands/vibe.reason.md +49 -172
- package/commands/vibe.review.md +72 -260
- package/commands/vibe.utils.md +101 -0
- package/commands/vibe.verify.md +4 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +44 -14
- package/dist/cli/index.js.map +1 -1
- package/{templates/hooks-template.json → hooks/hooks.json} +6 -6
- package/package.json +2 -2
- package/commands/vibe.continue.md +0 -88
- package/commands/vibe.setup.md +0 -97
- /package/{templates → .claude/vibe/templates}/constitution-template.md +0 -0
- /package/{templates → .claude/vibe/templates}/contract-backend-template.md +0 -0
- /package/{templates → .claude/vibe/templates}/contract-frontend-template.md +0 -0
- /package/{templates → .claude/vibe/templates}/feature-template.md +0 -0
- /package/{templates → .claude/vibe/templates}/spec-template.md +0 -0
- /package/{commands/vibe.compound.md → agents/compounder.md} +0 -0
- /package/{commands/vibe.diagram.md → agents/diagrammer.md} +0 -0
- /package/{commands/vibe.e2e.md → agents/e2e-tester.md} +0 -0
- /package/{commands/vibe.ui.md → agents/ui-previewer.md} +0 -0
package/commands/vibe.review.md
CHANGED
|
@@ -10,214 +10,87 @@ argument-hint: "PR number, branch name, or file path"
|
|
|
10
10
|
## Usage
|
|
11
11
|
|
|
12
12
|
```
|
|
13
|
-
/vibe.review
|
|
14
|
-
/vibe.review PR#123
|
|
15
|
-
/vibe.review feature/login
|
|
16
|
-
/vibe.review src/api/
|
|
13
|
+
/vibe.review # Review current branch
|
|
14
|
+
/vibe.review PR#123 # Review specific PR
|
|
15
|
+
/vibe.review feature/login # Review specific branch
|
|
16
|
+
/vibe.review src/api/ # Review specific path
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
-
##
|
|
19
|
+
## Priority System
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
│ 🟡 P2 (Important): Should fix - Before merge │
|
|
27
|
-
│ 🔵 P3 (Nice-to-have): Enhancement - When time permits │
|
|
28
|
-
└─────────────────────────────────────────────────────────────────┘
|
|
29
|
-
```
|
|
21
|
+
| Priority | Criteria | Action |
|
|
22
|
+
|----------|----------|--------|
|
|
23
|
+
| P1 | Security vulnerabilities, data loss, crashes | Block merge, fix immediately |
|
|
24
|
+
| P2 | Performance issues, architecture violations, missing tests | Fix before merge |
|
|
25
|
+
| P3 | Style, refactoring suggestions, documentation | Add to backlog |
|
|
30
26
|
|
|
31
27
|
## Process
|
|
32
28
|
|
|
33
|
-
### Phase 1: Tech Stack Detection
|
|
34
|
-
|
|
35
|
-
**Detect project tech stack FIRST before launching reviewers:**
|
|
29
|
+
### Phase 1: Tech Stack Detection
|
|
36
30
|
|
|
37
|
-
|
|
38
|
-
📋 Tech Stack Detection
|
|
39
|
-
├── Read package.json → TypeScript, React, Node.js
|
|
40
|
-
├── Read pyproject.toml → Python, FastAPI, Django
|
|
41
|
-
├── Read Gemfile → Ruby, Rails
|
|
42
|
-
├── Read pubspec.yaml → Flutter, Dart
|
|
43
|
-
├── Read go.mod → Go
|
|
44
|
-
├── Read CLAUDE.md → Explicit tech stack declaration
|
|
45
|
-
└── Analyze file extensions in changed files
|
|
46
|
-
```
|
|
31
|
+
Detect project tech stack FIRST before launching reviewers:
|
|
47
32
|
|
|
48
|
-
**Detection Logic:**
|
|
49
|
-
```javascript
|
|
50
|
-
// Stack detection from project files
|
|
51
|
-
const stack = {
|
|
52
|
-
typescript: hasFile("package.json") && (hasDep("typescript") || hasFile("tsconfig.json")),
|
|
53
|
-
react: hasDep("react") || hasDep("next"),
|
|
54
|
-
python: hasFile("pyproject.toml") || hasFile("requirements.txt"),
|
|
55
|
-
rails: hasFile("Gemfile") && hasDep("rails"),
|
|
56
|
-
go: hasFile("go.mod"),
|
|
57
|
-
flutter: hasFile("pubspec.yaml")
|
|
58
|
-
};
|
|
59
33
|
```
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
├── app/models/*.rb → Rails reviewer needed
|
|
67
|
-
└── No .ts files → Skip TypeScript reviewer
|
|
34
|
+
Read package.json -> TypeScript, React, Node.js
|
|
35
|
+
Read pyproject.toml -> Python, FastAPI, Django
|
|
36
|
+
Read Gemfile -> Ruby, Rails
|
|
37
|
+
Read pubspec.yaml -> Flutter, Dart
|
|
38
|
+
Read go.mod -> Go
|
|
39
|
+
Read CLAUDE.md -> Explicit tech stack declaration
|
|
68
40
|
```
|
|
69
41
|
|
|
70
42
|
### Phase 2: Parallel Agent Review (STACK-AWARE)
|
|
71
43
|
|
|
72
44
|
**Launch ONLY relevant agents based on detected stack!**
|
|
73
45
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
│ ├── architecture-reviewer # Layer violations, cycles │
|
|
84
|
-
│ ├── complexity-reviewer # Cyclomatic complexity, length │
|
|
85
|
-
│ ├── simplicity-reviewer # Over-abstraction, dead code │
|
|
86
|
-
│ ├── git-history-reviewer # Churn files, risk patterns │
|
|
87
|
-
│ └── test-coverage-reviewer # Missing tests, edge cases │
|
|
88
|
-
│ │
|
|
89
|
-
│ 🔍 CONDITIONAL (Based on Detected Stack) │
|
|
90
|
-
│ ├── python-reviewer # IF: .py files in diff │
|
|
91
|
-
│ ├── typescript-reviewer # IF: .ts/.tsx files OR tsconfig │
|
|
92
|
-
│ ├── rails-reviewer # IF: Gemfile has rails │
|
|
93
|
-
│ └── react-reviewer # IF: package.json has react │
|
|
94
|
-
│ │
|
|
95
|
-
└─────────────────────────────────────────────────────────────────┘
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
**Stack-Aware Agent Invocation:**
|
|
99
|
-
```javascript
|
|
100
|
-
// Core reviewers (ALWAYS)
|
|
101
|
-
const coreAgents = [
|
|
102
|
-
"security-reviewer",
|
|
103
|
-
"data-integrity-reviewer",
|
|
104
|
-
"performance-reviewer",
|
|
105
|
-
"architecture-reviewer",
|
|
106
|
-
"complexity-reviewer",
|
|
107
|
-
"simplicity-reviewer",
|
|
108
|
-
"git-history-reviewer",
|
|
109
|
-
"test-coverage-reviewer"
|
|
110
|
-
];
|
|
111
|
-
|
|
112
|
-
// Language reviewers (CONDITIONAL)
|
|
113
|
-
const languageAgents = [];
|
|
114
|
-
if (stack.python || changedFiles.some(f => f.endsWith('.py'))) {
|
|
115
|
-
languageAgents.push("python-reviewer");
|
|
116
|
-
}
|
|
117
|
-
if (stack.typescript || changedFiles.some(f => f.match(/\.tsx?$/))) {
|
|
118
|
-
languageAgents.push("typescript-reviewer");
|
|
119
|
-
}
|
|
120
|
-
if (stack.react) {
|
|
121
|
-
languageAgents.push("react-reviewer");
|
|
122
|
-
}
|
|
123
|
-
if (stack.rails) {
|
|
124
|
-
languageAgents.push("rails-reviewer");
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// Launch ALL selected agents in parallel
|
|
128
|
-
const allAgents = [...coreAgents, ...languageAgents];
|
|
129
|
-
```
|
|
46
|
+
**ALWAYS RUN (Core Reviewers):**
|
|
47
|
+
- security-reviewer: OWASP Top 10, vulnerabilities
|
|
48
|
+
- data-integrity-reviewer: Data validation, constraints
|
|
49
|
+
- performance-reviewer: N+1 queries, memory leaks
|
|
50
|
+
- architecture-reviewer: Layer violations, cycles
|
|
51
|
+
- complexity-reviewer: Cyclomatic complexity, length
|
|
52
|
+
- simplicity-reviewer: Over-abstraction, dead code
|
|
53
|
+
- git-history-reviewer: Churn files, risk patterns
|
|
54
|
+
- test-coverage-reviewer: Missing tests, edge cases
|
|
130
55
|
|
|
131
|
-
**
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
🚀 Launching 10 agents (8 core + 2 language-specific):
|
|
137
|
-
✅ security-reviewer
|
|
138
|
-
✅ data-integrity-reviewer
|
|
139
|
-
✅ performance-reviewer
|
|
140
|
-
✅ architecture-reviewer
|
|
141
|
-
✅ complexity-reviewer
|
|
142
|
-
✅ simplicity-reviewer
|
|
143
|
-
✅ git-history-reviewer
|
|
144
|
-
✅ test-coverage-reviewer
|
|
145
|
-
✅ typescript-reviewer ← Detected: tsconfig.json
|
|
146
|
-
✅ react-reviewer ← Detected: react in package.json
|
|
147
|
-
⏭️ python-reviewer ← Skipped: No Python files
|
|
148
|
-
⏭️ rails-reviewer ← Skipped: No Gemfile
|
|
149
|
-
```
|
|
56
|
+
**CONDITIONAL (Based on Detected Stack):**
|
|
57
|
+
- python-reviewer: IF .py files in diff
|
|
58
|
+
- typescript-reviewer: IF .ts/.tsx files OR tsconfig
|
|
59
|
+
- rails-reviewer: IF Gemfile has rails
|
|
60
|
+
- react-reviewer: IF package.json has react
|
|
150
61
|
|
|
151
|
-
### Phase 3:
|
|
62
|
+
### Phase 3: Deep Analysis
|
|
152
63
|
|
|
153
|
-
|
|
64
|
+
After agent results:
|
|
154
65
|
|
|
155
|
-
|
|
156
|
-
|
|
66
|
+
1. **System Context**: Component interactions, data flow, external dependencies
|
|
67
|
+
2. **Stakeholder Perspectives**: Developers, Ops, Security, Business
|
|
68
|
+
3. **Edge Cases**: Race conditions, resource exhaustion, network failures
|
|
69
|
+
4. **Multiple Angles**: Technical excellence, business value, risk management
|
|
157
70
|
|
|
158
|
-
|
|
159
|
-
- Component interactions
|
|
160
|
-
- Data flow
|
|
161
|
-
- External dependencies
|
|
162
|
-
|
|
163
|
-
2. **Stakeholder Perspectives**
|
|
164
|
-
- Developers: Maintainability
|
|
165
|
-
- Ops: Deployment risk
|
|
166
|
-
- Security: Vulnerabilities
|
|
167
|
-
- Business: Impact
|
|
168
|
-
|
|
169
|
-
3. **Edge Cases & Failure Scenarios**
|
|
170
|
-
- Race conditions
|
|
171
|
-
- Resource exhaustion
|
|
172
|
-
- Network failures
|
|
173
|
-
- Malicious input
|
|
71
|
+
### Phase 4: Findings Synthesis
|
|
174
72
|
|
|
175
|
-
4. **Multiple Angles**
|
|
176
|
-
- Technical excellence
|
|
177
|
-
- Business value
|
|
178
|
-
- Risk management
|
|
179
|
-
- Team dynamics
|
|
180
73
|
```
|
|
74
|
+
REVIEW FINDINGS
|
|
181
75
|
|
|
182
|
-
|
|
76
|
+
P1 CRITICAL (Blocks Merge) - N issues
|
|
77
|
+
1. [SECURITY] SQL Injection in user query
|
|
78
|
+
Location: src/api/users.py:42
|
|
79
|
+
Fix: Use parameterized queries
|
|
183
80
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
|
|
191
|
-
│ 1. [SECURITY] SQL Injection in user query │
|
|
192
|
-
│ 📍 src/api/users.py:42 │
|
|
193
|
-
│ 💡 Use parameterized queries │
|
|
194
|
-
│ │
|
|
195
|
-
│ 2. [DATA] Missing transaction rollback │
|
|
196
|
-
│ 📍 src/services/payment.py:128 │
|
|
197
|
-
│ 💡 Wrap in try/except with rollback │
|
|
198
|
-
│ │
|
|
199
|
-
│ 🟡 P2 IMPORTANT (Should Fix) - 5 issues │
|
|
200
|
-
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
|
|
201
|
-
│ 3. [PERF] N+1 query in user list │
|
|
202
|
-
│ 4. [ARCH] Circular dependency detected │
|
|
203
|
-
│ 5. [TEST] Missing edge case tests │
|
|
204
|
-
│ ... │
|
|
205
|
-
│ │
|
|
206
|
-
│ 🔵 P3 NICE-TO-HAVE (Enhancement) - 3 issues │
|
|
207
|
-
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
|
|
208
|
-
│ 8. [STYLE] Consider extracting helper function │
|
|
209
|
-
│ ... │
|
|
210
|
-
│ │
|
|
211
|
-
└─────────────────────────────────────────────────────────────────┘
|
|
81
|
+
P2 IMPORTANT (Should Fix) - N issues
|
|
82
|
+
2. [PERF] N+1 query in user list
|
|
83
|
+
3. [ARCH] Circular dependency detected
|
|
84
|
+
|
|
85
|
+
P3 NICE-TO-HAVE (Enhancement) - N issues
|
|
86
|
+
4. [STYLE] Consider extracting helper function
|
|
212
87
|
```
|
|
213
88
|
|
|
214
89
|
### Phase 5: Todo File Creation
|
|
215
90
|
|
|
216
91
|
Save findings to `.claude/vibe/todos/`:
|
|
217
92
|
|
|
218
|
-
```
|
|
219
|
-
## File Naming Convention
|
|
220
|
-
|
|
93
|
+
```
|
|
221
94
|
{priority}-{category}-{short-desc}.md
|
|
222
95
|
|
|
223
96
|
Examples:
|
|
@@ -226,98 +99,37 @@ Examples:
|
|
|
226
99
|
- P3-style-extract-helper.md
|
|
227
100
|
```
|
|
228
101
|
|
|
229
|
-
|
|
230
|
-
```markdown
|
|
231
|
-
# [P1] SQL Injection Vulnerability
|
|
232
|
-
|
|
233
|
-
## Summary
|
|
234
|
-
User input directly concatenated in SQL query
|
|
235
|
-
|
|
236
|
-
## Location
|
|
237
|
-
- File: src/api/users.py
|
|
238
|
-
- Line: 42
|
|
239
|
-
- Function: get_user_by_email()
|
|
102
|
+
## Output
|
|
240
103
|
|
|
241
|
-
## Current Code
|
|
242
|
-
```python
|
|
243
|
-
query = f"SELECT * FROM users WHERE email = '{email}'"
|
|
244
104
|
```
|
|
105
|
+
CODE REVIEW SUMMARY
|
|
106
|
+
PR #123: Add user authentication
|
|
245
107
|
|
|
246
|
-
|
|
247
|
-
```python
|
|
248
|
-
query = "SELECT * FROM users WHERE email = %s"
|
|
249
|
-
cursor.execute(query, (email,))
|
|
250
|
-
```
|
|
108
|
+
Reviewers: 13 agents | Duration: 45s
|
|
251
109
|
|
|
252
|
-
|
|
253
|
-
- OWASP SQL Injection: https://owasp.org/...
|
|
254
|
-
- Project DB Guide: docs/database.md
|
|
110
|
+
Score: 72/100 (Needs Work)
|
|
255
111
|
|
|
256
|
-
|
|
257
|
-
-
|
|
258
|
-
-
|
|
259
|
-
-
|
|
260
|
-
```
|
|
112
|
+
Issues Found:
|
|
113
|
+
- P1 Critical: 2 (BLOCKS MERGE)
|
|
114
|
+
- P2 Important: 5
|
|
115
|
+
- P3 Nice-to-have: 3
|
|
261
116
|
|
|
262
|
-
|
|
117
|
+
By Category:
|
|
118
|
+
- Security: 2
|
|
119
|
+
- Performance: 3
|
|
120
|
+
- Architecture: 1
|
|
121
|
+
- Testing: 2
|
|
122
|
+
- Style: 2
|
|
263
123
|
|
|
264
|
-
|
|
265
|
-
Suggest E2E tests based on project type:
|
|
266
|
-
├── Web: /vibe.e2e (Playwright)
|
|
267
|
-
├── iOS: Xcode Test
|
|
268
|
-
├── Android: Espresso
|
|
269
|
-
└── API: Contract Test
|
|
270
|
-
```
|
|
124
|
+
Todos created: .claude/vibe/todos/ (10 files)
|
|
271
125
|
|
|
272
|
-
|
|
126
|
+
MERGE BLOCKED - Fix P1 issues first
|
|
273
127
|
|
|
128
|
+
Next Steps:
|
|
129
|
+
1. Fix P1-security-sql-injection.md
|
|
130
|
+
2. Fix P1-data-transaction-rollback.md
|
|
131
|
+
3. Re-run: /vibe.review
|
|
274
132
|
```
|
|
275
|
-
┌─────────────────────────────────────────────────────────────────┐
|
|
276
|
-
│ 📊 CODE REVIEW SUMMARY │
|
|
277
|
-
│ PR #123: Add user authentication │
|
|
278
|
-
├─────────────────────────────────────────────────────────────────┤
|
|
279
|
-
│ │
|
|
280
|
-
│ Reviewers: 13 agents | Duration: 45s │
|
|
281
|
-
│ │
|
|
282
|
-
│ 📈 Score: 72/100 (Needs Work) │
|
|
283
|
-
│ │
|
|
284
|
-
│ Issues Found: │
|
|
285
|
-
│ ├── 🔴 P1 Critical: 2 (BLOCKS MERGE) │
|
|
286
|
-
│ ├── 🟡 P2 Important: 5 │
|
|
287
|
-
│ └── 🔵 P3 Nice-to-have: 3 │
|
|
288
|
-
│ │
|
|
289
|
-
│ By Category: │
|
|
290
|
-
│ ├── Security: 2 │
|
|
291
|
-
│ ├── Performance: 3 │
|
|
292
|
-
│ ├── Architecture: 1 │
|
|
293
|
-
│ ├── Testing: 2 │
|
|
294
|
-
│ └── Style: 2 │
|
|
295
|
-
│ │
|
|
296
|
-
│ 📁 Todos created: .claude/vibe/todos/ (10 files) │
|
|
297
|
-
│ │
|
|
298
|
-
│ ❌ MERGE BLOCKED - Fix P1 issues first │
|
|
299
|
-
│ │
|
|
300
|
-
│ Next Steps: │
|
|
301
|
-
│ 1. Fix P1-security-sql-injection.md │
|
|
302
|
-
│ 2. Fix P1-data-transaction-rollback.md │
|
|
303
|
-
│ 3. Re-run: /vibe.review │
|
|
304
|
-
│ │
|
|
305
|
-
└─────────────────────────────────────────────────────────────────┘
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
## Priority Guidelines
|
|
309
|
-
|
|
310
|
-
| Priority | Criteria | Action |
|
|
311
|
-
|----------|----------|--------|
|
|
312
|
-
| 🔴 P1 | Security vulnerabilities, data loss, crashes | Block merge, fix immediately |
|
|
313
|
-
| 🟡 P2 | Performance issues, architecture violations, missing tests | Fix before merge |
|
|
314
|
-
| 🔵 P3 | Style, refactoring suggestions, documentation | Add to backlog |
|
|
315
|
-
|
|
316
|
-
## Related Commands
|
|
317
|
-
|
|
318
|
-
- `/vibe.e2e` - Run E2E tests
|
|
319
|
-
- `/vibe.compound` - Document solutions
|
|
320
|
-
- `/vibe.verify` - SPEC-based verification
|
|
321
133
|
|
|
322
134
|
---
|
|
323
135
|
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Utility tools (UI preview, diagram, E2E test, etc.)
|
|
3
|
+
argument-hint: "--ui, --diagram, --e2e, or other options"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /vibe.utils
|
|
7
|
+
|
|
8
|
+
Collection of utility tools. Use with options.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
/vibe.utils --ui "설명" # UI ASCII preview
|
|
14
|
+
/vibe.utils --diagram # Architecture diagram
|
|
15
|
+
/vibe.utils --diagram --er # ERD diagram
|
|
16
|
+
/vibe.utils --diagram --flow # Flowchart
|
|
17
|
+
/vibe.utils --e2e "scenario" # E2E browser test (Playwright)
|
|
18
|
+
/vibe.utils --e2e --visual # Visual regression test
|
|
19
|
+
/vibe.utils --e2e --record # Video recording
|
|
20
|
+
/vibe.utils --compound # Document solution (usually auto-triggered)
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## --ui (UI Preview)
|
|
26
|
+
|
|
27
|
+
Read and follow `agents/ui-previewer.md` for ASCII UI preview generation.
|
|
28
|
+
|
|
29
|
+
Generate ASCII-based UI preview from description.
|
|
30
|
+
|
|
31
|
+
**Example:**
|
|
32
|
+
```
|
|
33
|
+
/vibe.utils --ui "로그인 폼 - 이메일, 비밀번호 입력 + 로그인 버튼"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## --diagram (Diagram Generation)
|
|
39
|
+
|
|
40
|
+
Read and follow `agents/diagrammer.md` for diagram generation.
|
|
41
|
+
|
|
42
|
+
Generate Mermaid diagrams for architecture visualization.
|
|
43
|
+
|
|
44
|
+
**Options:**
|
|
45
|
+
- `--diagram`: Architecture overview
|
|
46
|
+
- `--diagram --er`: Entity-Relationship Diagram
|
|
47
|
+
- `--diagram --flow`: Flowchart
|
|
48
|
+
- `--diagram --seq`: Sequence Diagram
|
|
49
|
+
|
|
50
|
+
**Example:**
|
|
51
|
+
```
|
|
52
|
+
/vibe.utils --diagram --er
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## --e2e (E2E Testing)
|
|
58
|
+
|
|
59
|
+
Read and follow `agents/e2e-tester.md` for Playwright-based E2E testing.
|
|
60
|
+
|
|
61
|
+
**Options:**
|
|
62
|
+
- `--e2e "scenario"`: Run specific scenario
|
|
63
|
+
- `--e2e --visual`: Visual regression testing
|
|
64
|
+
- `--e2e --record`: Video recording
|
|
65
|
+
|
|
66
|
+
**Features:**
|
|
67
|
+
- Screenshot capture and comparison
|
|
68
|
+
- Console error collection
|
|
69
|
+
- Accessibility (a11y) testing
|
|
70
|
+
- Bug reproduction automation
|
|
71
|
+
|
|
72
|
+
**Example:**
|
|
73
|
+
```
|
|
74
|
+
/vibe.utils --e2e "login flow"
|
|
75
|
+
/vibe.utils --e2e --visual --record
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## --compound (Solution Documentation)
|
|
81
|
+
|
|
82
|
+
Read and follow `agents/compounder.md` for solution documentation.
|
|
83
|
+
|
|
84
|
+
Document solved problems for knowledge accumulation.
|
|
85
|
+
|
|
86
|
+
**Usually auto-triggered by hooks when:**
|
|
87
|
+
- "버그 해결됨", "bug fixed", "PR merged" detected
|
|
88
|
+
|
|
89
|
+
**Output location:** `.claude/vibe/solutions/`
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
.claude/vibe/solutions/
|
|
93
|
+
├── security/ # Security solutions
|
|
94
|
+
├── performance/ # Performance optimizations
|
|
95
|
+
├── database/ # Database related
|
|
96
|
+
└── integration/ # External integrations
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
ARGUMENTS: $ARGUMENTS
|
package/commands/vibe.verify.md
CHANGED
|
@@ -12,7 +12,10 @@ argument-hint: "feature name"
|
|
|
12
12
|
## Usage
|
|
13
13
|
|
|
14
14
|
```
|
|
15
|
-
/vibe.verify "feature-name"
|
|
15
|
+
/vibe.verify "feature-name" # SPEC 기반 검증
|
|
16
|
+
/vibe.verify --e2e "feature-name" # E2E 브라우저 테스트 (agents/e2e-tester.md)
|
|
17
|
+
/vibe.verify --e2e --visual # 시각적 회귀 테스트
|
|
18
|
+
/vibe.verify --e2e --record # 비디오 녹화
|
|
16
19
|
```
|
|
17
20
|
|
|
18
21
|
## 핵심 원칙
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AA+3EH,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,qBAAqB,IAAI,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAEzE,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAErF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAEvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAE3E,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAErE,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -398,9 +398,11 @@ function detectTechStacks(projectRoot) {
|
|
|
398
398
|
detected.push({ type: 'typescript-react-native', path: prefix });
|
|
399
399
|
else if (deps['react'])
|
|
400
400
|
detected.push({ type: 'typescript-react', path: prefix });
|
|
401
|
+
else if (deps['nuxt'] || deps['nuxt3'])
|
|
402
|
+
detected.push({ type: 'typescript-nuxt', path: prefix });
|
|
401
403
|
else if (deps['vue'])
|
|
402
404
|
detected.push({ type: 'typescript-vue', path: prefix });
|
|
403
|
-
else if (deps['express'] || deps['fastify'] || deps['koa'])
|
|
405
|
+
else if (deps['express'] || deps['fastify'] || deps['koa'] || deps['nest'] || deps['@nestjs/core'])
|
|
404
406
|
detected.push({ type: 'typescript-node', path: prefix });
|
|
405
407
|
else if (pkg.name)
|
|
406
408
|
detected.push({ type: 'typescript-node', path: prefix });
|
|
@@ -776,6 +778,7 @@ const STACK_NAMES = {
|
|
|
776
778
|
'typescript-nextjs': { lang: 'TypeScript', framework: 'Next.js' },
|
|
777
779
|
'typescript-react': { lang: 'TypeScript', framework: 'React' },
|
|
778
780
|
'typescript-vue': { lang: 'TypeScript', framework: 'Vue.js' },
|
|
781
|
+
'typescript-nuxt': { lang: 'TypeScript', framework: 'Nuxt 3' },
|
|
779
782
|
'typescript-react-native': { lang: 'TypeScript', framework: 'React Native' },
|
|
780
783
|
'dart-flutter': { lang: 'Dart', framework: 'Flutter' },
|
|
781
784
|
'go': { lang: 'Go', framework: '-' },
|
|
@@ -965,7 +968,7 @@ async function init(projectName) {
|
|
|
965
968
|
ensureDir(commandsDir);
|
|
966
969
|
const sourceDir = path.join(__dirname, '../../commands');
|
|
967
970
|
copyDirRecursive(sourceDir, commandsDir);
|
|
968
|
-
log(' ✅ 슬래시 커맨드 설치 완료 (
|
|
971
|
+
log(' ✅ 슬래시 커맨드 설치 완료 (7개)\n');
|
|
969
972
|
// 기술 스택 감지
|
|
970
973
|
const { stacks: detectedStacks, details: stackDetails } = detectTechStacks(projectRoot);
|
|
971
974
|
if (detectedStacks.length > 0) {
|
|
@@ -1051,12 +1054,13 @@ async function init(projectName) {
|
|
|
1051
1054
|
const langSource = path.join(rulesSource, 'languages');
|
|
1052
1055
|
const langTarget = path.join(rulesTarget, 'languages');
|
|
1053
1056
|
ensureDir(langTarget);
|
|
1054
|
-
|
|
1057
|
+
// 감지된 스택 타입을 그대로 파일명으로 매칭 (typescript-nextjs -> typescript-nextjs.md)
|
|
1058
|
+
const detectedTypes = new Set(detectedStacks.map(s => s.type));
|
|
1055
1059
|
if (fs.existsSync(langSource)) {
|
|
1056
1060
|
const langFiles = fs.readdirSync(langSource);
|
|
1057
1061
|
langFiles.forEach(file => {
|
|
1058
1062
|
const langType = file.replace('.md', '');
|
|
1059
|
-
if (detectedTypes.
|
|
1063
|
+
if (detectedTypes.has(langType)) {
|
|
1060
1064
|
fs.copyFileSync(path.join(langSource, file), path.join(langTarget, file));
|
|
1061
1065
|
}
|
|
1062
1066
|
});
|
|
@@ -1070,7 +1074,7 @@ async function init(projectName) {
|
|
|
1070
1074
|
log(' ✅ 서브에이전트 설치 완료 (.claude/agents/)\n');
|
|
1071
1075
|
// .claude/settings.json 설정
|
|
1072
1076
|
const settingsPath = path.join(claudeDir, 'settings.json');
|
|
1073
|
-
const hooksTemplate = path.join(__dirname, '../../
|
|
1077
|
+
const hooksTemplate = path.join(__dirname, '../../hooks/hooks.json');
|
|
1074
1078
|
if (fs.existsSync(hooksTemplate)) {
|
|
1075
1079
|
const vibeHooks = JSON.parse(fs.readFileSync(hooksTemplate, 'utf-8'));
|
|
1076
1080
|
if (fs.existsSync(settingsPath)) {
|
|
@@ -1106,7 +1110,7 @@ ${isNewProject ? `프로젝트 위치:
|
|
|
1106
1110
|
` : ''}생성된 구조:
|
|
1107
1111
|
CLAUDE.md # 프로젝트 컨텍스트
|
|
1108
1112
|
.claude/
|
|
1109
|
-
├── commands/ # 슬래시 커맨드 (
|
|
1113
|
+
├── commands/ # 슬래시 커맨드 (7개)
|
|
1110
1114
|
├── agents/ # 서브에이전트 (simplifier)
|
|
1111
1115
|
├── settings.json # Hooks 설정 (저장소 공유)
|
|
1112
1116
|
└── vibe/
|
|
@@ -1235,9 +1239,35 @@ async function update() {
|
|
|
1235
1239
|
// .claude/commands 업데이트
|
|
1236
1240
|
const commandsDir = path.join(claudeDir, 'commands');
|
|
1237
1241
|
ensureDir(commandsDir);
|
|
1242
|
+
// 레거시 커맨드 파일 정리 (v2.2.7 이전 버전에서 제거된 커맨드들)
|
|
1243
|
+
const legacyCommands = [
|
|
1244
|
+
'vibe.analyze.md', // agents/analyzer.md로 통합 후 다시 commands로 복원
|
|
1245
|
+
'vibe.compound.md', // hooks 자동 트리거로 변경
|
|
1246
|
+
'vibe.continue.md', // SessionStart hook으로 변경
|
|
1247
|
+
'vibe.diagram.md', // vibe.utils --diagram으로 변경
|
|
1248
|
+
'vibe.e2e.md', // vibe.utils --e2e로 변경
|
|
1249
|
+
'vibe.reason.md', // agents/reasoner.md로 통합 후 다시 commands로 복원
|
|
1250
|
+
'vibe.setup.md', // 제거됨
|
|
1251
|
+
'vibe.ui.md', // vibe.utils --ui로 변경
|
|
1252
|
+
];
|
|
1253
|
+
legacyCommands.forEach(cmd => {
|
|
1254
|
+
const cmdPath = path.join(commandsDir, cmd);
|
|
1255
|
+
if (fs.existsSync(cmdPath)) {
|
|
1256
|
+
fs.unlinkSync(cmdPath);
|
|
1257
|
+
}
|
|
1258
|
+
});
|
|
1238
1259
|
const sourceDir = path.join(__dirname, '../../commands');
|
|
1239
1260
|
copyDirRecursive(sourceDir, commandsDir);
|
|
1240
|
-
log(' ✅ 슬래시 커맨드 업데이트 완료 (
|
|
1261
|
+
log(' ✅ 슬래시 커맨드 업데이트 완료 (7개)\n');
|
|
1262
|
+
// 레거시 에이전트 파일 정리 (commands에 통합된 에이전트들)
|
|
1263
|
+
const agentsDir = path.join(claudeDir, 'agents');
|
|
1264
|
+
const legacyAgents = ['reviewer.md', 'analyzer.md', 'reasoner.md'];
|
|
1265
|
+
legacyAgents.forEach(agent => {
|
|
1266
|
+
const agentPath = path.join(agentsDir, agent);
|
|
1267
|
+
if (fs.existsSync(agentPath)) {
|
|
1268
|
+
fs.unlinkSync(agentPath);
|
|
1269
|
+
}
|
|
1270
|
+
});
|
|
1241
1271
|
// 기술 스택 감지
|
|
1242
1272
|
const { stacks: detectedStacks, details: stackDetails } = detectTechStacks(projectRoot);
|
|
1243
1273
|
// config.json 업데이트
|
|
@@ -1338,29 +1368,29 @@ async function update() {
|
|
|
1338
1368
|
removeDirRecursive(langTarget);
|
|
1339
1369
|
}
|
|
1340
1370
|
ensureDir(langTarget);
|
|
1341
|
-
|
|
1371
|
+
// 감지된 스택 타입을 그대로 파일명으로 매칭 (typescript-nextjs -> typescript-nextjs.md)
|
|
1372
|
+
const detectedTypes = new Set(detectedStacks.map(s => s.type));
|
|
1342
1373
|
if (fs.existsSync(langSource)) {
|
|
1343
1374
|
const langFiles = fs.readdirSync(langSource);
|
|
1344
1375
|
langFiles.forEach(file => {
|
|
1345
1376
|
const langType = file.replace('.md', '');
|
|
1346
|
-
if (detectedTypes.
|
|
1377
|
+
if (detectedTypes.has(langType)) {
|
|
1347
1378
|
fs.copyFileSync(path.join(langSource, file), path.join(langTarget, file));
|
|
1348
1379
|
}
|
|
1349
1380
|
});
|
|
1350
1381
|
}
|
|
1351
1382
|
if (detectedStacks.length > 0) {
|
|
1352
|
-
log(` 🔍 감지된 기술 스택: ${detectedTypes.join(', ')}\n`);
|
|
1383
|
+
log(` 🔍 감지된 기술 스택: ${Array.from(detectedTypes).join(', ')}\n`);
|
|
1353
1384
|
}
|
|
1354
1385
|
log(' ✅ 코딩 규칙 업데이트 완료 (.claude/vibe/rules/)\n');
|
|
1355
1386
|
// .claude/agents/ 업데이트
|
|
1356
|
-
const agentsDir = path.join(claudeDir, 'agents');
|
|
1357
1387
|
ensureDir(agentsDir);
|
|
1358
1388
|
const agentsSourceDir = path.join(__dirname, '../../agents');
|
|
1359
1389
|
copyDirRecursive(agentsSourceDir, agentsDir);
|
|
1360
1390
|
log(' ✅ 서브에이전트 업데이트 완료 (.claude/agents/)\n');
|
|
1361
1391
|
// settings.json 업데이트
|
|
1362
1392
|
const settingsPath = path.join(claudeDir, 'settings.json');
|
|
1363
|
-
const hooksTemplate = path.join(__dirname, '../../
|
|
1393
|
+
const hooksTemplate = path.join(__dirname, '../../hooks/hooks.json');
|
|
1364
1394
|
if (fs.existsSync(hooksTemplate)) {
|
|
1365
1395
|
const vibeHooks = JSON.parse(fs.readFileSync(hooksTemplate, 'utf-8'));
|
|
1366
1396
|
if (fs.existsSync(settingsPath)) {
|
|
@@ -1507,7 +1537,7 @@ async function update() {
|
|
|
1507
1537
|
✅ vibe 업데이트 완료! (v${packageJson.version})
|
|
1508
1538
|
|
|
1509
1539
|
업데이트된 항목:
|
|
1510
|
-
- 슬래시 커맨드 (
|
|
1540
|
+
- 슬래시 커맨드 (7개)
|
|
1511
1541
|
- 코딩 규칙 (.claude/vibe/rules/)
|
|
1512
1542
|
- 서브에이전트 (.claude/agents/)
|
|
1513
1543
|
- Hooks 설정
|
|
@@ -1589,7 +1619,7 @@ function remove() {
|
|
|
1589
1619
|
제거된 항목:
|
|
1590
1620
|
- MCP 서버 (vibe, context7)
|
|
1591
1621
|
- .claude/vibe/ 폴더
|
|
1592
|
-
- 슬래시 커맨드 (
|
|
1622
|
+
- 슬래시 커맨드 (7개)
|
|
1593
1623
|
- 서브에이전트 (5개)
|
|
1594
1624
|
- Hooks 설정
|
|
1595
1625
|
|