@su-record/vibe 2.4.6 → 2.4.7
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.local.json +28 -24
- package/README.md +32 -15
- package/dist/cli/auth.d.ts +13 -0
- package/dist/cli/auth.d.ts.map +1 -0
- package/dist/cli/auth.js +118 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/collaborator.d.ts +8 -0
- package/dist/cli/collaborator.d.ts.map +1 -0
- package/dist/cli/collaborator.js +136 -0
- package/dist/cli/collaborator.js.map +1 -0
- package/dist/cli/detect.d.ts +35 -0
- package/dist/cli/detect.d.ts.map +1 -0
- package/dist/cli/detect.js +376 -0
- package/dist/cli/detect.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +201 -2001
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/llm.d.ts +49 -0
- package/dist/cli/llm.d.ts.map +1 -0
- package/dist/cli/llm.js +464 -0
- package/dist/cli/llm.js.map +1 -0
- package/dist/cli/mcp.d.ts +49 -0
- package/dist/cli/mcp.d.ts.map +1 -0
- package/dist/cli/mcp.js +169 -0
- package/dist/cli/mcp.js.map +1 -0
- package/dist/cli/setup.d.ts +53 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +455 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/types.d.ts +83 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +5 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/utils.d.ts +40 -0
- package/dist/cli/utils.d.ts.map +1 -0
- package/dist/cli/utils.js +112 -0
- package/dist/cli/utils.js.map +1 -0
- package/dist/lib/MemoryManager.js +93 -93
- package/dist/lib/MemoryManager.js.map +1 -1
- package/dist/lib/ProjectCache.d.ts.map +1 -1
- package/dist/lib/ProjectCache.js +2 -1
- package/dist/lib/ProjectCache.js.map +1 -1
- package/dist/lib/PythonParser.js +109 -109
- package/dist/lib/PythonParser.js.map +1 -1
- package/dist/lib/constants.d.ts +31 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +36 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/gemini-api.d.ts.map +1 -1
- package/dist/lib/gemini-api.js +1 -6
- package/dist/lib/gemini-api.js.map +1 -1
- package/dist/lib/gemini-mcp.js +15 -15
- package/dist/lib/gemini-oauth.js +36 -36
- package/dist/lib/gemini-oauth.js.map +1 -1
- package/dist/lib/gpt-api.d.ts.map +1 -1
- package/dist/lib/gpt-api.js +6 -11
- package/dist/lib/gpt-api.js.map +1 -1
- package/dist/lib/gpt-mcp.js +17 -17
- package/dist/lib/gpt-oauth.js +45 -45
- package/dist/lib/gpt-oauth.js.map +1 -1
- package/dist/lib/utils.d.ts +21 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +51 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/orchestrator/agentDiscovery.d.ts.map +1 -1
- package/dist/orchestrator/agentDiscovery.js +3 -2
- package/dist/orchestrator/agentDiscovery.js.map +1 -1
- package/dist/orchestrator/backgroundAgent.d.ts.map +1 -1
- package/dist/orchestrator/backgroundAgent.js +4 -16
- package/dist/orchestrator/backgroundAgent.js.map +1 -1
- package/dist/orchestrator/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator/orchestrator.js +17 -15
- package/dist/orchestrator/orchestrator.js.map +1 -1
- package/dist/orchestrator/parallelResearch.d.ts.map +1 -1
- package/dist/orchestrator/parallelResearch.js +30 -44
- package/dist/orchestrator/parallelResearch.js.map +1 -1
- package/dist/orchestrator/types.d.ts +3 -2
- package/dist/orchestrator/types.d.ts.map +1 -1
- package/dist/tools/analytics/getUsageAnalytics.js +13 -13
- package/dist/tools/analytics/getUsageAnalytics.js.map +1 -1
- package/dist/tools/convention/getCodingGuide.js +2 -2
- package/dist/tools/convention/getCodingGuide.js.map +1 -1
- package/dist/tools/memory/createMemoryTimeline.js +11 -11
- package/dist/tools/memory/createMemoryTimeline.js.map +1 -1
- package/dist/tools/memory/getMemoryGraph.js +12 -12
- package/dist/tools/memory/getSessionContext.js +10 -10
- package/dist/tools/memory/getSessionContext.js.map +1 -1
- 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/restoreSessionContext.js +2 -2
- package/dist/tools/memory/restoreSessionContext.js.map +1 -1
- package/dist/tools/memory/saveMemory.js +4 -4
- package/dist/tools/memory/searchMemoriesAdvanced.js +23 -23
- package/dist/tools/memory/searchMemoriesAdvanced.js.map +1 -1
- package/dist/tools/memory/startSession.js +3 -3
- package/dist/tools/memory/startSession.js.map +1 -1
- 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/dist/tools/semantic/findReferences.d.ts.map +1 -1
- package/dist/tools/semantic/findReferences.js +2 -1
- package/dist/tools/semantic/findReferences.js.map +1 -1
- package/dist/tools/semantic/findSymbol.d.ts.map +1 -1
- package/dist/tools/semantic/findSymbol.js +2 -1
- package/dist/tools/semantic/findSymbol.js.map +1 -1
- package/hooks/hooks.json +10 -8
- package/package.json +4 -2
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* init/update 공통 설정 함수
|
|
3
|
+
*/
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import fs from 'fs';
|
|
6
|
+
import os from 'os';
|
|
7
|
+
import { fileURLToPath } from 'url';
|
|
8
|
+
import { log, ensureDir, copyDirRecursive, removeDirRecursive } from './utils.js';
|
|
9
|
+
import { registerMcp, unregisterMcp } from './mcp.js';
|
|
10
|
+
import { STACK_NAMES, getLanguageRulesContent } from './detect.js';
|
|
11
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
+
const __dirname = path.dirname(__filename);
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// MCP 서버 등록
|
|
15
|
+
// ============================================================================
|
|
16
|
+
/**
|
|
17
|
+
* MCP 서버 등록 (context7만 유지, GPT/Gemini는 Hook으로 대체)
|
|
18
|
+
*/
|
|
19
|
+
export function registerMcpServers(isUpdate = false) {
|
|
20
|
+
// 레거시 MCP 제거 (vibe, vibe-gemini, vibe-gpt)
|
|
21
|
+
unregisterMcp('vibe');
|
|
22
|
+
unregisterMcp('vibe-gemini');
|
|
23
|
+
unregisterMcp('vibe-gpt');
|
|
24
|
+
if (isUpdate) {
|
|
25
|
+
unregisterMcp('context7');
|
|
26
|
+
}
|
|
27
|
+
// context7 MCP만 등록 (라이브러리 문서 검색용)
|
|
28
|
+
try {
|
|
29
|
+
registerMcp('context7', { command: 'npx', args: ['-y', '@upstash/context7-mcp@latest'] });
|
|
30
|
+
log(isUpdate ? ' ✅ context7 MCP 전역 등록 완료\n' : ' ✅ Context7 MCP 등록 완료 (라이브러리 문서 검색)\n');
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
34
|
+
if (message.includes('already exists')) {
|
|
35
|
+
log(' ℹ️ Context7 MCP 이미 등록됨\n');
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
log(' ⚠️ Context7 MCP 수동 등록 필요\n');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
log(' ℹ️ GPT/Gemini는 Hook으로 직접 호출 (MCP 불필요)\n');
|
|
42
|
+
}
|
|
43
|
+
// ============================================================================
|
|
44
|
+
// constitution.md 생성/업데이트
|
|
45
|
+
// ============================================================================
|
|
46
|
+
/**
|
|
47
|
+
* constitution.md 생성 또는 업데이트
|
|
48
|
+
*/
|
|
49
|
+
export function updateConstitution(vibeDir, detectedStacks, stackDetails) {
|
|
50
|
+
const templatePath = path.join(__dirname, '../../templates/constitution-template.md');
|
|
51
|
+
const constitutionPath = path.join(vibeDir, 'constitution.md');
|
|
52
|
+
if (!fs.existsSync(templatePath))
|
|
53
|
+
return;
|
|
54
|
+
let constitution = fs.readFileSync(templatePath, 'utf-8');
|
|
55
|
+
const backendStack = detectedStacks.find(s => s.type.includes('python') || s.type.includes('node') ||
|
|
56
|
+
s.type.includes('go') || s.type.includes('java') || s.type.includes('rust'));
|
|
57
|
+
const frontendStack = detectedStacks.find(s => s.type.includes('react') || s.type.includes('vue') ||
|
|
58
|
+
s.type.includes('flutter') || s.type.includes('swift') || s.type.includes('android'));
|
|
59
|
+
if (backendStack && STACK_NAMES[backendStack.type]) {
|
|
60
|
+
const info = STACK_NAMES[backendStack.type];
|
|
61
|
+
constitution = constitution.replace('- Language: {Python 3.11+ / Node.js / etc.}', `- Language: ${info.lang}`);
|
|
62
|
+
constitution = constitution.replace('- Framework: {FastAPI / Express / etc.}', `- Framework: ${info.framework}`);
|
|
63
|
+
}
|
|
64
|
+
if (frontendStack && STACK_NAMES[frontendStack.type]) {
|
|
65
|
+
const info = STACK_NAMES[frontendStack.type];
|
|
66
|
+
constitution = constitution.replace('- Framework: {Flutter / React / etc.}', `- Framework: ${info.framework}`);
|
|
67
|
+
}
|
|
68
|
+
constitution = constitution.replace('- Database: {PostgreSQL / MongoDB / etc.}', stackDetails.databases.length > 0 ? `- Database: ${stackDetails.databases.join(', ')}` : '- Database: (프로젝트에 맞게 설정)');
|
|
69
|
+
constitution = constitution.replace('- State Management: {Provider / Redux / etc.}', stackDetails.stateManagement.length > 0 ? `- State Management: ${stackDetails.stateManagement.join(', ')}` : '- State Management: (프로젝트에 맞게 설정)');
|
|
70
|
+
constitution = constitution.replace('- Hosting: {Cloud Run / Vercel / etc.}', stackDetails.hosting.length > 0 ? `- Hosting: ${stackDetails.hosting.join(', ')}` : '- Hosting: (프로젝트에 맞게 설정)');
|
|
71
|
+
constitution = constitution.replace('- CI/CD: {GitHub Actions / etc.}', stackDetails.cicd.length > 0 ? `- CI/CD: ${stackDetails.cicd.join(', ')}` : '- CI/CD: (프로젝트에 맞게 설정)');
|
|
72
|
+
fs.writeFileSync(constitutionPath, constitution);
|
|
73
|
+
}
|
|
74
|
+
// ============================================================================
|
|
75
|
+
// CLAUDE.md 업데이트
|
|
76
|
+
// ============================================================================
|
|
77
|
+
/**
|
|
78
|
+
* CLAUDE.md 업데이트 (vibe 섹션 추가/교체)
|
|
79
|
+
*/
|
|
80
|
+
export function updateClaudeMd(projectRoot, detectedStacks, isUpdate = false) {
|
|
81
|
+
const vibeClaudeMd = path.join(__dirname, '../../CLAUDE.md');
|
|
82
|
+
const projectClaudeMd = path.join(projectRoot, 'CLAUDE.md');
|
|
83
|
+
if (!fs.existsSync(vibeClaudeMd))
|
|
84
|
+
return;
|
|
85
|
+
let vibeContent = fs.readFileSync(vibeClaudeMd, 'utf-8');
|
|
86
|
+
// 감지된 기술 스택에 따라 언어별 규칙 추가
|
|
87
|
+
const languageRules = getLanguageRulesContent(detectedStacks);
|
|
88
|
+
if (languageRules) {
|
|
89
|
+
vibeContent = vibeContent.replace('### 에러 처리 필수', languageRules + '\n\n### 에러 처리 필수');
|
|
90
|
+
}
|
|
91
|
+
if (fs.existsSync(projectClaudeMd)) {
|
|
92
|
+
const existingContent = fs.readFileSync(projectClaudeMd, 'utf-8');
|
|
93
|
+
if (isUpdate) {
|
|
94
|
+
// update: vibe 섹션 찾아서 교체
|
|
95
|
+
const vibeStartMarker = '# VIBE';
|
|
96
|
+
const sectionSeparator = '\n---\n';
|
|
97
|
+
if (existingContent.includes(vibeStartMarker)) {
|
|
98
|
+
const vibeStartIdx = existingContent.indexOf(vibeStartMarker);
|
|
99
|
+
const beforeVibe = existingContent.substring(0, vibeStartIdx).trimEnd();
|
|
100
|
+
const afterVibeStart = existingContent.substring(vibeStartIdx);
|
|
101
|
+
const nextSeparatorIdx = afterVibeStart.indexOf(sectionSeparator);
|
|
102
|
+
let afterVibe = '';
|
|
103
|
+
if (nextSeparatorIdx !== -1) {
|
|
104
|
+
afterVibe = afterVibeStart.substring(nextSeparatorIdx);
|
|
105
|
+
}
|
|
106
|
+
const newContent = beforeVibe + (beforeVibe ? '\n\n---\n\n' : '') + vibeContent + afterVibe;
|
|
107
|
+
fs.writeFileSync(projectClaudeMd, newContent);
|
|
108
|
+
log(' ✅ CLAUDE.md vibe 섹션 업데이트 완료\n');
|
|
109
|
+
}
|
|
110
|
+
else if (!existingContent.includes('/vibe.spec')) {
|
|
111
|
+
const mergedContent = existingContent.trim() + '\n\n---\n\n' + vibeContent;
|
|
112
|
+
fs.writeFileSync(projectClaudeMd, mergedContent);
|
|
113
|
+
log(' ✅ CLAUDE.md에 vibe 섹션 추가\n');
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
log(' ℹ️ CLAUDE.md vibe 섹션 유지\n');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
// init: 없으면 추가
|
|
121
|
+
if (!existingContent.includes('/vibe.spec')) {
|
|
122
|
+
const mergedContent = existingContent.trim() + '\n\n---\n\n' + vibeContent;
|
|
123
|
+
fs.writeFileSync(projectClaudeMd, mergedContent);
|
|
124
|
+
log(' ✅ CLAUDE.md에 vibe 섹션 추가\n');
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
log(' ℹ️ CLAUDE.md에 vibe 섹션 이미 존재\n');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
fs.writeFileSync(projectClaudeMd, vibeContent);
|
|
133
|
+
log(' ✅ CLAUDE.md 생성\n');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// ============================================================================
|
|
137
|
+
// 규칙 복사/업데이트
|
|
138
|
+
// ============================================================================
|
|
139
|
+
/**
|
|
140
|
+
* .claude/vibe/rules/ 복사 또는 업데이트
|
|
141
|
+
*/
|
|
142
|
+
export function updateRules(vibeDir, detectedStacks, isUpdate = false) {
|
|
143
|
+
const rulesSource = path.join(__dirname, '../../.claude/vibe/rules');
|
|
144
|
+
const rulesTarget = path.join(vibeDir, 'rules');
|
|
145
|
+
// core, quality, standards, tools 복사
|
|
146
|
+
const coreDirs = ['core', 'quality', 'standards', 'tools'];
|
|
147
|
+
coreDirs.forEach(dir => {
|
|
148
|
+
const src = path.join(rulesSource, dir);
|
|
149
|
+
const dst = path.join(rulesTarget, dir);
|
|
150
|
+
if (fs.existsSync(src)) {
|
|
151
|
+
copyDirRecursive(src, dst);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
// languages 폴더 처리
|
|
155
|
+
const langSource = path.join(rulesSource, 'languages');
|
|
156
|
+
const langTarget = path.join(rulesTarget, 'languages');
|
|
157
|
+
if (isUpdate && fs.existsSync(langTarget)) {
|
|
158
|
+
removeDirRecursive(langTarget);
|
|
159
|
+
}
|
|
160
|
+
ensureDir(langTarget);
|
|
161
|
+
// 감지된 스택 타입에 해당하는 언어 규칙만 복사
|
|
162
|
+
const detectedTypes = new Set(detectedStacks.map(s => s.type));
|
|
163
|
+
if (fs.existsSync(langSource)) {
|
|
164
|
+
const langFiles = fs.readdirSync(langSource);
|
|
165
|
+
langFiles.forEach(file => {
|
|
166
|
+
const langType = file.replace('.md', '');
|
|
167
|
+
if (detectedTypes.has(langType)) {
|
|
168
|
+
fs.copyFileSync(path.join(langSource, file), path.join(langTarget, file));
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
log(' ✅ 코딩 규칙 ' + (isUpdate ? '업데이트' : '설치') + ' 완료 (.claude/vibe/rules/)\n');
|
|
173
|
+
}
|
|
174
|
+
// ============================================================================
|
|
175
|
+
// 전역 assets 설치/업데이트
|
|
176
|
+
// ============================================================================
|
|
177
|
+
/**
|
|
178
|
+
* ~/.claude/ 전역 assets 설치 (commands, agents, skills, hooks)
|
|
179
|
+
*/
|
|
180
|
+
export function installGlobalAssets(isUpdate = false) {
|
|
181
|
+
const globalClaudeDir = path.join(os.homedir(), '.claude');
|
|
182
|
+
ensureDir(globalClaudeDir);
|
|
183
|
+
// commands
|
|
184
|
+
const globalCommandsDir = path.join(globalClaudeDir, 'commands');
|
|
185
|
+
ensureDir(globalCommandsDir);
|
|
186
|
+
const commandsSource = path.join(__dirname, '../../commands');
|
|
187
|
+
copyDirRecursive(commandsSource, globalCommandsDir);
|
|
188
|
+
log(' ✅ 슬래시 커맨드 ' + (isUpdate ? '업데이트' : '설치') + ' 완료 (~/.claude/commands/)\n');
|
|
189
|
+
// agents
|
|
190
|
+
const globalAgentsDir = path.join(globalClaudeDir, 'agents');
|
|
191
|
+
ensureDir(globalAgentsDir);
|
|
192
|
+
const agentsSource = path.join(__dirname, '../../agents');
|
|
193
|
+
copyDirRecursive(agentsSource, globalAgentsDir);
|
|
194
|
+
log(' ✅ 서브에이전트 ' + (isUpdate ? '업데이트' : '설치') + ' 완료 (~/.claude/agents/)\n');
|
|
195
|
+
// skills
|
|
196
|
+
const globalSkillsDir = path.join(globalClaudeDir, 'skills');
|
|
197
|
+
ensureDir(globalSkillsDir);
|
|
198
|
+
const skillsSource = path.join(__dirname, '../../skills');
|
|
199
|
+
if (fs.existsSync(skillsSource)) {
|
|
200
|
+
copyDirRecursive(skillsSource, globalSkillsDir);
|
|
201
|
+
log(' ✅ 스킬 ' + (isUpdate ? '업데이트' : '설치') + ' 완료 (~/.claude/skills/)\n');
|
|
202
|
+
}
|
|
203
|
+
// hooks
|
|
204
|
+
const globalSettingsPath = path.join(globalClaudeDir, 'settings.json');
|
|
205
|
+
const hooksTemplate = path.join(__dirname, '../../hooks/hooks.json');
|
|
206
|
+
if (fs.existsSync(hooksTemplate)) {
|
|
207
|
+
const vibeHooks = JSON.parse(fs.readFileSync(hooksTemplate, 'utf-8'));
|
|
208
|
+
if (fs.existsSync(globalSettingsPath)) {
|
|
209
|
+
const existingSettings = JSON.parse(fs.readFileSync(globalSettingsPath, 'utf-8'));
|
|
210
|
+
existingSettings.hooks = vibeHooks.hooks;
|
|
211
|
+
fs.writeFileSync(globalSettingsPath, JSON.stringify(existingSettings, null, 2));
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
fs.copyFileSync(hooksTemplate, globalSettingsPath);
|
|
215
|
+
}
|
|
216
|
+
log(' ✅ Hooks 설정 ' + (isUpdate ? '업데이트' : '설치') + ' 완료 (~/.claude/settings.json)\n');
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// ============================================================================
|
|
220
|
+
// 레거시 마이그레이션
|
|
221
|
+
// ============================================================================
|
|
222
|
+
/**
|
|
223
|
+
* .vibe/ → .claude/vibe/ 마이그레이션
|
|
224
|
+
*/
|
|
225
|
+
export function migrateLegacyVibe(projectRoot, vibeDir) {
|
|
226
|
+
const legacyVibeDir = path.join(projectRoot, '.vibe');
|
|
227
|
+
if (!fs.existsSync(legacyVibeDir))
|
|
228
|
+
return false;
|
|
229
|
+
log(' 🔄 레거시 .vibe/ 폴더 마이그레이션 중...\n');
|
|
230
|
+
ensureDir(vibeDir);
|
|
231
|
+
try {
|
|
232
|
+
const itemsToMigrate = ['specs', 'features', 'solutions', 'todos', 'memory', 'rules', 'config.json', 'constitution.md'];
|
|
233
|
+
itemsToMigrate.forEach(item => {
|
|
234
|
+
const src = path.join(legacyVibeDir, item);
|
|
235
|
+
const dst = path.join(vibeDir, item);
|
|
236
|
+
if (fs.existsSync(src) && !fs.existsSync(dst)) {
|
|
237
|
+
if (fs.statSync(src).isDirectory()) {
|
|
238
|
+
copyDirRecursive(src, dst);
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
fs.copyFileSync(src, dst);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
removeDirRecursive(legacyVibeDir);
|
|
246
|
+
log(' ✅ .vibe/ → .claude/vibe/ 마이그레이션 완료\n');
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
catch { /* ignore: optional operation */
|
|
250
|
+
log(' ⚠️ 마이그레이션 실패 - .vibe/ 폴더 수동 삭제 필요\n');
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// ============================================================================
|
|
255
|
+
// .gitignore 업데이트
|
|
256
|
+
// ============================================================================
|
|
257
|
+
/**
|
|
258
|
+
* .gitignore 업데이트 (vibe MCP 제외, settings.local.json 제거)
|
|
259
|
+
*/
|
|
260
|
+
export function updateGitignore(projectRoot) {
|
|
261
|
+
const gitignorePath = path.join(projectRoot, '.gitignore');
|
|
262
|
+
const mcpIgnore = '.claude/vibe/mcp/';
|
|
263
|
+
let gitignore = '';
|
|
264
|
+
if (fs.existsSync(gitignorePath)) {
|
|
265
|
+
gitignore = fs.readFileSync(gitignorePath, 'utf-8');
|
|
266
|
+
}
|
|
267
|
+
let modified = false;
|
|
268
|
+
// mcp 폴더 제외 추가
|
|
269
|
+
if (!gitignore.includes(mcpIgnore)) {
|
|
270
|
+
gitignore += `\n# vibe MCP\n${mcpIgnore}\n`;
|
|
271
|
+
modified = true;
|
|
272
|
+
}
|
|
273
|
+
// settings.local.json 제거
|
|
274
|
+
if (gitignore.includes('settings.local.json')) {
|
|
275
|
+
gitignore = gitignore.replace(/\.claude\/settings\.local\.json\n?/g, '');
|
|
276
|
+
gitignore = gitignore.replace(/settings\.local\.json\n?/g, '');
|
|
277
|
+
modified = true;
|
|
278
|
+
log(' ✅ .gitignore에서 settings.local.json 제거\n');
|
|
279
|
+
}
|
|
280
|
+
if (modified) {
|
|
281
|
+
fs.writeFileSync(gitignorePath, gitignore);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// ============================================================================
|
|
285
|
+
// config.json 생성/업데이트
|
|
286
|
+
// ============================================================================
|
|
287
|
+
/**
|
|
288
|
+
* config.json 생성 또는 업데이트
|
|
289
|
+
*/
|
|
290
|
+
export function updateConfig(vibeDir, detectedStacks, stackDetails, isUpdate = false) {
|
|
291
|
+
const configPath = path.join(vibeDir, 'config.json');
|
|
292
|
+
if (isUpdate && fs.existsSync(configPath)) {
|
|
293
|
+
try {
|
|
294
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
295
|
+
config.stacks = detectedStacks;
|
|
296
|
+
config.details = stackDetails;
|
|
297
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
298
|
+
}
|
|
299
|
+
catch { /* ignore: optional operation */ }
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
const config = {
|
|
303
|
+
language: 'ko',
|
|
304
|
+
quality: { strict: true, autoVerify: true },
|
|
305
|
+
stacks: detectedStacks,
|
|
306
|
+
details: stackDetails
|
|
307
|
+
};
|
|
308
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// ============================================================================
|
|
312
|
+
// 레거시 정리
|
|
313
|
+
// ============================================================================
|
|
314
|
+
/**
|
|
315
|
+
* 레거시 파일/폴더 정리
|
|
316
|
+
*/
|
|
317
|
+
export function cleanupLegacy(projectRoot, claudeDir) {
|
|
318
|
+
// .agent/rules/ 정리
|
|
319
|
+
const oldRulesDir = path.join(projectRoot, '.agent/rules');
|
|
320
|
+
const oldAgentDir = path.join(projectRoot, '.agent');
|
|
321
|
+
if (fs.existsSync(oldRulesDir)) {
|
|
322
|
+
log(' 🔄 마이그레이션: .agent/rules/ → .claude/vibe/rules/\n');
|
|
323
|
+
removeDirRecursive(oldRulesDir);
|
|
324
|
+
if (fs.existsSync(oldAgentDir) && fs.readdirSync(oldAgentDir).length === 0) {
|
|
325
|
+
fs.rmdirSync(oldAgentDir);
|
|
326
|
+
}
|
|
327
|
+
log(' ✅ 기존 .agent/rules/ 폴더 정리 완료\n');
|
|
328
|
+
}
|
|
329
|
+
// 레거시 커맨드 파일 정리
|
|
330
|
+
const commandsDir = path.join(claudeDir, 'commands');
|
|
331
|
+
if (fs.existsSync(commandsDir)) {
|
|
332
|
+
const legacyCommands = [
|
|
333
|
+
'vibe.analyze.md', 'vibe.compound.md', 'vibe.continue.md',
|
|
334
|
+
'vibe.diagram.md', 'vibe.e2e.md', 'vibe.reason.md',
|
|
335
|
+
'vibe.setup.md', 'vibe.ui.md'
|
|
336
|
+
];
|
|
337
|
+
legacyCommands.forEach(cmd => {
|
|
338
|
+
const cmdPath = path.join(commandsDir, cmd);
|
|
339
|
+
if (fs.existsSync(cmdPath)) {
|
|
340
|
+
fs.unlinkSync(cmdPath);
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
// 레거시 에이전트 파일 정리
|
|
345
|
+
const agentsDir = path.join(claudeDir, 'agents');
|
|
346
|
+
if (fs.existsSync(agentsDir)) {
|
|
347
|
+
const legacyAgents = ['reviewer.md', 'analyzer.md', 'reasoner.md'];
|
|
348
|
+
legacyAgents.forEach(agent => {
|
|
349
|
+
const agentPath = path.join(agentsDir, agent);
|
|
350
|
+
if (fs.existsSync(agentPath)) {
|
|
351
|
+
fs.unlinkSync(agentPath);
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
// 프로젝트 로컬 settings.json 제거 (전역으로 이동됨)
|
|
356
|
+
const localSettingsPath = path.join(claudeDir, 'settings.json');
|
|
357
|
+
if (fs.existsSync(localSettingsPath)) {
|
|
358
|
+
log(' 🧹 프로젝트 로컬 settings.json 제거 (전역으로 통합됨)...\n');
|
|
359
|
+
try {
|
|
360
|
+
fs.unlinkSync(localSettingsPath);
|
|
361
|
+
log(' ✅ .claude/settings.json 삭제 완료\n');
|
|
362
|
+
}
|
|
363
|
+
catch { /* ignore: optional operation */
|
|
364
|
+
log(' ⚠️ .claude/settings.json 수동 삭제 필요\n');
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* 프로젝트 로컬 설정/자산 제거 (전역으로 이동됨)
|
|
370
|
+
*/
|
|
371
|
+
export function removeLocalAssets(claudeDir) {
|
|
372
|
+
const localAssets = [
|
|
373
|
+
{ path: path.join(claudeDir, 'settings.json'), isDir: false },
|
|
374
|
+
{ path: path.join(claudeDir, 'settings.local.json'), isDir: false },
|
|
375
|
+
{ path: path.join(claudeDir, 'commands'), isDir: true },
|
|
376
|
+
{ path: path.join(claudeDir, 'agents'), isDir: true },
|
|
377
|
+
{ path: path.join(claudeDir, 'skills'), isDir: true },
|
|
378
|
+
];
|
|
379
|
+
localAssets.forEach(asset => {
|
|
380
|
+
if (fs.existsSync(asset.path)) {
|
|
381
|
+
if (asset.isDir) {
|
|
382
|
+
removeDirRecursive(asset.path);
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
fs.unlinkSync(asset.path);
|
|
386
|
+
}
|
|
387
|
+
const name = path.basename(asset.path);
|
|
388
|
+
log(` 🧹 프로젝트 로컬 ${name}${asset.isDir ? '/' : ''} 제거 (전역으로 이동)\n`);
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* ~/.claude.json 정리 (로컬 MCP 설정 제거)
|
|
394
|
+
*/
|
|
395
|
+
export function cleanupClaudeConfig() {
|
|
396
|
+
const claudeConfigPath = path.join(os.homedir(), '.claude.json');
|
|
397
|
+
if (!fs.existsSync(claudeConfigPath))
|
|
398
|
+
return;
|
|
399
|
+
try {
|
|
400
|
+
const claudeConfig = JSON.parse(fs.readFileSync(claudeConfigPath, 'utf-8'));
|
|
401
|
+
let configModified = false;
|
|
402
|
+
if (claudeConfig.projects) {
|
|
403
|
+
for (const [projectPath, projectConfig] of Object.entries(claudeConfig.projects)) {
|
|
404
|
+
if (projectConfig.mcpServers) {
|
|
405
|
+
if (projectConfig.mcpServers.vibe) {
|
|
406
|
+
const vibeArgs = projectConfig.mcpServers.vibe.args || [];
|
|
407
|
+
const isLocalPath = vibeArgs.some((arg) => arg.includes('.vibe/mcp/') || arg.includes('.vibe\\mcp\\'));
|
|
408
|
+
if (isLocalPath) {
|
|
409
|
+
delete projectConfig.mcpServers.vibe;
|
|
410
|
+
configModified = true;
|
|
411
|
+
log(` 🧹 ${projectPath}: 로컬 vibe MCP 제거\n`);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
if (projectConfig.mcpServers['vibe-gemini']) {
|
|
415
|
+
const geminiArgs = projectConfig.mcpServers['vibe-gemini'].args || [];
|
|
416
|
+
const isLocalPath = geminiArgs.some((arg) => arg.includes('.vibe/') || arg.includes('.vibe\\'));
|
|
417
|
+
if (isLocalPath) {
|
|
418
|
+
delete projectConfig.mcpServers['vibe-gemini'];
|
|
419
|
+
configModified = true;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
if (projectConfig.mcpServers.context7) {
|
|
423
|
+
delete projectConfig.mcpServers.context7;
|
|
424
|
+
configModified = true;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
if (configModified) {
|
|
430
|
+
fs.writeFileSync(claudeConfigPath, JSON.stringify(claudeConfig, null, 2));
|
|
431
|
+
log(' ✅ ~/.claude.json 로컬 MCP 설정 정리 완료\n');
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
catch (e) {
|
|
435
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
436
|
+
log(' ⚠️ ~/.claude.json 정리 실패: ' + message + '\n');
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* 레거시 mcp/ 폴더 정리
|
|
441
|
+
*/
|
|
442
|
+
export function cleanupLegacyMcp(vibeDir) {
|
|
443
|
+
const oldMcpDir = path.join(vibeDir, 'mcp');
|
|
444
|
+
if (fs.existsSync(oldMcpDir)) {
|
|
445
|
+
log(' 🧹 기존 mcp/ 폴더 정리 중...\n');
|
|
446
|
+
try {
|
|
447
|
+
removeDirRecursive(oldMcpDir);
|
|
448
|
+
log(' ✅ mcp/ 폴더 삭제 완료\n');
|
|
449
|
+
}
|
|
450
|
+
catch { /* ignore: optional operation */
|
|
451
|
+
log(' ⚠️ mcp/ 폴더 수동 삭제 필요\n');
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEnE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAQ,GAAG,KAAK;IACjD,2CAA2C;IAC3C,aAAa,CAAC,MAAM,CAAC,CAAC;IACtB,aAAa,CAAC,aAAa,CAAC,CAAC;IAC7B,aAAa,CAAC,UAAU,CAAC,CAAC;IAE1B,IAAI,QAAQ,EAAE,CAAC;QACb,aAAa,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;IAED,kCAAkC;IAClC,IAAI,CAAC;QACH,WAAW,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,8BAA8B,CAAC,EAAE,CAAC,CAAC;QAC1F,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,yCAAyC,CAAC,CAAC;IAC7F,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,gCAAgC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,GAAG,CAAC,6CAA6C,CAAC,CAAC;AACrD,CAAC;AAED,+EAA+E;AAC/E,0BAA0B;AAC1B,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAe,EACf,cAA2B,EAC3B,YAA0B;IAE1B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,0CAA0C,CAAC,CAAC;IACtF,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IAE/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO;IAEzC,IAAI,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAE1D,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC3C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACpD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAC5E,CAAC;IACF,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC5C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAClD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CACrF,CAAC;IAEF,IAAI,YAAY,IAAI,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC5C,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,6CAA6C,EAAE,eAAe,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/G,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,yCAAyC,EAAE,gBAAgB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACnH,CAAC;IAED,IAAI,aAAa,IAAI,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC7C,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,uCAAuC,EAAE,gBAAgB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACjH,CAAC;IAED,YAAY,GAAG,YAAY,CAAC,OAAO,CACjC,2CAA2C,EAC3C,YAAY,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,2BAA2B,CACrH,CAAC;IACF,YAAY,GAAG,YAAY,CAAC,OAAO,CACjC,+CAA+C,EAC/C,YAAY,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,uBAAuB,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,mCAAmC,CACjJ,CAAC;IACF,YAAY,GAAG,YAAY,CAAC,OAAO,CACjC,wCAAwC,EACxC,YAAY,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,0BAA0B,CAC/G,CAAC;IACF,YAAY,GAAG,YAAY,CAAC,OAAO,CACjC,kCAAkC,EAClC,YAAY,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,wBAAwB,CACrG,CAAC;IAEF,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;AACnD,CAAC;AAED,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,WAAmB,EACnB,cAA2B,EAC3B,QAAQ,GAAG,KAAK;IAEhB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAC7D,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAE5D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO;IAEzC,IAAI,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAEzD,0BAA0B;IAC1B,MAAM,aAAa,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAAC;IAC9D,IAAI,aAAa,EAAE,CAAC;QAClB,WAAW,GAAG,WAAW,CAAC,OAAO,CAC/B,cAAc,EACd,aAAa,GAAG,kBAAkB,CACnC,CAAC;IACJ,CAAC;IAED,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACnC,MAAM,eAAe,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAElE,IAAI,QAAQ,EAAE,CAAC;YACb,yBAAyB;YACzB,MAAM,eAAe,GAAG,QAAQ,CAAC;YACjC,MAAM,gBAAgB,GAAG,SAAS,CAAC;YAEnC,IAAI,eAAe,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC9C,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;gBAC9D,MAAM,UAAU,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC;gBACxE,MAAM,cAAc,GAAG,eAAe,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;gBAC/D,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;gBAElE,IAAI,SAAS,GAAG,EAAE,CAAC;gBACnB,IAAI,gBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC;oBAC5B,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;gBACzD,CAAC;gBAED,MAAM,UAAU,GAAG,UAAU,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,GAAG,SAAS,CAAC;gBAC5F,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;gBAC9C,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAC1C,CAAC;iBAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBACnD,MAAM,aAAa,GAAG,eAAe,CAAC,IAAI,EAAE,GAAG,aAAa,GAAG,WAAW,CAAC;gBAC3E,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;gBACjD,GAAG,CAAC,8BAA8B,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,+BAA+B,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,eAAe;YACf,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC5C,MAAM,aAAa,GAAG,eAAe,CAAC,IAAI,EAAE,GAAG,aAAa,GAAG,WAAW,CAAC;gBAC3E,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;gBACjD,GAAG,CAAC,8BAA8B,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,mCAAmC,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;QAC/C,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,cAA2B,EAAE,QAAQ,GAAG,KAAK;IACxF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,0BAA0B,CAAC,CAAC;IACrE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEhD,qCAAqC;IACrC,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3D,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACxC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,kBAAkB;IAClB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAEvD,IAAI,QAAQ,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1C,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACjC,CAAC;IACD,SAAS,CAAC,UAAU,CAAC,CAAC;IAEtB,4BAA4B;IAC5B,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAE/D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAC7C,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,GAAG,CAAC,aAAa,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,6BAA6B,CAAC,CAAC;AAClF,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAQ,GAAG,KAAK;IAClD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IAC3D,SAAS,CAAC,eAAe,CAAC,CAAC;IAE3B,WAAW;IACX,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IACjE,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAC7B,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAC9D,gBAAgB,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;IACpD,GAAG,CAAC,eAAe,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,6BAA6B,CAAC,CAAC;IAElF,SAAS;IACT,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IAC7D,SAAS,CAAC,eAAe,CAAC,CAAC;IAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC1D,gBAAgB,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAChD,GAAG,CAAC,cAAc,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,2BAA2B,CAAC,CAAC;IAE/E,SAAS;IACT,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IAC7D,SAAS,CAAC,eAAe,CAAC,CAAC;IAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,gBAAgB,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QAChD,GAAG,CAAC,UAAU,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,2BAA2B,CAAC,CAAC;IAC7E,CAAC;IAED,QAAQ;IACR,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;IACvE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC;IACrE,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;QACtE,IAAI,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACtC,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,CAAC;YAClF,gBAAgB,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;YACzC,EAAE,CAAC,aAAa,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAClF,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;QACrD,CAAC;QACD,GAAG,CAAC,gBAAgB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,iCAAiC,CAAC,CAAC;IACzF,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB,EAAE,OAAe;IACpE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAEtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,KAAK,CAAC;IAEhD,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACzC,SAAS,CAAC,OAAO,CAAC,CAAC;IAEnB,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,iBAAiB,CAAC,CAAC;QACxH,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACrC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9C,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;oBACnC,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACN,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QACH,kBAAkB,CAAC,aAAa,CAAC,CAAC;QAClC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC,CAAC,gCAAgC;QACxC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QAC/C,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,mBAAmB,CAAC;IAEtC,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACjC,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,eAAe;IACf,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,SAAS,IAAI,iBAAiB,SAAS,IAAI,CAAC;QAC5C,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,yBAAyB;IACzB,IAAI,SAAS,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAC9C,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,qCAAqC,EAAE,EAAE,CAAC,CAAC;QACzE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;QAC/D,QAAQ,GAAG,IAAI,CAAC;QAChB,GAAG,CAAC,4CAA4C,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,cAA2B,EAC3B,YAA0B,EAC1B,QAAQ,GAAG,KAAK;IAEhB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAErD,IAAI,QAAQ,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,MAAM,GAAe,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;YAC5E,MAAM,CAAC,MAAM,GAAG,cAAc,CAAC;YAC/B,MAAM,CAAC,OAAO,GAAG,YAAY,CAAC;YAC9B,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC,CAAC,gCAAgC,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAe;YACzB,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;YAC3C,MAAM,EAAE,cAAc;YACtB,OAAO,EAAE,YAAY;SACtB,CAAC;QACF,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB,EAAE,SAAiB;IAClE,mBAAmB;IACnB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACrD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,GAAG,CAAC,qDAAqD,CAAC,CAAC;QAC3D,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAChC,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3E,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;QACD,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAC1C,CAAC;IAED,gBAAgB;IAChB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACrD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,MAAM,cAAc,GAAG;YACrB,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB;YACzD,iBAAiB,EAAE,aAAa,EAAE,gBAAgB;YAClD,eAAe,EAAE,YAAY;SAC9B,CAAC;QACF,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YAC5C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB;IACjB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACjD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;QACnE,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,sCAAsC;IACtC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAChE,IAAI,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;YACjC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC,CAAC,gCAAgC;YACxC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,MAAM,WAAW,GAAG;QAClB,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE;QAC7D,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE;QACnE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;QACvD,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;QACrD,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;KACtD,CAAC;IAEF,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QAC1B,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,GAAG,CAAC,iBAAiB,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACvE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;IAEjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO;IAE7C,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5E,IAAI,cAAc,GAAG,KAAK,CAAC;QAE3B,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;YAC1B,KAAK,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAqE,EAAE,CAAC;gBACrJ,IAAI,aAAa,CAAC,UAAU,EAAE,CAAC;oBAC7B,IAAI,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;wBAClC,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;wBAC1D,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAChD,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAC3D,CAAC;wBACF,IAAI,WAAW,EAAE,CAAC;4BAChB,OAAO,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC;4BACrC,cAAc,GAAG,IAAI,CAAC;4BACtB,GAAG,CAAC,SAAS,WAAW,oBAAoB,CAAC,CAAC;wBAChD,CAAC;oBACH,CAAC;oBACD,IAAI,aAAa,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;wBAC5C,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;wBACtE,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAClD,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAClD,CAAC;wBACF,IAAI,WAAW,EAAE,CAAC;4BAChB,OAAO,aAAa,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;4BAC/C,cAAc,GAAG,IAAI,CAAC;wBACxB,CAAC;oBACH,CAAC;oBACD,IAAI,aAAa,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;wBACtC,OAAO,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC;wBACzC,cAAc,GAAG,IAAI,CAAC;oBACxB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1E,GAAG,CAAC,uCAAuC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3D,GAAG,CAAC,+BAA+B,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC5C,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAClC,IAAI,CAAC;YACH,kBAAkB,CAAC,SAAS,CAAC,CAAC;YAC9B,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC,CAAC,gCAAgC;YACxC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI 타입 정의
|
|
3
|
+
*/
|
|
4
|
+
export interface CliOptions {
|
|
5
|
+
silent: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface LLMAuthStatus {
|
|
8
|
+
type: 'oauth' | 'apikey';
|
|
9
|
+
email?: string;
|
|
10
|
+
valid: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface LLMStatusMap {
|
|
13
|
+
gpt: LLMAuthStatus | null;
|
|
14
|
+
gemini: LLMAuthStatus | null;
|
|
15
|
+
}
|
|
16
|
+
export interface DetectedStack {
|
|
17
|
+
type: string;
|
|
18
|
+
path: string;
|
|
19
|
+
}
|
|
20
|
+
export type TechStack = DetectedStack;
|
|
21
|
+
export interface StackDetails {
|
|
22
|
+
databases: string[];
|
|
23
|
+
stateManagement: string[];
|
|
24
|
+
hosting: string[];
|
|
25
|
+
cicd: string[];
|
|
26
|
+
}
|
|
27
|
+
export interface DetectionResult {
|
|
28
|
+
stacks: DetectedStack[];
|
|
29
|
+
details: StackDetails;
|
|
30
|
+
}
|
|
31
|
+
export interface ExternalLLMConfig {
|
|
32
|
+
name: string;
|
|
33
|
+
role: string;
|
|
34
|
+
description: string;
|
|
35
|
+
package: string;
|
|
36
|
+
envKey: string;
|
|
37
|
+
}
|
|
38
|
+
export interface VibeConfig {
|
|
39
|
+
language?: string;
|
|
40
|
+
quality?: {
|
|
41
|
+
strict: boolean;
|
|
42
|
+
autoVerify: boolean;
|
|
43
|
+
};
|
|
44
|
+
stacks?: DetectedStack[];
|
|
45
|
+
details?: StackDetails;
|
|
46
|
+
models?: {
|
|
47
|
+
gpt?: {
|
|
48
|
+
enabled: boolean;
|
|
49
|
+
authType?: string;
|
|
50
|
+
email?: string;
|
|
51
|
+
role?: string;
|
|
52
|
+
description?: string;
|
|
53
|
+
apiKey?: string;
|
|
54
|
+
};
|
|
55
|
+
gemini?: {
|
|
56
|
+
enabled: boolean;
|
|
57
|
+
authType?: string;
|
|
58
|
+
email?: string;
|
|
59
|
+
role?: string;
|
|
60
|
+
description?: string;
|
|
61
|
+
apiKey?: string;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export interface OAuthTokens {
|
|
66
|
+
email: string;
|
|
67
|
+
accessToken: string;
|
|
68
|
+
refreshToken: string;
|
|
69
|
+
idToken?: string;
|
|
70
|
+
expires: number;
|
|
71
|
+
accountId?: string;
|
|
72
|
+
projectId?: string;
|
|
73
|
+
}
|
|
74
|
+
export interface McpServerConfig {
|
|
75
|
+
command: string;
|
|
76
|
+
args: string[];
|
|
77
|
+
env?: Record<string, string>;
|
|
78
|
+
}
|
|
79
|
+
export interface ClaudeSettings {
|
|
80
|
+
mcpServers?: Record<string, McpServerConfig>;
|
|
81
|
+
[key: string]: unknown;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,aAAa,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAGD,MAAM,MAAM,SAAS,GAAG,aAAa,CAAC;AAEtC,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,OAAO,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAAC;IACnD,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,MAAM,CAAC,EAAE;QACP,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,OAAO,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACpH,MAAM,CAAC,EAAE;YAAE,OAAO,EAAE,OAAO,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACxH,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC7C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI 유틸리티 함수
|
|
3
|
+
*/
|
|
4
|
+
export declare function setSilentMode(silent: boolean): void;
|
|
5
|
+
/**
|
|
6
|
+
* 로그 출력 (silent 모드 지원)
|
|
7
|
+
*/
|
|
8
|
+
export declare function log(message: string): void;
|
|
9
|
+
/**
|
|
10
|
+
* 디렉토리 생성 (재귀)
|
|
11
|
+
*/
|
|
12
|
+
export declare function ensureDir(dir: string): void;
|
|
13
|
+
/**
|
|
14
|
+
* 디렉토리 내용 복사 (1단계만)
|
|
15
|
+
*/
|
|
16
|
+
export declare function copyDirContents(sourceDir: string, targetDir: string): void;
|
|
17
|
+
/**
|
|
18
|
+
* 디렉토리 재귀 복사
|
|
19
|
+
*/
|
|
20
|
+
export declare function copyDirRecursive(sourceDir: string, targetDir: string): void;
|
|
21
|
+
/**
|
|
22
|
+
* 디렉토리 재귀 삭제
|
|
23
|
+
*/
|
|
24
|
+
export declare function removeDirRecursive(dirPath: string): void;
|
|
25
|
+
/**
|
|
26
|
+
* package.json 읽기
|
|
27
|
+
*/
|
|
28
|
+
export declare function getPackageJson(): {
|
|
29
|
+
version: string;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* 버전 비교 (semver)
|
|
33
|
+
* @returns 1 if a > b, -1 if a < b, 0 if equal
|
|
34
|
+
*/
|
|
35
|
+
export declare function compareVersions(a: string, b: string): number;
|
|
36
|
+
/**
|
|
37
|
+
* __dirname 반환 (ESM 호환)
|
|
38
|
+
*/
|
|
39
|
+
export declare function getCliDir(): string;
|
|
40
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/cli/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAEnD;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAIzC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAI3C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAM1E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAe3E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAYxD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAOpD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAU5D;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC"}
|