@su-record/vibe 2.0.0 → 2.0.1

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.
Files changed (65) hide show
  1. package/.claude/agents/explorer.md +48 -48
  2. package/.claude/agents/implementer.md +53 -53
  3. package/.claude/agents/searcher.md +54 -54
  4. package/.claude/agents/simplifier.md +119 -119
  5. package/.claude/agents/tester.md +49 -49
  6. package/.claude/commands/vibe.analyze.md +239 -239
  7. package/.claude/commands/vibe.continue.md +88 -88
  8. package/.claude/commands/vibe.diagram.md +178 -178
  9. package/.claude/commands/vibe.reason.md +306 -306
  10. package/.claude/commands/vibe.run.md +760 -760
  11. package/.claude/commands/vibe.spec.md +339 -339
  12. package/.claude/commands/vibe.tool.md +153 -153
  13. package/.claude/commands/vibe.ui.md +137 -137
  14. package/.claude/commands/vibe.verify.md +238 -238
  15. package/.claude/settings.json +152 -152
  16. package/.claude/settings.local.json +4 -57
  17. package/.vibe/config.json +9 -0
  18. package/.vibe/constitution.md +184 -184
  19. package/.vibe/rules/core/communication-guide.md +104 -104
  20. package/.vibe/rules/core/development-philosophy.md +52 -52
  21. package/.vibe/rules/core/quick-start.md +120 -120
  22. package/.vibe/rules/quality/bdd-contract-testing.md +388 -388
  23. package/.vibe/rules/quality/checklist.md +276 -276
  24. package/.vibe/rules/quality/testing-strategy.md +437 -437
  25. package/.vibe/rules/standards/anti-patterns.md +369 -369
  26. package/.vibe/rules/standards/code-structure.md +291 -291
  27. package/.vibe/rules/standards/complexity-metrics.md +312 -312
  28. package/.vibe/rules/standards/naming-conventions.md +198 -198
  29. package/.vibe/rules/tools/mcp-hi-ai-guide.md +665 -665
  30. package/.vibe/rules/tools/mcp-workflow.md +51 -51
  31. package/.vibe/setup.sh +31 -31
  32. package/CLAUDE.md +122 -122
  33. package/LICENSE +21 -21
  34. package/README.md +568 -568
  35. package/dist/cli/index.d.ts.map +1 -1
  36. package/dist/cli/index.js +391 -406
  37. package/dist/cli/index.js.map +1 -1
  38. package/dist/lib/MemoryManager.js +92 -92
  39. package/dist/lib/PythonParser.js +108 -108
  40. package/dist/lib/gemini-mcp.js +15 -15
  41. package/dist/lib/gemini-oauth.js +35 -35
  42. package/dist/lib/gpt-mcp.js +17 -17
  43. package/dist/lib/gpt-oauth.js +44 -44
  44. package/dist/tools/analytics/getUsageAnalytics.js +12 -12
  45. package/dist/tools/memory/createMemoryTimeline.js +10 -10
  46. package/dist/tools/memory/getMemoryGraph.js +12 -12
  47. package/dist/tools/memory/getSessionContext.js +9 -9
  48. package/dist/tools/memory/linkMemories.js +14 -14
  49. package/dist/tools/memory/listMemories.js +4 -4
  50. package/dist/tools/memory/recallMemory.js +4 -4
  51. package/dist/tools/memory/saveMemory.js +4 -4
  52. package/dist/tools/memory/searchMemoriesAdvanced.js +22 -22
  53. package/dist/tools/planning/generatePrd.js +46 -46
  54. package/dist/tools/prompt/enhancePromptGemini.js +160 -160
  55. package/dist/tools/reasoning/applyReasoningFramework.js +56 -56
  56. package/dist/tools/semantic/analyzeDependencyGraph.js +12 -12
  57. package/package.json +67 -67
  58. package/templates/constitution-template.md +184 -184
  59. package/templates/contract-backend-template.md +517 -517
  60. package/templates/contract-frontend-template.md +594 -594
  61. package/templates/feature-template.md +96 -96
  62. package/templates/hooks-template.json +103 -103
  63. package/templates/spec-template.md +199 -199
  64. package/dist/lib/vibe-mcp.d.ts.map +0 -1
  65. package/dist/lib/vibe-mcp.js.map +0 -1
package/dist/cli/index.js CHANGED
@@ -522,37 +522,37 @@ function setupCollaboratorAutoInstall(projectRoot) {
522
522
  // 2. .vibe/setup.sh 생성
523
523
  const setupShPath = path.join(vibeDir, 'setup.sh');
524
524
  if (!fs.existsSync(setupShPath)) {
525
- const setupScript = `#!/bin/bash
526
- # Vibe 협업자 자동 설치 스크립트
527
- # 사용법: ./.vibe/setup.sh
528
-
529
- set -e
530
-
531
- echo "🔧 Vibe 설치 확인 중..."
532
-
533
- # npm/npx 확인
534
- if ! command -v npx &> /dev/null; then
535
- echo "❌ Node.js/npm이 설치되어 있지 않습니다."
536
- echo " https://nodejs.org 에서 설치해주세요."
537
- exit 1
538
- fi
539
-
540
- # vibe 설치 확인 및 업데이트
541
- if command -v vibe &> /dev/null; then
542
- echo "✅ Vibe가 이미 설치되어 있습니다."
543
- vibe update --silent
544
- echo "✅ Vibe 업데이트 완료!"
545
- else
546
- echo "📦 Vibe 설치 중..."
547
- npm install -g @su-record/vibe
548
- vibe update --silent
549
- echo "✅ Vibe 설치 및 설정 완료!"
550
- fi
551
-
552
- echo ""
553
- echo "다음 명령어로 시작하세요:"
554
- echo " /vibe.spec \\"기능명\\" SPEC 작성"
555
- echo " /vibe.run \\"기능명\\" 구현 실행"
525
+ const setupScript = `#!/bin/bash
526
+ # Vibe 협업자 자동 설치 스크립트
527
+ # 사용법: ./.vibe/setup.sh
528
+
529
+ set -e
530
+
531
+ echo "🔧 Vibe 설치 확인 중..."
532
+
533
+ # npm/npx 확인
534
+ if ! command -v npx &> /dev/null; then
535
+ echo "❌ Node.js/npm이 설치되어 있지 않습니다."
536
+ echo " https://nodejs.org 에서 설치해주세요."
537
+ exit 1
538
+ fi
539
+
540
+ # vibe 설치 확인 및 업데이트
541
+ if command -v vibe &> /dev/null; then
542
+ echo "✅ Vibe가 이미 설치되어 있습니다."
543
+ vibe update --silent
544
+ echo "✅ Vibe 업데이트 완료!"
545
+ else
546
+ echo "📦 Vibe 설치 중..."
547
+ npm install -g @su-record/vibe
548
+ vibe update --silent
549
+ echo "✅ Vibe 설치 및 설정 완료!"
550
+ fi
551
+
552
+ echo ""
553
+ echo "다음 명령어로 시작하세요:"
554
+ echo " /vibe.spec \\"기능명\\" SPEC 작성"
555
+ echo " /vibe.run \\"기능명\\" 구현 실행"
556
556
  `;
557
557
  fs.writeFileSync(setupShPath, setupScript);
558
558
  fs.chmodSync(setupShPath, '755');
@@ -560,27 +560,27 @@ echo " /vibe.run \\"기능명\\" 구현 실행"
560
560
  }
561
561
  // 3. README.md에 협업자 안내 추가
562
562
  const readmePath = path.join(projectRoot, 'README.md');
563
- const vibeSetupSection = `
564
- ## Vibe Setup (AI Coding)
565
-
566
- 이 프로젝트는 [Vibe](https://github.com/su-record/vibe) AI 코딩 프레임워크를 사용합니다.
567
-
568
- ### 협업자 설치
569
-
570
- \`\`\`bash
571
- # 전역 설치 (권장)
572
- npm install -g @su-record/vibe
573
- vibe update
574
-
575
- # 또는 setup 스크립트 실행
576
- ./.vibe/setup.sh
577
- \`\`\`
578
-
579
- ### 사용법
580
-
581
- Claude Code에서 슬래시 커맨드 사용:
582
- - \`/vibe.spec "기능명"\` - SPEC 문서 작성
583
- - \`/vibe.run "기능명"\` - 구현 실행
563
+ const vibeSetupSection = `
564
+ ## Vibe Setup (AI Coding)
565
+
566
+ 이 프로젝트는 [Vibe](https://github.com/su-record/vibe) AI 코딩 프레임워크를 사용합니다.
567
+
568
+ ### 협업자 설치
569
+
570
+ \`\`\`bash
571
+ # 전역 설치 (권장)
572
+ npm install -g @su-record/vibe
573
+ vibe update
574
+
575
+ # 또는 setup 스크립트 실행
576
+ ./.vibe/setup.sh
577
+ \`\`\`
578
+
579
+ ### 사용법
580
+
581
+ Claude Code에서 슬래시 커맨드 사용:
582
+ - \`/vibe.spec "기능명"\` - SPEC 문서 작성
583
+ - \`/vibe.run "기능명"\` - 구현 실행
584
584
  `;
585
585
  if (fs.existsSync(readmePath)) {
586
586
  const readme = fs.readFileSync(readmePath, 'utf-8');
@@ -847,41 +847,41 @@ async function init(projectName) {
847
847
  // 협업자 자동 설치 설정
848
848
  setupCollaboratorAutoInstall(projectRoot);
849
849
  // 완료 메시지
850
- log(`
851
- ✅ vibe 초기화 완료!
852
-
853
- ${isNewProject ? `프로젝트 위치:
854
- ${projectRoot}/
855
-
856
- ` : ''}생성된 구조:
857
- CLAUDE.md # 프로젝트 컨텍스트
858
- .claude/
859
- ├── commands/ # 슬래시 커맨드 (7개)
860
- ├── agents/ # 서브에이전트 (simplifier)
861
- └── settings.json # Hooks 설정 (저장소 공유)
862
- .vibe/
863
- ├── config.json # 프로젝트 설정
864
- ├── constitution.md # 프로젝트 원칙
865
- ├── setup.sh # 협업자 설치 스크립트
866
- ├── rules/ # 코딩 규칙
867
- │ ├── core/ # 핵심 원칙
868
- │ ├── quality/ # 품질 체크리스트
869
- │ └── languages/ # 언어별 규칙
870
- ├── specs/ # SPEC 문서들
871
- └── features/ # BDD Feature 파일들
872
-
873
- 내장 도구: ✓ (35+)
874
- 협업자 자동 설치: ✓
875
-
876
- ${formatLLMStatus()}
877
-
878
- 사용법:
879
- /vibe.spec "기능명" SPEC 작성 (대화형)
880
- /vibe.run "기능명" 구현 실행
881
- /vibe.verify "기능명" 검증
882
-
883
- 다음 단계:
884
- ${isNewProject ? `cd ${projectName}\n ` : ''}/vibe.spec "기능명" 으로 시작하세요!
850
+ log(`
851
+ ✅ vibe 초기화 완료!
852
+
853
+ ${isNewProject ? `프로젝트 위치:
854
+ ${projectRoot}/
855
+
856
+ ` : ''}생성된 구조:
857
+ CLAUDE.md # 프로젝트 컨텍스트
858
+ .claude/
859
+ ├── commands/ # 슬래시 커맨드 (7개)
860
+ ├── agents/ # 서브에이전트 (simplifier)
861
+ └── settings.json # Hooks 설정 (저장소 공유)
862
+ .vibe/
863
+ ├── config.json # 프로젝트 설정
864
+ ├── constitution.md # 프로젝트 원칙
865
+ ├── setup.sh # 협업자 설치 스크립트
866
+ ├── rules/ # 코딩 규칙
867
+ │ ├── core/ # 핵심 원칙
868
+ │ ├── quality/ # 품질 체크리스트
869
+ │ └── languages/ # 언어별 규칙
870
+ ├── specs/ # SPEC 문서들
871
+ └── features/ # BDD Feature 파일들
872
+
873
+ 내장 도구: ✓ (35+)
874
+ 협업자 자동 설치: ✓
875
+
876
+ ${formatLLMStatus()}
877
+
878
+ 사용법:
879
+ /vibe.spec "기능명" SPEC 작성 (대화형)
880
+ /vibe.run "기능명" 구현 실행
881
+ /vibe.verify "기능명" 검증
882
+
883
+ 다음 단계:
884
+ ${isNewProject ? `cd ${projectName}\n ` : ''}/vibe.spec "기능명" 으로 시작하세요!
885
885
  `);
886
886
  }
887
887
  catch (error) {
@@ -1205,16 +1205,16 @@ async function update() {
1205
1205
  }
1206
1206
  }
1207
1207
  const packageJson = getPackageJson();
1208
- log(`
1209
- ✅ vibe 업데이트 완료! (v${packageJson.version})
1210
-
1211
- 업데이트된 항목:
1212
- - 슬래시 커맨드 (7개)
1213
- - 코딩 규칙 (.vibe/rules/)
1214
- - 서브에이전트 (.claude/agents/)
1215
- - Hooks 설정
1216
-
1217
- ${formatLLMStatus()}
1208
+ log(`
1209
+ ✅ vibe 업데이트 완료! (v${packageJson.version})
1210
+
1211
+ 업데이트된 항목:
1212
+ - 슬래시 커맨드 (7개)
1213
+ - 코딩 규칙 (.vibe/rules/)
1214
+ - 서브에이전트 (.claude/agents/)
1215
+ - Hooks 설정
1216
+
1217
+ ${formatLLMStatus()}
1218
1218
  `);
1219
1219
  }
1220
1220
  catch (error) {
@@ -1288,17 +1288,17 @@ function remove() {
1288
1288
  }
1289
1289
  catch (e) { }
1290
1290
  }
1291
- console.log(`
1292
- ✅ vibe 제거 완료!
1293
-
1294
- 제거된 항목:
1295
- - MCP 서버 (vibe, context7)
1296
- - .vibe/ 폴더
1297
- - 슬래시 커맨드 (7개)
1298
- - 서브에이전트 (5개)
1299
- - Hooks 설정
1300
-
1301
- 다시 설치하려면: vibe init
1291
+ console.log(`
1292
+ ✅ vibe 제거 완료!
1293
+
1294
+ 제거된 항목:
1295
+ - MCP 서버 (vibe, context7)
1296
+ - .vibe/ 폴더
1297
+ - 슬래시 커맨드 (7개)
1298
+ - 서브에이전트 (5개)
1299
+ - Hooks 설정
1300
+
1301
+ 다시 설치하려면: vibe init
1302
1302
  `);
1303
1303
  }
1304
1304
  // ============================================================================
@@ -1306,13 +1306,13 @@ function remove() {
1306
1306
  // ============================================================================
1307
1307
  function setupExternalLLM(llmType, apiKey) {
1308
1308
  if (!apiKey) {
1309
- console.log(`
1310
- ❌ API 키가 필요합니다.
1311
-
1312
- 사용법:
1313
- vibe ${llmType} <api-key>
1314
-
1315
- ${llmType === 'gpt' ? 'OpenAI API 키: https://platform.openai.com/api-keys' : 'Google API 키: https://aistudio.google.com/apikey'}
1309
+ console.log(`
1310
+ ❌ API 키가 필요합니다.
1311
+
1312
+ 사용법:
1313
+ vibe ${llmType} <api-key>
1314
+
1315
+ ${llmType === 'gpt' ? 'OpenAI API 키: https://platform.openai.com/api-keys' : 'Google API 키: https://aistudio.google.com/apikey'}
1316
1316
  `);
1317
1317
  return;
1318
1318
  }
@@ -1344,22 +1344,22 @@ ${llmType === 'gpt' ? 'OpenAI API 키: https://platform.openai.com/api-keys' : '
1344
1344
  }
1345
1345
  catch (e) { }
1346
1346
  execSync(`claude mcp add ${llmConfig.name} -s user -e ${envKey}=${apiKey} -- npx -y ${llmConfig.package}`, { stdio: 'pipe' });
1347
- console.log(`
1348
- ✅ ${llmType.toUpperCase()} 활성화 완료! (전역)
1349
-
1350
- 역할: ${llmConfig.description}
1351
- MCP: ${llmConfig.name}
1352
-
1353
- 모든 프로젝트에서 /vibe.run 실행 시 자동으로 활용됩니다.
1354
-
1355
- 비활성화: vibe ${llmType} --remove
1347
+ console.log(`
1348
+ ✅ ${llmType.toUpperCase()} 활성화 완료! (전역)
1349
+
1350
+ 역할: ${llmConfig.description}
1351
+ MCP: ${llmConfig.name}
1352
+
1353
+ 모든 프로젝트에서 /vibe.run 실행 시 자동으로 활용됩니다.
1354
+
1355
+ 비활성화: vibe ${llmType} --remove
1356
1356
  `);
1357
1357
  }
1358
1358
  catch (e) {
1359
- console.log(`
1360
- ⚠️ MCP 등록 실패. 수동으로 등록하세요:
1361
-
1362
- claude mcp add ${llmConfig.name} -s user -e ${envKey}=<your-key> -- npx -y ${llmConfig.package}
1359
+ console.log(`
1360
+ ⚠️ MCP 등록 실패. 수동으로 등록하세요:
1361
+
1362
+ claude mcp add ${llmConfig.name} -s user -e ${envKey}=<your-key> -- npx -y ${llmConfig.package}
1363
1363
  `);
1364
1364
  }
1365
1365
  }
@@ -1398,11 +1398,11 @@ function removeExternalLLM(llmType) {
1398
1398
  // GPT OAuth Commands
1399
1399
  // ============================================================================
1400
1400
  async function gptAuth() {
1401
- console.log(`
1402
- 🔐 GPT Plus/Pro 인증 (OAuth)
1403
-
1404
- ChatGPT Plus 또는 Pro 구독이 있으면 Codex API를 사용할 수 있습니다.
1405
- 브라우저에서 OpenAI 계정으로 로그인하세요.
1401
+ console.log(`
1402
+ 🔐 GPT Plus/Pro 인증 (OAuth)
1403
+
1404
+ ChatGPT Plus 또는 Pro 구독이 있으면 Codex API를 사용할 수 있습니다.
1405
+ 브라우저에서 OpenAI 계정으로 로그인하세요.
1406
1406
  `);
1407
1407
  try {
1408
1408
  const gptOAuthPath = path.join(__dirname, '../lib/gpt-oauth.js');
@@ -1418,17 +1418,17 @@ ChatGPT Plus 또는 Pro 구독이 있으면 Codex API를 사용할 수 있습니
1418
1418
  expires: tokens.expires,
1419
1419
  accountId: tokens.accountId,
1420
1420
  });
1421
- console.log(`
1422
- ✅ GPT 인증 완료!
1423
-
1424
- 계정: ${tokens.email}
1425
- 계정 ID: ${tokens.accountId || '(자동 감지)'}
1426
-
1427
- ⚠️ 참고: ChatGPT Plus/Pro 구독이 있어야 API 호출이 가능합니다.
1428
- 구독이 없으면 인증은 성공하지만 API 호출 시 오류가 발생합니다.
1429
-
1430
- 상태 확인: vibe gpt --status
1431
- 로그아웃: vibe gpt --logout
1421
+ console.log(`
1422
+ ✅ GPT 인증 완료!
1423
+
1424
+ 계정: ${tokens.email}
1425
+ 계정 ID: ${tokens.accountId || '(자동 감지)'}
1426
+
1427
+ ⚠️ 참고: ChatGPT Plus/Pro 구독이 있어야 API 호출이 가능합니다.
1428
+ 구독이 없으면 인증은 성공하지만 API 호출 시 오류가 발생합니다.
1429
+
1430
+ 상태 확인: vibe status gpt
1431
+ 로그아웃: vibe logout gpt
1432
1432
  `);
1433
1433
  // config.json 업데이트
1434
1434
  const projectRoot = process.cwd();
@@ -1453,12 +1453,12 @@ ChatGPT Plus 또는 Pro 구독이 있으면 Codex API를 사용할 수 있습니
1453
1453
  process.exit(0);
1454
1454
  }
1455
1455
  catch (error) {
1456
- console.error(`
1457
- ❌ GPT 인증 실패
1458
-
1459
- 오류: ${error.message}
1460
-
1461
- 다시 시도하려면: vibe gpt --auth
1456
+ console.error(`
1457
+ ❌ GPT 인증 실패
1458
+
1459
+ 오류: ${error.message}
1460
+
1461
+ 다시 시도하려면: vibe gpt --auth
1462
1462
  `);
1463
1463
  process.exit(1);
1464
1464
  }
@@ -1469,31 +1469,31 @@ function gptStatus() {
1469
1469
  const storage = require(gptStoragePath);
1470
1470
  const accounts = storage.getAllAccounts();
1471
1471
  if (accounts.length === 0) {
1472
- console.log(`
1473
- 📊 GPT 인증 상태
1474
-
1475
- 인증된 계정 없음
1476
-
1477
- 로그인: vibe gpt --auth
1472
+ console.log(`
1473
+ 📊 GPT 인증 상태
1474
+
1475
+ 인증된 계정 없음
1476
+
1477
+ 로그인: vibe gpt --auth
1478
1478
  `);
1479
1479
  return;
1480
1480
  }
1481
1481
  const activeAccount = storage.getActiveAccount();
1482
1482
  const isExpired = storage.isTokenExpired(activeAccount);
1483
- console.log(`
1484
- 📊 GPT 인증 상태
1485
-
1486
- 활성 계정: ${activeAccount.email}
1487
- 계정 ID: ${activeAccount.accountId || '(없음)'}
1488
- 토큰 상태: ${isExpired ? '⚠️ 만료됨 (자동 갱신됨)' : '✅ 유효'}
1489
- 마지막 사용: ${new Date(activeAccount.lastUsed).toLocaleString()}
1490
-
1491
- 등록된 계정 (${accounts.length}개):
1492
- ${accounts.map((acc, i) => ` ${i === storage.loadAccounts()?.activeIndex ? '→' : ' '} ${acc.email}`).join('\n')}
1493
-
1494
- ⚠️ 참고: ChatGPT Plus/Pro 구독이 있어야 API 호출이 가능합니다.
1495
-
1496
- 로그아웃: vibe gpt --logout
1483
+ console.log(`
1484
+ 📊 GPT 인증 상태
1485
+
1486
+ 활성 계정: ${activeAccount.email}
1487
+ 계정 ID: ${activeAccount.accountId || '(없음)'}
1488
+ 토큰 상태: ${isExpired ? '⚠️ 만료됨 (자동 갱신됨)' : '✅ 유효'}
1489
+ 마지막 사용: ${new Date(activeAccount.lastUsed).toLocaleString()}
1490
+
1491
+ 등록된 계정 (${accounts.length}개):
1492
+ ${accounts.map((acc, i) => ` ${i === storage.loadAccounts()?.activeIndex ? '→' : ' '} ${acc.email}`).join('\n')}
1493
+
1494
+ ⚠️ 참고: ChatGPT Plus/Pro 구독이 있어야 API 호출이 가능합니다.
1495
+
1496
+ 로그아웃: vibe logout gpt
1497
1497
  `);
1498
1498
  }
1499
1499
  catch (error) {
@@ -1510,12 +1510,12 @@ function gptLogout() {
1510
1510
  return;
1511
1511
  }
1512
1512
  storage.clearAccounts();
1513
- console.log(`
1514
- ✅ GPT 로그아웃 완료
1515
-
1516
- ${activeAccount.email} 계정이 제거되었습니다.
1517
-
1518
- 다시 로그인: vibe gpt --auth
1513
+ console.log(`
1514
+ ✅ GPT 로그아웃 완료
1515
+
1516
+ ${activeAccount.email} 계정이 제거되었습니다.
1517
+
1518
+ 다시 로그인: vibe gpt --auth
1519
1519
  `);
1520
1520
  // config.json 업데이트
1521
1521
  const projectRoot = process.cwd();
@@ -1538,40 +1538,40 @@ ${activeAccount.email} 계정이 제거되었습니다.
1538
1538
  console.error('로그아웃 실패:', error.message);
1539
1539
  }
1540
1540
  }
1541
- function showGptHelp() {
1542
- console.log(`
1543
- 🤖 GPT 설정
1544
-
1545
- ChatGPT Plus 또는 Pro 구독이 있으면 OpenAI Codex API를 사용할 수 있습니다.
1546
-
1547
- 사용 방법:
1548
-
1549
- 1. OAuth 인증 (권장):
1550
- vibe gpt --auth OpenAI 계정으로 로그인 (Plus/Pro 구독 필요)
1551
-
1552
- 2. API 방식:
1553
- vibe gpt <api-key> API 키로 설정 (사용량 과금)
1554
-
1555
- 관리 명령어:
1556
- vibe gpt --status 인증 상태 확인
1557
- vibe gpt --logout 로그아웃
1558
- vibe gpt --remove API 키 제거
1559
-
1560
- ⚠️ 중요:
1561
- - OAuth 인증은 ChatGPT Plus 또는 Pro 구독이 있어야 API 호출 가능
1562
- - 구독이 없으면 인증은 성공하지만 API 호출 시 권한 오류 발생
1563
- - API 방식은 OpenAI Platform의 별도 과금 (구독과 무관)
1541
+ function showAuthHelp() {
1542
+ console.log(`
1543
+ 🔐 vibe auth - LLM 인증
1544
+
1545
+ 사용법:
1546
+ vibe auth gpt GPT Plus/Pro OAuth 인증
1547
+ vibe auth gpt --key <key> GPT API 키로 설정
1548
+ vibe auth gemini Gemini 구독 OAuth 인증 (권장)
1549
+ vibe auth gemini --key <key> Gemini API 키로 설정
1550
+
1551
+ 예시:
1552
+ vibe auth gpt OpenAI 로그인 (Plus/Pro 구독 필요)
1553
+ vibe auth gemini Google 로그인 (Gemini Advanced 구독 시 무료)
1554
+ vibe auth gpt --key sk-xxx API 키로 설정 (사용량 과금)
1555
+ `);
1556
+ }
1557
+ function showLogoutHelp() {
1558
+ console.log(`
1559
+ 🚪 vibe logout - LLM 로그아웃
1560
+
1561
+ 사용법:
1562
+ vibe logout gpt GPT 로그아웃
1563
+ vibe logout gemini Gemini 로그아웃
1564
1564
  `);
1565
1565
  }
1566
1566
  // ============================================================================
1567
1567
  // Gemini OAuth Commands
1568
1568
  // ============================================================================
1569
1569
  async function geminiAuth() {
1570
- console.log(`
1571
- 🔐 Gemini 구독 인증 (OAuth)
1572
-
1573
- Gemini Advanced 구독이 있으면 추가 비용 없이 사용할 수 있습니다.
1574
- 브라우저에서 Google 계정으로 로그인하세요.
1570
+ console.log(`
1571
+ 🔐 Gemini 구독 인증 (OAuth)
1572
+
1573
+ Gemini Advanced 구독이 있으면 추가 비용 없이 사용할 수 있습니다.
1574
+ 브라우저에서 Google 계정으로 로그인하세요.
1575
1575
  `);
1576
1576
  try {
1577
1577
  const geminiOAuthPath = path.join(__dirname, '../lib/gemini-oauth.js');
@@ -1586,20 +1586,20 @@ Gemini Advanced 구독이 있으면 추가 비용 없이 사용할 수 있습니
1586
1586
  expires: tokens.expires,
1587
1587
  projectId: tokens.projectId,
1588
1588
  });
1589
- console.log(`
1590
- ✅ Gemini 인증 완료!
1591
-
1592
- 계정: ${tokens.email}
1593
- 프로젝트: ${tokens.projectId || '(자동 감지)'}
1594
-
1595
- 사용 가능한 모델:
1596
- - Gemini 3 Flash (빠른 응답, 탐색/검색)
1597
- - Gemini 3 Pro (높은 정확도)
1598
-
1599
- /vibe.run 실행 시 자동으로 Gemini가 보조 모델로 활용됩니다.
1600
-
1601
- 상태 확인: vibe gemini --status
1602
- 로그아웃: vibe gemini --logout
1589
+ console.log(`
1590
+ ✅ Gemini 인증 완료!
1591
+
1592
+ 계정: ${tokens.email}
1593
+ 프로젝트: ${tokens.projectId || '(자동 감지)'}
1594
+
1595
+ 사용 가능한 모델:
1596
+ - Gemini 3 Flash (빠른 응답, 탐색/검색)
1597
+ - Gemini 3 Pro (높은 정확도)
1598
+
1599
+ /vibe.run 실행 시 자동으로 Gemini가 보조 모델로 활용됩니다.
1600
+
1601
+ 상태 확인: vibe status gemini
1602
+ 로그아웃: vibe logout gemini
1603
1603
  `);
1604
1604
  // config.json 업데이트
1605
1605
  const projectRoot = process.cwd();
@@ -1629,31 +1629,31 @@ Gemini Advanced 구독이 있으면 추가 비용 없이 사용할 수 있습니
1629
1629
  }
1630
1630
  catch (e) { }
1631
1631
  execSync(`claude mcp add vibe-gemini -s user node "${mcpPath}"`, { stdio: 'inherit' });
1632
- console.log(`
1633
- ✅ vibe-gemini MCP 서버 등록 완료! (전역)
1634
-
1635
- 이제 모든 프로젝트에서 다음 도구를 사용할 수 있습니다:
1636
- - mcp__vibe-gemini__gemini_chat: Gemini에 질문
1637
- - mcp__vibe-gemini__gemini_analyze_code: 코드 분석
1638
- - mcp__vibe-gemini__gemini_review_ui: UI/UX 리뷰
1639
- - mcp__vibe-gemini__gemini_quick_ask: 빠른 질문
1632
+ console.log(`
1633
+ ✅ vibe-gemini MCP 서버 등록 완료! (전역)
1634
+
1635
+ 이제 모든 프로젝트에서 다음 도구를 사용할 수 있습니다:
1636
+ - mcp__vibe-gemini__gemini_chat: Gemini에 질문
1637
+ - mcp__vibe-gemini__gemini_analyze_code: 코드 분석
1638
+ - mcp__vibe-gemini__gemini_review_ui: UI/UX 리뷰
1639
+ - mcp__vibe-gemini__gemini_quick_ask: 빠른 질문
1640
1640
  `);
1641
1641
  }
1642
1642
  catch (mcpError) {
1643
- console.log(`
1644
- ⚠️ MCP 서버 등록 실패 (수동 등록 필요):
1645
- claude mcp add vibe-gemini -s user node "${path.join(__dirname, '../lib/gemini-mcp.js')}"
1643
+ console.log(`
1644
+ ⚠️ MCP 서버 등록 실패 (수동 등록 필요):
1645
+ claude mcp add vibe-gemini -s user node "${path.join(__dirname, '../lib/gemini-mcp.js')}"
1646
1646
  `);
1647
1647
  }
1648
1648
  process.exit(0);
1649
1649
  }
1650
1650
  catch (error) {
1651
- console.error(`
1652
- ❌ Gemini 인증 실패
1653
-
1654
- 오류: ${error.message}
1655
-
1656
- 다시 시도하려면: vibe gemini --auth
1651
+ console.error(`
1652
+ ❌ Gemini 인증 실패
1653
+
1654
+ 오류: ${error.message}
1655
+
1656
+ 다시 시도하려면: vibe gemini --auth
1657
1657
  `);
1658
1658
  process.exit(1);
1659
1659
  }
@@ -1666,32 +1666,32 @@ function geminiStatus() {
1666
1666
  const { GEMINI_MODELS } = require(geminiApiPath);
1667
1667
  const accounts = storage.getAllAccounts();
1668
1668
  if (accounts.length === 0) {
1669
- console.log(`
1670
- 📊 Gemini 인증 상태
1671
-
1672
- 인증된 계정 없음
1673
-
1674
- 로그인: vibe gemini --auth
1669
+ console.log(`
1670
+ 📊 Gemini 인증 상태
1671
+
1672
+ 인증된 계정 없음
1673
+
1674
+ 로그인: vibe gemini --auth
1675
1675
  `);
1676
1676
  return;
1677
1677
  }
1678
1678
  const activeAccount = storage.getActiveAccount();
1679
1679
  const isExpired = storage.isTokenExpired(activeAccount);
1680
- console.log(`
1681
- 📊 Gemini 인증 상태
1682
-
1683
- 활성 계정: ${activeAccount.email}
1684
- 프로젝트: ${activeAccount.projectId || '(자동)'}
1685
- 토큰 상태: ${isExpired ? '⚠️ 만료됨 (자동 갱신됨)' : '✅ 유효'}
1686
- 마지막 사용: ${new Date(activeAccount.lastUsed).toLocaleString()}
1687
-
1688
- 등록된 계정 (${accounts.length}개):
1689
- ${accounts.map((acc, i) => ` ${i === storage.loadAccounts()?.activeIndex ? '→' : ' '} ${acc.email}`).join('\n')}
1690
-
1691
- 사용 가능한 모델:
1692
- ${Object.entries(GEMINI_MODELS).map(([id, info]) => ` - ${id}: ${info.description}`).join('\n')}
1693
-
1694
- 로그아웃: vibe gemini --logout
1680
+ console.log(`
1681
+ 📊 Gemini 인증 상태
1682
+
1683
+ 활성 계정: ${activeAccount.email}
1684
+ 프로젝트: ${activeAccount.projectId || '(자동)'}
1685
+ 토큰 상태: ${isExpired ? '⚠️ 만료됨 (자동 갱신됨)' : '✅ 유효'}
1686
+ 마지막 사용: ${new Date(activeAccount.lastUsed).toLocaleString()}
1687
+
1688
+ 등록된 계정 (${accounts.length}개):
1689
+ ${accounts.map((acc, i) => ` ${i === storage.loadAccounts()?.activeIndex ? '→' : ' '} ${acc.email}`).join('\n')}
1690
+
1691
+ 사용 가능한 모델:
1692
+ ${Object.entries(GEMINI_MODELS).map(([id, info]) => ` - ${id}: ${info.description}`).join('\n')}
1693
+
1694
+ 로그아웃: vibe logout gemini
1695
1695
  `);
1696
1696
  }
1697
1697
  catch (error) {
@@ -1708,12 +1708,12 @@ function geminiLogout() {
1708
1708
  return;
1709
1709
  }
1710
1710
  storage.clearAccounts();
1711
- console.log(`
1712
- ✅ Gemini 로그아웃 완료
1713
-
1714
- ${activeAccount.email} 계정이 제거되었습니다.
1715
-
1716
- 다시 로그인: vibe gemini --auth
1711
+ console.log(`
1712
+ ✅ Gemini 로그아웃 완료
1713
+
1714
+ ${activeAccount.email} 계정이 제거되었습니다.
1715
+
1716
+ 다시 로그인: vibe gemini --auth
1717
1717
  `);
1718
1718
  // config.json 업데이트
1719
1719
  const projectRoot = process.cwd();
@@ -1736,86 +1736,58 @@ ${activeAccount.email} 계정이 제거되었습니다.
1736
1736
  console.error('로그아웃 실패:', error.message);
1737
1737
  }
1738
1738
  }
1739
- function showGeminiHelp() {
1740
- console.log(`
1741
- 🤖 Gemini 설정
1742
-
1743
- Gemini Advanced 구독이 있으면 추가 비용 없이 AI 보조 모델로 활용할 수 있습니다.
1744
-
1745
- 사용 방법:
1746
-
1747
- 1. 구독 인증 (권장):
1748
- vibe gemini --auth Google 계정으로 로그인 (추가 비용 없음)
1749
-
1750
- 2. API 키 방식:
1751
- vibe gemini <api-key> API 키로 설정 (사용량 과금)
1752
-
1753
- 관리 명령어:
1754
- vibe gemini --status 인증 상태 확인
1755
- vibe gemini --logout 로그아웃
1756
- vibe gemini --remove API 키 제거
1757
-
1758
- 사용 가능한 모델:
1759
- - gemini-2.5-flash: 안정적, Thinking 기능 (기본)
1760
- - gemini-2.5-flash-lite: 경량 버전
1761
- - gemini-3-flash: 최신 프리뷰, 빠름
1762
- - gemini-3-pro: 최신 프리뷰, 정확
1763
-
1764
- 활용 방식:
1765
- /vibe.run 실행 시 자동으로 다음 용도로 활용됩니다:
1766
- - 코드 탐색/검색 (Gemini 3 Flash)
1767
- - UI/UX 분석 (Gemini 3 Pro)
1768
- - 병렬 작업 처리
1769
- `);
1770
- }
1739
+ // showGeminiHelp 제거됨 - showAuthHelp로 통합
1771
1740
  // ============================================================================
1772
1741
  // Info Commands
1773
1742
  // ============================================================================
1774
1743
  function showHelp() {
1775
- console.log(`
1776
- 📖 Vibe - SPEC-driven AI coding framework (Claude Code 전용)
1777
-
1778
- 기본 명령어:
1779
- vibe init [project] 프로젝트 초기화
1780
- vibe update 설정 업데이트
1781
- vibe remove vibe 제거 (MCP, 설정, 패키지)
1782
- vibe status 현재 설정 상태
1783
- vibe help 도움말
1784
- vibe version 버전 정보
1785
-
1786
- 외부 LLM (선택적):
1787
- vibe gpt --auth GPT Plus/Pro 인증 (OAuth)
1788
- vibe gpt <api-key> GPT API 키 설정 (사용량 과금)
1789
- vibe gpt --status GPT 인증 상태 확인
1790
- vibe gpt --logout GPT 로그아웃
1791
- vibe gpt --remove GPT 비활성화
1792
- vibe gemini --auth Gemini 구독 인증 (추가 비용 없음, 권장)
1793
- vibe gemini <api-key> Gemini API 설정 (사용량 과금)
1794
- vibe gemini --status Gemini 인증 상태 확인
1795
- vibe gemini --logout Gemini 로그아웃
1796
- vibe gemini --remove Gemini API 키 제거
1797
-
1798
- Claude Code 슬래시 커맨드:
1799
- /vibe.spec "기능명" SPEC 작성 (PTCF 구조)
1800
- /vibe.run "기능명" 구현 실행
1801
- /vibe.verify "기능명" 검증
1802
- /vibe.reason "문제" 체계적 추론
1803
- /vibe.analyze 프로젝트 분석
1804
- /vibe.ui "설명" UI 미리보기
1805
- /vibe.diagram 다이어그램 생성
1806
-
1807
- 모델 오케스트레이션:
1808
- Opus 4.5 오케스트레이터 (메인)
1809
- Sonnet 4 구현
1810
- Haiku 4.5 코드 탐색
1811
- GPT 5.2 아키텍처/디버깅 (선택적)
1812
- Gemini 3 UI/UX 설계 (선택적)
1813
-
1814
- Workflow:
1815
- /vibe.spec /vibe.run /vibe.verify
1816
-
1817
- 문서:
1818
- https://github.com/su-record/vibe
1744
+ console.log(`
1745
+ 📖 Vibe - SPEC-driven AI coding framework (Claude Code 전용)
1746
+
1747
+ 기본 명령어:
1748
+ vibe init [project] 프로젝트 초기화
1749
+ vibe update 설정 업데이트
1750
+ vibe status 현재 설정 상태
1751
+ vibe help 도움말
1752
+ vibe version 버전 정보
1753
+
1754
+ 외부 LLM 인증:
1755
+ vibe auth gpt GPT Plus/Pro OAuth 인증
1756
+ vibe auth gemini Gemini 구독 OAuth 인증 (권장)
1757
+ vibe auth gpt --key <key> GPT API 키 설정
1758
+ vibe auth gemini --key <key> Gemini API 키 설정
1759
+
1760
+ 상태 관리:
1761
+ vibe status 전체 상태 확인
1762
+ vibe status gpt GPT 인증 상태 확인
1763
+ vibe status gemini Gemini 인증 상태 확인
1764
+ vibe logout gpt GPT 로그아웃
1765
+ vibe logout gemini Gemini 로그아웃
1766
+ vibe remove gpt GPT 제거
1767
+ vibe remove gemini Gemini 제거
1768
+ vibe remove vibe 전체 제거 (MCP, 설정, 패키지)
1769
+
1770
+ Claude Code 슬래시 커맨드:
1771
+ /vibe.spec "기능명" SPEC 작성 (PTCF 구조)
1772
+ /vibe.run "기능명" 구현 실행
1773
+ /vibe.verify "기능명" 검증
1774
+ /vibe.reason "문제" 체계적 추론
1775
+ /vibe.analyze 프로젝트 분석
1776
+ /vibe.ui "설명" UI 미리보기
1777
+ /vibe.diagram 다이어그램 생성
1778
+
1779
+ 모델 오케스트레이션:
1780
+ Opus 4.5 오케스트레이터 (메인)
1781
+ Sonnet 4 구현
1782
+ Haiku 4.5 코드 탐색
1783
+ GPT 5.2 아키텍처/디버깅 (선택적)
1784
+ Gemini 3 UI/UX 설계 (선택적)
1785
+
1786
+ Workflow:
1787
+ /vibe.spec → /vibe.run → /vibe.verify
1788
+
1789
+ 문서:
1790
+ https://github.com/su-record/vibe
1819
1791
  `);
1820
1792
  }
1821
1793
  function showStatus() {
@@ -1833,32 +1805,33 @@ function showStatus() {
1833
1805
  }
1834
1806
  const gptStatus = config.models?.gpt?.enabled ? '✅ 활성' : '⬚ 비활성';
1835
1807
  const geminiStatus = config.models?.gemini?.enabled ? '✅ 활성' : '⬚ 비활성';
1836
- console.log(`
1837
- 📊 Vibe 상태 (v${packageJson.version})
1838
-
1839
- 프로젝트: ${projectRoot}
1840
- 언어: ${config.language || 'ko'}
1841
-
1842
- 모델 오케스트레이션:
1843
- ┌─────────────────────────────────────────┐
1844
- │ Opus 4.5 오케스트레이터 │
1845
- ├─────────────────────────────────────────┤
1846
- │ Sonnet 4 구현 │
1847
- │ Haiku 4.5 코드 탐색 │
1848
- ├─────────────────────────────────────────┤
1849
- │ GPT 5.2 ${gptStatus} 아키텍처/디버깅 │
1850
- │ Gemini 3 ${geminiStatus} UI/UX 설계 │
1851
- └─────────────────────────────────────────┘
1852
-
1853
- MCP 서버:
1854
- vibe-gemini Gemini API
1855
- vibe-gpt GPT API
1856
- context7 라이브러리 문서 검색
1857
-
1858
- 외부 LLM 설정:
1859
- vibe gpt <key> GPT 활성화 (아키텍처/디버깅)
1860
- vibe gemini <key> Gemini 활성화 (UI/UX)
1861
- vibe <name> --remove 비활성화
1808
+ console.log(`
1809
+ 📊 Vibe 상태 (v${packageJson.version})
1810
+
1811
+ 프로젝트: ${projectRoot}
1812
+ 언어: ${config.language || 'ko'}
1813
+
1814
+ 모델 오케스트레이션:
1815
+ ┌─────────────────────────────────────────┐
1816
+ │ Opus 4.5 오케스트레이터 │
1817
+ ├─────────────────────────────────────────┤
1818
+ │ Sonnet 4 구현 │
1819
+ │ Haiku 4.5 코드 탐색 │
1820
+ ├─────────────────────────────────────────┤
1821
+ │ GPT 5.2 ${gptStatus} 아키텍처/디버깅 │
1822
+ │ Gemini 3 ${geminiStatus} UI/UX 설계 │
1823
+ └─────────────────────────────────────────┘
1824
+
1825
+ MCP 서버:
1826
+ vibe-gemini Gemini API
1827
+ vibe-gpt GPT API
1828
+ context7 라이브러리 문서 검색
1829
+
1830
+ 외부 LLM 설정:
1831
+ vibe auth gpt GPT 활성화 (OAuth)
1832
+ vibe auth gemini Gemini 활성화 (OAuth)
1833
+ vibe remove gpt GPT 제거
1834
+ vibe remove gemini Gemini 제거
1862
1835
  `);
1863
1836
  }
1864
1837
  function showVersion() {
@@ -1921,51 +1894,62 @@ switch (command) {
1921
1894
  break;
1922
1895
  case 'remove':
1923
1896
  case 'uninstall':
1924
- remove();
1897
+ // vibe remove gpt / vibe remove gemini
1898
+ if (positionalArgs[1] === 'gpt' || positionalArgs[1] === 'gemini') {
1899
+ removeExternalLLM(positionalArgs[1]);
1900
+ }
1901
+ else {
1902
+ remove();
1903
+ }
1925
1904
  break;
1926
- case 'gpt':
1927
- if (args[1] === '--remove') {
1928
- removeExternalLLM('gpt');
1905
+ case 'auth':
1906
+ // vibe auth gpt / vibe auth gemini
1907
+ if (positionalArgs[1] === 'gpt') {
1908
+ const keyIndex = args.indexOf('--key');
1909
+ if (keyIndex !== -1 && args[keyIndex + 1]) {
1910
+ setupExternalLLM('gpt', args[keyIndex + 1]);
1911
+ }
1912
+ else {
1913
+ gptAuth();
1914
+ }
1929
1915
  }
1930
- else if (args[1] === '--auth') {
1931
- gptAuth();
1916
+ else if (positionalArgs[1] === 'gemini') {
1917
+ const keyIndex = args.indexOf('--key');
1918
+ if (keyIndex !== -1 && args[keyIndex + 1]) {
1919
+ setupExternalLLM('gemini', args[keyIndex + 1]);
1920
+ }
1921
+ else {
1922
+ geminiAuth();
1923
+ }
1932
1924
  }
1933
- else if (args[1] === '--status') {
1934
- gptStatus();
1925
+ else {
1926
+ showAuthHelp();
1935
1927
  }
1936
- else if (args[1] === '--logout') {
1928
+ break;
1929
+ case 'logout':
1930
+ // vibe logout gpt / vibe logout gemini
1931
+ if (positionalArgs[1] === 'gpt') {
1937
1932
  gptLogout();
1938
1933
  }
1939
- else if (args[1]) {
1940
- setupExternalLLM('gpt', args[1]);
1934
+ else if (positionalArgs[1] === 'gemini') {
1935
+ geminiLogout();
1941
1936
  }
1942
1937
  else {
1943
- showGptHelp();
1938
+ showLogoutHelp();
1944
1939
  }
1945
1940
  break;
1946
- case 'gemini':
1947
- if (args[1] === '--remove') {
1948
- removeExternalLLM('gemini');
1949
- }
1950
- else if (args[1] === '--auth') {
1951
- geminiAuth();
1941
+ case 'status':
1942
+ // vibe status / vibe status gpt / vibe status gemini
1943
+ if (positionalArgs[1] === 'gpt') {
1944
+ gptStatus();
1952
1945
  }
1953
- else if (args[1] === '--status') {
1946
+ else if (positionalArgs[1] === 'gemini') {
1954
1947
  geminiStatus();
1955
1948
  }
1956
- else if (args[1] === '--logout') {
1957
- geminiLogout();
1958
- }
1959
- else if (args[1]) {
1960
- setupExternalLLM('gemini', args[1]);
1961
- }
1962
1949
  else {
1963
- showGeminiHelp();
1950
+ showStatus();
1964
1951
  }
1965
1952
  break;
1966
- case 'status':
1967
- showStatus();
1968
- break;
1969
1953
  case 'version':
1970
1954
  case '-v':
1971
1955
  case '--version':
@@ -1978,19 +1962,20 @@ switch (command) {
1978
1962
  showHelp();
1979
1963
  break;
1980
1964
  default:
1981
- console.log(`
1982
- ❌ 알 수 없는 명령어: ${command}
1983
-
1984
- 사용 가능한 명령어:
1985
- vibe init 프로젝트 초기화
1986
- vibe update 설정 업데이트
1987
- vibe gpt GPT 활성화/비활성화
1988
- vibe gemini Gemini 활성화/비활성화
1989
- vibe status 현재 설정 상태
1990
- vibe help 도움말
1991
- vibe version 버전 정보
1992
-
1993
- 사용법: vibe help
1965
+ console.log(`
1966
+ ❌ 알 수 없는 명령어: ${command}
1967
+
1968
+ 사용 가능한 명령어:
1969
+ vibe init 프로젝트 초기화
1970
+ vibe update 설정 업데이트
1971
+ vibe auth LLM 인증 (gpt, gemini)
1972
+ vibe status 상태 확인
1973
+ vibe logout 로그아웃
1974
+ vibe remove 제거
1975
+ vibe help 도움말
1976
+ vibe version 버전 정보
1977
+
1978
+ 사용법: vibe help
1994
1979
  `);
1995
1980
  process.exit(1);
1996
1981
  }