@su-record/vibe 2.2.1 → 2.2.3
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 +152 -152
- 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/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.md +323 -323
- package/LICENSE +21 -21
- package/README.md +724 -721
- package/agents/explorer.md +48 -0
- package/agents/implementer.md +53 -0
- package/agents/research/best-practices-agent.md +139 -0
- package/agents/research/codebase-patterns-agent.md +147 -0
- package/agents/research/framework-docs-agent.md +181 -0
- package/agents/research/security-advisory-agent.md +167 -0
- package/agents/review/architecture-reviewer.md +107 -0
- package/agents/review/complexity-reviewer.md +116 -0
- package/agents/review/data-integrity-reviewer.md +88 -0
- package/agents/review/git-history-reviewer.md +103 -0
- package/agents/review/performance-reviewer.md +86 -0
- package/agents/review/python-reviewer.md +152 -0
- package/agents/review/rails-reviewer.md +139 -0
- package/agents/review/react-reviewer.md +144 -0
- package/agents/review/security-reviewer.md +80 -0
- package/agents/review/simplicity-reviewer.md +140 -0
- package/agents/review/test-coverage-reviewer.md +116 -0
- package/agents/review/typescript-reviewer.md +127 -0
- package/agents/searcher.md +54 -0
- package/agents/simplifier.md +119 -0
- package/agents/tester.md +49 -0
- package/commands/vibe.analyze.md +239 -0
- package/commands/vibe.compound.md +261 -0
- package/commands/vibe.continue.md +88 -0
- package/commands/vibe.diagram.md +178 -0
- package/commands/vibe.e2e.md +266 -0
- package/commands/vibe.reason.md +306 -0
- package/commands/vibe.review.md +324 -0
- package/commands/vibe.run.md +836 -0
- package/commands/vibe.setup.md +97 -0
- package/commands/vibe.spec.md +383 -0
- package/commands/vibe.ui.md +137 -0
- package/commands/vibe.verify.md +238 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +389 -385
- package/dist/cli/index.js.map +1 -1
- package/dist/lib/MemoryManager.js +92 -92
- 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/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/package.json +69 -66
- package/skills/git-worktree.md +178 -0
- package/skills/priority-todos.md +236 -0
- package/templates/constitution-template.md +184 -184
- package/templates/contract-backend-template.md +517 -517
- package/templates/contract-frontend-template.md +594 -594
- package/templates/feature-template.md +96 -96
- package/templates/hooks-template.json +103 -103
- package/templates/spec-template.md +199 -199
- package/.claude/vibe/rules/tools/mcp-hi-ai-guide.md +0 -665
- package/.claude/vibe/rules/tools/mcp-workflow.md +0 -51
package/dist/cli/index.js
CHANGED
|
@@ -693,37 +693,37 @@ function setupCollaboratorAutoInstall(projectRoot) {
|
|
|
693
693
|
fs.mkdirSync(vibeDir, { recursive: true });
|
|
694
694
|
}
|
|
695
695
|
if (!fs.existsSync(setupShPath)) {
|
|
696
|
-
const setupScript = `#!/bin/bash
|
|
697
|
-
# Vibe 협업자 자동 설치 스크립트
|
|
698
|
-
# 사용법: ./.claude/vibe/setup.sh
|
|
699
|
-
|
|
700
|
-
set -e
|
|
701
|
-
|
|
702
|
-
echo "🔧 Vibe 설치 확인 중..."
|
|
703
|
-
|
|
704
|
-
# npm/npx 확인
|
|
705
|
-
if ! command -v npx &> /dev/null; then
|
|
706
|
-
echo "❌ Node.js/npm이 설치되어 있지 않습니다."
|
|
707
|
-
echo " https://nodejs.org 에서 설치해주세요."
|
|
708
|
-
exit 1
|
|
709
|
-
fi
|
|
710
|
-
|
|
711
|
-
# vibe 설치 확인 및 업데이트
|
|
712
|
-
if command -v vibe &> /dev/null; then
|
|
713
|
-
echo "✅ Vibe가 이미 설치되어 있습니다."
|
|
714
|
-
vibe update --silent
|
|
715
|
-
echo "✅ Vibe 업데이트 완료!"
|
|
716
|
-
else
|
|
717
|
-
echo "📦 Vibe 설치 중..."
|
|
718
|
-
npm install -g @su-record/vibe
|
|
719
|
-
vibe update --silent
|
|
720
|
-
echo "✅ Vibe 설치 및 설정 완료!"
|
|
721
|
-
fi
|
|
722
|
-
|
|
723
|
-
echo ""
|
|
724
|
-
echo "다음 명령어로 시작하세요:"
|
|
725
|
-
echo " /vibe.spec \\"기능명\\" SPEC 작성"
|
|
726
|
-
echo " /vibe.run \\"기능명\\" 구현 실행"
|
|
696
|
+
const setupScript = `#!/bin/bash
|
|
697
|
+
# Vibe 협업자 자동 설치 스크립트
|
|
698
|
+
# 사용법: ./.claude/vibe/setup.sh
|
|
699
|
+
|
|
700
|
+
set -e
|
|
701
|
+
|
|
702
|
+
echo "🔧 Vibe 설치 확인 중..."
|
|
703
|
+
|
|
704
|
+
# npm/npx 확인
|
|
705
|
+
if ! command -v npx &> /dev/null; then
|
|
706
|
+
echo "❌ Node.js/npm이 설치되어 있지 않습니다."
|
|
707
|
+
echo " https://nodejs.org 에서 설치해주세요."
|
|
708
|
+
exit 1
|
|
709
|
+
fi
|
|
710
|
+
|
|
711
|
+
# vibe 설치 확인 및 업데이트
|
|
712
|
+
if command -v vibe &> /dev/null; then
|
|
713
|
+
echo "✅ Vibe가 이미 설치되어 있습니다."
|
|
714
|
+
vibe update --silent
|
|
715
|
+
echo "✅ Vibe 업데이트 완료!"
|
|
716
|
+
else
|
|
717
|
+
echo "📦 Vibe 설치 중..."
|
|
718
|
+
npm install -g @su-record/vibe
|
|
719
|
+
vibe update --silent
|
|
720
|
+
echo "✅ Vibe 설치 및 설정 완료!"
|
|
721
|
+
fi
|
|
722
|
+
|
|
723
|
+
echo ""
|
|
724
|
+
echo "다음 명령어로 시작하세요:"
|
|
725
|
+
echo " /vibe.spec \\"기능명\\" SPEC 작성"
|
|
726
|
+
echo " /vibe.run \\"기능명\\" 구현 실행"
|
|
727
727
|
`;
|
|
728
728
|
fs.writeFileSync(setupShPath, setupScript);
|
|
729
729
|
fs.chmodSync(setupShPath, '755');
|
|
@@ -731,27 +731,27 @@ echo " /vibe.run \\"기능명\\" 구현 실행"
|
|
|
731
731
|
}
|
|
732
732
|
// 3. README.md에 협업자 안내 추가
|
|
733
733
|
const readmePath = path.join(projectRoot, 'README.md');
|
|
734
|
-
const vibeSetupSection = `
|
|
735
|
-
## Vibe Setup (AI Coding)
|
|
736
|
-
|
|
737
|
-
이 프로젝트는 [Vibe](https://github.com/su-record/vibe) AI 코딩 프레임워크를 사용합니다.
|
|
738
|
-
|
|
739
|
-
### 협업자 설치
|
|
740
|
-
|
|
741
|
-
\`\`\`bash
|
|
742
|
-
# 전역 설치 (권장)
|
|
743
|
-
npm install -g @su-record/vibe
|
|
744
|
-
vibe update
|
|
745
|
-
|
|
746
|
-
# 또는 setup 스크립트 실행
|
|
747
|
-
./.claude/vibe/setup.sh
|
|
748
|
-
\`\`\`
|
|
749
|
-
|
|
750
|
-
### 사용법
|
|
751
|
-
|
|
752
|
-
Claude Code에서 슬래시 커맨드 사용:
|
|
753
|
-
- \`/vibe.spec "기능명"\` - SPEC 문서 작성
|
|
754
|
-
- \`/vibe.run "기능명"\` - 구현 실행
|
|
734
|
+
const vibeSetupSection = `
|
|
735
|
+
## Vibe Setup (AI Coding)
|
|
736
|
+
|
|
737
|
+
이 프로젝트는 [Vibe](https://github.com/su-record/vibe) AI 코딩 프레임워크를 사용합니다.
|
|
738
|
+
|
|
739
|
+
### 협업자 설치
|
|
740
|
+
|
|
741
|
+
\`\`\`bash
|
|
742
|
+
# 전역 설치 (권장)
|
|
743
|
+
npm install -g @su-record/vibe
|
|
744
|
+
vibe update
|
|
745
|
+
|
|
746
|
+
# 또는 setup 스크립트 실행
|
|
747
|
+
./.claude/vibe/setup.sh
|
|
748
|
+
\`\`\`
|
|
749
|
+
|
|
750
|
+
### 사용법
|
|
751
|
+
|
|
752
|
+
Claude Code에서 슬래시 커맨드 사용:
|
|
753
|
+
- \`/vibe.spec "기능명"\` - SPEC 문서 작성
|
|
754
|
+
- \`/vibe.run "기능명"\` - 구현 실행
|
|
755
755
|
`;
|
|
756
756
|
if (fs.existsSync(readmePath)) {
|
|
757
757
|
const readme = fs.readFileSync(readmePath, 'utf-8');
|
|
@@ -786,45 +786,45 @@ const STACK_NAMES = {
|
|
|
786
786
|
};
|
|
787
787
|
// 언어별 CLAUDE.md 규칙
|
|
788
788
|
const LANGUAGE_RULES = {
|
|
789
|
-
typescript: `### TypeScript 규칙
|
|
790
|
-
- \`any\` 타입 사용 금지 → \`unknown\` + 타입 가드 사용
|
|
791
|
-
- \`as any\` 캐스팅 금지 → 적절한 인터페이스 정의
|
|
792
|
-
- \`@ts-ignore\` 금지 → 타입 문제 근본 해결
|
|
789
|
+
typescript: `### TypeScript 규칙
|
|
790
|
+
- \`any\` 타입 사용 금지 → \`unknown\` + 타입 가드 사용
|
|
791
|
+
- \`as any\` 캐스팅 금지 → 적절한 인터페이스 정의
|
|
792
|
+
- \`@ts-ignore\` 금지 → 타입 문제 근본 해결
|
|
793
793
|
- 모든 함수에 반환 타입 명시`,
|
|
794
|
-
python: `### Python 규칙
|
|
795
|
-
- 타입 힌트 필수 (함수 매개변수, 반환값)
|
|
796
|
-
- \`# type: ignore\` 금지 → 타입 문제 근본 해결
|
|
797
|
-
- f-string 사용 권장 (format() 대신)
|
|
794
|
+
python: `### Python 규칙
|
|
795
|
+
- 타입 힌트 필수 (함수 매개변수, 반환값)
|
|
796
|
+
- \`# type: ignore\` 금지 → 타입 문제 근본 해결
|
|
797
|
+
- f-string 사용 권장 (format() 대신)
|
|
798
798
|
- 리스트 컴프리헨션 적절히 활용`,
|
|
799
|
-
go: `### Go 규칙
|
|
800
|
-
- 에러 반환 즉시 처리 (if err != nil)
|
|
801
|
-
- 명시적 에러 래핑 (fmt.Errorf with %w)
|
|
802
|
-
- 인터페이스는 사용처에서 정의
|
|
799
|
+
go: `### Go 규칙
|
|
800
|
+
- 에러 반환 즉시 처리 (if err != nil)
|
|
801
|
+
- 명시적 에러 래핑 (fmt.Errorf with %w)
|
|
802
|
+
- 인터페이스는 사용처에서 정의
|
|
803
803
|
- 고루틴 누수 방지 (context 활용)`,
|
|
804
|
-
rust: `### Rust 규칙
|
|
805
|
-
- unwrap()/expect() 프로덕션 코드 금지 → Result/Option 처리
|
|
806
|
-
- unsafe 블록 최소화
|
|
807
|
-
- 명시적 에러 타입 정의
|
|
804
|
+
rust: `### Rust 규칙
|
|
805
|
+
- unwrap()/expect() 프로덕션 코드 금지 → Result/Option 처리
|
|
806
|
+
- unsafe 블록 최소화
|
|
807
|
+
- 명시적 에러 타입 정의
|
|
808
808
|
- 소유권/수명 주석 명확히`,
|
|
809
|
-
java: `### Java 규칙
|
|
810
|
-
- Optional 적극 활용 (null 대신)
|
|
811
|
-
- 불변 객체 선호 (final 필드)
|
|
812
|
-
- 체크 예외 적절히 처리
|
|
809
|
+
java: `### Java 규칙
|
|
810
|
+
- Optional 적극 활용 (null 대신)
|
|
811
|
+
- 불변 객체 선호 (final 필드)
|
|
812
|
+
- 체크 예외 적절히 처리
|
|
813
813
|
- 스트림 API 활용`,
|
|
814
|
-
kotlin: `### Kotlin 규칙
|
|
815
|
-
- nullable 타입 명시 (?)
|
|
816
|
-
- !! 연산자 금지 → safe call (?.) 사용
|
|
817
|
-
- data class 적극 활용
|
|
814
|
+
kotlin: `### Kotlin 규칙
|
|
815
|
+
- nullable 타입 명시 (?)
|
|
816
|
+
- !! 연산자 금지 → safe call (?.) 사용
|
|
817
|
+
- data class 적극 활용
|
|
818
818
|
- 확장 함수로 유틸리티 구현`,
|
|
819
|
-
dart: `### Dart 규칙
|
|
820
|
-
- null safety 준수 (? 및 ! 적절히 사용)
|
|
821
|
-
- late 키워드 남용 금지
|
|
822
|
-
- const 생성자 활용
|
|
819
|
+
dart: `### Dart 규칙
|
|
820
|
+
- null safety 준수 (? 및 ! 적절히 사용)
|
|
821
|
+
- late 키워드 남용 금지
|
|
822
|
+
- const 생성자 활용
|
|
823
823
|
- 비동기 코드에 async/await 사용`,
|
|
824
|
-
swift: `### Swift 규칙
|
|
825
|
-
- 옵셔널 강제 언래핑 금지 → guard let / if let 사용
|
|
826
|
-
- 프로토콜 지향 프로그래밍 권장
|
|
827
|
-
- 값 타입(struct) 우선 사용
|
|
824
|
+
swift: `### Swift 규칙
|
|
825
|
+
- 옵셔널 강제 언래핑 금지 → guard let / if let 사용
|
|
826
|
+
- 프로토콜 지향 프로그래밍 권장
|
|
827
|
+
- 값 타입(struct) 우선 사용
|
|
828
828
|
- @escaping 클로저 메모리 관리 주의`
|
|
829
829
|
};
|
|
830
830
|
function getLanguageRulesForStacks(stacks) {
|
|
@@ -963,7 +963,7 @@ async function init(projectName) {
|
|
|
963
963
|
const commandsDir = path.join(claudeDir, 'commands');
|
|
964
964
|
ensureDir(claudeDir);
|
|
965
965
|
ensureDir(commandsDir);
|
|
966
|
-
const sourceDir = path.join(__dirname, '
|
|
966
|
+
const sourceDir = path.join(__dirname, '../../commands');
|
|
967
967
|
copyDirContents(sourceDir, commandsDir);
|
|
968
968
|
log(' ✅ 슬래시 커맨드 설치 완료 (7개)\n');
|
|
969
969
|
// 기술 스택 감지
|
|
@@ -1065,7 +1065,7 @@ async function init(projectName) {
|
|
|
1065
1065
|
// .claude/agents/ 복사
|
|
1066
1066
|
const agentsDir = path.join(claudeDir, 'agents');
|
|
1067
1067
|
ensureDir(agentsDir);
|
|
1068
|
-
const agentsSourceDir = path.join(__dirname, '
|
|
1068
|
+
const agentsSourceDir = path.join(__dirname, '../../agents');
|
|
1069
1069
|
copyDirContents(agentsSourceDir, agentsDir);
|
|
1070
1070
|
log(' ✅ 서브에이전트 설치 완료 (.claude/agents/)\n');
|
|
1071
1071
|
// .claude/settings.json 설정
|
|
@@ -1097,41 +1097,41 @@ async function init(projectName) {
|
|
|
1097
1097
|
// 협업자 자동 설치 설정
|
|
1098
1098
|
setupCollaboratorAutoInstall(projectRoot);
|
|
1099
1099
|
// 완료 메시지
|
|
1100
|
-
log(`
|
|
1101
|
-
✅ vibe 초기화 완료!
|
|
1102
|
-
|
|
1103
|
-
${isNewProject ? `프로젝트 위치:
|
|
1104
|
-
${projectRoot}/
|
|
1105
|
-
|
|
1106
|
-
` : ''}생성된 구조:
|
|
1107
|
-
CLAUDE.md # 프로젝트 컨텍스트
|
|
1108
|
-
.claude/
|
|
1109
|
-
├── commands/ # 슬래시 커맨드 (7개)
|
|
1110
|
-
├── agents/ # 서브에이전트 (simplifier)
|
|
1111
|
-
├── settings.json # Hooks 설정 (저장소 공유)
|
|
1112
|
-
└── vibe/
|
|
1113
|
-
├── config.json # 프로젝트 설정
|
|
1114
|
-
├── constitution.md # 프로젝트 원칙
|
|
1115
|
-
├── setup.sh # 협업자 설치 스크립트
|
|
1116
|
-
├── rules/ # 코딩 규칙
|
|
1117
|
-
│ ├── core/ # 핵심 원칙
|
|
1118
|
-
│ ├── quality/ # 품질 체크리스트
|
|
1119
|
-
│ └── languages/ # 언어별 규칙
|
|
1120
|
-
├── specs/ # SPEC 문서들
|
|
1121
|
-
└── features/ # BDD Feature 파일들
|
|
1122
|
-
|
|
1123
|
-
내장 도구: ✓ (35+)
|
|
1124
|
-
협업자 자동 설치: ✓
|
|
1125
|
-
|
|
1126
|
-
${formatLLMStatus()}
|
|
1127
|
-
|
|
1128
|
-
사용법:
|
|
1129
|
-
/vibe.spec "기능명" SPEC 작성 (대화형)
|
|
1130
|
-
/vibe.run "기능명" 구현 실행
|
|
1131
|
-
/vibe.verify "기능명" 검증
|
|
1132
|
-
|
|
1133
|
-
다음 단계:
|
|
1134
|
-
${isNewProject ? `cd ${projectName}\n ` : ''}/vibe.spec "기능명" 으로 시작하세요!
|
|
1100
|
+
log(`
|
|
1101
|
+
✅ vibe 초기화 완료!
|
|
1102
|
+
|
|
1103
|
+
${isNewProject ? `프로젝트 위치:
|
|
1104
|
+
${projectRoot}/
|
|
1105
|
+
|
|
1106
|
+
` : ''}생성된 구조:
|
|
1107
|
+
CLAUDE.md # 프로젝트 컨텍스트
|
|
1108
|
+
.claude/
|
|
1109
|
+
├── commands/ # 슬래시 커맨드 (7개)
|
|
1110
|
+
├── agents/ # 서브에이전트 (simplifier)
|
|
1111
|
+
├── settings.json # Hooks 설정 (저장소 공유)
|
|
1112
|
+
└── vibe/
|
|
1113
|
+
├── config.json # 프로젝트 설정
|
|
1114
|
+
├── constitution.md # 프로젝트 원칙
|
|
1115
|
+
├── setup.sh # 협업자 설치 스크립트
|
|
1116
|
+
├── rules/ # 코딩 규칙
|
|
1117
|
+
│ ├── core/ # 핵심 원칙
|
|
1118
|
+
│ ├── quality/ # 품질 체크리스트
|
|
1119
|
+
│ └── languages/ # 언어별 규칙
|
|
1120
|
+
├── specs/ # SPEC 문서들
|
|
1121
|
+
└── features/ # BDD Feature 파일들
|
|
1122
|
+
|
|
1123
|
+
내장 도구: ✓ (35+)
|
|
1124
|
+
협업자 자동 설치: ✓
|
|
1125
|
+
|
|
1126
|
+
${formatLLMStatus()}
|
|
1127
|
+
|
|
1128
|
+
사용법:
|
|
1129
|
+
/vibe.spec "기능명" SPEC 작성 (대화형)
|
|
1130
|
+
/vibe.run "기능명" 구현 실행
|
|
1131
|
+
/vibe.verify "기능명" 검증
|
|
1132
|
+
|
|
1133
|
+
다음 단계:
|
|
1134
|
+
${isNewProject ? `cd ${projectName}\n ` : ''}/vibe.spec "기능명" 으로 시작하세요!
|
|
1135
1135
|
`);
|
|
1136
1136
|
}
|
|
1137
1137
|
catch (error) {
|
|
@@ -1235,7 +1235,7 @@ async function update() {
|
|
|
1235
1235
|
// .claude/commands 업데이트
|
|
1236
1236
|
const commandsDir = path.join(claudeDir, 'commands');
|
|
1237
1237
|
ensureDir(commandsDir);
|
|
1238
|
-
const sourceDir = path.join(__dirname, '
|
|
1238
|
+
const sourceDir = path.join(__dirname, '../../commands');
|
|
1239
1239
|
copyDirContents(sourceDir, commandsDir);
|
|
1240
1240
|
log(' ✅ 슬래시 커맨드 업데이트 완료 (7개)\n');
|
|
1241
1241
|
// 기술 스택 감지
|
|
@@ -1355,7 +1355,7 @@ async function update() {
|
|
|
1355
1355
|
// .claude/agents/ 업데이트
|
|
1356
1356
|
const agentsDir = path.join(claudeDir, 'agents');
|
|
1357
1357
|
ensureDir(agentsDir);
|
|
1358
|
-
const agentsSourceDir = path.join(__dirname, '
|
|
1358
|
+
const agentsSourceDir = path.join(__dirname, '../../agents');
|
|
1359
1359
|
copyDirContents(agentsSourceDir, agentsDir);
|
|
1360
1360
|
log(' ✅ 서브에이전트 업데이트 완료 (.claude/agents/)\n');
|
|
1361
1361
|
// settings.json 업데이트
|
|
@@ -1503,16 +1503,16 @@ async function update() {
|
|
|
1503
1503
|
}
|
|
1504
1504
|
}
|
|
1505
1505
|
const packageJson = getPackageJson();
|
|
1506
|
-
log(`
|
|
1507
|
-
✅ vibe 업데이트 완료! (v${packageJson.version})
|
|
1508
|
-
|
|
1509
|
-
업데이트된 항목:
|
|
1510
|
-
- 슬래시 커맨드 (7개)
|
|
1511
|
-
- 코딩 규칙 (.claude/vibe/rules/)
|
|
1512
|
-
- 서브에이전트 (.claude/agents/)
|
|
1513
|
-
- Hooks 설정
|
|
1514
|
-
|
|
1515
|
-
${formatLLMStatus()}
|
|
1506
|
+
log(`
|
|
1507
|
+
✅ vibe 업데이트 완료! (v${packageJson.version})
|
|
1508
|
+
|
|
1509
|
+
업데이트된 항목:
|
|
1510
|
+
- 슬래시 커맨드 (7개)
|
|
1511
|
+
- 코딩 규칙 (.claude/vibe/rules/)
|
|
1512
|
+
- 서브에이전트 (.claude/agents/)
|
|
1513
|
+
- Hooks 설정
|
|
1514
|
+
|
|
1515
|
+
${formatLLMStatus()}
|
|
1516
1516
|
`);
|
|
1517
1517
|
}
|
|
1518
1518
|
catch (error) {
|
|
@@ -1583,17 +1583,17 @@ function remove() {
|
|
|
1583
1583
|
}
|
|
1584
1584
|
catch (e) { }
|
|
1585
1585
|
}
|
|
1586
|
-
console.log(`
|
|
1587
|
-
✅ vibe 제거 완료!
|
|
1588
|
-
|
|
1589
|
-
제거된 항목:
|
|
1590
|
-
- MCP 서버 (vibe, context7)
|
|
1591
|
-
- .claude/vibe/ 폴더
|
|
1592
|
-
- 슬래시 커맨드 (7개)
|
|
1593
|
-
- 서브에이전트 (5개)
|
|
1594
|
-
- Hooks 설정
|
|
1595
|
-
|
|
1596
|
-
다시 설치하려면: vibe init
|
|
1586
|
+
console.log(`
|
|
1587
|
+
✅ vibe 제거 완료!
|
|
1588
|
+
|
|
1589
|
+
제거된 항목:
|
|
1590
|
+
- MCP 서버 (vibe, context7)
|
|
1591
|
+
- .claude/vibe/ 폴더
|
|
1592
|
+
- 슬래시 커맨드 (7개)
|
|
1593
|
+
- 서브에이전트 (5개)
|
|
1594
|
+
- Hooks 설정
|
|
1595
|
+
|
|
1596
|
+
다시 설치하려면: vibe init
|
|
1597
1597
|
`);
|
|
1598
1598
|
}
|
|
1599
1599
|
// ============================================================================
|
|
@@ -1601,13 +1601,13 @@ function remove() {
|
|
|
1601
1601
|
// ============================================================================
|
|
1602
1602
|
function setupExternalLLM(llmType, apiKey) {
|
|
1603
1603
|
if (!apiKey) {
|
|
1604
|
-
console.log(`
|
|
1605
|
-
❌ API 키가 필요합니다.
|
|
1606
|
-
|
|
1607
|
-
사용법:
|
|
1608
|
-
vibe ${llmType} <api-key>
|
|
1609
|
-
|
|
1610
|
-
${llmType === 'gpt' ? 'OpenAI API 키: https://platform.openai.com/api-keys' : 'Google API 키: https://aistudio.google.com/apikey'}
|
|
1604
|
+
console.log(`
|
|
1605
|
+
❌ API 키가 필요합니다.
|
|
1606
|
+
|
|
1607
|
+
사용법:
|
|
1608
|
+
vibe ${llmType} <api-key>
|
|
1609
|
+
|
|
1610
|
+
${llmType === 'gpt' ? 'OpenAI API 키: https://platform.openai.com/api-keys' : 'Google API 키: https://aistudio.google.com/apikey'}
|
|
1611
1611
|
`);
|
|
1612
1612
|
return;
|
|
1613
1613
|
}
|
|
@@ -1640,20 +1640,20 @@ ${llmType === 'gpt' ? 'OpenAI API 키: https://platform.openai.com/api-keys' : '
|
|
|
1640
1640
|
args: ['-y', llmConfig.package],
|
|
1641
1641
|
env: { [envKey]: apiKey }
|
|
1642
1642
|
});
|
|
1643
|
-
console.log(`
|
|
1644
|
-
✅ ${llmType.toUpperCase()} 활성화 완료! (전역)
|
|
1645
|
-
|
|
1646
|
-
역할: ${llmConfig.description}
|
|
1647
|
-
MCP: ${llmConfig.name}
|
|
1648
|
-
|
|
1649
|
-
모든 프로젝트에서 /vibe.run 실행 시 자동으로 활용됩니다.
|
|
1650
|
-
|
|
1651
|
-
비활성화: vibe remove ${llmType}
|
|
1643
|
+
console.log(`
|
|
1644
|
+
✅ ${llmType.toUpperCase()} 활성화 완료! (전역)
|
|
1645
|
+
|
|
1646
|
+
역할: ${llmConfig.description}
|
|
1647
|
+
MCP: ${llmConfig.name}
|
|
1648
|
+
|
|
1649
|
+
모든 프로젝트에서 /vibe.run 실행 시 자동으로 활용됩니다.
|
|
1650
|
+
|
|
1651
|
+
비활성화: vibe remove ${llmType}
|
|
1652
1652
|
`);
|
|
1653
1653
|
}
|
|
1654
1654
|
catch (e) {
|
|
1655
|
-
console.log(`
|
|
1656
|
-
⚠️ MCP 등록 실패. ~/.claude/settings.json에 수동으로 추가하세요.
|
|
1655
|
+
console.log(`
|
|
1656
|
+
⚠️ MCP 등록 실패. ~/.claude/settings.json에 수동으로 추가하세요.
|
|
1657
1657
|
`);
|
|
1658
1658
|
}
|
|
1659
1659
|
}
|
|
@@ -1680,11 +1680,11 @@ function removeExternalLLM(llmType) {
|
|
|
1680
1680
|
// GPT OAuth Commands
|
|
1681
1681
|
// ============================================================================
|
|
1682
1682
|
async function gptAuth() {
|
|
1683
|
-
console.log(`
|
|
1684
|
-
🔐 GPT Plus/Pro 인증 (OAuth)
|
|
1685
|
-
|
|
1686
|
-
ChatGPT Plus 또는 Pro 구독이 있으면 Codex API를 사용할 수 있습니다.
|
|
1687
|
-
브라우저에서 OpenAI 계정으로 로그인하세요.
|
|
1683
|
+
console.log(`
|
|
1684
|
+
🔐 GPT Plus/Pro 인증 (OAuth)
|
|
1685
|
+
|
|
1686
|
+
ChatGPT Plus 또는 Pro 구독이 있으면 Codex API를 사용할 수 있습니다.
|
|
1687
|
+
브라우저에서 OpenAI 계정으로 로그인하세요.
|
|
1688
1688
|
`);
|
|
1689
1689
|
try {
|
|
1690
1690
|
const gptOAuthPath = path.join(__dirname, '../lib/gpt-oauth.js');
|
|
@@ -1700,17 +1700,17 @@ ChatGPT Plus 또는 Pro 구독이 있으면 Codex API를 사용할 수 있습니
|
|
|
1700
1700
|
expires: tokens.expires,
|
|
1701
1701
|
accountId: tokens.accountId,
|
|
1702
1702
|
});
|
|
1703
|
-
console.log(`
|
|
1704
|
-
✅ GPT 인증 완료!
|
|
1705
|
-
|
|
1706
|
-
계정: ${tokens.email}
|
|
1707
|
-
계정 ID: ${tokens.accountId || '(자동 감지)'}
|
|
1708
|
-
|
|
1709
|
-
⚠️ 참고: ChatGPT Plus/Pro 구독이 있어야 API 호출이 가능합니다.
|
|
1710
|
-
구독이 없으면 인증은 성공하지만 API 호출 시 오류가 발생합니다.
|
|
1711
|
-
|
|
1712
|
-
상태 확인: vibe status gpt
|
|
1713
|
-
로그아웃: vibe logout gpt
|
|
1703
|
+
console.log(`
|
|
1704
|
+
✅ GPT 인증 완료!
|
|
1705
|
+
|
|
1706
|
+
계정: ${tokens.email}
|
|
1707
|
+
계정 ID: ${tokens.accountId || '(자동 감지)'}
|
|
1708
|
+
|
|
1709
|
+
⚠️ 참고: ChatGPT Plus/Pro 구독이 있어야 API 호출이 가능합니다.
|
|
1710
|
+
구독이 없으면 인증은 성공하지만 API 호출 시 오류가 발생합니다.
|
|
1711
|
+
|
|
1712
|
+
상태 확인: vibe status gpt
|
|
1713
|
+
로그아웃: vibe logout gpt
|
|
1714
1714
|
`);
|
|
1715
1715
|
// config.json 업데이트
|
|
1716
1716
|
const projectRoot = process.cwd();
|
|
@@ -1737,26 +1737,30 @@ ChatGPT Plus 또는 Pro 구독이 있으면 Codex API를 사용할 수 있습니
|
|
|
1737
1737
|
const mcpPath = path.join(__dirname, '../lib/gpt-mcp.js');
|
|
1738
1738
|
unregisterMcp('vibe-gpt');
|
|
1739
1739
|
registerMcp('vibe-gpt', { command: 'node', args: [mcpPath] });
|
|
1740
|
-
console.log(`
|
|
1741
|
-
✅ vibe-gpt MCP 서버 등록 완료! (전역)
|
|
1742
|
-
|
|
1743
|
-
이제 모든 프로젝트에서
|
|
1740
|
+
console.log(`
|
|
1741
|
+
✅ vibe-gpt MCP 서버 등록 완료! (전역)
|
|
1742
|
+
|
|
1743
|
+
이제 모든 프로젝트에서 다음 도구를 사용할 수 있습니다:
|
|
1744
|
+
- gpt_chat: GPT에 질문
|
|
1745
|
+
- gpt_analyze_architecture: 아키텍처 분석
|
|
1746
|
+
- gpt_debug: 디버깅
|
|
1747
|
+
- gpt_quick_ask: 빠른 질문
|
|
1744
1748
|
`);
|
|
1745
1749
|
}
|
|
1746
1750
|
catch (mcpError) {
|
|
1747
|
-
console.log(`
|
|
1748
|
-
⚠️ MCP 서버 등록 실패. ~/.claude/settings.json에 수동으로 추가하세요.
|
|
1751
|
+
console.log(`
|
|
1752
|
+
⚠️ MCP 서버 등록 실패. ~/.claude/settings.json에 수동으로 추가하세요.
|
|
1749
1753
|
`);
|
|
1750
1754
|
}
|
|
1751
1755
|
process.exit(0);
|
|
1752
1756
|
}
|
|
1753
1757
|
catch (error) {
|
|
1754
|
-
console.error(`
|
|
1755
|
-
❌ GPT 인증 실패
|
|
1756
|
-
|
|
1757
|
-
오류: ${error.message}
|
|
1758
|
-
|
|
1759
|
-
다시 시도하려면: vibe gpt --auth
|
|
1758
|
+
console.error(`
|
|
1759
|
+
❌ GPT 인증 실패
|
|
1760
|
+
|
|
1761
|
+
오류: ${error.message}
|
|
1762
|
+
|
|
1763
|
+
다시 시도하려면: vibe gpt --auth
|
|
1760
1764
|
`);
|
|
1761
1765
|
process.exit(1);
|
|
1762
1766
|
}
|
|
@@ -1767,31 +1771,31 @@ function gptStatus() {
|
|
|
1767
1771
|
const storage = require(gptStoragePath);
|
|
1768
1772
|
const accounts = storage.getAllAccounts();
|
|
1769
1773
|
if (accounts.length === 0) {
|
|
1770
|
-
console.log(`
|
|
1771
|
-
📊 GPT 인증 상태
|
|
1772
|
-
|
|
1773
|
-
인증된 계정 없음
|
|
1774
|
-
|
|
1775
|
-
로그인: vibe gpt --auth
|
|
1774
|
+
console.log(`
|
|
1775
|
+
📊 GPT 인증 상태
|
|
1776
|
+
|
|
1777
|
+
인증된 계정 없음
|
|
1778
|
+
|
|
1779
|
+
로그인: vibe gpt --auth
|
|
1776
1780
|
`);
|
|
1777
1781
|
return;
|
|
1778
1782
|
}
|
|
1779
1783
|
const activeAccount = storage.getActiveAccount();
|
|
1780
1784
|
const isExpired = storage.isTokenExpired(activeAccount);
|
|
1781
|
-
console.log(`
|
|
1782
|
-
📊 GPT 인증 상태
|
|
1783
|
-
|
|
1784
|
-
활성 계정: ${activeAccount.email}
|
|
1785
|
-
계정 ID: ${activeAccount.accountId || '(없음)'}
|
|
1786
|
-
토큰 상태: ${isExpired ? '⚠️ 만료됨 (자동 갱신됨)' : '✅ 유효'}
|
|
1787
|
-
마지막 사용: ${new Date(activeAccount.lastUsed).toLocaleString()}
|
|
1788
|
-
|
|
1789
|
-
등록된 계정 (${accounts.length}개):
|
|
1790
|
-
${accounts.map((acc, i) => ` ${i === storage.loadAccounts()?.activeIndex ? '→' : ' '} ${acc.email}`).join('\n')}
|
|
1791
|
-
|
|
1792
|
-
⚠️ 참고: ChatGPT Plus/Pro 구독이 있어야 API 호출이 가능합니다.
|
|
1793
|
-
|
|
1794
|
-
로그아웃: vibe logout gpt
|
|
1785
|
+
console.log(`
|
|
1786
|
+
📊 GPT 인증 상태
|
|
1787
|
+
|
|
1788
|
+
활성 계정: ${activeAccount.email}
|
|
1789
|
+
계정 ID: ${activeAccount.accountId || '(없음)'}
|
|
1790
|
+
토큰 상태: ${isExpired ? '⚠️ 만료됨 (자동 갱신됨)' : '✅ 유효'}
|
|
1791
|
+
마지막 사용: ${new Date(activeAccount.lastUsed).toLocaleString()}
|
|
1792
|
+
|
|
1793
|
+
등록된 계정 (${accounts.length}개):
|
|
1794
|
+
${accounts.map((acc, i) => ` ${i === storage.loadAccounts()?.activeIndex ? '→' : ' '} ${acc.email}`).join('\n')}
|
|
1795
|
+
|
|
1796
|
+
⚠️ 참고: ChatGPT Plus/Pro 구독이 있어야 API 호출이 가능합니다.
|
|
1797
|
+
|
|
1798
|
+
로그아웃: vibe logout gpt
|
|
1795
1799
|
`);
|
|
1796
1800
|
}
|
|
1797
1801
|
catch (error) {
|
|
@@ -1808,12 +1812,12 @@ function gptLogout() {
|
|
|
1808
1812
|
return;
|
|
1809
1813
|
}
|
|
1810
1814
|
storage.clearAccounts();
|
|
1811
|
-
console.log(`
|
|
1812
|
-
✅ GPT 로그아웃 완료
|
|
1813
|
-
|
|
1814
|
-
${activeAccount.email} 계정이 제거되었습니다.
|
|
1815
|
-
|
|
1816
|
-
다시 로그인: vibe gpt --auth
|
|
1815
|
+
console.log(`
|
|
1816
|
+
✅ GPT 로그아웃 완료
|
|
1817
|
+
|
|
1818
|
+
${activeAccount.email} 계정이 제거되었습니다.
|
|
1819
|
+
|
|
1820
|
+
다시 로그인: vibe gpt --auth
|
|
1817
1821
|
`);
|
|
1818
1822
|
// config.json 업데이트
|
|
1819
1823
|
const projectRoot = process.cwd();
|
|
@@ -1837,39 +1841,39 @@ ${activeAccount.email} 계정이 제거되었습니다.
|
|
|
1837
1841
|
}
|
|
1838
1842
|
}
|
|
1839
1843
|
function showAuthHelp() {
|
|
1840
|
-
console.log(`
|
|
1841
|
-
🔐 vibe auth - LLM 인증
|
|
1842
|
-
|
|
1843
|
-
사용법:
|
|
1844
|
-
vibe auth gpt GPT Plus/Pro OAuth 인증
|
|
1845
|
-
vibe auth gpt --key <key> GPT API 키로 설정
|
|
1846
|
-
vibe auth gemini Gemini 구독 OAuth 인증 (권장)
|
|
1847
|
-
vibe auth gemini --key <key> Gemini API 키로 설정
|
|
1848
|
-
|
|
1849
|
-
예시:
|
|
1850
|
-
vibe auth gpt OpenAI 로그인 (Plus/Pro 구독 필요)
|
|
1851
|
-
vibe auth gemini Google 로그인 (Gemini Advanced 구독 시 무료)
|
|
1852
|
-
vibe auth gpt --key sk-xxx API 키로 설정 (사용량 과금)
|
|
1844
|
+
console.log(`
|
|
1845
|
+
🔐 vibe auth - LLM 인증
|
|
1846
|
+
|
|
1847
|
+
사용법:
|
|
1848
|
+
vibe auth gpt GPT Plus/Pro OAuth 인증
|
|
1849
|
+
vibe auth gpt --key <key> GPT API 키로 설정
|
|
1850
|
+
vibe auth gemini Gemini 구독 OAuth 인증 (권장)
|
|
1851
|
+
vibe auth gemini --key <key> Gemini API 키로 설정
|
|
1852
|
+
|
|
1853
|
+
예시:
|
|
1854
|
+
vibe auth gpt OpenAI 로그인 (Plus/Pro 구독 필요)
|
|
1855
|
+
vibe auth gemini Google 로그인 (Gemini Advanced 구독 시 무료)
|
|
1856
|
+
vibe auth gpt --key sk-xxx API 키로 설정 (사용량 과금)
|
|
1853
1857
|
`);
|
|
1854
1858
|
}
|
|
1855
1859
|
function showLogoutHelp() {
|
|
1856
|
-
console.log(`
|
|
1857
|
-
🚪 vibe logout - LLM 로그아웃
|
|
1858
|
-
|
|
1859
|
-
사용법:
|
|
1860
|
-
vibe logout gpt GPT 로그아웃
|
|
1861
|
-
vibe logout gemini Gemini 로그아웃
|
|
1860
|
+
console.log(`
|
|
1861
|
+
🚪 vibe logout - LLM 로그아웃
|
|
1862
|
+
|
|
1863
|
+
사용법:
|
|
1864
|
+
vibe logout gpt GPT 로그아웃
|
|
1865
|
+
vibe logout gemini Gemini 로그아웃
|
|
1862
1866
|
`);
|
|
1863
1867
|
}
|
|
1864
1868
|
// ============================================================================
|
|
1865
1869
|
// Gemini OAuth Commands
|
|
1866
1870
|
// ============================================================================
|
|
1867
1871
|
async function geminiAuth() {
|
|
1868
|
-
console.log(`
|
|
1869
|
-
🔐 Gemini 구독 인증 (OAuth)
|
|
1870
|
-
|
|
1871
|
-
Gemini Advanced 구독이 있으면 추가 비용 없이 사용할 수 있습니다.
|
|
1872
|
-
브라우저에서 Google 계정으로 로그인하세요.
|
|
1872
|
+
console.log(`
|
|
1873
|
+
🔐 Gemini 구독 인증 (OAuth)
|
|
1874
|
+
|
|
1875
|
+
Gemini Advanced 구독이 있으면 추가 비용 없이 사용할 수 있습니다.
|
|
1876
|
+
브라우저에서 Google 계정으로 로그인하세요.
|
|
1873
1877
|
`);
|
|
1874
1878
|
try {
|
|
1875
1879
|
const geminiOAuthPath = path.join(__dirname, '../lib/gemini-oauth.js');
|
|
@@ -1884,20 +1888,20 @@ Gemini Advanced 구독이 있으면 추가 비용 없이 사용할 수 있습니
|
|
|
1884
1888
|
expires: tokens.expires,
|
|
1885
1889
|
projectId: tokens.projectId,
|
|
1886
1890
|
});
|
|
1887
|
-
console.log(`
|
|
1888
|
-
✅ Gemini 인증 완료!
|
|
1889
|
-
|
|
1890
|
-
계정: ${tokens.email}
|
|
1891
|
-
프로젝트: ${tokens.projectId || '(자동 감지)'}
|
|
1892
|
-
|
|
1893
|
-
사용 가능한 모델:
|
|
1894
|
-
- Gemini 3 Flash (빠른 응답, 탐색/검색)
|
|
1895
|
-
- Gemini 3 Pro (높은 정확도)
|
|
1896
|
-
|
|
1897
|
-
/vibe.run 실행 시 자동으로 Gemini가 보조 모델로 활용됩니다.
|
|
1898
|
-
|
|
1899
|
-
상태 확인: vibe status gemini
|
|
1900
|
-
로그아웃: vibe logout gemini
|
|
1891
|
+
console.log(`
|
|
1892
|
+
✅ Gemini 인증 완료!
|
|
1893
|
+
|
|
1894
|
+
계정: ${tokens.email}
|
|
1895
|
+
프로젝트: ${tokens.projectId || '(자동 감지)'}
|
|
1896
|
+
|
|
1897
|
+
사용 가능한 모델:
|
|
1898
|
+
- Gemini 3 Flash (빠른 응답, 탐색/검색)
|
|
1899
|
+
- Gemini 3 Pro (높은 정확도)
|
|
1900
|
+
|
|
1901
|
+
/vibe.run 실행 시 자동으로 Gemini가 보조 모델로 활용됩니다.
|
|
1902
|
+
|
|
1903
|
+
상태 확인: vibe status gemini
|
|
1904
|
+
로그아웃: vibe logout gemini
|
|
1901
1905
|
`);
|
|
1902
1906
|
// config.json 업데이트
|
|
1903
1907
|
const projectRoot = process.cwd();
|
|
@@ -1924,30 +1928,30 @@ Gemini Advanced 구독이 있으면 추가 비용 없이 사용할 수 있습니
|
|
|
1924
1928
|
const mcpPath = path.join(__dirname, '../lib/gemini-mcp.js');
|
|
1925
1929
|
unregisterMcp('vibe-gemini');
|
|
1926
1930
|
registerMcp('vibe-gemini', { command: 'node', args: [mcpPath] });
|
|
1927
|
-
console.log(`
|
|
1928
|
-
✅ vibe-gemini MCP 서버 등록 완료! (전역)
|
|
1929
|
-
|
|
1930
|
-
이제 모든 프로젝트에서 다음 도구를 사용할 수 있습니다:
|
|
1931
|
-
-
|
|
1932
|
-
-
|
|
1933
|
-
-
|
|
1934
|
-
-
|
|
1931
|
+
console.log(`
|
|
1932
|
+
✅ vibe-gemini MCP 서버 등록 완료! (전역)
|
|
1933
|
+
|
|
1934
|
+
이제 모든 프로젝트에서 다음 도구를 사용할 수 있습니다:
|
|
1935
|
+
- gemini_chat: Gemini에 질문
|
|
1936
|
+
- gemini_analyze_code: 코드 분석
|
|
1937
|
+
- gemini_review_ui: UI/UX 리뷰
|
|
1938
|
+
- gemini_quick_ask: 빠른 질문
|
|
1935
1939
|
`);
|
|
1936
1940
|
}
|
|
1937
1941
|
catch (mcpError) {
|
|
1938
|
-
console.log(`
|
|
1939
|
-
⚠️ MCP 서버 등록 실패. ~/.claude/settings.json에 수동으로 추가하세요.
|
|
1942
|
+
console.log(`
|
|
1943
|
+
⚠️ MCP 서버 등록 실패. ~/.claude/settings.json에 수동으로 추가하세요.
|
|
1940
1944
|
`);
|
|
1941
1945
|
}
|
|
1942
1946
|
process.exit(0);
|
|
1943
1947
|
}
|
|
1944
1948
|
catch (error) {
|
|
1945
|
-
console.error(`
|
|
1946
|
-
❌ Gemini 인증 실패
|
|
1947
|
-
|
|
1948
|
-
오류: ${error.message}
|
|
1949
|
-
|
|
1950
|
-
다시 시도하려면: vibe gemini --auth
|
|
1949
|
+
console.error(`
|
|
1950
|
+
❌ Gemini 인증 실패
|
|
1951
|
+
|
|
1952
|
+
오류: ${error.message}
|
|
1953
|
+
|
|
1954
|
+
다시 시도하려면: vibe gemini --auth
|
|
1951
1955
|
`);
|
|
1952
1956
|
process.exit(1);
|
|
1953
1957
|
}
|
|
@@ -1960,32 +1964,32 @@ function geminiStatus() {
|
|
|
1960
1964
|
const { GEMINI_MODELS } = require(geminiApiPath);
|
|
1961
1965
|
const accounts = storage.getAllAccounts();
|
|
1962
1966
|
if (accounts.length === 0) {
|
|
1963
|
-
console.log(`
|
|
1964
|
-
📊 Gemini 인증 상태
|
|
1965
|
-
|
|
1966
|
-
인증된 계정 없음
|
|
1967
|
-
|
|
1968
|
-
로그인: vibe gemini --auth
|
|
1967
|
+
console.log(`
|
|
1968
|
+
📊 Gemini 인증 상태
|
|
1969
|
+
|
|
1970
|
+
인증된 계정 없음
|
|
1971
|
+
|
|
1972
|
+
로그인: vibe gemini --auth
|
|
1969
1973
|
`);
|
|
1970
1974
|
return;
|
|
1971
1975
|
}
|
|
1972
1976
|
const activeAccount = storage.getActiveAccount();
|
|
1973
1977
|
const isExpired = storage.isTokenExpired(activeAccount);
|
|
1974
|
-
console.log(`
|
|
1975
|
-
📊 Gemini 인증 상태
|
|
1976
|
-
|
|
1977
|
-
활성 계정: ${activeAccount.email}
|
|
1978
|
-
프로젝트: ${activeAccount.projectId || '(자동)'}
|
|
1979
|
-
토큰 상태: ${isExpired ? '⚠️ 만료됨 (자동 갱신됨)' : '✅ 유효'}
|
|
1980
|
-
마지막 사용: ${new Date(activeAccount.lastUsed).toLocaleString()}
|
|
1981
|
-
|
|
1982
|
-
등록된 계정 (${accounts.length}개):
|
|
1983
|
-
${accounts.map((acc, i) => ` ${i === storage.loadAccounts()?.activeIndex ? '→' : ' '} ${acc.email}`).join('\n')}
|
|
1984
|
-
|
|
1985
|
-
사용 가능한 모델:
|
|
1986
|
-
${Object.entries(GEMINI_MODELS).map(([id, info]) => ` - ${id}: ${info.description}`).join('\n')}
|
|
1987
|
-
|
|
1988
|
-
로그아웃: vibe logout gemini
|
|
1978
|
+
console.log(`
|
|
1979
|
+
📊 Gemini 인증 상태
|
|
1980
|
+
|
|
1981
|
+
활성 계정: ${activeAccount.email}
|
|
1982
|
+
프로젝트: ${activeAccount.projectId || '(자동)'}
|
|
1983
|
+
토큰 상태: ${isExpired ? '⚠️ 만료됨 (자동 갱신됨)' : '✅ 유효'}
|
|
1984
|
+
마지막 사용: ${new Date(activeAccount.lastUsed).toLocaleString()}
|
|
1985
|
+
|
|
1986
|
+
등록된 계정 (${accounts.length}개):
|
|
1987
|
+
${accounts.map((acc, i) => ` ${i === storage.loadAccounts()?.activeIndex ? '→' : ' '} ${acc.email}`).join('\n')}
|
|
1988
|
+
|
|
1989
|
+
사용 가능한 모델:
|
|
1990
|
+
${Object.entries(GEMINI_MODELS).map(([id, info]) => ` - ${id}: ${info.description}`).join('\n')}
|
|
1991
|
+
|
|
1992
|
+
로그아웃: vibe logout gemini
|
|
1989
1993
|
`);
|
|
1990
1994
|
}
|
|
1991
1995
|
catch (error) {
|
|
@@ -2002,12 +2006,12 @@ function geminiLogout() {
|
|
|
2002
2006
|
return;
|
|
2003
2007
|
}
|
|
2004
2008
|
storage.clearAccounts();
|
|
2005
|
-
console.log(`
|
|
2006
|
-
✅ Gemini 로그아웃 완료
|
|
2007
|
-
|
|
2008
|
-
${activeAccount.email} 계정이 제거되었습니다.
|
|
2009
|
-
|
|
2010
|
-
다시 로그인: vibe gemini --auth
|
|
2009
|
+
console.log(`
|
|
2010
|
+
✅ Gemini 로그아웃 완료
|
|
2011
|
+
|
|
2012
|
+
${activeAccount.email} 계정이 제거되었습니다.
|
|
2013
|
+
|
|
2014
|
+
다시 로그인: vibe gemini --auth
|
|
2011
2015
|
`);
|
|
2012
2016
|
// config.json 업데이트
|
|
2013
2017
|
const projectRoot = process.cwd();
|
|
@@ -2035,53 +2039,53 @@ ${activeAccount.email} 계정이 제거되었습니다.
|
|
|
2035
2039
|
// Info Commands
|
|
2036
2040
|
// ============================================================================
|
|
2037
2041
|
function showHelp() {
|
|
2038
|
-
console.log(`
|
|
2039
|
-
📖 Vibe - SPEC-driven AI coding framework (Claude Code 전용)
|
|
2040
|
-
|
|
2041
|
-
기본 명령어:
|
|
2042
|
-
vibe init [project] 프로젝트 초기화
|
|
2043
|
-
vibe update 설정 업데이트
|
|
2044
|
-
vibe status 현재 설정 상태
|
|
2045
|
-
vibe help 도움말
|
|
2046
|
-
vibe version 버전 정보
|
|
2047
|
-
|
|
2048
|
-
외부 LLM 인증:
|
|
2049
|
-
vibe auth gpt GPT Plus/Pro OAuth 인증
|
|
2050
|
-
vibe auth gemini Gemini 구독 OAuth 인증 (권장)
|
|
2051
|
-
vibe auth gpt --key <key> GPT API 키 설정
|
|
2052
|
-
vibe auth gemini --key <key> Gemini API 키 설정
|
|
2053
|
-
|
|
2054
|
-
상태 및 관리:
|
|
2055
|
-
vibe status 전체 상태 확인
|
|
2056
|
-
vibe status gpt GPT 인증 상태 확인
|
|
2057
|
-
vibe status gemini Gemini 인증 상태 확인
|
|
2058
|
-
vibe logout gpt GPT 로그아웃
|
|
2059
|
-
vibe logout gemini Gemini 로그아웃
|
|
2060
|
-
vibe remove gpt GPT 제거
|
|
2061
|
-
vibe remove gemini Gemini 제거
|
|
2062
|
-
vibe remove vibe 전체 제거 (MCP, 설정, 패키지)
|
|
2063
|
-
|
|
2064
|
-
Claude Code 슬래시 커맨드:
|
|
2065
|
-
/vibe.spec "기능명" SPEC 작성 (PTCF 구조)
|
|
2066
|
-
/vibe.run "기능명" 구현 실행
|
|
2067
|
-
/vibe.verify "기능명" 검증
|
|
2068
|
-
/vibe.reason "문제" 체계적 추론
|
|
2069
|
-
/vibe.analyze 프로젝트 분석
|
|
2070
|
-
/vibe.ui "설명" UI 미리보기
|
|
2071
|
-
/vibe.diagram 다이어그램 생성
|
|
2072
|
-
|
|
2073
|
-
모델 오케스트레이션:
|
|
2074
|
-
Opus 4.5 오케스트레이터 (메인)
|
|
2075
|
-
Sonnet 4 구현
|
|
2076
|
-
Haiku 4.5 코드 탐색
|
|
2077
|
-
GPT 5.2 아키텍처/디버깅 (선택적)
|
|
2078
|
-
Gemini 3 UI/UX 설계 (선택적)
|
|
2079
|
-
|
|
2080
|
-
Workflow:
|
|
2081
|
-
/vibe.spec → /vibe.run → /vibe.verify
|
|
2082
|
-
|
|
2083
|
-
문서:
|
|
2084
|
-
https://github.com/su-record/vibe
|
|
2042
|
+
console.log(`
|
|
2043
|
+
📖 Vibe - SPEC-driven AI coding framework (Claude Code 전용)
|
|
2044
|
+
|
|
2045
|
+
기본 명령어:
|
|
2046
|
+
vibe init [project] 프로젝트 초기화
|
|
2047
|
+
vibe update 설정 업데이트
|
|
2048
|
+
vibe status 현재 설정 상태
|
|
2049
|
+
vibe help 도움말
|
|
2050
|
+
vibe version 버전 정보
|
|
2051
|
+
|
|
2052
|
+
외부 LLM 인증:
|
|
2053
|
+
vibe auth gpt GPT Plus/Pro OAuth 인증
|
|
2054
|
+
vibe auth gemini Gemini 구독 OAuth 인증 (권장)
|
|
2055
|
+
vibe auth gpt --key <key> GPT API 키 설정
|
|
2056
|
+
vibe auth gemini --key <key> Gemini API 키 설정
|
|
2057
|
+
|
|
2058
|
+
상태 및 관리:
|
|
2059
|
+
vibe status 전체 상태 확인
|
|
2060
|
+
vibe status gpt GPT 인증 상태 확인
|
|
2061
|
+
vibe status gemini Gemini 인증 상태 확인
|
|
2062
|
+
vibe logout gpt GPT 로그아웃
|
|
2063
|
+
vibe logout gemini Gemini 로그아웃
|
|
2064
|
+
vibe remove gpt GPT 제거
|
|
2065
|
+
vibe remove gemini Gemini 제거
|
|
2066
|
+
vibe remove vibe 전체 제거 (MCP, 설정, 패키지)
|
|
2067
|
+
|
|
2068
|
+
Claude Code 슬래시 커맨드:
|
|
2069
|
+
/vibe.spec "기능명" SPEC 작성 (PTCF 구조)
|
|
2070
|
+
/vibe.run "기능명" 구현 실행
|
|
2071
|
+
/vibe.verify "기능명" 검증
|
|
2072
|
+
/vibe.reason "문제" 체계적 추론
|
|
2073
|
+
/vibe.analyze 프로젝트 분석
|
|
2074
|
+
/vibe.ui "설명" UI 미리보기
|
|
2075
|
+
/vibe.diagram 다이어그램 생성
|
|
2076
|
+
|
|
2077
|
+
모델 오케스트레이션:
|
|
2078
|
+
Opus 4.5 오케스트레이터 (메인)
|
|
2079
|
+
Sonnet 4 구현
|
|
2080
|
+
Haiku 4.5 코드 탐색
|
|
2081
|
+
GPT 5.2 아키텍처/디버깅 (선택적)
|
|
2082
|
+
Gemini 3 UI/UX 설계 (선택적)
|
|
2083
|
+
|
|
2084
|
+
Workflow:
|
|
2085
|
+
/vibe.spec → /vibe.run → /vibe.verify
|
|
2086
|
+
|
|
2087
|
+
문서:
|
|
2088
|
+
https://github.com/su-record/vibe
|
|
2085
2089
|
`);
|
|
2086
2090
|
}
|
|
2087
2091
|
function showStatus() {
|
|
@@ -2099,33 +2103,33 @@ function showStatus() {
|
|
|
2099
2103
|
}
|
|
2100
2104
|
const gptStatus = config.models?.gpt?.enabled ? '✅ 활성' : '⬚ 비활성';
|
|
2101
2105
|
const geminiStatus = config.models?.gemini?.enabled ? '✅ 활성' : '⬚ 비활성';
|
|
2102
|
-
console.log(`
|
|
2103
|
-
📊 Vibe 상태 (v${packageJson.version})
|
|
2104
|
-
|
|
2105
|
-
프로젝트: ${projectRoot}
|
|
2106
|
-
언어: ${config.language || 'ko'}
|
|
2107
|
-
|
|
2108
|
-
모델 오케스트레이션:
|
|
2109
|
-
┌─────────────────────────────────────────┐
|
|
2110
|
-
│ Opus 4.5 오케스트레이터 │
|
|
2111
|
-
├─────────────────────────────────────────┤
|
|
2112
|
-
│ Sonnet 4 구현 │
|
|
2113
|
-
│ Haiku 4.5 코드 탐색 │
|
|
2114
|
-
├─────────────────────────────────────────┤
|
|
2115
|
-
│ GPT 5.2 ${gptStatus} 아키텍처/디버깅 │
|
|
2116
|
-
│ Gemini 3 ${geminiStatus} UI/UX 설계 │
|
|
2117
|
-
└─────────────────────────────────────────┘
|
|
2118
|
-
|
|
2119
|
-
MCP 서버:
|
|
2120
|
-
vibe-gemini Gemini API
|
|
2121
|
-
vibe-gpt GPT API
|
|
2122
|
-
context7 라이브러리 문서 검색
|
|
2123
|
-
|
|
2124
|
-
외부 LLM 설정:
|
|
2125
|
-
vibe auth gpt GPT 활성화 (OAuth)
|
|
2126
|
-
vibe auth gemini Gemini 활성화 (OAuth)
|
|
2127
|
-
vibe remove gpt GPT 제거
|
|
2128
|
-
vibe remove gemini Gemini 제거
|
|
2106
|
+
console.log(`
|
|
2107
|
+
📊 Vibe 상태 (v${packageJson.version})
|
|
2108
|
+
|
|
2109
|
+
프로젝트: ${projectRoot}
|
|
2110
|
+
언어: ${config.language || 'ko'}
|
|
2111
|
+
|
|
2112
|
+
모델 오케스트레이션:
|
|
2113
|
+
┌─────────────────────────────────────────┐
|
|
2114
|
+
│ Opus 4.5 오케스트레이터 │
|
|
2115
|
+
├─────────────────────────────────────────┤
|
|
2116
|
+
│ Sonnet 4 구현 │
|
|
2117
|
+
│ Haiku 4.5 코드 탐색 │
|
|
2118
|
+
├─────────────────────────────────────────┤
|
|
2119
|
+
│ GPT 5.2 ${gptStatus} 아키텍처/디버깅 │
|
|
2120
|
+
│ Gemini 3 ${geminiStatus} UI/UX 설계 │
|
|
2121
|
+
└─────────────────────────────────────────┘
|
|
2122
|
+
|
|
2123
|
+
MCP 서버:
|
|
2124
|
+
vibe-gemini Gemini API
|
|
2125
|
+
vibe-gpt GPT API
|
|
2126
|
+
context7 라이브러리 문서 검색
|
|
2127
|
+
|
|
2128
|
+
외부 LLM 설정:
|
|
2129
|
+
vibe auth gpt GPT 활성화 (OAuth)
|
|
2130
|
+
vibe auth gemini Gemini 활성화 (OAuth)
|
|
2131
|
+
vibe remove gpt GPT 제거
|
|
2132
|
+
vibe remove gemini Gemini 제거
|
|
2129
2133
|
`);
|
|
2130
2134
|
}
|
|
2131
2135
|
function showVersion() {
|
|
@@ -2256,20 +2260,20 @@ switch (command) {
|
|
|
2256
2260
|
showHelp();
|
|
2257
2261
|
break;
|
|
2258
2262
|
default:
|
|
2259
|
-
console.log(`
|
|
2260
|
-
❌ 알 수 없는 명령어: ${command}
|
|
2261
|
-
|
|
2262
|
-
사용 가능한 명령어:
|
|
2263
|
-
vibe init 프로젝트 초기화
|
|
2264
|
-
vibe update 설정 업데이트
|
|
2265
|
-
vibe auth LLM 인증 (gpt, gemini)
|
|
2266
|
-
vibe status 상태 확인
|
|
2267
|
-
vibe logout 로그아웃
|
|
2268
|
-
vibe remove 제거
|
|
2269
|
-
vibe help 도움말
|
|
2270
|
-
vibe version 버전 정보
|
|
2271
|
-
|
|
2272
|
-
사용법: vibe help
|
|
2263
|
+
console.log(`
|
|
2264
|
+
❌ 알 수 없는 명령어: ${command}
|
|
2265
|
+
|
|
2266
|
+
사용 가능한 명령어:
|
|
2267
|
+
vibe init 프로젝트 초기화
|
|
2268
|
+
vibe update 설정 업데이트
|
|
2269
|
+
vibe auth LLM 인증 (gpt, gemini)
|
|
2270
|
+
vibe status 상태 확인
|
|
2271
|
+
vibe logout 로그아웃
|
|
2272
|
+
vibe remove 제거
|
|
2273
|
+
vibe help 도움말
|
|
2274
|
+
vibe version 버전 정보
|
|
2275
|
+
|
|
2276
|
+
사용법: vibe help
|
|
2273
2277
|
`);
|
|
2274
2278
|
process.exit(1);
|
|
2275
2279
|
}
|