@su-record/vibe 2.2.2 → 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.js +389 -389
- 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,30 +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
|
-
이제 모든 프로젝트에서 다음 도구를 사용할 수 있습니다:
|
|
1744
|
-
- gpt_chat: GPT에 질문
|
|
1745
|
-
- gpt_analyze_architecture: 아키텍처 분석
|
|
1746
|
-
- gpt_debug: 디버깅
|
|
1747
|
-
- gpt_quick_ask: 빠른 질문
|
|
1740
|
+
console.log(`
|
|
1741
|
+
✅ vibe-gpt MCP 서버 등록 완료! (전역)
|
|
1742
|
+
|
|
1743
|
+
이제 모든 프로젝트에서 다음 도구를 사용할 수 있습니다:
|
|
1744
|
+
- gpt_chat: GPT에 질문
|
|
1745
|
+
- gpt_analyze_architecture: 아키텍처 분석
|
|
1746
|
+
- gpt_debug: 디버깅
|
|
1747
|
+
- gpt_quick_ask: 빠른 질문
|
|
1748
1748
|
`);
|
|
1749
1749
|
}
|
|
1750
1750
|
catch (mcpError) {
|
|
1751
|
-
console.log(`
|
|
1752
|
-
⚠️ MCP 서버 등록 실패. ~/.claude/settings.json에 수동으로 추가하세요.
|
|
1751
|
+
console.log(`
|
|
1752
|
+
⚠️ MCP 서버 등록 실패. ~/.claude/settings.json에 수동으로 추가하세요.
|
|
1753
1753
|
`);
|
|
1754
1754
|
}
|
|
1755
1755
|
process.exit(0);
|
|
1756
1756
|
}
|
|
1757
1757
|
catch (error) {
|
|
1758
|
-
console.error(`
|
|
1759
|
-
❌ GPT 인증 실패
|
|
1760
|
-
|
|
1761
|
-
오류: ${error.message}
|
|
1762
|
-
|
|
1763
|
-
다시 시도하려면: vibe gpt --auth
|
|
1758
|
+
console.error(`
|
|
1759
|
+
❌ GPT 인증 실패
|
|
1760
|
+
|
|
1761
|
+
오류: ${error.message}
|
|
1762
|
+
|
|
1763
|
+
다시 시도하려면: vibe gpt --auth
|
|
1764
1764
|
`);
|
|
1765
1765
|
process.exit(1);
|
|
1766
1766
|
}
|
|
@@ -1771,31 +1771,31 @@ function gptStatus() {
|
|
|
1771
1771
|
const storage = require(gptStoragePath);
|
|
1772
1772
|
const accounts = storage.getAllAccounts();
|
|
1773
1773
|
if (accounts.length === 0) {
|
|
1774
|
-
console.log(`
|
|
1775
|
-
📊 GPT 인증 상태
|
|
1776
|
-
|
|
1777
|
-
인증된 계정 없음
|
|
1778
|
-
|
|
1779
|
-
로그인: vibe gpt --auth
|
|
1774
|
+
console.log(`
|
|
1775
|
+
📊 GPT 인증 상태
|
|
1776
|
+
|
|
1777
|
+
인증된 계정 없음
|
|
1778
|
+
|
|
1779
|
+
로그인: vibe gpt --auth
|
|
1780
1780
|
`);
|
|
1781
1781
|
return;
|
|
1782
1782
|
}
|
|
1783
1783
|
const activeAccount = storage.getActiveAccount();
|
|
1784
1784
|
const isExpired = storage.isTokenExpired(activeAccount);
|
|
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
|
|
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
|
|
1799
1799
|
`);
|
|
1800
1800
|
}
|
|
1801
1801
|
catch (error) {
|
|
@@ -1812,12 +1812,12 @@ function gptLogout() {
|
|
|
1812
1812
|
return;
|
|
1813
1813
|
}
|
|
1814
1814
|
storage.clearAccounts();
|
|
1815
|
-
console.log(`
|
|
1816
|
-
✅ GPT 로그아웃 완료
|
|
1817
|
-
|
|
1818
|
-
${activeAccount.email} 계정이 제거되었습니다.
|
|
1819
|
-
|
|
1820
|
-
다시 로그인: vibe gpt --auth
|
|
1815
|
+
console.log(`
|
|
1816
|
+
✅ GPT 로그아웃 완료
|
|
1817
|
+
|
|
1818
|
+
${activeAccount.email} 계정이 제거되었습니다.
|
|
1819
|
+
|
|
1820
|
+
다시 로그인: vibe gpt --auth
|
|
1821
1821
|
`);
|
|
1822
1822
|
// config.json 업데이트
|
|
1823
1823
|
const projectRoot = process.cwd();
|
|
@@ -1841,39 +1841,39 @@ ${activeAccount.email} 계정이 제거되었습니다.
|
|
|
1841
1841
|
}
|
|
1842
1842
|
}
|
|
1843
1843
|
function showAuthHelp() {
|
|
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 키로 설정 (사용량 과금)
|
|
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 키로 설정 (사용량 과금)
|
|
1857
1857
|
`);
|
|
1858
1858
|
}
|
|
1859
1859
|
function showLogoutHelp() {
|
|
1860
|
-
console.log(`
|
|
1861
|
-
🚪 vibe logout - LLM 로그아웃
|
|
1862
|
-
|
|
1863
|
-
사용법:
|
|
1864
|
-
vibe logout gpt GPT 로그아웃
|
|
1865
|
-
vibe logout gemini Gemini 로그아웃
|
|
1860
|
+
console.log(`
|
|
1861
|
+
🚪 vibe logout - LLM 로그아웃
|
|
1862
|
+
|
|
1863
|
+
사용법:
|
|
1864
|
+
vibe logout gpt GPT 로그아웃
|
|
1865
|
+
vibe logout gemini Gemini 로그아웃
|
|
1866
1866
|
`);
|
|
1867
1867
|
}
|
|
1868
1868
|
// ============================================================================
|
|
1869
1869
|
// Gemini OAuth Commands
|
|
1870
1870
|
// ============================================================================
|
|
1871
1871
|
async function geminiAuth() {
|
|
1872
|
-
console.log(`
|
|
1873
|
-
🔐 Gemini 구독 인증 (OAuth)
|
|
1874
|
-
|
|
1875
|
-
Gemini Advanced 구독이 있으면 추가 비용 없이 사용할 수 있습니다.
|
|
1876
|
-
브라우저에서 Google 계정으로 로그인하세요.
|
|
1872
|
+
console.log(`
|
|
1873
|
+
🔐 Gemini 구독 인증 (OAuth)
|
|
1874
|
+
|
|
1875
|
+
Gemini Advanced 구독이 있으면 추가 비용 없이 사용할 수 있습니다.
|
|
1876
|
+
브라우저에서 Google 계정으로 로그인하세요.
|
|
1877
1877
|
`);
|
|
1878
1878
|
try {
|
|
1879
1879
|
const geminiOAuthPath = path.join(__dirname, '../lib/gemini-oauth.js');
|
|
@@ -1888,20 +1888,20 @@ Gemini Advanced 구독이 있으면 추가 비용 없이 사용할 수 있습니
|
|
|
1888
1888
|
expires: tokens.expires,
|
|
1889
1889
|
projectId: tokens.projectId,
|
|
1890
1890
|
});
|
|
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
|
|
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
|
|
1905
1905
|
`);
|
|
1906
1906
|
// config.json 업데이트
|
|
1907
1907
|
const projectRoot = process.cwd();
|
|
@@ -1928,30 +1928,30 @@ Gemini Advanced 구독이 있으면 추가 비용 없이 사용할 수 있습니
|
|
|
1928
1928
|
const mcpPath = path.join(__dirname, '../lib/gemini-mcp.js');
|
|
1929
1929
|
unregisterMcp('vibe-gemini');
|
|
1930
1930
|
registerMcp('vibe-gemini', { command: 'node', args: [mcpPath] });
|
|
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: 빠른 질문
|
|
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: 빠른 질문
|
|
1939
1939
|
`);
|
|
1940
1940
|
}
|
|
1941
1941
|
catch (mcpError) {
|
|
1942
|
-
console.log(`
|
|
1943
|
-
⚠️ MCP 서버 등록 실패. ~/.claude/settings.json에 수동으로 추가하세요.
|
|
1942
|
+
console.log(`
|
|
1943
|
+
⚠️ MCP 서버 등록 실패. ~/.claude/settings.json에 수동으로 추가하세요.
|
|
1944
1944
|
`);
|
|
1945
1945
|
}
|
|
1946
1946
|
process.exit(0);
|
|
1947
1947
|
}
|
|
1948
1948
|
catch (error) {
|
|
1949
|
-
console.error(`
|
|
1950
|
-
❌ Gemini 인증 실패
|
|
1951
|
-
|
|
1952
|
-
오류: ${error.message}
|
|
1953
|
-
|
|
1954
|
-
다시 시도하려면: vibe gemini --auth
|
|
1949
|
+
console.error(`
|
|
1950
|
+
❌ Gemini 인증 실패
|
|
1951
|
+
|
|
1952
|
+
오류: ${error.message}
|
|
1953
|
+
|
|
1954
|
+
다시 시도하려면: vibe gemini --auth
|
|
1955
1955
|
`);
|
|
1956
1956
|
process.exit(1);
|
|
1957
1957
|
}
|
|
@@ -1964,32 +1964,32 @@ function geminiStatus() {
|
|
|
1964
1964
|
const { GEMINI_MODELS } = require(geminiApiPath);
|
|
1965
1965
|
const accounts = storage.getAllAccounts();
|
|
1966
1966
|
if (accounts.length === 0) {
|
|
1967
|
-
console.log(`
|
|
1968
|
-
📊 Gemini 인증 상태
|
|
1969
|
-
|
|
1970
|
-
인증된 계정 없음
|
|
1971
|
-
|
|
1972
|
-
로그인: vibe gemini --auth
|
|
1967
|
+
console.log(`
|
|
1968
|
+
📊 Gemini 인증 상태
|
|
1969
|
+
|
|
1970
|
+
인증된 계정 없음
|
|
1971
|
+
|
|
1972
|
+
로그인: vibe gemini --auth
|
|
1973
1973
|
`);
|
|
1974
1974
|
return;
|
|
1975
1975
|
}
|
|
1976
1976
|
const activeAccount = storage.getActiveAccount();
|
|
1977
1977
|
const isExpired = storage.isTokenExpired(activeAccount);
|
|
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
|
|
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
|
|
1993
1993
|
`);
|
|
1994
1994
|
}
|
|
1995
1995
|
catch (error) {
|
|
@@ -2006,12 +2006,12 @@ function geminiLogout() {
|
|
|
2006
2006
|
return;
|
|
2007
2007
|
}
|
|
2008
2008
|
storage.clearAccounts();
|
|
2009
|
-
console.log(`
|
|
2010
|
-
✅ Gemini 로그아웃 완료
|
|
2011
|
-
|
|
2012
|
-
${activeAccount.email} 계정이 제거되었습니다.
|
|
2013
|
-
|
|
2014
|
-
다시 로그인: vibe gemini --auth
|
|
2009
|
+
console.log(`
|
|
2010
|
+
✅ Gemini 로그아웃 완료
|
|
2011
|
+
|
|
2012
|
+
${activeAccount.email} 계정이 제거되었습니다.
|
|
2013
|
+
|
|
2014
|
+
다시 로그인: vibe gemini --auth
|
|
2015
2015
|
`);
|
|
2016
2016
|
// config.json 업데이트
|
|
2017
2017
|
const projectRoot = process.cwd();
|
|
@@ -2039,53 +2039,53 @@ ${activeAccount.email} 계정이 제거되었습니다.
|
|
|
2039
2039
|
// Info Commands
|
|
2040
2040
|
// ============================================================================
|
|
2041
2041
|
function showHelp() {
|
|
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
|
|
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
|
|
2089
2089
|
`);
|
|
2090
2090
|
}
|
|
2091
2091
|
function showStatus() {
|
|
@@ -2103,33 +2103,33 @@ function showStatus() {
|
|
|
2103
2103
|
}
|
|
2104
2104
|
const gptStatus = config.models?.gpt?.enabled ? '✅ 활성' : '⬚ 비활성';
|
|
2105
2105
|
const geminiStatus = config.models?.gemini?.enabled ? '✅ 활성' : '⬚ 비활성';
|
|
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 제거
|
|
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 제거
|
|
2133
2133
|
`);
|
|
2134
2134
|
}
|
|
2135
2135
|
function showVersion() {
|
|
@@ -2260,20 +2260,20 @@ switch (command) {
|
|
|
2260
2260
|
showHelp();
|
|
2261
2261
|
break;
|
|
2262
2262
|
default:
|
|
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
|
|
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
|
|
2277
2277
|
`);
|
|
2278
2278
|
process.exit(1);
|
|
2279
2279
|
}
|