@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.
@@ -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
- const mcpPath = path.join(__dirname, '..', 'node_modules', '@su-record', 'hi-ai', 'dist', 'index.js');
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 서버 등록 확인 (update에서는 스킵 - init에서만 등록)
1081
- // update는 파일만 업데이트하고, MCP는 이미 등록되어 있다고 가정
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(args[1]);
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.17",
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": "세션 시작 시: mcp__vibe__start_session을 호출하여 이전 세션 컨텍스트를 복원하세요. 저장된 메모리와 미완료 작업을 확인하세요."
98
+ "prompt": "사용자가 세션 시작 인사를 했습니다. mcp__vibe__start_session을 호출하여 이전 세션 컨텍스트를 복원하세요."
99
99
  }
100
100
  ]
101
101
  }