@su-record/vibe 1.0.17 → 1.0.19
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.local.json +18 -1
- package/bin/vibe +143 -5
- package/package.json +3 -3
- package/templates/hooks-template.json +2 -2
|
@@ -11,7 +11,24 @@
|
|
|
11
11
|
"Bash(npx @su-record/vibe@latest update:*)",
|
|
12
12
|
"Bash(pnpm install)",
|
|
13
13
|
"SlashCommand(/vibe.analyze 에이전트 개발)",
|
|
14
|
-
"SlashCommand(/vibe.analyze:*)"
|
|
14
|
+
"SlashCommand(/vibe.analyze:*)",
|
|
15
|
+
"Bash(claude --version:*)",
|
|
16
|
+
"Skill(vibe.spec)",
|
|
17
|
+
"Skill(vibe.spec:*)",
|
|
18
|
+
"Bash(NODE_OPTIONS=\"--max-old-space-size=8192\" claude:*)",
|
|
19
|
+
"Skill(vibe.analyze)",
|
|
20
|
+
"Skill(vibe.analyze:*)",
|
|
21
|
+
"Bash(wc:*)",
|
|
22
|
+
"Bash(grep:*)",
|
|
23
|
+
"Bash(claude mcp list:*)",
|
|
24
|
+
"Bash(claude mcp remove:*)",
|
|
25
|
+
"Bash(claude mcp add:*)",
|
|
26
|
+
"Bash(for f in ~/workspace/fallingo/.claude/settings.json ~/workspace/meeting-room-react/.claude/settings.json ~/workspace/meeting-room-api/.claude/settings.json ~/workspace/test-vibe-project/.claude/settings.json ~/workspace/test/.claude/settings.json)",
|
|
27
|
+
"Bash(do)",
|
|
28
|
+
"Bash(if [ -f \"$f\" ])",
|
|
29
|
+
"Bash(then)",
|
|
30
|
+
"Bash(fi)",
|
|
31
|
+
"Bash(done)"
|
|
15
32
|
],
|
|
16
33
|
"deny": [],
|
|
17
34
|
"ask": []
|
package/bin/vibe
CHANGED
|
@@ -16,6 +16,9 @@ const options = {
|
|
|
16
16
|
silent: args.includes('--silent') || args.includes('-s')
|
|
17
17
|
};
|
|
18
18
|
|
|
19
|
+
// 옵션이 아닌 인자들만 필터링 (프로젝트 이름 등)
|
|
20
|
+
const positionalArgs = args.filter(arg => !arg.startsWith('-'));
|
|
21
|
+
|
|
19
22
|
// MCP 설정
|
|
20
23
|
const DEFAULT_MCPS = [
|
|
21
24
|
{ name: 'vibe', type: 'node', local: true },
|
|
@@ -454,8 +457,18 @@ async function init(projectName) {
|
|
|
454
457
|
log('🔧 Claude Code MCP 서버 등록 중...\n');
|
|
455
458
|
const { execSync } = require('child_process');
|
|
456
459
|
|
|
457
|
-
// 1. hi-ai MCP (
|
|
458
|
-
|
|
460
|
+
// 1. hi-ai MCP (프로젝트 로컬 설치)
|
|
461
|
+
log(' 📦 hi-ai MCP 패키지 설치 중...\n');
|
|
462
|
+
try {
|
|
463
|
+
// 프로젝트에 hi-ai 직접 설치
|
|
464
|
+
execSync('npm install @su-record/hi-ai --save-dev', { stdio: 'pipe', cwd: projectRoot });
|
|
465
|
+
log(' ✅ hi-ai 패키지 설치 완료\n');
|
|
466
|
+
} catch (e) {
|
|
467
|
+
log(' ⚠️ hi-ai 패키지 설치 실패 (수동 설치: npm install @su-record/hi-ai --save-dev)\n');
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// 프로젝트 로컬 경로로 MCP 등록
|
|
471
|
+
const mcpPath = path.join(projectRoot, 'node_modules', '@su-record', 'hi-ai', 'dist', 'index.js');
|
|
459
472
|
try {
|
|
460
473
|
execSync(`claude mcp add vibe node "${mcpPath}"`, { stdio: 'pipe' });
|
|
461
474
|
log(' ✅ vibe MCP 등록 완료\n');
|
|
@@ -772,6 +785,7 @@ function showHelp() {
|
|
|
772
785
|
기본 명령어:
|
|
773
786
|
vibe init [project] 프로젝트 초기화
|
|
774
787
|
vibe update 설정 업데이트
|
|
788
|
+
vibe remove vibe 제거 (MCP, 설정, 패키지)
|
|
775
789
|
vibe status 현재 설정 상태
|
|
776
790
|
vibe help 도움말
|
|
777
791
|
vibe version 버전 정보
|
|
@@ -1077,8 +1091,27 @@ async function update() {
|
|
|
1077
1091
|
// 협업자 자동 설치 설정 (update에서도 실행)
|
|
1078
1092
|
setupCollaboratorAutoInstall(projectRoot);
|
|
1079
1093
|
|
|
1080
|
-
// MCP
|
|
1081
|
-
|
|
1094
|
+
// MCP 서버: hi-ai 로컬 설치 확인 및 경로 업데이트
|
|
1095
|
+
const localHiAiPath = path.join(projectRoot, 'node_modules', '@su-record', 'hi-ai', 'dist', 'index.js');
|
|
1096
|
+
if (!fs.existsSync(localHiAiPath)) {
|
|
1097
|
+
log(' 📦 hi-ai MCP 패키지 로컬 설치 중...\n');
|
|
1098
|
+
try {
|
|
1099
|
+
const { execSync } = require('child_process');
|
|
1100
|
+
execSync('npm install @su-record/hi-ai --save-dev', { stdio: 'pipe', cwd: projectRoot });
|
|
1101
|
+
log(' ✅ hi-ai 패키지 설치 완료\n');
|
|
1102
|
+
|
|
1103
|
+
// MCP 경로 업데이트 (로컬 경로로)
|
|
1104
|
+
try {
|
|
1105
|
+
execSync(`claude mcp remove vibe`, { stdio: 'pipe' });
|
|
1106
|
+
execSync(`claude mcp add vibe node "${localHiAiPath}"`, { stdio: 'pipe' });
|
|
1107
|
+
log(' ✅ vibe MCP 경로 업데이트 완료 (로컬)\n');
|
|
1108
|
+
} catch (e) {
|
|
1109
|
+
log(' ⚠️ MCP 경로 업데이트 실패 (수동: claude mcp add vibe node "' + localHiAiPath + '")\n');
|
|
1110
|
+
}
|
|
1111
|
+
} catch (e) {
|
|
1112
|
+
log(' ⚠️ hi-ai 패키지 설치 실패 (수동 설치: npm install @su-record/hi-ai --save-dev)\n');
|
|
1113
|
+
}
|
|
1114
|
+
}
|
|
1082
1115
|
|
|
1083
1116
|
const packageJson = require('../package.json');
|
|
1084
1117
|
log(`
|
|
@@ -1261,16 +1294,121 @@ function showVersion() {
|
|
|
1261
1294
|
console.log(`vibe v${packageJson.version}`);
|
|
1262
1295
|
}
|
|
1263
1296
|
|
|
1297
|
+
// vibe 제거
|
|
1298
|
+
function remove() {
|
|
1299
|
+
const projectRoot = process.cwd();
|
|
1300
|
+
const vibeDir = path.join(projectRoot, '.vibe');
|
|
1301
|
+
const claudeDir = path.join(projectRoot, '.claude');
|
|
1302
|
+
|
|
1303
|
+
if (!fs.existsSync(vibeDir)) {
|
|
1304
|
+
console.log('❌ vibe 프로젝트가 아닙니다.');
|
|
1305
|
+
return;
|
|
1306
|
+
}
|
|
1307
|
+
|
|
1308
|
+
console.log('🗑️ vibe 제거 중...\n');
|
|
1309
|
+
const { execSync } = require('child_process');
|
|
1310
|
+
|
|
1311
|
+
// 1. MCP 서버 제거
|
|
1312
|
+
try {
|
|
1313
|
+
execSync('claude mcp remove vibe', { stdio: 'pipe' });
|
|
1314
|
+
console.log(' ✅ vibe MCP 제거 완료\n');
|
|
1315
|
+
} catch (e) {
|
|
1316
|
+
console.log(' ℹ️ vibe MCP 이미 제거됨 또는 없음\n');
|
|
1317
|
+
}
|
|
1318
|
+
|
|
1319
|
+
try {
|
|
1320
|
+
execSync('claude mcp remove context7', { stdio: 'pipe' });
|
|
1321
|
+
console.log(' ✅ context7 MCP 제거 완료\n');
|
|
1322
|
+
} catch (e) {
|
|
1323
|
+
console.log(' ℹ️ context7 MCP 이미 제거됨 또는 없음\n');
|
|
1324
|
+
}
|
|
1325
|
+
|
|
1326
|
+
// 2. .vibe 폴더 제거
|
|
1327
|
+
if (fs.existsSync(vibeDir)) {
|
|
1328
|
+
removeDirRecursive(vibeDir);
|
|
1329
|
+
console.log(' ✅ .vibe/ 폴더 제거 완료\n');
|
|
1330
|
+
}
|
|
1331
|
+
|
|
1332
|
+
// 3. .claude/commands 제거 (vibe 관련만)
|
|
1333
|
+
const commandsDir = path.join(claudeDir, 'commands');
|
|
1334
|
+
if (fs.existsSync(commandsDir)) {
|
|
1335
|
+
const vibeCommands = ['vibe.spec.md', 'vibe.run.md', 'vibe.verify.md', 'vibe.reason.md', 'vibe.analyze.md', 'vibe.ui.md', 'vibe.diagram.md'];
|
|
1336
|
+
vibeCommands.forEach(cmd => {
|
|
1337
|
+
const cmdPath = path.join(commandsDir, cmd);
|
|
1338
|
+
if (fs.existsSync(cmdPath)) {
|
|
1339
|
+
fs.unlinkSync(cmdPath);
|
|
1340
|
+
}
|
|
1341
|
+
});
|
|
1342
|
+
console.log(' ✅ 슬래시 커맨드 제거 완료\n');
|
|
1343
|
+
}
|
|
1344
|
+
|
|
1345
|
+
// 4. .claude/agents 제거 (vibe 관련만)
|
|
1346
|
+
const agentsDir = path.join(claudeDir, 'agents');
|
|
1347
|
+
if (fs.existsSync(agentsDir)) {
|
|
1348
|
+
const vibeAgents = ['simplifier.md', 'explorer.md', 'implementer.md', 'tester.md', 'searcher.md'];
|
|
1349
|
+
vibeAgents.forEach(agent => {
|
|
1350
|
+
const agentPath = path.join(agentsDir, agent);
|
|
1351
|
+
if (fs.existsSync(agentPath)) {
|
|
1352
|
+
fs.unlinkSync(agentPath);
|
|
1353
|
+
}
|
|
1354
|
+
});
|
|
1355
|
+
console.log(' ✅ 서브에이전트 제거 완료\n');
|
|
1356
|
+
}
|
|
1357
|
+
|
|
1358
|
+
// 5. .claude/settings.json에서 hooks 제거
|
|
1359
|
+
const settingsPath = path.join(claudeDir, 'settings.json');
|
|
1360
|
+
if (fs.existsSync(settingsPath)) {
|
|
1361
|
+
try {
|
|
1362
|
+
const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
|
|
1363
|
+
if (settings.hooks) {
|
|
1364
|
+
delete settings.hooks;
|
|
1365
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
|
|
1366
|
+
console.log(' ✅ Hooks 설정 제거 완료\n');
|
|
1367
|
+
}
|
|
1368
|
+
} catch (e) {}
|
|
1369
|
+
}
|
|
1370
|
+
|
|
1371
|
+
// 6. hi-ai 패키지 제거 (선택적)
|
|
1372
|
+
const hiAiPath = path.join(projectRoot, 'node_modules', '@su-record', 'hi-ai');
|
|
1373
|
+
if (fs.existsSync(hiAiPath)) {
|
|
1374
|
+
try {
|
|
1375
|
+
execSync('npm uninstall @su-record/hi-ai', { stdio: 'pipe', cwd: projectRoot });
|
|
1376
|
+
console.log(' ✅ hi-ai 패키지 제거 완료\n');
|
|
1377
|
+
} catch (e) {
|
|
1378
|
+
console.log(' ⚠️ hi-ai 패키지 제거 실패 (수동: npm uninstall @su-record/hi-ai)\n');
|
|
1379
|
+
}
|
|
1380
|
+
}
|
|
1381
|
+
|
|
1382
|
+
console.log(`
|
|
1383
|
+
✅ vibe 제거 완료!
|
|
1384
|
+
|
|
1385
|
+
제거된 항목:
|
|
1386
|
+
- MCP 서버 (vibe, context7)
|
|
1387
|
+
- .vibe/ 폴더
|
|
1388
|
+
- 슬래시 커맨드 (7개)
|
|
1389
|
+
- 서브에이전트 (5개)
|
|
1390
|
+
- Hooks 설정
|
|
1391
|
+
- hi-ai 패키지
|
|
1392
|
+
|
|
1393
|
+
다시 설치하려면: vibe init
|
|
1394
|
+
`);
|
|
1395
|
+
}
|
|
1396
|
+
|
|
1264
1397
|
// 메인 라우터
|
|
1265
1398
|
switch (command) {
|
|
1266
1399
|
case 'init':
|
|
1267
|
-
init(
|
|
1400
|
+
init(positionalArgs[1]); // 옵션 제외한 인자 사용
|
|
1268
1401
|
break;
|
|
1269
1402
|
|
|
1270
1403
|
case 'update':
|
|
1271
1404
|
update();
|
|
1272
1405
|
break;
|
|
1273
1406
|
|
|
1407
|
+
case 'remove':
|
|
1408
|
+
case 'uninstall':
|
|
1409
|
+
remove();
|
|
1410
|
+
break;
|
|
1411
|
+
|
|
1274
1412
|
case 'gpt':
|
|
1275
1413
|
if (args[1] === '--remove') {
|
|
1276
1414
|
removeExternalLLM('gpt');
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@su-record/vibe",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.19",
|
|
4
4
|
"description": "Vibe - Claude Code exclusive SPEC-driven AI coding framework",
|
|
5
5
|
"bin": {
|
|
6
6
|
"vibe": "./bin/vibe"
|
|
@@ -31,9 +31,9 @@
|
|
|
31
31
|
"node": ">=18.0.0"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@su-record/hi-ai": "latest"
|
|
34
|
+
"@su-record/hi-ai": "latest",
|
|
35
|
+
"typescript": "^5.9.3"
|
|
35
36
|
},
|
|
36
|
-
"devDependencies": {},
|
|
37
37
|
"files": [
|
|
38
38
|
"bin/",
|
|
39
39
|
".claude/",
|
|
@@ -91,11 +91,11 @@
|
|
|
91
91
|
],
|
|
92
92
|
"UserPromptSubmit": [
|
|
93
93
|
{
|
|
94
|
-
"matcher": "
|
|
94
|
+
"matcher": "^(hi-ai|하이아이|안녕|시작)",
|
|
95
95
|
"hooks": [
|
|
96
96
|
{
|
|
97
97
|
"type": "prompt",
|
|
98
|
-
"prompt": "세션 시작
|
|
98
|
+
"prompt": "사용자가 세션 시작 인사를 했습니다. mcp__vibe__start_session을 호출하여 이전 세션 컨텍스트를 복원하세요."
|
|
99
99
|
}
|
|
100
100
|
]
|
|
101
101
|
}
|