@su-record/vibe 2.4.17 → 2.4.18
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 +48 -48
- package/.claude/settings.local.json +28 -28
- 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/languages/dart-flutter.md +509 -509
- package/.claude/vibe/rules/languages/go.md +396 -396
- package/.claude/vibe/rules/languages/java-spring.md +586 -586
- package/.claude/vibe/rules/languages/kotlin-android.md +491 -491
- package/.claude/vibe/rules/languages/python-django.md +371 -371
- package/.claude/vibe/rules/languages/python-fastapi.md +386 -386
- package/.claude/vibe/rules/languages/rust.md +425 -425
- package/.claude/vibe/rules/languages/swift-ios.md +516 -516
- package/.claude/vibe/rules/languages/typescript-nextjs.md +441 -441
- package/.claude/vibe/rules/languages/typescript-node.md +375 -375
- package/.claude/vibe/rules/languages/typescript-nuxt.md +521 -521
- package/.claude/vibe/rules/languages/typescript-react-native.md +446 -446
- package/.claude/vibe/rules/languages/typescript-react.md +525 -525
- package/.claude/vibe/rules/languages/typescript-vue.md +353 -353
- 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/vibe/templates/constitution-template.md +184 -184
- package/.claude/vibe/templates/contract-backend-template.md +517 -517
- package/.claude/vibe/templates/contract-frontend-template.md +594 -594
- package/.claude/vibe/templates/feature-template.md +96 -96
- package/.claude/vibe/templates/spec-template.md +199 -199
- package/CLAUDE.md +333 -333
- package/LICENSE +21 -21
- package/README.md +205 -205
- package/agents/compounder.md +261 -261
- package/agents/diagrammer.md +178 -178
- package/agents/e2e-tester.md +266 -266
- package/agents/explorer.md +48 -48
- package/agents/implementer.md +53 -53
- package/agents/research/best-practices-agent.md +139 -139
- package/agents/research/codebase-patterns-agent.md +147 -147
- package/agents/research/framework-docs-agent.md +181 -181
- package/agents/research/security-advisory-agent.md +167 -167
- package/agents/review/architecture-reviewer.md +107 -107
- package/agents/review/complexity-reviewer.md +116 -116
- package/agents/review/data-integrity-reviewer.md +88 -88
- package/agents/review/git-history-reviewer.md +103 -103
- package/agents/review/performance-reviewer.md +86 -86
- package/agents/review/python-reviewer.md +152 -152
- package/agents/review/rails-reviewer.md +139 -139
- package/agents/review/react-reviewer.md +144 -144
- package/agents/review/security-reviewer.md +80 -80
- package/agents/review/simplicity-reviewer.md +140 -140
- package/agents/review/test-coverage-reviewer.md +116 -116
- package/agents/review/typescript-reviewer.md +127 -127
- package/agents/searcher.md +54 -54
- package/agents/simplifier.md +119 -119
- package/agents/tester.md +49 -49
- package/agents/ui-previewer.md +137 -137
- package/commands/vibe.analyze.md +260 -260
- package/commands/vibe.reason.md +223 -223
- package/commands/vibe.review.md +213 -213
- package/commands/vibe.run.md +935 -935
- package/commands/vibe.spec.md +442 -442
- package/commands/vibe.utils.md +101 -101
- package/commands/vibe.verify.md +282 -282
- package/dist/cli/collaborator.js +52 -52
- package/dist/cli/detect.js +32 -32
- package/dist/cli/index.js +0 -0
- package/dist/cli/llm.js +144 -144
- package/hooks/hooks.json +195 -195
- package/package.json +87 -87
- package/skills/context7-usage.md +82 -82
- package/skills/git-worktree.md +181 -181
- package/skills/multi-llm-orchestration.md +97 -97
- package/skills/parallel-research.md +77 -77
- package/skills/priority-todos.md +239 -239
- package/skills/tool-fallback.md +126 -126
- package/skills/vibe-capabilities.md +127 -127
package/dist/cli/collaborator.js
CHANGED
|
@@ -61,37 +61,37 @@ export function setupCollaboratorAutoInstall(projectRoot) {
|
|
|
61
61
|
fs.mkdirSync(vibeDir, { recursive: true });
|
|
62
62
|
}
|
|
63
63
|
if (!fs.existsSync(setupShPath)) {
|
|
64
|
-
const setupScript = `#!/bin/bash
|
|
65
|
-
# Vibe 협업자 자동 설치 스크립트
|
|
66
|
-
# 사용법: ./.claude/vibe/setup.sh
|
|
67
|
-
|
|
68
|
-
set -e
|
|
69
|
-
|
|
70
|
-
echo "🔧 Vibe 설치 확인 중..."
|
|
71
|
-
|
|
72
|
-
# npm/npx 확인
|
|
73
|
-
if ! command -v npx &> /dev/null; then
|
|
74
|
-
echo "❌ Node.js/npm이 설치되어 있지 않습니다."
|
|
75
|
-
echo " https://nodejs.org 에서 설치해주세요."
|
|
76
|
-
exit 1
|
|
77
|
-
fi
|
|
78
|
-
|
|
79
|
-
# vibe 설치 확인 및 업데이트
|
|
80
|
-
if command -v vibe &> /dev/null; then
|
|
81
|
-
echo "✅ Vibe가 이미 설치되어 있습니다."
|
|
82
|
-
vibe update --silent
|
|
83
|
-
echo "✅ Vibe 업데이트 완료!"
|
|
84
|
-
else
|
|
85
|
-
echo "📦 Vibe 설치 중..."
|
|
86
|
-
npm install -g @su-record/vibe
|
|
87
|
-
vibe update --silent
|
|
88
|
-
echo "✅ Vibe 설치 및 설정 완료!"
|
|
89
|
-
fi
|
|
90
|
-
|
|
91
|
-
echo ""
|
|
92
|
-
echo "다음 명령어로 시작하세요:"
|
|
93
|
-
echo " /vibe.spec \\"기능명\\" SPEC 작성"
|
|
94
|
-
echo " /vibe.run \\"기능명\\" 구현 실행"
|
|
64
|
+
const setupScript = `#!/bin/bash
|
|
65
|
+
# Vibe 협업자 자동 설치 스크립트
|
|
66
|
+
# 사용법: ./.claude/vibe/setup.sh
|
|
67
|
+
|
|
68
|
+
set -e
|
|
69
|
+
|
|
70
|
+
echo "🔧 Vibe 설치 확인 중..."
|
|
71
|
+
|
|
72
|
+
# npm/npx 확인
|
|
73
|
+
if ! command -v npx &> /dev/null; then
|
|
74
|
+
echo "❌ Node.js/npm이 설치되어 있지 않습니다."
|
|
75
|
+
echo " https://nodejs.org 에서 설치해주세요."
|
|
76
|
+
exit 1
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
# vibe 설치 확인 및 업데이트
|
|
80
|
+
if command -v vibe &> /dev/null; then
|
|
81
|
+
echo "✅ Vibe가 이미 설치되어 있습니다."
|
|
82
|
+
vibe update --silent
|
|
83
|
+
echo "✅ Vibe 업데이트 완료!"
|
|
84
|
+
else
|
|
85
|
+
echo "📦 Vibe 설치 중..."
|
|
86
|
+
npm install -g @su-record/vibe
|
|
87
|
+
vibe update --silent
|
|
88
|
+
echo "✅ Vibe 설치 및 설정 완료!"
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
echo ""
|
|
92
|
+
echo "다음 명령어로 시작하세요:"
|
|
93
|
+
echo " /vibe.spec \\"기능명\\" SPEC 작성"
|
|
94
|
+
echo " /vibe.run \\"기능명\\" 구현 실행"
|
|
95
95
|
`;
|
|
96
96
|
fs.writeFileSync(setupShPath, setupScript);
|
|
97
97
|
fs.chmodSync(setupShPath, '755');
|
|
@@ -99,27 +99,27 @@ echo " /vibe.run \\"기능명\\" 구현 실행"
|
|
|
99
99
|
}
|
|
100
100
|
// 3. README.md에 협업자 안내 추가
|
|
101
101
|
const readmePath = path.join(projectRoot, 'README.md');
|
|
102
|
-
const vibeSetupSection = `
|
|
103
|
-
## Vibe Setup (AI Coding)
|
|
104
|
-
|
|
105
|
-
이 프로젝트는 [Vibe](https://github.com/su-record/vibe) AI 코딩 프레임워크를 사용합니다.
|
|
106
|
-
|
|
107
|
-
### 협업자 설치
|
|
108
|
-
|
|
109
|
-
\`\`\`bash
|
|
110
|
-
# 전역 설치 (권장)
|
|
111
|
-
npm install -g @su-record/vibe
|
|
112
|
-
vibe update
|
|
113
|
-
|
|
114
|
-
# 또는 setup 스크립트 실행
|
|
115
|
-
./.claude/vibe/setup.sh
|
|
116
|
-
\`\`\`
|
|
117
|
-
|
|
118
|
-
### 사용법
|
|
119
|
-
|
|
120
|
-
Claude Code에서 슬래시 커맨드 사용:
|
|
121
|
-
- \`/vibe.spec "기능명"\` - SPEC 문서 작성
|
|
122
|
-
- \`/vibe.run "기능명"\` - 구현 실행
|
|
102
|
+
const vibeSetupSection = `
|
|
103
|
+
## Vibe Setup (AI Coding)
|
|
104
|
+
|
|
105
|
+
이 프로젝트는 [Vibe](https://github.com/su-record/vibe) AI 코딩 프레임워크를 사용합니다.
|
|
106
|
+
|
|
107
|
+
### 협업자 설치
|
|
108
|
+
|
|
109
|
+
\`\`\`bash
|
|
110
|
+
# 전역 설치 (권장)
|
|
111
|
+
npm install -g @su-record/vibe
|
|
112
|
+
vibe update
|
|
113
|
+
|
|
114
|
+
# 또는 setup 스크립트 실행
|
|
115
|
+
./.claude/vibe/setup.sh
|
|
116
|
+
\`\`\`
|
|
117
|
+
|
|
118
|
+
### 사용법
|
|
119
|
+
|
|
120
|
+
Claude Code에서 슬래시 커맨드 사용:
|
|
121
|
+
- \`/vibe.spec "기능명"\` - SPEC 문서 작성
|
|
122
|
+
- \`/vibe.run "기능명"\` - 구현 실행
|
|
123
123
|
`;
|
|
124
124
|
if (fs.existsSync(readmePath)) {
|
|
125
125
|
const readme = fs.readFileSync(readmePath, 'utf-8');
|
package/dist/cli/detect.js
CHANGED
|
@@ -301,45 +301,45 @@ export function getLanguageRulesForStacks(stacks) {
|
|
|
301
301
|
* 언어별 CLAUDE.md 규칙
|
|
302
302
|
*/
|
|
303
303
|
export const LANGUAGE_RULES = {
|
|
304
|
-
typescript: `### TypeScript 규칙
|
|
305
|
-
- \`any\` 타입 사용 금지 → \`unknown\` + 타입 가드 사용
|
|
306
|
-
- \`as any\` 캐스팅 금지 → 적절한 인터페이스 정의
|
|
307
|
-
- \`@ts-ignore\` 금지 → 타입 문제 근본 해결
|
|
304
|
+
typescript: `### TypeScript 규칙
|
|
305
|
+
- \`any\` 타입 사용 금지 → \`unknown\` + 타입 가드 사용
|
|
306
|
+
- \`as any\` 캐스팅 금지 → 적절한 인터페이스 정의
|
|
307
|
+
- \`@ts-ignore\` 금지 → 타입 문제 근본 해결
|
|
308
308
|
- 모든 함수에 반환 타입 명시`,
|
|
309
|
-
python: `### Python 규칙
|
|
310
|
-
- 타입 힌트 필수 (함수 매개변수, 반환값)
|
|
311
|
-
- \`# type: ignore\` 금지 → 타입 문제 근본 해결
|
|
312
|
-
- f-string 사용 권장 (format() 대신)
|
|
309
|
+
python: `### Python 규칙
|
|
310
|
+
- 타입 힌트 필수 (함수 매개변수, 반환값)
|
|
311
|
+
- \`# type: ignore\` 금지 → 타입 문제 근본 해결
|
|
312
|
+
- f-string 사용 권장 (format() 대신)
|
|
313
313
|
- 리스트 컴프리헨션 적절히 활용`,
|
|
314
|
-
go: `### Go 규칙
|
|
315
|
-
- 에러 반환 즉시 처리 (if err != nil)
|
|
316
|
-
- 명시적 에러 래핑 (fmt.Errorf with %w)
|
|
317
|
-
- 인터페이스는 사용처에서 정의
|
|
314
|
+
go: `### Go 규칙
|
|
315
|
+
- 에러 반환 즉시 처리 (if err != nil)
|
|
316
|
+
- 명시적 에러 래핑 (fmt.Errorf with %w)
|
|
317
|
+
- 인터페이스는 사용처에서 정의
|
|
318
318
|
- 고루틴 누수 방지 (context 활용)`,
|
|
319
|
-
rust: `### Rust 규칙
|
|
320
|
-
- unwrap()/expect() 프로덕션 코드 금지 → Result/Option 처리
|
|
321
|
-
- unsafe 블록 최소화
|
|
322
|
-
- 명시적 에러 타입 정의
|
|
319
|
+
rust: `### Rust 규칙
|
|
320
|
+
- unwrap()/expect() 프로덕션 코드 금지 → Result/Option 처리
|
|
321
|
+
- unsafe 블록 최소화
|
|
322
|
+
- 명시적 에러 타입 정의
|
|
323
323
|
- 소유권/수명 주석 명확히`,
|
|
324
|
-
java: `### Java 규칙
|
|
325
|
-
- Optional 적극 활용 (null 대신)
|
|
326
|
-
- 불변 객체 선호 (final 필드)
|
|
327
|
-
- 체크 예외 적절히 처리
|
|
324
|
+
java: `### Java 규칙
|
|
325
|
+
- Optional 적극 활용 (null 대신)
|
|
326
|
+
- 불변 객체 선호 (final 필드)
|
|
327
|
+
- 체크 예외 적절히 처리
|
|
328
328
|
- 스트림 API 활용`,
|
|
329
|
-
kotlin: `### Kotlin 규칙
|
|
330
|
-
- nullable 타입 명시 (?)
|
|
331
|
-
- !! 연산자 금지 → safe call (?.) 사용
|
|
332
|
-
- data class 적극 활용
|
|
329
|
+
kotlin: `### Kotlin 규칙
|
|
330
|
+
- nullable 타입 명시 (?)
|
|
331
|
+
- !! 연산자 금지 → safe call (?.) 사용
|
|
332
|
+
- data class 적극 활용
|
|
333
333
|
- 확장 함수로 유틸리티 구현`,
|
|
334
|
-
dart: `### Dart 규칙
|
|
335
|
-
- null safety 준수 (? 및 ! 적절히 사용)
|
|
336
|
-
- late 키워드 남용 금지
|
|
337
|
-
- const 생성자 활용
|
|
334
|
+
dart: `### Dart 규칙
|
|
335
|
+
- null safety 준수 (? 및 ! 적절히 사용)
|
|
336
|
+
- late 키워드 남용 금지
|
|
337
|
+
- const 생성자 활용
|
|
338
338
|
- 비동기 코드에 async/await 사용`,
|
|
339
|
-
swift: `### Swift 규칙
|
|
340
|
-
- 옵셔널 강제 언래핑 금지 → guard let / if let 사용
|
|
341
|
-
- 프로토콜 지향 프로그래밍 권장
|
|
342
|
-
- 값 타입(struct) 우선 사용
|
|
339
|
+
swift: `### Swift 규칙
|
|
340
|
+
- 옵셔널 강제 언래핑 금지 → guard let / if let 사용
|
|
341
|
+
- 프로토콜 지향 프로그래밍 권장
|
|
342
|
+
- 값 타입(struct) 우선 사용
|
|
343
343
|
- @escaping 클로저 메모리 관리 주의`
|
|
344
344
|
};
|
|
345
345
|
/**
|
package/dist/cli/index.js
CHANGED
|
File without changes
|
package/dist/cli/llm.js
CHANGED
|
@@ -33,13 +33,13 @@ export const EXTERNAL_LLMS = {
|
|
|
33
33
|
*/
|
|
34
34
|
export function setupExternalLLM(llmType, apiKey) {
|
|
35
35
|
if (!apiKey) {
|
|
36
|
-
console.log(`
|
|
37
|
-
❌ API 키가 필요합니다.
|
|
38
|
-
|
|
39
|
-
사용법:
|
|
40
|
-
vibe ${llmType} <api-key>
|
|
41
|
-
|
|
42
|
-
${llmType === 'gpt' ? 'OpenAI API 키: https://platform.openai.com/api-keys' : 'Google API 키: https://aistudio.google.com/apikey'}
|
|
36
|
+
console.log(`
|
|
37
|
+
❌ API 키가 필요합니다.
|
|
38
|
+
|
|
39
|
+
사용법:
|
|
40
|
+
vibe ${llmType} <api-key>
|
|
41
|
+
|
|
42
|
+
${llmType === 'gpt' ? 'OpenAI API 키: https://platform.openai.com/api-keys' : 'Google API 키: https://aistudio.google.com/apikey'}
|
|
43
43
|
`);
|
|
44
44
|
return;
|
|
45
45
|
}
|
|
@@ -66,16 +66,16 @@ ${llmType === 'gpt' ? 'OpenAI API 키: https://platform.openai.com/api-keys' : '
|
|
|
66
66
|
// API 키를 config에 저장 (암호화 없이 - 로컬 전용)
|
|
67
67
|
config.models[llmType].apiKey = apiKey;
|
|
68
68
|
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
69
|
-
console.log(`
|
|
70
|
-
✅ ${llmType.toUpperCase()} API 키 설정 완료!
|
|
71
|
-
|
|
72
|
-
역할: ${llmConfig.description}
|
|
73
|
-
|
|
74
|
-
${llmType.toUpperCase()}는 Hook으로 직접 호출됩니다:
|
|
75
|
-
- "${llmType}한테 물어봐" 키워드로 자동 호출
|
|
76
|
-
- import('@su-record/vibe/lib/${llmType}') 로 직접 사용 가능
|
|
77
|
-
|
|
78
|
-
비활성화: vibe remove ${llmType}
|
|
69
|
+
console.log(`
|
|
70
|
+
✅ ${llmType.toUpperCase()} API 키 설정 완료!
|
|
71
|
+
|
|
72
|
+
역할: ${llmConfig.description}
|
|
73
|
+
|
|
74
|
+
${llmType.toUpperCase()}는 Hook으로 직접 호출됩니다:
|
|
75
|
+
- "${llmType}한테 물어봐" 키워드로 자동 호출
|
|
76
|
+
- import('@su-record/vibe/lib/${llmType}') 로 직접 사용 가능
|
|
77
|
+
|
|
78
|
+
비활성화: vibe remove ${llmType}
|
|
79
79
|
`);
|
|
80
80
|
}
|
|
81
81
|
/**
|
|
@@ -107,11 +107,11 @@ export function removeExternalLLM(llmType) {
|
|
|
107
107
|
* GPT OAuth 인증
|
|
108
108
|
*/
|
|
109
109
|
export async function gptAuth() {
|
|
110
|
-
console.log(`
|
|
111
|
-
🔐 GPT Plus/Pro 인증 (OAuth)
|
|
112
|
-
|
|
113
|
-
ChatGPT Plus 또는 Pro 구독이 있으면 Codex API를 사용할 수 있습니다.
|
|
114
|
-
브라우저에서 OpenAI 계정으로 로그인하세요.
|
|
110
|
+
console.log(`
|
|
111
|
+
🔐 GPT Plus/Pro 인증 (OAuth)
|
|
112
|
+
|
|
113
|
+
ChatGPT Plus 또는 Pro 구독이 있으면 Codex API를 사용할 수 있습니다.
|
|
114
|
+
브라우저에서 OpenAI 계정으로 로그인하세요.
|
|
115
115
|
`);
|
|
116
116
|
try {
|
|
117
117
|
const gptOAuthPath = path.join(__dirname, '../lib/gpt-oauth.js');
|
|
@@ -127,17 +127,17 @@ ChatGPT Plus 또는 Pro 구독이 있으면 Codex API를 사용할 수 있습니
|
|
|
127
127
|
expires: tokens.expires,
|
|
128
128
|
accountId: tokens.accountId,
|
|
129
129
|
});
|
|
130
|
-
console.log(`
|
|
131
|
-
✅ GPT 인증 완료!
|
|
132
|
-
|
|
133
|
-
계정: ${tokens.email}
|
|
134
|
-
계정 ID: ${tokens.accountId || '(자동 감지)'}
|
|
135
|
-
|
|
136
|
-
⚠️ 참고: ChatGPT Plus/Pro 구독이 있어야 API 호출이 가능합니다.
|
|
137
|
-
구독이 없으면 인증은 성공하지만 API 호출 시 오류가 발생합니다.
|
|
138
|
-
|
|
139
|
-
상태 확인: vibe status gpt
|
|
140
|
-
로그아웃: vibe logout gpt
|
|
130
|
+
console.log(`
|
|
131
|
+
✅ GPT 인증 완료!
|
|
132
|
+
|
|
133
|
+
계정: ${tokens.email}
|
|
134
|
+
계정 ID: ${tokens.accountId || '(자동 감지)'}
|
|
135
|
+
|
|
136
|
+
⚠️ 참고: ChatGPT Plus/Pro 구독이 있어야 API 호출이 가능합니다.
|
|
137
|
+
구독이 없으면 인증은 성공하지만 API 호출 시 오류가 발생합니다.
|
|
138
|
+
|
|
139
|
+
상태 확인: vibe status gpt
|
|
140
|
+
로그아웃: vibe logout gpt
|
|
141
141
|
`);
|
|
142
142
|
// config.json 업데이트
|
|
143
143
|
const projectRoot = process.cwd();
|
|
@@ -159,21 +159,21 @@ ChatGPT Plus 또는 Pro 구독이 있으면 Codex API를 사용할 수 있습니
|
|
|
159
159
|
}
|
|
160
160
|
catch { /* ignore: optional operation */ }
|
|
161
161
|
}
|
|
162
|
-
console.log(`
|
|
163
|
-
GPT는 Hook으로 직접 호출됩니다:
|
|
164
|
-
- "gpt한테 물어봐" 키워드로 자동 호출
|
|
165
|
-
- import('@su-record/vibe/lib/gpt') 로 직접 사용 가능
|
|
162
|
+
console.log(`
|
|
163
|
+
GPT는 Hook으로 직접 호출됩니다:
|
|
164
|
+
- "gpt한테 물어봐" 키워드로 자동 호출
|
|
165
|
+
- import('@su-record/vibe/lib/gpt') 로 직접 사용 가능
|
|
166
166
|
`);
|
|
167
167
|
process.exit(0);
|
|
168
168
|
}
|
|
169
169
|
catch (error) {
|
|
170
170
|
const message = error instanceof Error ? error.message : String(error);
|
|
171
|
-
console.error(`
|
|
172
|
-
❌ GPT 인증 실패
|
|
173
|
-
|
|
174
|
-
오류: ${message}
|
|
175
|
-
|
|
176
|
-
다시 시도하려면: vibe gpt --auth
|
|
171
|
+
console.error(`
|
|
172
|
+
❌ GPT 인증 실패
|
|
173
|
+
|
|
174
|
+
오류: ${message}
|
|
175
|
+
|
|
176
|
+
다시 시도하려면: vibe gpt --auth
|
|
177
177
|
`);
|
|
178
178
|
process.exit(1);
|
|
179
179
|
}
|
|
@@ -187,31 +187,31 @@ export function gptStatus() {
|
|
|
187
187
|
const storage = require(gptStoragePath);
|
|
188
188
|
const accounts = storage.getAllAccounts();
|
|
189
189
|
if (accounts.length === 0) {
|
|
190
|
-
console.log(`
|
|
191
|
-
📊 GPT 인증 상태
|
|
192
|
-
|
|
193
|
-
인증된 계정 없음
|
|
194
|
-
|
|
195
|
-
로그인: vibe gpt --auth
|
|
190
|
+
console.log(`
|
|
191
|
+
📊 GPT 인증 상태
|
|
192
|
+
|
|
193
|
+
인증된 계정 없음
|
|
194
|
+
|
|
195
|
+
로그인: vibe gpt --auth
|
|
196
196
|
`);
|
|
197
197
|
return;
|
|
198
198
|
}
|
|
199
199
|
const activeAccount = storage.getActiveAccount();
|
|
200
200
|
const isExpired = storage.isTokenExpired(activeAccount);
|
|
201
|
-
console.log(`
|
|
202
|
-
📊 GPT 인증 상태
|
|
203
|
-
|
|
204
|
-
활성 계정: ${activeAccount.email}
|
|
205
|
-
계정 ID: ${activeAccount.accountId || '(없음)'}
|
|
206
|
-
토큰 상태: ${isExpired ? '⚠️ 만료됨 (자동 갱신됨)' : '✅ 유효'}
|
|
207
|
-
마지막 사용: ${new Date(activeAccount.lastUsed).toLocaleString()}
|
|
208
|
-
|
|
209
|
-
등록된 계정 (${accounts.length}개):
|
|
210
|
-
${accounts.map((acc, i) => ` ${i === storage.loadAccounts()?.activeIndex ? '→' : ' '} ${acc.email}`).join('\n')}
|
|
211
|
-
|
|
212
|
-
⚠️ 참고: ChatGPT Plus/Pro 구독이 있어야 API 호출이 가능합니다.
|
|
213
|
-
|
|
214
|
-
로그아웃: vibe logout gpt
|
|
201
|
+
console.log(`
|
|
202
|
+
📊 GPT 인증 상태
|
|
203
|
+
|
|
204
|
+
활성 계정: ${activeAccount.email}
|
|
205
|
+
계정 ID: ${activeAccount.accountId || '(없음)'}
|
|
206
|
+
토큰 상태: ${isExpired ? '⚠️ 만료됨 (자동 갱신됨)' : '✅ 유효'}
|
|
207
|
+
마지막 사용: ${new Date(activeAccount.lastUsed).toLocaleString()}
|
|
208
|
+
|
|
209
|
+
등록된 계정 (${accounts.length}개):
|
|
210
|
+
${accounts.map((acc, i) => ` ${i === storage.loadAccounts()?.activeIndex ? '→' : ' '} ${acc.email}`).join('\n')}
|
|
211
|
+
|
|
212
|
+
⚠️ 참고: ChatGPT Plus/Pro 구독이 있어야 API 호출이 가능합니다.
|
|
213
|
+
|
|
214
|
+
로그아웃: vibe logout gpt
|
|
215
215
|
`);
|
|
216
216
|
}
|
|
217
217
|
catch (error) {
|
|
@@ -232,12 +232,12 @@ export function gptLogout() {
|
|
|
232
232
|
return;
|
|
233
233
|
}
|
|
234
234
|
storage.clearAccounts();
|
|
235
|
-
console.log(`
|
|
236
|
-
✅ GPT 로그아웃 완료
|
|
237
|
-
|
|
238
|
-
${activeAccount.email} 계정이 제거되었습니다.
|
|
239
|
-
|
|
240
|
-
다시 로그인: vibe gpt --auth
|
|
235
|
+
console.log(`
|
|
236
|
+
✅ GPT 로그아웃 완료
|
|
237
|
+
|
|
238
|
+
${activeAccount.email} 계정이 제거되었습니다.
|
|
239
|
+
|
|
240
|
+
다시 로그인: vibe gpt --auth
|
|
241
241
|
`);
|
|
242
242
|
// config.json 업데이트
|
|
243
243
|
const projectRoot = process.cwd();
|
|
@@ -268,11 +268,11 @@ ${activeAccount.email} 계정이 제거되었습니다.
|
|
|
268
268
|
* Gemini OAuth 인증
|
|
269
269
|
*/
|
|
270
270
|
export async function geminiAuth() {
|
|
271
|
-
console.log(`
|
|
272
|
-
🔐 Gemini 구독 인증 (OAuth)
|
|
273
|
-
|
|
274
|
-
Gemini Advanced 구독이 있으면 추가 비용 없이 사용할 수 있습니다.
|
|
275
|
-
브라우저에서 Google 계정으로 로그인하세요.
|
|
271
|
+
console.log(`
|
|
272
|
+
🔐 Gemini 구독 인증 (OAuth)
|
|
273
|
+
|
|
274
|
+
Gemini Advanced 구독이 있으면 추가 비용 없이 사용할 수 있습니다.
|
|
275
|
+
브라우저에서 Google 계정으로 로그인하세요.
|
|
276
276
|
`);
|
|
277
277
|
try {
|
|
278
278
|
const geminiOAuthPath = path.join(__dirname, '../lib/gemini-oauth.js');
|
|
@@ -287,20 +287,20 @@ Gemini Advanced 구독이 있으면 추가 비용 없이 사용할 수 있습니
|
|
|
287
287
|
expires: tokens.expires,
|
|
288
288
|
projectId: tokens.projectId,
|
|
289
289
|
});
|
|
290
|
-
console.log(`
|
|
291
|
-
✅ Gemini 인증 완료!
|
|
292
|
-
|
|
293
|
-
계정: ${tokens.email}
|
|
294
|
-
프로젝트: ${tokens.projectId || '(자동 감지)'}
|
|
295
|
-
|
|
296
|
-
사용 가능한 모델:
|
|
297
|
-
- Gemini 3 Flash (빠른 응답, 탐색/검색)
|
|
298
|
-
- Gemini 3 Pro (높은 정확도)
|
|
299
|
-
|
|
300
|
-
/vibe.run 실행 시 자동으로 Gemini가 보조 모델로 활용됩니다.
|
|
301
|
-
|
|
302
|
-
상태 확인: vibe status gemini
|
|
303
|
-
로그아웃: vibe logout gemini
|
|
290
|
+
console.log(`
|
|
291
|
+
✅ Gemini 인증 완료!
|
|
292
|
+
|
|
293
|
+
계정: ${tokens.email}
|
|
294
|
+
프로젝트: ${tokens.projectId || '(자동 감지)'}
|
|
295
|
+
|
|
296
|
+
사용 가능한 모델:
|
|
297
|
+
- Gemini 3 Flash (빠른 응답, 탐색/검색)
|
|
298
|
+
- Gemini 3 Pro (높은 정확도)
|
|
299
|
+
|
|
300
|
+
/vibe.run 실행 시 자동으로 Gemini가 보조 모델로 활용됩니다.
|
|
301
|
+
|
|
302
|
+
상태 확인: vibe status gemini
|
|
303
|
+
로그아웃: vibe logout gemini
|
|
304
304
|
`);
|
|
305
305
|
// config.json 업데이트
|
|
306
306
|
const projectRoot = process.cwd();
|
|
@@ -322,21 +322,21 @@ Gemini Advanced 구독이 있으면 추가 비용 없이 사용할 수 있습니
|
|
|
322
322
|
}
|
|
323
323
|
catch { /* ignore: optional operation */ }
|
|
324
324
|
}
|
|
325
|
-
console.log(`
|
|
326
|
-
Gemini는 Hook으로 직접 호출됩니다:
|
|
327
|
-
- "gemini한테 물어봐" 키워드로 자동 호출
|
|
328
|
-
- import('@su-record/vibe/lib/gemini') 로 직접 사용 가능
|
|
325
|
+
console.log(`
|
|
326
|
+
Gemini는 Hook으로 직접 호출됩니다:
|
|
327
|
+
- "gemini한테 물어봐" 키워드로 자동 호출
|
|
328
|
+
- import('@su-record/vibe/lib/gemini') 로 직접 사용 가능
|
|
329
329
|
`);
|
|
330
330
|
process.exit(0);
|
|
331
331
|
}
|
|
332
332
|
catch (error) {
|
|
333
333
|
const message = error instanceof Error ? error.message : String(error);
|
|
334
|
-
console.error(`
|
|
335
|
-
❌ Gemini 인증 실패
|
|
336
|
-
|
|
337
|
-
오류: ${message}
|
|
338
|
-
|
|
339
|
-
다시 시도하려면: vibe gemini --auth
|
|
334
|
+
console.error(`
|
|
335
|
+
❌ Gemini 인증 실패
|
|
336
|
+
|
|
337
|
+
오류: ${message}
|
|
338
|
+
|
|
339
|
+
다시 시도하려면: vibe gemini --auth
|
|
340
340
|
`);
|
|
341
341
|
process.exit(1);
|
|
342
342
|
}
|
|
@@ -352,32 +352,32 @@ export function geminiStatus() {
|
|
|
352
352
|
const { GEMINI_MODELS } = require(geminiApiPath);
|
|
353
353
|
const accounts = storage.getAllAccounts();
|
|
354
354
|
if (accounts.length === 0) {
|
|
355
|
-
console.log(`
|
|
356
|
-
📊 Gemini 인증 상태
|
|
357
|
-
|
|
358
|
-
인증된 계정 없음
|
|
359
|
-
|
|
360
|
-
로그인: vibe gemini --auth
|
|
355
|
+
console.log(`
|
|
356
|
+
📊 Gemini 인증 상태
|
|
357
|
+
|
|
358
|
+
인증된 계정 없음
|
|
359
|
+
|
|
360
|
+
로그인: vibe gemini --auth
|
|
361
361
|
`);
|
|
362
362
|
return;
|
|
363
363
|
}
|
|
364
364
|
const activeAccount = storage.getActiveAccount();
|
|
365
365
|
const isExpired = storage.isTokenExpired(activeAccount);
|
|
366
|
-
console.log(`
|
|
367
|
-
📊 Gemini 인증 상태
|
|
368
|
-
|
|
369
|
-
활성 계정: ${activeAccount.email}
|
|
370
|
-
프로젝트: ${activeAccount.projectId || '(자동)'}
|
|
371
|
-
토큰 상태: ${isExpired ? '⚠️ 만료됨 (자동 갱신됨)' : '✅ 유효'}
|
|
372
|
-
마지막 사용: ${new Date(activeAccount.lastUsed).toLocaleString()}
|
|
373
|
-
|
|
374
|
-
등록된 계정 (${accounts.length}개):
|
|
375
|
-
${accounts.map((acc, i) => ` ${i === storage.loadAccounts()?.activeIndex ? '→' : ' '} ${acc.email}`).join('\n')}
|
|
376
|
-
|
|
377
|
-
사용 가능한 모델:
|
|
378
|
-
${Object.entries(GEMINI_MODELS).map(([id, info]) => ` - ${id}: ${info.description}`).join('\n')}
|
|
379
|
-
|
|
380
|
-
로그아웃: vibe logout gemini
|
|
366
|
+
console.log(`
|
|
367
|
+
📊 Gemini 인증 상태
|
|
368
|
+
|
|
369
|
+
활성 계정: ${activeAccount.email}
|
|
370
|
+
프로젝트: ${activeAccount.projectId || '(자동)'}
|
|
371
|
+
토큰 상태: ${isExpired ? '⚠️ 만료됨 (자동 갱신됨)' : '✅ 유효'}
|
|
372
|
+
마지막 사용: ${new Date(activeAccount.lastUsed).toLocaleString()}
|
|
373
|
+
|
|
374
|
+
등록된 계정 (${accounts.length}개):
|
|
375
|
+
${accounts.map((acc, i) => ` ${i === storage.loadAccounts()?.activeIndex ? '→' : ' '} ${acc.email}`).join('\n')}
|
|
376
|
+
|
|
377
|
+
사용 가능한 모델:
|
|
378
|
+
${Object.entries(GEMINI_MODELS).map(([id, info]) => ` - ${id}: ${info.description}`).join('\n')}
|
|
379
|
+
|
|
380
|
+
로그아웃: vibe logout gemini
|
|
381
381
|
`);
|
|
382
382
|
}
|
|
383
383
|
catch (error) {
|
|
@@ -398,12 +398,12 @@ export function geminiLogout() {
|
|
|
398
398
|
return;
|
|
399
399
|
}
|
|
400
400
|
storage.clearAccounts();
|
|
401
|
-
console.log(`
|
|
402
|
-
✅ Gemini 로그아웃 완료
|
|
403
|
-
|
|
404
|
-
${activeAccount.email} 계정이 제거되었습니다.
|
|
405
|
-
|
|
406
|
-
다시 로그인: vibe gemini --auth
|
|
401
|
+
console.log(`
|
|
402
|
+
✅ Gemini 로그아웃 완료
|
|
403
|
+
|
|
404
|
+
${activeAccount.email} 계정이 제거되었습니다.
|
|
405
|
+
|
|
406
|
+
다시 로그인: vibe gemini --auth
|
|
407
407
|
`);
|
|
408
408
|
// config.json 업데이트
|
|
409
409
|
const projectRoot = process.cwd();
|
|
@@ -434,31 +434,31 @@ ${activeAccount.email} 계정이 제거되었습니다.
|
|
|
434
434
|
* 인증 도움말
|
|
435
435
|
*/
|
|
436
436
|
export function showAuthHelp() {
|
|
437
|
-
console.log(`
|
|
438
|
-
🔐 vibe auth - LLM 인증
|
|
439
|
-
|
|
440
|
-
사용법:
|
|
441
|
-
vibe auth gpt GPT Plus/Pro OAuth 인증
|
|
442
|
-
vibe auth gpt --key <key> GPT API 키로 설정
|
|
443
|
-
vibe auth gemini Gemini 구독 OAuth 인증 (권장)
|
|
444
|
-
vibe auth gemini --key <key> Gemini API 키로 설정
|
|
445
|
-
|
|
446
|
-
예시:
|
|
447
|
-
vibe auth gpt OpenAI 로그인 (Plus/Pro 구독 필요)
|
|
448
|
-
vibe auth gemini Google 로그인 (Gemini Advanced 구독 시 무료)
|
|
449
|
-
vibe auth gpt --key sk-xxx API 키로 설정 (사용량 과금)
|
|
437
|
+
console.log(`
|
|
438
|
+
🔐 vibe auth - LLM 인증
|
|
439
|
+
|
|
440
|
+
사용법:
|
|
441
|
+
vibe auth gpt GPT Plus/Pro OAuth 인증
|
|
442
|
+
vibe auth gpt --key <key> GPT API 키로 설정
|
|
443
|
+
vibe auth gemini Gemini 구독 OAuth 인증 (권장)
|
|
444
|
+
vibe auth gemini --key <key> Gemini API 키로 설정
|
|
445
|
+
|
|
446
|
+
예시:
|
|
447
|
+
vibe auth gpt OpenAI 로그인 (Plus/Pro 구독 필요)
|
|
448
|
+
vibe auth gemini Google 로그인 (Gemini Advanced 구독 시 무료)
|
|
449
|
+
vibe auth gpt --key sk-xxx API 키로 설정 (사용량 과금)
|
|
450
450
|
`);
|
|
451
451
|
}
|
|
452
452
|
/**
|
|
453
453
|
* 로그아웃 도움말
|
|
454
454
|
*/
|
|
455
455
|
export function showLogoutHelp() {
|
|
456
|
-
console.log(`
|
|
457
|
-
🚪 vibe logout - LLM 로그아웃
|
|
458
|
-
|
|
459
|
-
사용법:
|
|
460
|
-
vibe logout gpt GPT 로그아웃
|
|
461
|
-
vibe logout gemini Gemini 로그아웃
|
|
456
|
+
console.log(`
|
|
457
|
+
🚪 vibe logout - LLM 로그아웃
|
|
458
|
+
|
|
459
|
+
사용법:
|
|
460
|
+
vibe logout gpt GPT 로그아웃
|
|
461
|
+
vibe logout gemini Gemini 로그아웃
|
|
462
462
|
`);
|
|
463
463
|
}
|
|
464
464
|
//# sourceMappingURL=llm.js.map
|