@su-record/vibe 2.3.0 → 2.3.2
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 +35 -35
- package/.claude/settings.local.json +24 -25
- package/.claude/vibe/constitution.md +184 -184
- package/.claude/vibe/rules/core/communication-guide.md +104 -104
- package/.claude/vibe/rules/core/development-philosophy.md +52 -52
- package/.claude/vibe/rules/core/quick-start.md +120 -120
- package/.claude/vibe/rules/languages/dart-flutter.md +509 -509
- package/.claude/vibe/rules/languages/go.md +396 -396
- package/.claude/vibe/rules/languages/java-spring.md +586 -586
- package/.claude/vibe/rules/languages/kotlin-android.md +491 -491
- package/.claude/vibe/rules/languages/python-django.md +371 -371
- package/.claude/vibe/rules/languages/python-fastapi.md +386 -386
- package/.claude/vibe/rules/languages/rust.md +425 -425
- package/.claude/vibe/rules/languages/swift-ios.md +516 -516
- package/.claude/vibe/rules/languages/typescript-nextjs.md +441 -441
- package/.claude/vibe/rules/languages/typescript-node.md +375 -375
- package/.claude/vibe/rules/languages/typescript-nuxt.md +521 -521
- package/.claude/vibe/rules/languages/typescript-react-native.md +446 -446
- package/.claude/vibe/rules/languages/typescript-react.md +525 -525
- package/.claude/vibe/rules/languages/typescript-vue.md +353 -353
- package/.claude/vibe/rules/quality/bdd-contract-testing.md +388 -388
- package/.claude/vibe/rules/quality/checklist.md +276 -276
- package/.claude/vibe/rules/quality/testing-strategy.md +437 -437
- package/.claude/vibe/rules/standards/anti-patterns.md +369 -369
- package/.claude/vibe/rules/standards/code-structure.md +291 -291
- package/.claude/vibe/rules/standards/complexity-metrics.md +312 -312
- package/.claude/vibe/rules/standards/naming-conventions.md +198 -198
- package/.claude/vibe/setup.sh +31 -31
- package/.claude/vibe/templates/constitution-template.md +184 -184
- package/.claude/vibe/templates/contract-backend-template.md +517 -517
- package/.claude/vibe/templates/contract-frontend-template.md +594 -594
- package/.claude/vibe/templates/feature-template.md +96 -96
- package/.claude/vibe/templates/spec-template.md +199 -199
- package/CLAUDE.md +345 -323
- package/LICENSE +21 -21
- package/README.md +744 -724
- package/agents/compounder.md +261 -261
- package/agents/diagrammer.md +178 -178
- package/agents/e2e-tester.md +266 -266
- package/agents/explorer.md +48 -48
- package/agents/implementer.md +53 -53
- package/agents/research/best-practices-agent.md +139 -139
- package/agents/research/codebase-patterns-agent.md +147 -147
- package/agents/research/framework-docs-agent.md +181 -181
- package/agents/research/security-advisory-agent.md +167 -167
- package/agents/review/architecture-reviewer.md +107 -107
- package/agents/review/complexity-reviewer.md +116 -116
- package/agents/review/data-integrity-reviewer.md +88 -88
- package/agents/review/git-history-reviewer.md +103 -103
- package/agents/review/performance-reviewer.md +86 -86
- package/agents/review/python-reviewer.md +152 -152
- package/agents/review/rails-reviewer.md +139 -139
- package/agents/review/react-reviewer.md +144 -144
- package/agents/review/security-reviewer.md +80 -80
- package/agents/review/simplicity-reviewer.md +140 -140
- package/agents/review/test-coverage-reviewer.md +116 -116
- package/agents/review/typescript-reviewer.md +127 -127
- package/agents/searcher.md +54 -54
- package/agents/simplifier.md +119 -119
- package/agents/tester.md +49 -49
- package/agents/ui-previewer.md +137 -137
- package/commands/vibe.analyze.md +245 -180
- package/commands/vibe.reason.md +223 -183
- package/commands/vibe.review.md +200 -136
- package/commands/vibe.run.md +838 -836
- package/commands/vibe.spec.md +419 -383
- package/commands/vibe.utils.md +101 -101
- package/commands/vibe.verify.md +282 -241
- package/dist/cli/index.js +385 -385
- package/dist/lib/MemoryManager.d.ts.map +1 -1
- package/dist/lib/MemoryManager.js +119 -114
- package/dist/lib/MemoryManager.js.map +1 -1
- package/dist/lib/PythonParser.js +108 -108
- package/dist/lib/gemini-mcp.js +15 -15
- package/dist/lib/gemini-oauth.js +35 -35
- package/dist/lib/gpt-mcp.js +17 -17
- package/dist/lib/gpt-oauth.js +44 -44
- package/dist/tools/analytics/getUsageAnalytics.js +12 -12
- package/dist/tools/index.d.ts +50 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +61 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/memory/createMemoryTimeline.js +10 -10
- package/dist/tools/memory/getMemoryGraph.js +12 -12
- package/dist/tools/memory/getSessionContext.js +9 -9
- package/dist/tools/memory/linkMemories.js +14 -14
- package/dist/tools/memory/listMemories.js +4 -4
- package/dist/tools/memory/recallMemory.js +4 -4
- package/dist/tools/memory/saveMemory.js +4 -4
- package/dist/tools/memory/searchMemoriesAdvanced.js +22 -22
- package/dist/tools/planning/generatePrd.js +46 -46
- package/dist/tools/prompt/enhancePromptGemini.js +160 -160
- package/dist/tools/reasoning/applyReasoningFramework.js +56 -56
- package/dist/tools/semantic/analyzeDependencyGraph.js +12 -12
- package/hooks/hooks.json +121 -103
- package/package.json +73 -69
- package/skills/git-worktree.md +178 -178
- package/skills/priority-todos.md +236 -236
|
@@ -1,198 +1,198 @@
|
|
|
1
|
-
# 📖 자동 네이밍 규칙
|
|
2
|
-
|
|
3
|
-
## 기본 규칙
|
|
4
|
-
|
|
5
|
-
```
|
|
6
|
-
변수: 명사 (userList, userData)
|
|
7
|
-
함수: 동사+명사 (fetchData, updateUser)
|
|
8
|
-
이벤트: handle 접두사 (handleClick, handleSubmit)
|
|
9
|
-
Boolean: is/has/can 접두사 (isLoading, hasError, canEdit)
|
|
10
|
-
상수: UPPER_SNAKE_CASE (MAX_RETRY_COUNT, API_TIMEOUT)
|
|
11
|
-
컴포넌트: PascalCase (UserProfile, HeaderSection)
|
|
12
|
-
훅: use 접두사 (useUserData, useAuth)
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## 변수 네이밍
|
|
16
|
-
|
|
17
|
-
### ✅ 좋은 예
|
|
18
|
-
|
|
19
|
-
```typescript
|
|
20
|
-
const userList = [...];
|
|
21
|
-
const totalAmount = 0;
|
|
22
|
-
const currentPage = 1;
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
### ❌ 나쁜 예
|
|
26
|
-
|
|
27
|
-
```typescript
|
|
28
|
-
const list = [...]; // 무엇의 리스트?
|
|
29
|
-
const total = 0; // 무엇의 총합?
|
|
30
|
-
const page = 1; // 명확하지 않음
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## 함수 네이밍
|
|
34
|
-
|
|
35
|
-
### ✅ 좋은 예
|
|
36
|
-
|
|
37
|
-
```typescript
|
|
38
|
-
function fetchUserData() { }
|
|
39
|
-
function updateProfile() { }
|
|
40
|
-
function validateEmail() { }
|
|
41
|
-
function calculateTotal() { }
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
### ❌ 나쁜 예
|
|
45
|
-
|
|
46
|
-
```typescript
|
|
47
|
-
function user() { } // 동사 없음
|
|
48
|
-
function data() { } // 불명확
|
|
49
|
-
function process() { } // 무엇을 처리?
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
## 이벤트 핸들러
|
|
53
|
-
|
|
54
|
-
### ✅ 좋은 예
|
|
55
|
-
|
|
56
|
-
```typescript
|
|
57
|
-
function handleClick() { }
|
|
58
|
-
function handleSubmit() { }
|
|
59
|
-
function handleInputChange() { }
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
### ❌ 나쁜 예
|
|
63
|
-
|
|
64
|
-
```typescript
|
|
65
|
-
function onClick() { } // handle 접두사 권장
|
|
66
|
-
function submit() { } // 이벤트임이 불명확
|
|
67
|
-
function change() { } // 무엇의 변경?
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
## Boolean 변수
|
|
71
|
-
|
|
72
|
-
### ✅ 좋은 예
|
|
73
|
-
|
|
74
|
-
```typescript
|
|
75
|
-
const isLoading = false;
|
|
76
|
-
const hasError = false;
|
|
77
|
-
const canEdit = true;
|
|
78
|
-
const shouldUpdate = false;
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
### ❌ 나쁜 예
|
|
82
|
-
|
|
83
|
-
```typescript
|
|
84
|
-
const loading = false; // is 접두사 권장
|
|
85
|
-
const error = false; // has 권장
|
|
86
|
-
const editable = true; // can 권장
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
## 상수
|
|
90
|
-
|
|
91
|
-
### ✅ 좋은 예
|
|
92
|
-
|
|
93
|
-
```typescript
|
|
94
|
-
const MAX_RETRY_COUNT = 3;
|
|
95
|
-
const API_TIMEOUT_MS = 5000;
|
|
96
|
-
const DEFAULT_PAGE_SIZE = 20;
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
### ❌ 나쁜 예
|
|
100
|
-
|
|
101
|
-
```typescript
|
|
102
|
-
const maxRetry = 3; // UPPER_SNAKE_CASE 사용
|
|
103
|
-
const timeout = 5000; // 단위 명시 부족
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
## 컴포넌트 & 클래스
|
|
107
|
-
|
|
108
|
-
### ✅ 좋은 예
|
|
109
|
-
|
|
110
|
-
```typescript
|
|
111
|
-
class UserProfile { }
|
|
112
|
-
class DataRepository { }
|
|
113
|
-
function ProfileCard() { }
|
|
114
|
-
function NavigationBar() { }
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
### ❌ 나쁜 예
|
|
118
|
-
|
|
119
|
-
```typescript
|
|
120
|
-
class userProfile { } // PascalCase 사용
|
|
121
|
-
class data { } // 불명확
|
|
122
|
-
function profile() { } // PascalCase 권장
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
## 커스텀 훅 (React)
|
|
126
|
-
|
|
127
|
-
### ✅ 좋은 예
|
|
128
|
-
|
|
129
|
-
```typescript
|
|
130
|
-
function useUserData() { }
|
|
131
|
-
function useAuth() { }
|
|
132
|
-
function useLocalStorage() { }
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
### ❌ 나쁜 예
|
|
136
|
-
|
|
137
|
-
```typescript
|
|
138
|
-
function getUserData() { } // use 접두사 필수
|
|
139
|
-
function auth() { } // use 접두사 필수
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
## 타입 & 인터페이스 (TypeScript)
|
|
143
|
-
|
|
144
|
-
### ✅ 좋은 예
|
|
145
|
-
|
|
146
|
-
```typescript
|
|
147
|
-
interface User { }
|
|
148
|
-
type UserRole = 'admin' | 'user';
|
|
149
|
-
interface ApiResponse<T> { }
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
### ❌ 나쁜 예
|
|
153
|
-
|
|
154
|
-
```typescript
|
|
155
|
-
interface IUser { } // I 접두사 불필요 (TypeScript)
|
|
156
|
-
type user = { }; // PascalCase 사용
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
## 파일 네이밍
|
|
160
|
-
|
|
161
|
-
### ✅ 좋은 예
|
|
162
|
-
|
|
163
|
-
```
|
|
164
|
-
user-profile.component.tsx
|
|
165
|
-
user.service.ts
|
|
166
|
-
auth.utils.ts
|
|
167
|
-
constants.ts
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
### ❌ 나쁜 예
|
|
171
|
-
|
|
172
|
-
```
|
|
173
|
-
UserProfile.tsx // kebab-case 권장
|
|
174
|
-
user_service.ts // kebab-case 권장
|
|
175
|
-
utils.ts // 불명확
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
## 약어 사용 원칙
|
|
179
|
-
|
|
180
|
-
- 일반적인 약어만 사용 (URL, API, ID, HTML, CSS)
|
|
181
|
-
- 프로젝트 특정 약어는 문서화 필수
|
|
182
|
-
- 의미가 명확하지 않으면 전체 단어 사용
|
|
183
|
-
|
|
184
|
-
### ✅ 좋은 예
|
|
185
|
-
|
|
186
|
-
```typescript
|
|
187
|
-
const userId = '123';
|
|
188
|
-
const apiEndpoint = '/users';
|
|
189
|
-
const htmlContent = '<div>';
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
### ❌ 나쁜 예
|
|
193
|
-
|
|
194
|
-
```typescript
|
|
195
|
-
const usrId = '123'; // 불명확한 약어
|
|
196
|
-
const endpt = '/users'; // 과도한 축약
|
|
197
|
-
const cnt = '<div>'; // content로 명확히
|
|
198
|
-
```
|
|
1
|
+
# 📖 자동 네이밍 규칙
|
|
2
|
+
|
|
3
|
+
## 기본 규칙
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
변수: 명사 (userList, userData)
|
|
7
|
+
함수: 동사+명사 (fetchData, updateUser)
|
|
8
|
+
이벤트: handle 접두사 (handleClick, handleSubmit)
|
|
9
|
+
Boolean: is/has/can 접두사 (isLoading, hasError, canEdit)
|
|
10
|
+
상수: UPPER_SNAKE_CASE (MAX_RETRY_COUNT, API_TIMEOUT)
|
|
11
|
+
컴포넌트: PascalCase (UserProfile, HeaderSection)
|
|
12
|
+
훅: use 접두사 (useUserData, useAuth)
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## 변수 네이밍
|
|
16
|
+
|
|
17
|
+
### ✅ 좋은 예
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
const userList = [...];
|
|
21
|
+
const totalAmount = 0;
|
|
22
|
+
const currentPage = 1;
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### ❌ 나쁜 예
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
const list = [...]; // 무엇의 리스트?
|
|
29
|
+
const total = 0; // 무엇의 총합?
|
|
30
|
+
const page = 1; // 명확하지 않음
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 함수 네이밍
|
|
34
|
+
|
|
35
|
+
### ✅ 좋은 예
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
function fetchUserData() { }
|
|
39
|
+
function updateProfile() { }
|
|
40
|
+
function validateEmail() { }
|
|
41
|
+
function calculateTotal() { }
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### ❌ 나쁜 예
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
function user() { } // 동사 없음
|
|
48
|
+
function data() { } // 불명확
|
|
49
|
+
function process() { } // 무엇을 처리?
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## 이벤트 핸들러
|
|
53
|
+
|
|
54
|
+
### ✅ 좋은 예
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
function handleClick() { }
|
|
58
|
+
function handleSubmit() { }
|
|
59
|
+
function handleInputChange() { }
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### ❌ 나쁜 예
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
function onClick() { } // handle 접두사 권장
|
|
66
|
+
function submit() { } // 이벤트임이 불명확
|
|
67
|
+
function change() { } // 무엇의 변경?
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Boolean 변수
|
|
71
|
+
|
|
72
|
+
### ✅ 좋은 예
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
const isLoading = false;
|
|
76
|
+
const hasError = false;
|
|
77
|
+
const canEdit = true;
|
|
78
|
+
const shouldUpdate = false;
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### ❌ 나쁜 예
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
const loading = false; // is 접두사 권장
|
|
85
|
+
const error = false; // has 권장
|
|
86
|
+
const editable = true; // can 권장
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## 상수
|
|
90
|
+
|
|
91
|
+
### ✅ 좋은 예
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
const MAX_RETRY_COUNT = 3;
|
|
95
|
+
const API_TIMEOUT_MS = 5000;
|
|
96
|
+
const DEFAULT_PAGE_SIZE = 20;
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### ❌ 나쁜 예
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
const maxRetry = 3; // UPPER_SNAKE_CASE 사용
|
|
103
|
+
const timeout = 5000; // 단위 명시 부족
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## 컴포넌트 & 클래스
|
|
107
|
+
|
|
108
|
+
### ✅ 좋은 예
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
class UserProfile { }
|
|
112
|
+
class DataRepository { }
|
|
113
|
+
function ProfileCard() { }
|
|
114
|
+
function NavigationBar() { }
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### ❌ 나쁜 예
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
class userProfile { } // PascalCase 사용
|
|
121
|
+
class data { } // 불명확
|
|
122
|
+
function profile() { } // PascalCase 권장
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## 커스텀 훅 (React)
|
|
126
|
+
|
|
127
|
+
### ✅ 좋은 예
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
function useUserData() { }
|
|
131
|
+
function useAuth() { }
|
|
132
|
+
function useLocalStorage() { }
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### ❌ 나쁜 예
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
function getUserData() { } // use 접두사 필수
|
|
139
|
+
function auth() { } // use 접두사 필수
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## 타입 & 인터페이스 (TypeScript)
|
|
143
|
+
|
|
144
|
+
### ✅ 좋은 예
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
interface User { }
|
|
148
|
+
type UserRole = 'admin' | 'user';
|
|
149
|
+
interface ApiResponse<T> { }
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### ❌ 나쁜 예
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
interface IUser { } // I 접두사 불필요 (TypeScript)
|
|
156
|
+
type user = { }; // PascalCase 사용
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## 파일 네이밍
|
|
160
|
+
|
|
161
|
+
### ✅ 좋은 예
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
user-profile.component.tsx
|
|
165
|
+
user.service.ts
|
|
166
|
+
auth.utils.ts
|
|
167
|
+
constants.ts
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### ❌ 나쁜 예
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
UserProfile.tsx // kebab-case 권장
|
|
174
|
+
user_service.ts // kebab-case 권장
|
|
175
|
+
utils.ts // 불명확
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## 약어 사용 원칙
|
|
179
|
+
|
|
180
|
+
- 일반적인 약어만 사용 (URL, API, ID, HTML, CSS)
|
|
181
|
+
- 프로젝트 특정 약어는 문서화 필수
|
|
182
|
+
- 의미가 명확하지 않으면 전체 단어 사용
|
|
183
|
+
|
|
184
|
+
### ✅ 좋은 예
|
|
185
|
+
|
|
186
|
+
```typescript
|
|
187
|
+
const userId = '123';
|
|
188
|
+
const apiEndpoint = '/users';
|
|
189
|
+
const htmlContent = '<div>';
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### ❌ 나쁜 예
|
|
193
|
+
|
|
194
|
+
```typescript
|
|
195
|
+
const usrId = '123'; // 불명확한 약어
|
|
196
|
+
const endpt = '/users'; // 과도한 축약
|
|
197
|
+
const cnt = '<div>'; // content로 명확히
|
|
198
|
+
```
|
package/.claude/vibe/setup.sh
CHANGED
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Vibe 협업자 자동 설치 스크립트
|
|
3
|
-
# 사용법: ./.claude/vibe/setup.sh
|
|
4
|
-
|
|
5
|
-
set -e
|
|
6
|
-
|
|
7
|
-
echo "🔧 Vibe 설치 확인 중..."
|
|
8
|
-
|
|
9
|
-
# npm/npx 확인
|
|
10
|
-
if ! command -v npx &> /dev/null; then
|
|
11
|
-
echo "❌ Node.js/npm이 설치되어 있지 않습니다."
|
|
12
|
-
echo " https://nodejs.org 에서 설치해주세요."
|
|
13
|
-
exit 1
|
|
14
|
-
fi
|
|
15
|
-
|
|
16
|
-
# vibe 설치 확인 및 업데이트
|
|
17
|
-
if command -v vibe &> /dev/null; then
|
|
18
|
-
echo "✅ Vibe가 이미 설치되어 있습니다."
|
|
19
|
-
vibe update --silent
|
|
20
|
-
echo "✅ Vibe 업데이트 완료!"
|
|
21
|
-
else
|
|
22
|
-
echo "📦 Vibe 설치 중..."
|
|
23
|
-
npm install -g @su-record/vibe
|
|
24
|
-
vibe update --silent
|
|
25
|
-
echo "✅ Vibe 설치 및 설정 완료!"
|
|
26
|
-
fi
|
|
27
|
-
|
|
28
|
-
echo ""
|
|
29
|
-
echo "다음 명령어로 시작하세요:"
|
|
30
|
-
echo " /vibe.spec \"기능명\" SPEC 작성"
|
|
31
|
-
echo " /vibe.run \"기능명\" 구현 실행"
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Vibe 협업자 자동 설치 스크립트
|
|
3
|
+
# 사용법: ./.claude/vibe/setup.sh
|
|
4
|
+
|
|
5
|
+
set -e
|
|
6
|
+
|
|
7
|
+
echo "🔧 Vibe 설치 확인 중..."
|
|
8
|
+
|
|
9
|
+
# npm/npx 확인
|
|
10
|
+
if ! command -v npx &> /dev/null; then
|
|
11
|
+
echo "❌ Node.js/npm이 설치되어 있지 않습니다."
|
|
12
|
+
echo " https://nodejs.org 에서 설치해주세요."
|
|
13
|
+
exit 1
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
# vibe 설치 확인 및 업데이트
|
|
17
|
+
if command -v vibe &> /dev/null; then
|
|
18
|
+
echo "✅ Vibe가 이미 설치되어 있습니다."
|
|
19
|
+
vibe update --silent
|
|
20
|
+
echo "✅ Vibe 업데이트 완료!"
|
|
21
|
+
else
|
|
22
|
+
echo "📦 Vibe 설치 중..."
|
|
23
|
+
npm install -g @su-record/vibe
|
|
24
|
+
vibe update --silent
|
|
25
|
+
echo "✅ Vibe 설치 및 설정 완료!"
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
echo ""
|
|
29
|
+
echo "다음 명령어로 시작하세요:"
|
|
30
|
+
echo " /vibe.spec \"기능명\" SPEC 작성"
|
|
31
|
+
echo " /vibe.run \"기능명\" 구현 실행"
|