@su-record/vibe 2.5.11 → 2.5.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. package/CLAUDE.md +243 -0
  2. package/LICENSE +21 -21
  3. package/README.md +262 -262
  4. package/agents/architect-low.md +41 -41
  5. package/agents/architect-medium.md +59 -59
  6. package/agents/architect.md +80 -80
  7. package/agents/build-error-resolver.md +115 -115
  8. package/agents/compounder.md +261 -261
  9. package/agents/diagrammer.md +178 -178
  10. package/agents/e2e-tester.md +266 -266
  11. package/agents/explorer-low.md +42 -42
  12. package/agents/explorer-medium.md +59 -59
  13. package/agents/explorer.md +48 -48
  14. package/agents/implementer-low.md +43 -43
  15. package/agents/implementer-medium.md +52 -52
  16. package/agents/implementer.md +54 -54
  17. package/agents/refactor-cleaner.md +143 -143
  18. package/agents/research/best-practices-agent.md +189 -189
  19. package/agents/research/codebase-patterns-agent.md +147 -147
  20. package/agents/research/framework-docs-agent.md +178 -178
  21. package/agents/research/security-advisory-agent.md +203 -203
  22. package/agents/review/architecture-reviewer.md +107 -107
  23. package/agents/review/complexity-reviewer.md +116 -116
  24. package/agents/review/data-integrity-reviewer.md +88 -88
  25. package/agents/review/git-history-reviewer.md +103 -103
  26. package/agents/review/performance-reviewer.md +86 -86
  27. package/agents/review/python-reviewer.md +150 -150
  28. package/agents/review/rails-reviewer.md +139 -139
  29. package/agents/review/react-reviewer.md +144 -144
  30. package/agents/review/security-reviewer.md +80 -80
  31. package/agents/review/simplicity-reviewer.md +140 -140
  32. package/agents/review/test-coverage-reviewer.md +116 -116
  33. package/agents/review/typescript-reviewer.md +127 -127
  34. package/agents/searcher.md +54 -54
  35. package/agents/simplifier.md +120 -120
  36. package/agents/tester.md +49 -49
  37. package/agents/ui-previewer.md +129 -129
  38. package/commands/vibe.analyze.md +356 -356
  39. package/commands/vibe.reason.md +329 -329
  40. package/commands/vibe.review.md +326 -326
  41. package/commands/vibe.run.md +1117 -1051
  42. package/commands/vibe.spec.md +1058 -1058
  43. package/commands/vibe.utils.md +353 -296
  44. package/commands/vibe.verify.md +375 -375
  45. package/dist/cli/collaborator.js +52 -52
  46. package/dist/cli/detect.js +32 -32
  47. package/dist/cli/index.js +102 -102
  48. package/dist/cli/llm.js +144 -144
  49. package/dist/cli/mcp.d.ts +49 -0
  50. package/dist/cli/mcp.d.ts.map +1 -0
  51. package/dist/cli/mcp.js +169 -0
  52. package/dist/cli/mcp.js.map +1 -0
  53. package/dist/cli/postinstall.js +180 -2
  54. package/dist/cli/postinstall.js.map +1 -1
  55. package/dist/cli/setup/GlobalInstaller.d.ts +24 -0
  56. package/dist/cli/setup/GlobalInstaller.d.ts.map +1 -0
  57. package/dist/cli/setup/GlobalInstaller.js +130 -0
  58. package/dist/cli/setup/GlobalInstaller.js.map +1 -0
  59. package/dist/cli/setup/LanguageDetector.d.ts +16 -0
  60. package/dist/cli/setup/LanguageDetector.d.ts.map +1 -0
  61. package/dist/cli/setup/LanguageDetector.js +49 -0
  62. package/dist/cli/setup/LanguageDetector.js.map +1 -0
  63. package/dist/cli/setup/LegacyMigration.d.ts +25 -0
  64. package/dist/cli/setup/LegacyMigration.d.ts.map +1 -0
  65. package/dist/cli/setup/LegacyMigration.js +162 -0
  66. package/dist/cli/setup/LegacyMigration.js.map +1 -0
  67. package/dist/cli/setup/ProjectSetup.d.ts +30 -0
  68. package/dist/cli/setup/ProjectSetup.d.ts.map +1 -0
  69. package/dist/cli/setup/ProjectSetup.js +238 -0
  70. package/dist/cli/setup/ProjectSetup.js.map +1 -0
  71. package/dist/cli/setup/index.d.ts +14 -0
  72. package/dist/cli/setup/index.d.ts.map +1 -0
  73. package/dist/cli/setup/index.js +18 -0
  74. package/dist/cli/setup/index.js.map +1 -0
  75. package/dist/cli/setup.d.ts +10 -77
  76. package/dist/cli/setup.d.ts.map +1 -1
  77. package/dist/cli/setup.js +15 -592
  78. package/dist/cli/setup.js.map +1 -1
  79. package/dist/lib/DeepInit.d.ts +0 -2
  80. package/dist/lib/DeepInit.d.ts.map +1 -1
  81. package/dist/lib/DeepInit.js +24 -26
  82. package/dist/lib/DeepInit.js.map +1 -1
  83. package/dist/lib/IterationTracker.d.ts +0 -2
  84. package/dist/lib/IterationTracker.d.ts.map +1 -1
  85. package/dist/lib/IterationTracker.js +11 -13
  86. package/dist/lib/IterationTracker.js.map +1 -1
  87. package/dist/lib/ModelRouter.d.ts +0 -2
  88. package/dist/lib/ModelRouter.d.ts.map +1 -1
  89. package/dist/lib/ModelRouter.js +0 -2
  90. package/dist/lib/ModelRouter.js.map +1 -1
  91. package/dist/lib/OrchestrateWorkflow.d.ts +1 -3
  92. package/dist/lib/OrchestrateWorkflow.d.ts.map +1 -1
  93. package/dist/lib/OrchestrateWorkflow.js +1 -3
  94. package/dist/lib/OrchestrateWorkflow.js.map +1 -1
  95. package/dist/lib/PythonParser.js +108 -108
  96. package/dist/lib/SkillFrontmatter.d.ts +0 -2
  97. package/dist/lib/SkillFrontmatter.d.ts.map +1 -1
  98. package/dist/lib/SkillFrontmatter.js +28 -30
  99. package/dist/lib/SkillFrontmatter.js.map +1 -1
  100. package/dist/lib/SkillQualityGate.d.ts +0 -2
  101. package/dist/lib/SkillQualityGate.d.ts.map +1 -1
  102. package/dist/lib/SkillQualityGate.js +9 -11
  103. package/dist/lib/SkillQualityGate.js.map +1 -1
  104. package/dist/lib/SkillRepository.d.ts +117 -0
  105. package/dist/lib/SkillRepository.d.ts.map +1 -0
  106. package/dist/lib/SkillRepository.js +477 -0
  107. package/dist/lib/SkillRepository.js.map +1 -0
  108. package/dist/lib/UltraQA.d.ts +0 -2
  109. package/dist/lib/UltraQA.d.ts.map +1 -1
  110. package/dist/lib/UltraQA.js +77 -79
  111. package/dist/lib/UltraQA.js.map +1 -1
  112. package/dist/lib/gemini-mcp.d.ts +10 -0
  113. package/dist/lib/gemini-mcp.d.ts.map +1 -0
  114. package/dist/lib/gemini-mcp.js +353 -0
  115. package/dist/lib/gemini-mcp.js.map +1 -0
  116. package/dist/lib/gpt-api.js +4 -4
  117. package/dist/lib/gpt-mcp.d.ts +10 -0
  118. package/dist/lib/gpt-mcp.d.ts.map +1 -0
  119. package/dist/lib/gpt-mcp.js +352 -0
  120. package/dist/lib/gpt-mcp.js.map +1 -0
  121. package/dist/lib/llm/auth/ApiKeyManager.d.ts +21 -0
  122. package/dist/lib/llm/auth/ApiKeyManager.d.ts.map +1 -0
  123. package/dist/lib/llm/auth/ApiKeyManager.js +43 -0
  124. package/dist/lib/llm/auth/ApiKeyManager.js.map +1 -0
  125. package/dist/lib/llm/auth/ConfigManager.d.ts +29 -0
  126. package/dist/lib/llm/auth/ConfigManager.d.ts.map +1 -0
  127. package/dist/lib/llm/auth/ConfigManager.js +67 -0
  128. package/dist/lib/llm/auth/ConfigManager.js.map +1 -0
  129. package/dist/lib/llm/auth/index.d.ts +25 -0
  130. package/dist/lib/llm/auth/index.d.ts.map +1 -0
  131. package/dist/lib/llm/auth/index.js +83 -0
  132. package/dist/lib/llm/auth/index.js.map +1 -0
  133. package/dist/lib/llm/index.d.ts +10 -0
  134. package/dist/lib/llm/index.d.ts.map +1 -0
  135. package/dist/lib/llm/index.js +12 -0
  136. package/dist/lib/llm/index.js.map +1 -0
  137. package/dist/lib/llm/types.d.ts +96 -0
  138. package/dist/lib/llm/types.d.ts.map +1 -0
  139. package/dist/lib/llm/types.js +17 -0
  140. package/dist/lib/llm/types.js.map +1 -0
  141. package/dist/lib/llm/utils/index.d.ts +6 -0
  142. package/dist/lib/llm/utils/index.d.ts.map +1 -0
  143. package/dist/lib/llm/utils/index.js +6 -0
  144. package/dist/lib/llm/utils/index.js.map +1 -0
  145. package/dist/lib/llm/utils/retry.d.ts +25 -0
  146. package/dist/lib/llm/utils/retry.d.ts.map +1 -0
  147. package/dist/lib/llm/utils/retry.js +72 -0
  148. package/dist/lib/llm/utils/retry.js.map +1 -0
  149. package/dist/lib/llm/utils/stream.d.ts +13 -0
  150. package/dist/lib/llm/utils/stream.d.ts.map +1 -0
  151. package/dist/lib/llm/utils/stream.js +110 -0
  152. package/dist/lib/llm/utils/stream.js.map +1 -0
  153. package/dist/lib/memory/KnowledgeGraph.js +4 -4
  154. package/dist/lib/memory/MemorySearch.js +20 -20
  155. package/dist/lib/memory/MemoryStorage.js +64 -64
  156. package/dist/orchestrator/AgentExecutor.d.ts +23 -0
  157. package/dist/orchestrator/AgentExecutor.d.ts.map +1 -0
  158. package/dist/orchestrator/AgentExecutor.js +231 -0
  159. package/dist/orchestrator/AgentExecutor.js.map +1 -0
  160. package/dist/orchestrator/AgentManager.d.ts +73 -0
  161. package/dist/orchestrator/AgentManager.d.ts.map +1 -0
  162. package/dist/orchestrator/AgentManager.js +184 -0
  163. package/dist/orchestrator/AgentManager.js.map +1 -0
  164. package/dist/orchestrator/LLMCluster.d.ts +70 -0
  165. package/dist/orchestrator/LLMCluster.d.ts.map +1 -0
  166. package/dist/orchestrator/LLMCluster.js +91 -0
  167. package/dist/orchestrator/LLMCluster.js.map +1 -0
  168. package/dist/orchestrator/MultiLlmResearch.d.ts +27 -0
  169. package/dist/orchestrator/MultiLlmResearch.d.ts.map +1 -0
  170. package/dist/orchestrator/MultiLlmResearch.js +145 -0
  171. package/dist/orchestrator/MultiLlmResearch.js.map +1 -0
  172. package/dist/orchestrator/SessionStore.d.ts +41 -0
  173. package/dist/orchestrator/SessionStore.d.ts.map +1 -0
  174. package/dist/orchestrator/SessionStore.js +117 -0
  175. package/dist/orchestrator/SessionStore.js.map +1 -0
  176. package/dist/orchestrator/SmartRouter.d.ts +68 -0
  177. package/dist/orchestrator/SmartRouter.d.ts.map +1 -0
  178. package/dist/orchestrator/SmartRouter.js +256 -0
  179. package/dist/orchestrator/SmartRouter.js.map +1 -0
  180. package/dist/orchestrator/backgroundAgent.d.ts +10 -28
  181. package/dist/orchestrator/backgroundAgent.d.ts.map +1 -1
  182. package/dist/orchestrator/backgroundAgent.js +11 -346
  183. package/dist/orchestrator/backgroundAgent.js.map +1 -1
  184. package/dist/orchestrator/index.d.ts +3 -0
  185. package/dist/orchestrator/index.d.ts.map +1 -1
  186. package/dist/orchestrator/index.js +4 -0
  187. package/dist/orchestrator/index.js.map +1 -1
  188. package/dist/orchestrator/orchestrator.d.ts +19 -154
  189. package/dist/orchestrator/orchestrator.d.ts.map +1 -1
  190. package/dist/orchestrator/orchestrator.js +90 -514
  191. package/dist/orchestrator/orchestrator.js.map +1 -1
  192. package/dist/orchestrator/parallelResearch.d.ts +5 -12
  193. package/dist/orchestrator/parallelResearch.d.ts.map +1 -1
  194. package/dist/orchestrator/parallelResearch.js +10 -193
  195. package/dist/orchestrator/parallelResearch.js.map +1 -1
  196. package/dist/tools/analytics/getUsageAnalytics.d.ts +10 -0
  197. package/dist/tools/analytics/getUsageAnalytics.d.ts.map +1 -0
  198. package/dist/tools/analytics/getUsageAnalytics.js +246 -0
  199. package/dist/tools/analytics/getUsageAnalytics.js.map +1 -0
  200. package/dist/tools/analytics/index.d.ts +5 -0
  201. package/dist/tools/analytics/index.d.ts.map +1 -0
  202. package/dist/tools/analytics/index.js +5 -0
  203. package/dist/tools/analytics/index.js.map +1 -0
  204. package/dist/tools/convention/analyzeComplexity.test.js +115 -115
  205. package/dist/tools/convention/getCodingGuide.d.ts +7 -0
  206. package/dist/tools/convention/getCodingGuide.d.ts.map +1 -0
  207. package/dist/tools/convention/getCodingGuide.js +69 -0
  208. package/dist/tools/convention/getCodingGuide.js.map +1 -0
  209. package/dist/tools/convention/validateCodeQuality.test.js +104 -104
  210. package/dist/tools/index.d.ts +2 -0
  211. package/dist/tools/index.d.ts.map +1 -1
  212. package/dist/tools/index.js +2 -0
  213. package/dist/tools/index.js.map +1 -1
  214. package/dist/tools/planning/analyzeRequirements.d.ts +9 -0
  215. package/dist/tools/planning/analyzeRequirements.d.ts.map +1 -0
  216. package/dist/tools/planning/analyzeRequirements.js +171 -0
  217. package/dist/tools/planning/analyzeRequirements.js.map +1 -0
  218. package/dist/tools/planning/createUserStories.d.ts +9 -0
  219. package/dist/tools/planning/createUserStories.d.ts.map +1 -0
  220. package/dist/tools/planning/createUserStories.js +124 -0
  221. package/dist/tools/planning/createUserStories.js.map +1 -0
  222. package/dist/tools/planning/featureRoadmap.d.ts +10 -0
  223. package/dist/tools/planning/featureRoadmap.d.ts.map +1 -0
  224. package/dist/tools/planning/featureRoadmap.js +207 -0
  225. package/dist/tools/planning/featureRoadmap.js.map +1 -0
  226. package/dist/tools/planning/generatePrd.d.ts +11 -0
  227. package/dist/tools/planning/generatePrd.d.ts.map +1 -0
  228. package/dist/tools/planning/generatePrd.js +161 -0
  229. package/dist/tools/planning/generatePrd.js.map +1 -0
  230. package/dist/tools/planning/index.d.ts +8 -0
  231. package/dist/tools/planning/index.d.ts.map +1 -0
  232. package/dist/tools/planning/index.js +8 -0
  233. package/dist/tools/planning/index.js.map +1 -0
  234. package/dist/tools/prompt/analyzePrompt.d.ts +7 -0
  235. package/dist/tools/prompt/analyzePrompt.d.ts.map +1 -0
  236. package/dist/tools/prompt/analyzePrompt.js +150 -0
  237. package/dist/tools/prompt/analyzePrompt.js.map +1 -0
  238. package/dist/tools/prompt/enhancePrompt.d.ts +8 -0
  239. package/dist/tools/prompt/enhancePrompt.d.ts.map +1 -0
  240. package/dist/tools/prompt/enhancePrompt.js +110 -0
  241. package/dist/tools/prompt/enhancePrompt.js.map +1 -0
  242. package/dist/tools/prompt/enhancePromptGemini.d.ts +8 -0
  243. package/dist/tools/prompt/enhancePromptGemini.d.ts.map +1 -0
  244. package/dist/tools/prompt/enhancePromptGemini.js +332 -0
  245. package/dist/tools/prompt/enhancePromptGemini.js.map +1 -0
  246. package/dist/tools/prompt/index.d.ts +7 -0
  247. package/dist/tools/prompt/index.d.ts.map +1 -0
  248. package/dist/tools/prompt/index.js +7 -0
  249. package/dist/tools/prompt/index.js.map +1 -0
  250. package/dist/tools/reasoning/applyReasoningFramework.d.ts +8 -0
  251. package/dist/tools/reasoning/applyReasoningFramework.d.ts.map +1 -0
  252. package/dist/tools/reasoning/applyReasoningFramework.js +266 -0
  253. package/dist/tools/reasoning/applyReasoningFramework.js.map +1 -0
  254. package/dist/tools/reasoning/index.d.ts +5 -0
  255. package/dist/tools/reasoning/index.d.ts.map +1 -0
  256. package/dist/tools/reasoning/index.js +5 -0
  257. package/dist/tools/reasoning/index.js.map +1 -0
  258. package/dist/tools/thinking/analyzeProblem.d.ts +7 -0
  259. package/dist/tools/thinking/analyzeProblem.d.ts.map +1 -0
  260. package/dist/tools/thinking/analyzeProblem.js +55 -0
  261. package/dist/tools/thinking/analyzeProblem.js.map +1 -0
  262. package/dist/tools/thinking/breakDownProblem.d.ts +8 -0
  263. package/dist/tools/thinking/breakDownProblem.d.ts.map +1 -0
  264. package/dist/tools/thinking/breakDownProblem.js +145 -0
  265. package/dist/tools/thinking/breakDownProblem.js.map +1 -0
  266. package/dist/tools/thinking/createThinkingChain.d.ts +7 -0
  267. package/dist/tools/thinking/createThinkingChain.d.ts.map +1 -0
  268. package/dist/tools/thinking/createThinkingChain.js +44 -0
  269. package/dist/tools/thinking/createThinkingChain.js.map +1 -0
  270. package/dist/tools/thinking/formatAsPlan.d.ts +9 -0
  271. package/dist/tools/thinking/formatAsPlan.d.ts.map +1 -0
  272. package/dist/tools/thinking/formatAsPlan.js +78 -0
  273. package/dist/tools/thinking/formatAsPlan.js.map +1 -0
  274. package/dist/tools/thinking/index.d.ts +10 -0
  275. package/dist/tools/thinking/index.d.ts.map +1 -0
  276. package/dist/tools/thinking/index.js +10 -0
  277. package/dist/tools/thinking/index.js.map +1 -0
  278. package/dist/tools/thinking/stepByStepAnalysis.d.ts +8 -0
  279. package/dist/tools/thinking/stepByStepAnalysis.d.ts.map +1 -0
  280. package/dist/tools/thinking/stepByStepAnalysis.js +63 -0
  281. package/dist/tools/thinking/stepByStepAnalysis.js.map +1 -0
  282. package/dist/tools/thinking/thinkAloudProcess.d.ts +8 -0
  283. package/dist/tools/thinking/thinkAloudProcess.d.ts.map +1 -0
  284. package/dist/tools/thinking/thinkAloudProcess.js +80 -0
  285. package/dist/tools/thinking/thinkAloudProcess.js.map +1 -0
  286. package/hooks/hooks.json +222 -222
  287. package/hooks/scripts/code-check.js +22 -22
  288. package/hooks/scripts/code-review.js +22 -22
  289. package/hooks/scripts/complexity.js +22 -22
  290. package/hooks/scripts/compound.js +23 -23
  291. package/hooks/scripts/context-save.js +33 -33
  292. package/hooks/scripts/generate-brand-assets.js +472 -0
  293. package/hooks/scripts/hud-multiline.js +262 -264
  294. package/hooks/scripts/hud-status.js +291 -293
  295. package/hooks/scripts/keyword-detector.js +214 -216
  296. package/hooks/scripts/llm-orchestrate.js +171 -171
  297. package/hooks/scripts/post-edit.js +97 -97
  298. package/hooks/scripts/post-tool-verify.js +210 -212
  299. package/hooks/scripts/pre-tool-guard.js +125 -127
  300. package/hooks/scripts/recall.js +22 -22
  301. package/hooks/scripts/session-start.js +30 -30
  302. package/hooks/scripts/skill-injector.js +191 -193
  303. package/hooks/scripts/utils.js +97 -97
  304. package/languages/csharp-unity.md +515 -515
  305. package/languages/gdscript-godot.md +470 -470
  306. package/languages/ruby-rails.md +489 -489
  307. package/languages/typescript-angular.md +433 -433
  308. package/languages/typescript-astro.md +416 -416
  309. package/languages/typescript-electron.md +406 -406
  310. package/languages/typescript-nestjs.md +524 -524
  311. package/languages/typescript-svelte.md +407 -407
  312. package/languages/typescript-tauri.md +365 -365
  313. package/package.json +83 -83
  314. package/skills/brand-assets.md +141 -0
  315. package/skills/commerce-patterns.md +361 -0
  316. package/skills/context7-usage.md +102 -102
  317. package/skills/e2e-commerce.md +304 -0
  318. package/skills/frontend-design.md +92 -0
  319. package/skills/git-worktree.md +181 -181
  320. package/skills/parallel-research.md +77 -77
  321. package/skills/priority-todos.md +239 -239
  322. package/skills/seo-checklist.md +244 -0
  323. package/skills/tool-fallback.md +190 -190
  324. package/skills/vibe-capabilities.md +161 -161
  325. package/vibe/constitution.md +227 -227
  326. package/vibe/rules/core/communication-guide.md +98 -98
  327. package/vibe/rules/core/development-philosophy.md +52 -52
  328. package/vibe/rules/core/quick-start.md +102 -102
  329. package/vibe/rules/quality/bdd-contract-testing.md +393 -393
  330. package/vibe/rules/quality/checklist.md +276 -276
  331. package/vibe/rules/quality/testing-strategy.md +440 -440
  332. package/vibe/rules/standards/anti-patterns.md +541 -541
  333. package/vibe/rules/standards/code-structure.md +291 -291
  334. package/vibe/rules/standards/complexity-metrics.md +313 -313
  335. package/vibe/rules/standards/naming-conventions.md +198 -198
  336. package/vibe/setup.sh +31 -31
  337. package/vibe/templates/constitution-template.md +252 -252
  338. package/vibe/templates/contract-backend-template.md +526 -526
  339. package/vibe/templates/contract-frontend-template.md +599 -599
  340. package/vibe/templates/feature-template.md +96 -96
  341. package/vibe/templates/spec-template.md +221 -221
@@ -0,0 +1,352 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * vibe-gpt MCP Server
4
+ * GPT API를 MCP 도구로 제공하여 Claude Code에서 서브에이전트로 활용
5
+ *
6
+ * 사용법:
7
+ * claude mcp add vibe-gpt node /path/to/vibe/dist/lib/gpt-mcp.js -s user
8
+ */
9
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
10
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
11
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
12
+ // GPT API 모듈 로드
13
+ import * as gptApi from './gpt-api.js';
14
+ import * as gptStorage from './gpt-storage.js';
15
+ // MCP 서버 생성
16
+ const server = new Server({
17
+ name: 'vibe-gpt',
18
+ version: '1.0.0',
19
+ }, {
20
+ capabilities: {
21
+ tools: {},
22
+ },
23
+ });
24
+ // 도구 목록 정의
25
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
26
+ return {
27
+ tools: [
28
+ {
29
+ name: 'gpt_chat',
30
+ description: 'GPT-5.2 모델에 질문하기. 아키텍처 분석, 디버깅, 복잡한 문제 해결에 활용. 서브에이전트로 사용 가능.',
31
+ inputSchema: {
32
+ type: 'object',
33
+ properties: {
34
+ prompt: {
35
+ type: 'string',
36
+ description: '질문 또는 요청 내용',
37
+ },
38
+ model: {
39
+ type: 'string',
40
+ description: '사용할 모델 (gpt-5.2, gpt-5.2-codex, gpt-5.1-codex, gpt-5.1-codex-mini, gpt-5.1-codex-max)',
41
+ default: 'gpt-5.2',
42
+ },
43
+ systemPrompt: {
44
+ type: 'string',
45
+ description: '시스템 프롬프트 (선택)',
46
+ },
47
+ maxTokens: {
48
+ type: 'number',
49
+ description: '최대 토큰 수',
50
+ default: 4096,
51
+ },
52
+ temperature: {
53
+ type: 'number',
54
+ description: '온도 (0-1)',
55
+ default: 0.7,
56
+ },
57
+ },
58
+ required: ['prompt'],
59
+ },
60
+ },
61
+ {
62
+ name: 'gpt_analyze_architecture',
63
+ description: '아키텍처 분석 요청. GPT-5.2가 코드 구조와 설계를 분석하고 개선점을 제안.',
64
+ inputSchema: {
65
+ type: 'object',
66
+ properties: {
67
+ code: {
68
+ type: 'string',
69
+ description: '분석할 코드 또는 아키텍처 설명',
70
+ },
71
+ context: {
72
+ type: 'string',
73
+ description: '프로젝트 컨텍스트 (선택)',
74
+ },
75
+ },
76
+ required: ['code'],
77
+ },
78
+ },
79
+ {
80
+ name: 'gpt_debug',
81
+ description: '디버깅 요청. GPT-5.2 Codex가 버그를 찾고 수정 방법을 제안.',
82
+ inputSchema: {
83
+ type: 'object',
84
+ properties: {
85
+ code: {
86
+ type: 'string',
87
+ description: '디버깅할 코드',
88
+ },
89
+ error: {
90
+ type: 'string',
91
+ description: '에러 메시지 또는 증상 (선택)',
92
+ },
93
+ language: {
94
+ type: 'string',
95
+ description: '프로그래밍 언어 (선택)',
96
+ },
97
+ },
98
+ required: ['code'],
99
+ },
100
+ },
101
+ {
102
+ name: 'gpt_quick_ask',
103
+ description: '빠른 질문. 간단한 질문에 최적화 (GPT-5.1 Codex Mini 사용).',
104
+ inputSchema: {
105
+ type: 'object',
106
+ properties: {
107
+ prompt: {
108
+ type: 'string',
109
+ description: '질문 내용',
110
+ },
111
+ },
112
+ required: ['prompt'],
113
+ },
114
+ },
115
+ {
116
+ name: 'gpt_auth_status',
117
+ description: 'GPT OAuth 인증 상태 확인',
118
+ inputSchema: {
119
+ type: 'object',
120
+ properties: {},
121
+ },
122
+ },
123
+ {
124
+ name: 'gpt_list_models',
125
+ description: '사용 가능한 GPT 모델 목록',
126
+ inputSchema: {
127
+ type: 'object',
128
+ properties: {},
129
+ },
130
+ },
131
+ ],
132
+ };
133
+ });
134
+ // 도구 실행 핸들러
135
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
136
+ const { name, arguments: args } = request.params;
137
+ try {
138
+ switch (name) {
139
+ case 'gpt_chat': {
140
+ const { prompt, model, systemPrompt, maxTokens, temperature } = args;
141
+ const result = await gptApi.chat({
142
+ model: model || 'gpt-5.2',
143
+ messages: [{ role: 'user', content: prompt }],
144
+ systemPrompt: systemPrompt || '',
145
+ maxTokens: maxTokens || 4096,
146
+ temperature: temperature || 0.7,
147
+ });
148
+ return {
149
+ content: [
150
+ {
151
+ type: 'text',
152
+ text: JSON.stringify({
153
+ response: result.content,
154
+ model: result.model,
155
+ }, null, 2),
156
+ },
157
+ ],
158
+ };
159
+ }
160
+ case 'gpt_analyze_architecture': {
161
+ const { code, context } = args;
162
+ const sysPrompt = `You are a senior software architect. Analyze the given code or architecture and provide detailed insights.
163
+
164
+ ${context ? `Project context: ${context}` : ''}
165
+
166
+ Respond in Korean and provide:
167
+ 1. 아키텍처 요약
168
+ 2. 강점
169
+ 3. 잠재적 문제점
170
+ 4. 개선 제안
171
+ 5. 확장성 평가`;
172
+ const result = await gptApi.chat({
173
+ model: 'gpt-5.2',
174
+ messages: [{ role: 'user', content: code }],
175
+ systemPrompt: sysPrompt,
176
+ maxTokens: 8192,
177
+ temperature: 0.5,
178
+ });
179
+ return {
180
+ content: [
181
+ {
182
+ type: 'text',
183
+ text: result.content,
184
+ },
185
+ ],
186
+ };
187
+ }
188
+ case 'gpt_debug': {
189
+ const { code, error, language } = args;
190
+ const sysPrompt = `You are an expert debugger. Analyze the given ${language || 'code'} and identify bugs.
191
+
192
+ ${error ? `Error/Symptom: ${error}` : ''}
193
+
194
+ Respond in Korean and provide:
195
+ 1. 버그 식별
196
+ 2. 원인 분석
197
+ 3. 수정된 코드
198
+ 4. 예방 방법`;
199
+ const result = await gptApi.chat({
200
+ model: 'gpt-5.2-codex',
201
+ messages: [{ role: 'user', content: code }],
202
+ systemPrompt: sysPrompt,
203
+ maxTokens: 4096,
204
+ temperature: 0.3,
205
+ });
206
+ return {
207
+ content: [
208
+ {
209
+ type: 'text',
210
+ text: result.content,
211
+ },
212
+ ],
213
+ };
214
+ }
215
+ case 'gpt_quick_ask': {
216
+ const { prompt } = args;
217
+ const response = await gptApi.quickAsk(prompt);
218
+ return {
219
+ content: [
220
+ {
221
+ type: 'text',
222
+ text: response,
223
+ },
224
+ ],
225
+ };
226
+ }
227
+ case 'gpt_auth_status': {
228
+ try {
229
+ const account = gptStorage.getActiveAccount();
230
+ if (account) {
231
+ const isExpired = gptStorage.isTokenExpired(account);
232
+ return {
233
+ content: [
234
+ {
235
+ type: 'text',
236
+ text: JSON.stringify({
237
+ authenticated: true,
238
+ email: account.email,
239
+ tokenValid: !isExpired,
240
+ expires: new Date(account.expires).toISOString(),
241
+ }, null, 2),
242
+ },
243
+ ],
244
+ };
245
+ }
246
+ else {
247
+ return {
248
+ content: [
249
+ {
250
+ type: 'text',
251
+ text: JSON.stringify({
252
+ authenticated: false,
253
+ message: 'vibe gpt --auth 명령으로 인증하세요.',
254
+ }, null, 2),
255
+ },
256
+ ],
257
+ };
258
+ }
259
+ }
260
+ catch (error) {
261
+ return {
262
+ content: [
263
+ {
264
+ type: 'text',
265
+ text: JSON.stringify({
266
+ authenticated: false,
267
+ error: error.message,
268
+ }, null, 2),
269
+ },
270
+ ],
271
+ };
272
+ }
273
+ }
274
+ case 'gpt_list_models': {
275
+ const models = gptApi.getAvailableModels();
276
+ return {
277
+ content: [
278
+ {
279
+ type: 'text',
280
+ text: JSON.stringify(models, null, 2),
281
+ },
282
+ ],
283
+ };
284
+ }
285
+ default:
286
+ return {
287
+ content: [
288
+ {
289
+ type: 'text',
290
+ text: `Unknown tool: ${name}`,
291
+ },
292
+ ],
293
+ isError: true,
294
+ };
295
+ }
296
+ }
297
+ catch (error) {
298
+ const errorMessage = error.message;
299
+ // 429 Rate Limit 또는 구독 에러 시 Claude fallback 안내
300
+ if (errorMessage.includes('429') || errorMessage.includes('plan_type') || errorMessage.includes('usage_not_included')) {
301
+ return {
302
+ content: [
303
+ {
304
+ type: 'text',
305
+ text: JSON.stringify({
306
+ status: 'fallback',
307
+ reason: 'subscription_required',
308
+ message: 'GPT API 접근 불가. ChatGPT Plus/Pro 구독이 필요합니다. Claude가 직접 처리해주세요.',
309
+ original_error: errorMessage,
310
+ }, null, 2),
311
+ },
312
+ ],
313
+ isError: false, // fallback은 에러가 아님
314
+ };
315
+ }
316
+ // 인증 에러 시 fallback 안내
317
+ if (errorMessage.includes('401') || errorMessage.includes('403') || errorMessage.includes('인증')) {
318
+ return {
319
+ content: [
320
+ {
321
+ type: 'text',
322
+ text: JSON.stringify({
323
+ status: 'fallback',
324
+ reason: 'auth_error',
325
+ message: 'GPT 인증 만료. Claude가 직접 처리해주세요. (vibe gpt --auth로 재인증 가능)',
326
+ original_error: errorMessage,
327
+ }, null, 2),
328
+ },
329
+ ],
330
+ isError: false,
331
+ };
332
+ }
333
+ // 기타 에러
334
+ return {
335
+ content: [
336
+ {
337
+ type: 'text',
338
+ text: `Error: ${errorMessage}`,
339
+ },
340
+ ],
341
+ isError: true,
342
+ };
343
+ }
344
+ });
345
+ // 서버 시작
346
+ async function main() {
347
+ const transport = new StdioServerTransport();
348
+ await server.connect(transport);
349
+ console.error('vibe-gpt MCP server running');
350
+ }
351
+ main().catch(console.error);
352
+ //# sourceMappingURL=gpt-mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gpt-mcp.js","sourceRoot":"","sources":["../../src/lib/gpt-mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * ApiKeyManager - API key storage and retrieval
3
+ */
4
+ import type { LLMProvider } from '../types.js';
5
+ /**
6
+ * Get API key from config file
7
+ */
8
+ export declare function getApiKey(provider: LLMProvider): string | null;
9
+ /**
10
+ * Save API key to config file
11
+ */
12
+ export declare function saveApiKey(provider: LLMProvider, apiKey: string): void;
13
+ /**
14
+ * Remove API key from config
15
+ */
16
+ export declare function removeApiKey(provider: LLMProvider): boolean;
17
+ /**
18
+ * Check if API key exists
19
+ */
20
+ export declare function hasApiKey(provider: LLMProvider): boolean;
21
+ //# sourceMappingURL=ApiKeyManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApiKeyManager.d.ts","sourceRoot":"","sources":["../../../../src/lib/llm/auth/ApiKeyManager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAQ/C;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAI9D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAQtE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAQ3D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAExD"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * ApiKeyManager - API key storage and retrieval
3
+ */
4
+ import { getProviderConfigPath, readJsonConfig, writeJsonConfig, ensureConfigDir } from './ConfigManager.js';
5
+ /**
6
+ * Get API key from config file
7
+ */
8
+ export function getApiKey(provider) {
9
+ const configPath = getProviderConfigPath(provider);
10
+ const config = readJsonConfig(configPath);
11
+ return config?.apiKey || null;
12
+ }
13
+ /**
14
+ * Save API key to config file
15
+ */
16
+ export function saveApiKey(provider, apiKey) {
17
+ ensureConfigDir();
18
+ const configPath = getProviderConfigPath(provider);
19
+ const config = {
20
+ apiKey,
21
+ createdAt: new Date().toISOString(),
22
+ };
23
+ writeJsonConfig(configPath, config);
24
+ }
25
+ /**
26
+ * Remove API key from config
27
+ */
28
+ export function removeApiKey(provider) {
29
+ const configPath = getProviderConfigPath(provider);
30
+ const config = readJsonConfig(configPath);
31
+ if (config?.apiKey) {
32
+ writeJsonConfig(configPath, {});
33
+ return true;
34
+ }
35
+ return false;
36
+ }
37
+ /**
38
+ * Check if API key exists
39
+ */
40
+ export function hasApiKey(provider) {
41
+ return getApiKey(provider) !== null;
42
+ }
43
+ //# sourceMappingURL=ApiKeyManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApiKeyManager.js","sourceRoot":"","sources":["../../../../src/lib/llm/auth/ApiKeyManager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAO7G;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,QAAqB;IAC7C,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,cAAc,CAAe,UAAU,CAAC,CAAC;IACxD,OAAO,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,QAAqB,EAAE,MAAc;IAC9D,eAAe,EAAE,CAAC;IAClB,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,MAAM,GAAiB;QAC3B,MAAM;QACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IACF,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAqB;IAChD,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,cAAc,CAAe,UAAU,CAAC,CAAC;IACxD,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;QACnB,eAAe,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,QAAqB;IAC7C,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;AACtC,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * ConfigManager - Centralized configuration directory management
3
+ */
4
+ import type { LLMProvider } from '../types.js';
5
+ /**
6
+ * Get the global vibe configuration directory
7
+ */
8
+ export declare function getGlobalConfigDir(): string;
9
+ /**
10
+ * Get the provider-specific config file path
11
+ */
12
+ export declare function getProviderConfigPath(provider: LLMProvider): string;
13
+ /**
14
+ * Get the provider-specific OAuth token path
15
+ */
16
+ export declare function getOAuthTokenPath(provider: LLMProvider): string;
17
+ /**
18
+ * Ensure the config directory exists
19
+ */
20
+ export declare function ensureConfigDir(): void;
21
+ /**
22
+ * Read JSON config file safely
23
+ */
24
+ export declare function readJsonConfig<T>(filePath: string): T | null;
25
+ /**
26
+ * Write JSON config file
27
+ */
28
+ export declare function writeJsonConfig<T>(filePath: string, data: T): void;
29
+ //# sourceMappingURL=ConfigManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigManager.d.ts","sourceRoot":"","sources":["../../../../src/lib/llm/auth/ConfigManager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAM3C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,CAInE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,CAI/D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAKtC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAU5D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAMlE"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * ConfigManager - Centralized configuration directory management
3
+ */
4
+ import fs from 'fs';
5
+ import path from 'path';
6
+ import os from 'os';
7
+ /**
8
+ * Get the global vibe configuration directory
9
+ */
10
+ export function getGlobalConfigDir() {
11
+ const homeDir = os.homedir();
12
+ if (process.platform === 'win32') {
13
+ return path.join(process.env.APPDATA || path.join(homeDir, 'AppData', 'Roaming'), 'vibe');
14
+ }
15
+ return path.join(homeDir, '.config', 'vibe');
16
+ }
17
+ /**
18
+ * Get the provider-specific config file path
19
+ */
20
+ export function getProviderConfigPath(provider) {
21
+ const configDir = getGlobalConfigDir();
22
+ const filename = provider === 'gpt' ? 'gpt-apikey.json' : 'gemini-apikey.json';
23
+ return path.join(configDir, filename);
24
+ }
25
+ /**
26
+ * Get the provider-specific OAuth token path
27
+ */
28
+ export function getOAuthTokenPath(provider) {
29
+ const configDir = getGlobalConfigDir();
30
+ const filename = provider === 'gpt' ? 'gpt' : 'gemini';
31
+ return path.join(configDir, filename, 'tokens.json');
32
+ }
33
+ /**
34
+ * Ensure the config directory exists
35
+ */
36
+ export function ensureConfigDir() {
37
+ const configDir = getGlobalConfigDir();
38
+ if (!fs.existsSync(configDir)) {
39
+ fs.mkdirSync(configDir, { recursive: true });
40
+ }
41
+ }
42
+ /**
43
+ * Read JSON config file safely
44
+ */
45
+ export function readJsonConfig(filePath) {
46
+ try {
47
+ if (!fs.existsSync(filePath)) {
48
+ return null;
49
+ }
50
+ const content = fs.readFileSync(filePath, 'utf-8');
51
+ return JSON.parse(content);
52
+ }
53
+ catch {
54
+ return null;
55
+ }
56
+ }
57
+ /**
58
+ * Write JSON config file
59
+ */
60
+ export function writeJsonConfig(filePath, data) {
61
+ const dir = path.dirname(filePath);
62
+ if (!fs.existsSync(dir)) {
63
+ fs.mkdirSync(dir, { recursive: true });
64
+ }
65
+ fs.writeFileSync(filePath, JSON.stringify(data, null, 2));
66
+ }
67
+ //# sourceMappingURL=ConfigManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigManager.js","sourceRoot":"","sources":["../../../../src/lib/llm/auth/ConfigManager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAGpB;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAqB;IACzD,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAC/E,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAqB;IACrD,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IACvD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAI,QAAgB;IAChD,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAI,QAAgB,EAAE,IAAO;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * LLM Auth Module - Centralized authentication management
3
+ */
4
+ export * from './ConfigManager.js';
5
+ export * from './ApiKeyManager.js';
6
+ import type { AuthInfo, LLMProvider } from '../types.js';
7
+ /**
8
+ * Get authentication info for a provider
9
+ * Prioritizes OAuth over API key
10
+ */
11
+ export declare function getAuthInfo(provider: LLMProvider, getValidAccessToken?: () => Promise<{
12
+ accessToken: string;
13
+ email?: string;
14
+ projectId?: string;
15
+ } | null>): Promise<AuthInfo>;
16
+ /**
17
+ * Check if a provider has any authentication configured
18
+ */
19
+ export declare function hasAuth(provider: LLMProvider): boolean;
20
+ /**
21
+ * Remove email from config if no valid token exists
22
+ * Used for cleanup after token expiration
23
+ */
24
+ export declare function removeEmailFromConfigIfNoToken(provider: LLMProvider): void;
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/llm/auth/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AAEnC,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAYzD;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,WAAW,EACrB,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,GACtG,OAAO,CAAC,QAAQ,CAAC,CA4CnB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAWtD;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,CAW1E"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * LLM Auth Module - Centralized authentication management
3
+ */
4
+ export * from './ConfigManager.js';
5
+ export * from './ApiKeyManager.js';
6
+ import { getApiKey } from './ApiKeyManager.js';
7
+ import { getOAuthTokenPath, readJsonConfig } from './ConfigManager.js';
8
+ /**
9
+ * Get authentication info for a provider
10
+ * Prioritizes OAuth over API key
11
+ */
12
+ export async function getAuthInfo(provider, getValidAccessToken) {
13
+ // Try OAuth first if token getter is provided
14
+ if (getValidAccessToken) {
15
+ try {
16
+ const oauthResult = await getValidAccessToken();
17
+ if (oauthResult?.accessToken) {
18
+ return {
19
+ type: 'oauth',
20
+ accessToken: oauthResult.accessToken,
21
+ email: oauthResult.email,
22
+ projectId: oauthResult.projectId,
23
+ };
24
+ }
25
+ }
26
+ catch {
27
+ // Fall through to API key
28
+ }
29
+ }
30
+ // Check for stored OAuth tokens
31
+ const tokenPath = getOAuthTokenPath(provider);
32
+ const tokens = readJsonConfig(tokenPath);
33
+ if (tokens?.access_token && tokens.expires_at && tokens.expires_at > Date.now()) {
34
+ return {
35
+ type: 'oauth',
36
+ accessToken: tokens.access_token,
37
+ email: tokens.email,
38
+ projectId: tokens.projectId,
39
+ };
40
+ }
41
+ // Fall back to API key
42
+ const apiKey = getApiKey(provider);
43
+ if (apiKey) {
44
+ return {
45
+ type: 'apikey',
46
+ apiKey,
47
+ };
48
+ }
49
+ // No auth available
50
+ const providerName = provider === 'gpt' ? 'GPT' : 'Gemini';
51
+ throw new Error(`${providerName} not configured. Run 'vibe ${provider} auth' to set up authentication.`);
52
+ }
53
+ /**
54
+ * Check if a provider has any authentication configured
55
+ */
56
+ export function hasAuth(provider) {
57
+ // Check API key
58
+ const apiKey = getApiKey(provider);
59
+ if (apiKey)
60
+ return true;
61
+ // Check OAuth tokens
62
+ const tokenPath = getOAuthTokenPath(provider);
63
+ const tokens = readJsonConfig(tokenPath);
64
+ if (tokens?.access_token || tokens?.refresh_token)
65
+ return true;
66
+ return false;
67
+ }
68
+ /**
69
+ * Remove email from config if no valid token exists
70
+ * Used for cleanup after token expiration
71
+ */
72
+ export function removeEmailFromConfigIfNoToken(provider) {
73
+ const tokenPath = getOAuthTokenPath(provider);
74
+ const tokens = readJsonConfig(tokenPath);
75
+ if (tokens && !tokens.access_token && !tokens.refresh_token) {
76
+ // Clear the tokens file but keep the directory
77
+ const { email, projectId, ...rest } = tokens;
78
+ if (Object.keys(rest).length === 0) {
79
+ // File is essentially empty, can be removed
80
+ }
81
+ }
82
+ }
83
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/llm/auth/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AAGnC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAUvE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAqB,EACrB,mBAAuG;IAEvG,8CAA8C;IAC9C,IAAI,mBAAmB,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,mBAAmB,EAAE,CAAC;YAChD,IAAI,WAAW,EAAE,WAAW,EAAE,CAAC;gBAC7B,OAAO;oBACL,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,WAAW,CAAC,WAAW;oBACpC,KAAK,EAAE,WAAW,CAAC,KAAK;oBACxB,SAAS,EAAE,WAAW,CAAC,SAAS;iBACjC,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,MAAM,SAAS,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,cAAc,CAAc,SAAS,CAAC,CAAC;IACtD,IAAI,MAAM,EAAE,YAAY,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAChF,OAAO;YACL,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,MAAM,CAAC,YAAY;YAChC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC;IACJ,CAAC;IAED,uBAAuB;IACvB,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,MAAM;SACP,CAAC;IACJ,CAAC;IAED,oBAAoB;IACpB,MAAM,YAAY,GAAG,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC3D,MAAM,IAAI,KAAK,CACb,GAAG,YAAY,8BAA8B,QAAQ,kCAAkC,CACxF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,QAAqB;IAC3C,gBAAgB;IAChB,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAExB,qBAAqB;IACrB,MAAM,SAAS,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,cAAc,CAAc,SAAS,CAAC,CAAC;IACtD,IAAI,MAAM,EAAE,YAAY,IAAI,MAAM,EAAE,aAAa;QAAE,OAAO,IAAI,CAAC;IAE/D,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,8BAA8B,CAAC,QAAqB;IAClE,MAAM,SAAS,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,cAAc,CAAc,SAAS,CAAC,CAAC;IAEtD,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QAC5D,+CAA+C;QAC/C,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;QAC7C,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,4CAA4C;QAC9C,CAAC;IACH,CAAC;AACH,CAAC"}