@su-record/vibe 0.1.3 → 0.1.7
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.analyze.md +123 -0
- package/.claude/commands/vibe.diagram.md +174 -0
- package/.claude/commands/vibe.plan.md +75 -0
- package/.claude/commands/vibe.run.md +151 -0
- package/.claude/commands/vibe.spec.md +273 -0
- package/.claude/commands/vibe.tasks.md +77 -0
- package/.claude/commands/vibe.ui.md +133 -0
- package/.claude/commands/vibe.verify.md +128 -0
- package/.claude/settings.local.json +14 -0
- package/README.md +170 -108
- package/bin/vibe +113 -226
- package/package.json +7 -7
- package/scripts/install-mcp.js +16 -6
- package/skills/quality/bdd-contract-testing.md +388 -0
- package/templates/contract-backend-template.md +517 -0
- package/templates/contract-frontend-template.md +594 -0
- package/templates/feature-template.md +259 -0
- package/templates/spec-template.md +60 -3
- package/mcp/dist/__tests__/complexity.test.js +0 -126
- package/mcp/dist/__tests__/memory.test.js +0 -120
- package/mcp/dist/__tests__/python-dart-complexity.test.js +0 -146
- package/mcp/dist/index.js +0 -230
- package/mcp/dist/lib/ContextCompressor.js +0 -305
- package/mcp/dist/lib/MemoryManager.js +0 -334
- package/mcp/dist/lib/ProjectCache.js +0 -126
- package/mcp/dist/lib/PythonParser.js +0 -241
- package/mcp/dist/tools/browser/browserPool.js +0 -76
- package/mcp/dist/tools/browser/browserUtils.js +0 -135
- package/mcp/dist/tools/browser/inspectNetworkRequests.js +0 -140
- package/mcp/dist/tools/browser/monitorConsoleLogs.js +0 -97
- package/mcp/dist/tools/convention/analyzeComplexity.js +0 -248
- package/mcp/dist/tools/convention/applyQualityRules.js +0 -102
- package/mcp/dist/tools/convention/checkCouplingCohesion.js +0 -233
- package/mcp/dist/tools/convention/complexityMetrics.js +0 -133
- package/mcp/dist/tools/convention/dartComplexity.js +0 -117
- package/mcp/dist/tools/convention/getCodingGuide.js +0 -64
- package/mcp/dist/tools/convention/languageDetector.js +0 -50
- package/mcp/dist/tools/convention/pythonComplexity.js +0 -109
- package/mcp/dist/tools/convention/suggestImprovements.js +0 -257
- package/mcp/dist/tools/convention/validateCodeQuality.js +0 -177
- package/mcp/dist/tools/memory/autoSaveContext.js +0 -79
- package/mcp/dist/tools/memory/database.js +0 -123
- package/mcp/dist/tools/memory/deleteMemory.js +0 -39
- package/mcp/dist/tools/memory/listMemories.js +0 -38
- package/mcp/dist/tools/memory/memoryConfig.js +0 -27
- package/mcp/dist/tools/memory/memorySQLite.js +0 -138
- package/mcp/dist/tools/memory/memoryUtils.js +0 -34
- package/mcp/dist/tools/memory/migrate.js +0 -113
- package/mcp/dist/tools/memory/prioritizeMemory.js +0 -109
- package/mcp/dist/tools/memory/recallMemory.js +0 -40
- package/mcp/dist/tools/memory/restoreSessionContext.js +0 -69
- package/mcp/dist/tools/memory/saveMemory.js +0 -34
- package/mcp/dist/tools/memory/searchMemories.js +0 -37
- package/mcp/dist/tools/memory/startSession.js +0 -100
- package/mcp/dist/tools/memory/updateMemory.js +0 -46
- package/mcp/dist/tools/planning/analyzeRequirements.js +0 -166
- package/mcp/dist/tools/planning/createUserStories.js +0 -119
- package/mcp/dist/tools/planning/featureRoadmap.js +0 -202
- package/mcp/dist/tools/planning/generatePrd.js +0 -156
- package/mcp/dist/tools/prompt/analyzePrompt.js +0 -145
- package/mcp/dist/tools/prompt/enhancePrompt.js +0 -105
- package/mcp/dist/tools/semantic/findReferences.js +0 -195
- package/mcp/dist/tools/semantic/findSymbol.js +0 -200
- package/mcp/dist/tools/thinking/analyzeProblem.js +0 -50
- package/mcp/dist/tools/thinking/breakDownProblem.js +0 -140
- package/mcp/dist/tools/thinking/createThinkingChain.js +0 -39
- package/mcp/dist/tools/thinking/formatAsPlan.js +0 -73
- package/mcp/dist/tools/thinking/stepByStepAnalysis.js +0 -58
- package/mcp/dist/tools/thinking/thinkAloudProcess.js +0 -75
- package/mcp/dist/tools/time/getCurrentTime.js +0 -61
- package/mcp/dist/tools/ui/previewUiAscii.js +0 -232
- package/mcp/dist/types/tool.js +0 -2
- package/mcp/package.json +0 -53
package/bin/vibe
CHANGED
|
@@ -8,19 +8,9 @@
|
|
|
8
8
|
const path = require('path');
|
|
9
9
|
const fs = require('fs');
|
|
10
10
|
|
|
11
|
-
// 명령어 목록
|
|
11
|
+
// 명령어 목록 (Claude Code 전용)
|
|
12
12
|
const commands = {
|
|
13
|
-
init: 'Initialize vibe in current project',
|
|
14
|
-
spec: 'Create/manage SPEC documents',
|
|
15
|
-
plan: 'Create technical implementation plan',
|
|
16
|
-
tasks: 'Break down SPEC into actionable tasks',
|
|
17
|
-
run: 'Run task implementation (with auto guide generation)',
|
|
18
|
-
verify: 'Verify implementation against SPEC',
|
|
19
|
-
analyze: 'Analyze project (code quality, architecture, dependencies)',
|
|
20
|
-
ui: 'Preview UI with ASCII art',
|
|
21
|
-
diagram: 'Generate diagrams (architecture, ERD, flow)',
|
|
22
|
-
agents: 'List available agents',
|
|
23
|
-
skills: 'List installed skills',
|
|
13
|
+
init: 'Initialize vibe in current project (MCP registration)',
|
|
24
14
|
help: 'Show help message'
|
|
25
15
|
};
|
|
26
16
|
|
|
@@ -30,50 +20,40 @@ const command = args[0];
|
|
|
30
20
|
// 도움말 출력
|
|
31
21
|
function showHelp() {
|
|
32
22
|
console.log(`
|
|
33
|
-
📖
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
init
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
analyze
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
diagram Generate architecture diagram
|
|
53
|
-
diagram --er Generate ERD diagram
|
|
54
|
-
|
|
55
|
-
agents List available agents
|
|
56
|
-
skills List installed skills
|
|
57
|
-
help Show this message
|
|
23
|
+
📖 Vibe - SPEC-driven AI coding framework for Claude Code
|
|
24
|
+
|
|
25
|
+
⚠️ Vibe는 Claude Code 전용 프레임워크입니다.
|
|
26
|
+
터미널에서는 초기화만 가능합니다.
|
|
27
|
+
|
|
28
|
+
터미널 명령어:
|
|
29
|
+
vibe init Initialize vibe in current project
|
|
30
|
+
vibe init <project-name> Create new project with vibe
|
|
31
|
+
vibe help Show this message
|
|
32
|
+
|
|
33
|
+
Claude Code 슬래시 커맨드 (프로젝트 내에서 사용):
|
|
34
|
+
/vibe.spec "기능명" SPEC 작성 (대화형 Q&A)
|
|
35
|
+
/vibe.plan "기능명" 기술 계획 작성
|
|
36
|
+
/vibe.tasks "기능명" Task 목록 생성
|
|
37
|
+
/vibe.run "Task 1-1" Task 구현
|
|
38
|
+
/vibe.verify "기능명" 검증
|
|
39
|
+
/vibe.analyze 프로젝트 분석
|
|
40
|
+
/vibe.ui "설명" UI 미리보기
|
|
41
|
+
/vibe.diagram --er 다이어그램 생성
|
|
58
42
|
|
|
59
43
|
Workflow:
|
|
60
|
-
1. vibe
|
|
61
|
-
2.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
$ vibe run --all # 전체 실행
|
|
74
|
-
|
|
75
|
-
More info:
|
|
76
|
-
https://github.com/your-username/vibe
|
|
44
|
+
1. 터미널에서 vibe init 실행 (MCP 서버 등록)
|
|
45
|
+
2. Claude Code에서 슬래시 커맨드 사용
|
|
46
|
+
/vibe.spec "푸시 알림 설정"
|
|
47
|
+
/vibe.plan "푸시 알림 설정"
|
|
48
|
+
/vibe.tasks "푸시 알림 설정"
|
|
49
|
+
/vibe.run "Task 1-1"
|
|
50
|
+
/vibe.verify "푸시 알림 설정"
|
|
51
|
+
|
|
52
|
+
설치:
|
|
53
|
+
npm install -g @su-record/vibe
|
|
54
|
+
|
|
55
|
+
문서:
|
|
56
|
+
https://github.com/su-record/vibe/wiki
|
|
77
57
|
`);
|
|
78
58
|
}
|
|
79
59
|
|
|
@@ -84,20 +64,73 @@ function showVersion() {
|
|
|
84
64
|
}
|
|
85
65
|
|
|
86
66
|
// 프로젝트 초기화
|
|
87
|
-
function init() {
|
|
88
|
-
|
|
67
|
+
function init(projectName) {
|
|
68
|
+
let projectRoot = process.cwd();
|
|
69
|
+
let isNewProject = false;
|
|
70
|
+
|
|
71
|
+
// 새 프로젝트 생성 케이스
|
|
72
|
+
if (projectName) {
|
|
73
|
+
projectRoot = path.join(process.cwd(), projectName);
|
|
74
|
+
|
|
75
|
+
if (fs.existsSync(projectRoot)) {
|
|
76
|
+
console.log(`❌ 폴더가 이미 존재합니다: ${projectName}/`);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
console.log(`📁 새 프로젝트 생성: ${projectName}/\n`);
|
|
81
|
+
fs.mkdirSync(projectRoot, { recursive: true });
|
|
82
|
+
isNewProject = true;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const vibeDir = path.join(projectRoot, '.vibe');
|
|
89
86
|
|
|
90
87
|
if (fs.existsSync(vibeDir)) {
|
|
91
88
|
console.log('❌ .vibe/ 폴더가 이미 존재합니다.');
|
|
92
89
|
return;
|
|
93
90
|
}
|
|
94
91
|
|
|
92
|
+
// MCP 서버 등록 먼저 체크 및 실행
|
|
93
|
+
console.log('🔧 MCP 서버 확인 중...\n');
|
|
94
|
+
try {
|
|
95
|
+
const { execSync } = require('child_process');
|
|
96
|
+
|
|
97
|
+
// MCP 서버 등록 스크립트 실행
|
|
98
|
+
const installScriptPath = path.join(__dirname, '../scripts/install-mcp.js');
|
|
99
|
+
execSync(`node "${installScriptPath}"`, { stdio: 'inherit' });
|
|
100
|
+
|
|
101
|
+
} catch (error) {
|
|
102
|
+
console.log('\n⚠️ MCP 서버 등록 중 오류가 발생했습니다.');
|
|
103
|
+
console.log(' 계속 진행합니다...\n');
|
|
104
|
+
}
|
|
105
|
+
|
|
95
106
|
// 폴더 생성
|
|
96
107
|
fs.mkdirSync(vibeDir);
|
|
97
108
|
fs.mkdirSync(path.join(vibeDir, 'specs'));
|
|
98
109
|
fs.mkdirSync(path.join(vibeDir, 'plans'));
|
|
99
110
|
fs.mkdirSync(path.join(vibeDir, 'tasks'));
|
|
100
111
|
|
|
112
|
+
// .claude/commands 폴더 생성 및 슬래시 커맨드 복사
|
|
113
|
+
const claudeDir = path.join(projectRoot, '.claude');
|
|
114
|
+
const commandsDir = path.join(claudeDir, 'commands');
|
|
115
|
+
|
|
116
|
+
if (!fs.existsSync(claudeDir)) {
|
|
117
|
+
fs.mkdirSync(claudeDir);
|
|
118
|
+
}
|
|
119
|
+
if (!fs.existsSync(commandsDir)) {
|
|
120
|
+
fs.mkdirSync(commandsDir);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// 슬래시 커맨드 파일들 복사
|
|
124
|
+
const sourceCommandsDir = path.join(__dirname, '../.claude/commands');
|
|
125
|
+
if (fs.existsSync(sourceCommandsDir)) {
|
|
126
|
+
const commandFiles = fs.readdirSync(sourceCommandsDir);
|
|
127
|
+
commandFiles.forEach(file => {
|
|
128
|
+
const sourcePath = path.join(sourceCommandsDir, file);
|
|
129
|
+
const destPath = path.join(commandsDir, file);
|
|
130
|
+
fs.copyFileSync(sourcePath, destPath);
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
|
|
101
134
|
// constitution.md 템플릿 복사
|
|
102
135
|
const templatePath = path.join(__dirname, '../templates/constitution-template.md');
|
|
103
136
|
const constitutionPath = path.join(vibeDir, 'constitution.md');
|
|
@@ -115,7 +148,7 @@ function init() {
|
|
|
115
148
|
},
|
|
116
149
|
mcp: {
|
|
117
150
|
enabled: true,
|
|
118
|
-
servers: ['
|
|
151
|
+
servers: ['vibe']
|
|
119
152
|
},
|
|
120
153
|
quality: {
|
|
121
154
|
strict: true,
|
|
@@ -127,7 +160,11 @@ function init() {
|
|
|
127
160
|
console.log(`
|
|
128
161
|
✅ vibe 초기화 완료!
|
|
129
162
|
|
|
130
|
-
|
|
163
|
+
${isNewProject ? `프로젝트 위치:
|
|
164
|
+
${projectRoot}/
|
|
165
|
+
|
|
166
|
+
` : ''}생성된 구조:
|
|
167
|
+
.claude/commands/ # 슬래시 커맨드 (8개)
|
|
131
168
|
.vibe/
|
|
132
169
|
├── config.json # 프로젝트 설정 (언어: 한국어)
|
|
133
170
|
├── constitution.md # 프로젝트 원칙
|
|
@@ -135,71 +172,25 @@ function init() {
|
|
|
135
172
|
├── plans/ # 기술 계획들
|
|
136
173
|
└── tasks/ # 작업 목록들
|
|
137
174
|
|
|
175
|
+
MCP 서버:
|
|
176
|
+
✓ vibe MCP 서버 등록 완료 (38개 도구)
|
|
177
|
+
확인: claude mcp list
|
|
178
|
+
|
|
138
179
|
언어 변경:
|
|
139
180
|
.vibe/config.json에서 "language"를 "en" 또는 "ko"로 변경
|
|
140
181
|
|
|
141
182
|
다음 단계:
|
|
142
|
-
|
|
183
|
+
${isNewProject ? `1. cd ${projectName}\n 2. ` : ''}Claude Code에서 슬래시 커맨드 사용:
|
|
184
|
+
/vibe.spec "기능명"
|
|
185
|
+
/vibe.plan "기능명"
|
|
143
186
|
`);
|
|
144
187
|
}
|
|
145
188
|
|
|
146
|
-
// 에이전트 목록
|
|
147
|
-
function listAgents() {
|
|
148
|
-
const agentsDir = path.join(__dirname, '../agents');
|
|
149
|
-
const agents = fs.readdirSync(agentsDir).filter(f => f.endsWith('.md'));
|
|
150
|
-
|
|
151
|
-
console.log('\n🤖 사용 가능한 에이전트:\n');
|
|
152
|
-
agents.forEach((agent, i) => {
|
|
153
|
-
const name = agent.replace('.md', '');
|
|
154
|
-
console.log(` ${i + 1}. ${name}`);
|
|
155
|
-
});
|
|
156
|
-
console.log('');
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// 스킬 목록
|
|
160
|
-
function listSkills() {
|
|
161
|
-
const skillsDir = path.join(__dirname, '../skills');
|
|
162
|
-
const categories = fs.readdirSync(skillsDir).filter(f => {
|
|
163
|
-
return fs.statSync(path.join(skillsDir, f)).isDirectory();
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
console.log('\n📚 설치된 스킬:\n');
|
|
167
|
-
categories.forEach(category => {
|
|
168
|
-
const skills = fs.readdirSync(path.join(skillsDir, category))
|
|
169
|
-
.filter(f => f.endsWith('.md'));
|
|
170
|
-
console.log(` ${category}/`);
|
|
171
|
-
skills.forEach(skill => {
|
|
172
|
-
console.log(` - ${skill.replace('.md', '')}`);
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
console.log('');
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
// Claude Code와 통합 (추후 구현)
|
|
179
|
-
function delegateToClaudeCode(command, args) {
|
|
180
|
-
console.log(`
|
|
181
|
-
⚠️ 이 명령어는 Claude Code와 통합이 필요합니다.
|
|
182
|
-
|
|
183
|
-
지금은 수동으로 Claude Code를 열고 다음과 같이 요청하세요:
|
|
184
|
-
|
|
185
|
-
"${command} ${args.join(' ')}"
|
|
186
|
-
|
|
187
|
-
향후 업데이트에서 자동화될 예정입니다.
|
|
188
|
-
`);
|
|
189
|
-
}
|
|
190
189
|
|
|
191
190
|
// 메인 라우터
|
|
192
191
|
switch (command) {
|
|
193
192
|
case 'init':
|
|
194
|
-
init();
|
|
195
|
-
break;
|
|
196
|
-
|
|
197
|
-
case 'agents':
|
|
198
|
-
listAgents();
|
|
199
|
-
break;
|
|
200
|
-
|
|
201
|
-
case 'skills':
|
|
202
|
-
listSkills();
|
|
193
|
+
init(args[1]);
|
|
203
194
|
break;
|
|
204
195
|
|
|
205
196
|
case 'version':
|
|
@@ -215,124 +206,20 @@ switch (command) {
|
|
|
215
206
|
showHelp();
|
|
216
207
|
break;
|
|
217
208
|
|
|
218
|
-
// vibe run 명령어 (새로운 구현 워크플로우)
|
|
219
|
-
case 'run':
|
|
220
|
-
handleRunCommand(args.slice(1));
|
|
221
|
-
break;
|
|
222
|
-
|
|
223
|
-
// Claude Code 위임이 필요한 명령어들
|
|
224
|
-
case 'spec':
|
|
225
|
-
case 'plan':
|
|
226
|
-
case 'tasks':
|
|
227
|
-
case 'verify':
|
|
228
|
-
case 'analyze':
|
|
229
|
-
case 'ui':
|
|
230
|
-
case 'diagram':
|
|
231
|
-
delegateToClaudeCode(command, args.slice(1));
|
|
232
|
-
break;
|
|
233
|
-
|
|
234
209
|
default:
|
|
235
|
-
console.log(`❌ 알 수 없는 명령어: ${command}`);
|
|
236
|
-
console.log('사용법을 보려면: vibe help');
|
|
237
|
-
process.exit(1);
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
// vibe run 명령어 핸들러
|
|
241
|
-
function handleRunCommand(args) {
|
|
242
|
-
const option = args[0];
|
|
243
|
-
|
|
244
|
-
if (!option) {
|
|
245
|
-
console.log(`
|
|
246
|
-
❌ 사용법: vibe run <task-id> | --phase <N> | --all
|
|
247
|
-
|
|
248
|
-
예시:
|
|
249
|
-
vibe run "Task 1-1" # 특정 Task 실행
|
|
250
|
-
vibe run --phase 1 # Phase 1 전체 실행
|
|
251
|
-
vibe run --all # 모든 Task 실행
|
|
252
|
-
`);
|
|
253
|
-
return;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// --all 플래그 처리
|
|
257
|
-
if (option === '--all') {
|
|
258
210
|
console.log(`
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
Claude Code에 다음과 같이 요청하세요:
|
|
211
|
+
❌ 알 수 없는 명령어: ${command}
|
|
262
212
|
|
|
263
|
-
|
|
213
|
+
⚠️ Vibe는 Claude Code 전용 프레임워크입니다.
|
|
214
|
+
터미널에서는 'init'만 사용 가능합니다.
|
|
264
215
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
216
|
+
Claude Code에서 슬래시 커맨드를 사용하세요:
|
|
217
|
+
/vibe.spec "기능명"
|
|
218
|
+
/vibe.plan "기능명"
|
|
219
|
+
/vibe.tasks "기능명"
|
|
220
|
+
/vibe.run "Task 1-1"
|
|
269
221
|
|
|
270
|
-
|
|
222
|
+
사용법: vibe help
|
|
271
223
|
`);
|
|
272
|
-
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
// --phase 플래그 처리
|
|
276
|
-
if (option === '--phase') {
|
|
277
|
-
const phaseNumber = args[1];
|
|
278
|
-
if (!phaseNumber) {
|
|
279
|
-
console.log(`❌ Phase 번호를 지정하세요: vibe run --phase <1|2|3>`);
|
|
280
|
-
return;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
console.log(`
|
|
284
|
-
🚀 Phase ${phaseNumber} 실행 시작...
|
|
285
|
-
|
|
286
|
-
Claude Code에 다음과 같이 요청하세요:
|
|
287
|
-
|
|
288
|
-
"vibe run --phase ${phaseNumber} 실행해줘. TASKS 문서의 Phase ${phaseNumber} Task들을 순차적으로 구현해줘."
|
|
289
|
-
|
|
290
|
-
Phase ${phaseNumber} 작업 목록:
|
|
291
|
-
${getPhaseTaskList(phaseNumber)}
|
|
292
|
-
|
|
293
|
-
예상 시간: ${getPhaseEstimatedTime(phaseNumber)}
|
|
294
|
-
`);
|
|
295
|
-
return;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
// 특정 Task 실행
|
|
299
|
-
const taskId = option;
|
|
300
|
-
console.log(`
|
|
301
|
-
🚀 Task 실행: "${taskId}"
|
|
302
|
-
|
|
303
|
-
Claude Code에 다음과 같이 요청하세요:
|
|
304
|
-
|
|
305
|
-
"vibe run '${taskId}' 실행해줘. 다음 순서로 진행해줘:
|
|
306
|
-
|
|
307
|
-
1. TASKS 문서에서 '${taskId}' 찾기
|
|
308
|
-
2. 구현 가이드 생성 (.vibe/guides/${taskId}.md)
|
|
309
|
-
3. 가이드에 따라 코드 구현
|
|
310
|
-
4. Acceptance Criteria 검증
|
|
311
|
-
5. Task 상태를 ✅ 완료로 업데이트"
|
|
312
|
-
|
|
313
|
-
구현 가이드 생성 위치:
|
|
314
|
-
.vibe/guides/${taskId.replace(/\s+/g, '-').toLowerCase()}.md
|
|
315
|
-
|
|
316
|
-
검증 명령어는 TASKS 문서 참고
|
|
317
|
-
`);
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
// Phase별 Task 목록 (하드코딩 - 추후 TASKS 파일에서 파싱)
|
|
321
|
-
function getPhaseTaskList(phase) {
|
|
322
|
-
const phases = {
|
|
323
|
-
'1': 'Task 1-1 ~ 1-8 (Backend 개발)',
|
|
324
|
-
'2': 'Task 2-1 ~ 2-8 (Frontend 개발)',
|
|
325
|
-
'3': 'Task 3-1 ~ 3-3 (FCM 연동 및 테스트)'
|
|
326
|
-
};
|
|
327
|
-
return phases[phase] || '알 수 없는 Phase';
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
// Phase별 예상 시간
|
|
331
|
-
function getPhaseEstimatedTime(phase) {
|
|
332
|
-
const times = {
|
|
333
|
-
'1': '8시간 (1일)',
|
|
334
|
-
'2': '12시간 (1.5일)',
|
|
335
|
-
'3': '4시간 (0.5일)'
|
|
336
|
-
};
|
|
337
|
-
return times[phase] || '알 수 없음';
|
|
224
|
+
process.exit(1);
|
|
338
225
|
}
|
package/package.json
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@su-record/vibe",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "Vibe - SPEC-driven AI coding framework
|
|
3
|
+
"version": "0.1.7",
|
|
4
|
+
"description": "Vibe - Claude Code exclusive SPEC-driven AI coding framework",
|
|
5
5
|
"main": "cli/index.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"vibe": "./bin/vibe"
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
|
-
"build": "
|
|
11
|
-
"postinstall": "node scripts/install-mcp.js",
|
|
10
|
+
"build": "echo \"No build needed - using @su-record/hi-ai\"",
|
|
12
11
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
13
12
|
},
|
|
14
13
|
"keywords": [
|
|
@@ -32,17 +31,18 @@
|
|
|
32
31
|
"engines": {
|
|
33
32
|
"node": ">=18.0.0"
|
|
34
33
|
},
|
|
35
|
-
"dependencies": {
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@su-record/hi-ai": "latest"
|
|
36
|
+
},
|
|
36
37
|
"devDependencies": {},
|
|
37
38
|
"files": [
|
|
38
39
|
"bin/",
|
|
39
40
|
"cli/",
|
|
41
|
+
".claude/",
|
|
40
42
|
"agents/",
|
|
41
43
|
"skills/",
|
|
42
44
|
"templates/",
|
|
43
45
|
"scripts/",
|
|
44
|
-
"mcp/dist/",
|
|
45
|
-
"mcp/package.json",
|
|
46
46
|
"README.md",
|
|
47
47
|
"LICENSE"
|
|
48
48
|
]
|
package/scripts/install-mcp.js
CHANGED
|
@@ -6,14 +6,23 @@ const fs = require('fs');
|
|
|
6
6
|
|
|
7
7
|
console.log('🔧 vibe MCP 서버 설치 중...\n');
|
|
8
8
|
|
|
9
|
-
//
|
|
10
|
-
|
|
9
|
+
// vibe 패키지의 실제 설치 경로 찾기
|
|
10
|
+
// npm link인 경우: 로컬 개발 경로
|
|
11
|
+
// npm install -g인 경우: 글로벌 설치 경로
|
|
12
|
+
// path.dirname()을 사용해 크로스 플랫폼 호환 (Windows/Unix)
|
|
13
|
+
const vibePackagePath = path.dirname(__dirname);
|
|
11
14
|
|
|
12
|
-
//
|
|
15
|
+
// MCP 서버 경로 (hi-ai 패키지)
|
|
16
|
+
// path.join()이 자동으로 OS별 경로 구분자 처리
|
|
17
|
+
const mcpIndexPath = path.join(vibePackagePath, 'node_modules', '@su-record', 'hi-ai', 'dist', 'index.js');
|
|
18
|
+
|
|
19
|
+
// hi-ai 설치 확인
|
|
13
20
|
if (!fs.existsSync(mcpIndexPath)) {
|
|
14
|
-
console.log('⚠️ MCP 서버를 찾을 수 없습니다.');
|
|
21
|
+
console.log('⚠️ hi-ai MCP 서버를 찾을 수 없습니다.');
|
|
15
22
|
console.log(' 경로:', mcpIndexPath);
|
|
16
|
-
console.log(' npm install을
|
|
23
|
+
console.log(' npm install을 실행해주세요.\n');
|
|
24
|
+
console.log(' npm install');
|
|
25
|
+
console.log('');
|
|
17
26
|
process.exit(1);
|
|
18
27
|
}
|
|
19
28
|
|
|
@@ -25,7 +34,7 @@ try {
|
|
|
25
34
|
console.log('📝 실행:', command);
|
|
26
35
|
console.log('');
|
|
27
36
|
|
|
28
|
-
execSync(command, { stdio: '
|
|
37
|
+
execSync(command, { stdio: 'inherit' });
|
|
29
38
|
|
|
30
39
|
console.log('\n✅ vibe MCP 서버 등록 완료!');
|
|
31
40
|
console.log('');
|
|
@@ -60,5 +69,6 @@ try {
|
|
|
60
69
|
console.error('');
|
|
61
70
|
console.error('에러:', error.message);
|
|
62
71
|
if (stderrOutput) console.error('stderr:', stderrOutput);
|
|
72
|
+
if (stdoutOutput) console.error('stdout:', stdoutOutput);
|
|
63
73
|
process.exit(1);
|
|
64
74
|
}
|