@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
@@ -1,24 +1,18 @@
1
1
  /**
2
2
  * Orchestrator - 메인 오케스트레이터 클래스
3
3
  * /vibe.* 명령어에서 사용할 중앙 오케스트레이션 로직
4
+ *
5
+ * v2.6.0: SmartRouter, LLMCluster, AgentManager로 분리
4
6
  */
5
7
  import { promises as fs } from 'fs';
6
8
  import path from 'path';
7
- import { TASK_LLM_PRIORITY } from './types.js';
8
- import { discoverAgents, loadAgent, listAgentsByCategory } from './agentDiscovery.js';
9
- import { debugLog, errorLog, warnLog } from '../lib/utils.js';
10
- import { DEFAULT_MODELS } from '../lib/constants.js';
11
9
  import { parallelResearch, createResearchTasks, parallelResearchWithMultiLlm } from './parallelResearch.js';
12
- import { launchBackgroundAgent, getBackgroundAgentResult, cancelBackgroundAgent, listActiveSessions, getSessionHistory, launchParallelAgents } from './backgroundAgent.js';
13
10
  import { MemoryManager } from '../lib/MemoryManager.js';
14
- import * as gptApi from '../lib/gpt-api.js';
15
- import * as geminiApi from '../lib/gemini-api.js';
16
- // LLM 가용성 캐시 (5분 TTL)
17
- const LLM_CACHE_TTL = 5 * 60 * 1000;
18
- const llmAvailabilityCache = {
19
- gpt: { available: true, checkedAt: 0, errorCount: 0 },
20
- gemini: { available: true, checkedAt: 0, errorCount: 0 }
21
- };
11
+ import { debugLog, errorLog } from '../lib/utils.js';
12
+ // 분리된 모듈 임포트
13
+ import { SmartRouter } from './SmartRouter.js';
14
+ import { LLMCluster } from './LLMCluster.js';
15
+ import { AgentManager } from './AgentManager.js';
22
16
  /**
23
17
  * Vibe Orchestrator
24
18
  * 모든 /vibe.* 명령어의 오케스트레이션을 담당
@@ -26,6 +20,10 @@ const llmAvailabilityCache = {
26
20
  export class VibeOrchestrator {
27
21
  options;
28
22
  memoryManager;
23
+ // 분리된 컴포넌트
24
+ router;
25
+ llmCluster;
26
+ agentManager;
29
27
  constructor(options = {}) {
30
28
  this.options = {
31
29
  projectPath: process.cwd(),
@@ -35,295 +33,77 @@ export class VibeOrchestrator {
35
33
  ...options
36
34
  };
37
35
  this.memoryManager = MemoryManager.getInstance(this.options.projectPath);
36
+ // 컴포넌트 초기화
37
+ this.router = new SmartRouter({ verbose: this.options.verbose });
38
+ this.llmCluster = new LLMCluster();
39
+ this.agentManager = new AgentManager({ projectPath: this.options.projectPath });
38
40
  }
39
41
  // ============================================
40
- // Smart Routing (핵심 오케스트레이션)
42
+ // Smart Routing (SmartRouter 위임)
41
43
  // ============================================
42
- /**
43
- * 스마트 라우팅 - 작업 유형에 따라 최적의 LLM 선택 + fallback
44
- *
45
- * @example
46
- * const result = await orchestrator.smartRoute({
47
- * type: 'architecture',
48
- * prompt: 'Review this system design'
49
- * });
50
- */
51
44
  async smartRoute(request) {
52
- const startTime = Date.now();
53
- const { type, prompt, systemPrompt = 'You are a helpful assistant.', preferredLlm, maxRetries = 2 } = request;
54
- // LLM 우선순위 결정
55
- let providers;
56
- if (preferredLlm) {
57
- // 지정된 LLM 우선, 나머지는 fallback
58
- const others = TASK_LLM_PRIORITY[type].filter(p => p !== preferredLlm);
59
- providers = [preferredLlm, ...others];
60
- }
61
- else {
62
- providers = [...TASK_LLM_PRIORITY[type]];
63
- }
64
- const attemptedProviders = [];
65
- const errors = {};
66
- // 각 LLM 순차 시도 (fallback chain)
67
- for (const provider of providers) {
68
- // 캐시 확인 - 최근 실패한 LLM 건너뛰기
69
- if (this.isLlmUnavailable(provider)) {
70
- if (this.options.verbose) {
71
- debugLog(`[SmartRoute] Skipping ${provider} (recently failed)`);
72
- }
73
- continue;
74
- }
75
- attemptedProviders.push(provider);
76
- // 재시도 로직
77
- for (let attempt = 0; attempt <= maxRetries; attempt++) {
78
- try {
79
- const content = await this.callLlm(provider, prompt, systemPrompt);
80
- // 성공 - 캐시 업데이트
81
- this.markLlmAvailable(provider);
82
- return {
83
- content,
84
- provider,
85
- success: true,
86
- usedFallback: attemptedProviders.length > 1,
87
- attemptedProviders,
88
- duration: Date.now() - startTime
89
- };
90
- }
91
- catch (error) {
92
- const errorMsg = error instanceof Error ? error.message : String(error);
93
- errors[provider] = errorMsg;
94
- if (this.options.verbose) {
95
- debugLog(`[SmartRoute] ${provider} attempt ${attempt + 1} failed: ${errorMsg}`);
96
- }
97
- // Rate limit, quota, 인증 에러는 바로 다음 LLM으로 (재시도 의미 없음)
98
- if (this.shouldSkipRetry(errorMsg)) {
99
- this.markLlmUnavailable(provider);
100
- break;
101
- }
102
- // 마지막 재시도가 아니면 잠시 대기
103
- if (attempt < maxRetries) {
104
- await this.delay(1000 * (attempt + 1));
105
- }
106
- }
107
- }
108
- // 해당 LLM 실패 - 다음으로
109
- this.markLlmUnavailable(provider);
110
- }
111
- // 모든 외부 LLM 실패 - Claude fallback 메시지 반환
112
- return {
113
- content: this.buildFallbackMessage(type, prompt, errors),
114
- provider: 'claude',
115
- success: true,
116
- usedFallback: true,
117
- attemptedProviders,
118
- errors: errors,
119
- duration: Date.now() - startTime
120
- };
121
- }
122
- /**
123
- * LLM 호출 (provider별 분기)
124
- */
125
- async callLlm(provider, prompt, systemPrompt) {
126
- switch (provider) {
127
- case 'gpt':
128
- return gptApi.vibeGptOrchestrate(prompt, systemPrompt, { jsonMode: false });
129
- case 'gemini':
130
- return geminiApi.vibeGeminiOrchestrate(prompt, systemPrompt, { jsonMode: false });
131
- case 'claude':
132
- // Claude는 직접 처리하지 않고 fallback 메시지 반환
133
- throw new Error('Claude fallback - handled by caller');
134
- default:
135
- throw new Error(`Unknown provider: ${provider}`);
136
- }
137
- }
138
- /**
139
- * 재시도 없이 즉시 다음 LLM으로 넘어가야 하는 에러인지 확인
140
- * - Rate limit/Quota 에러
141
- * - 인증 에러 (토큰/키 없음)
142
- */
143
- shouldSkipRetry(errorMsg) {
144
- const skipPatterns = [
145
- // Rate limit / Quota
146
- 'rate limit',
147
- 'quota',
148
- 'exhausted',
149
- '429',
150
- 'usage limit',
151
- 'too many requests',
152
- // Auth errors (no token/key) - no retry needed
153
- 'no token',
154
- 'token not set',
155
- 'no api key',
156
- 'api key not set',
157
- 'missing token',
158
- 'missing api key',
159
- 'not authenticated',
160
- 'authentication failed',
161
- 'unauthorized',
162
- '401',
163
- 'auth'
164
- ];
165
- const lowerMsg = errorMsg.toLowerCase();
166
- return skipPatterns.some(pattern => lowerMsg.includes(pattern));
167
- }
168
- /**
169
- * LLM 가용성 확인 (캐시 기반)
170
- */
171
- isLlmUnavailable(provider) {
172
- if (provider === 'claude')
173
- return false;
174
- const cache = llmAvailabilityCache[provider];
175
- const now = Date.now();
176
- // 캐시 만료 확인
177
- if (now - cache.checkedAt > LLM_CACHE_TTL) {
178
- cache.available = true;
179
- cache.errorCount = 0;
180
- return false;
181
- }
182
- // 연속 3회 이상 실패 시 unavailable
183
- return !cache.available || cache.errorCount >= 3;
184
- }
185
- /**
186
- * LLM 가용 상태로 마킹
187
- */
188
- markLlmAvailable(provider) {
189
- if (provider === 'claude')
190
- return;
191
- llmAvailabilityCache[provider] = {
192
- available: true,
193
- checkedAt: Date.now(),
194
- errorCount: 0
195
- };
196
- }
197
- /**
198
- * LLM 불가용 상태로 마킹
199
- */
200
- markLlmUnavailable(provider) {
201
- if (provider === 'claude')
202
- return;
203
- const cache = llmAvailabilityCache[provider];
204
- cache.errorCount++;
205
- cache.checkedAt = Date.now();
206
- if (cache.errorCount >= 3) {
207
- cache.available = false;
208
- }
45
+ return this.router.route(request);
209
46
  }
210
- /**
211
- * Fallback 메시지 생성 (Claude가 직접 처리하도록 안내)
212
- */
213
- buildFallbackMessage(type, prompt, errors) {
214
- const errorSummary = Object.entries(errors)
215
- .map(([provider, msg]) => `- ${provider}: ${msg}`)
216
- .join('\n');
217
- return `[External LLM Unavailable - Claude Direct Handling]
218
-
219
- All external LLMs failed. Claude should handle this ${type} task directly.
220
-
221
- **Original Request:**
222
- ${prompt}
223
-
224
- **Failed Providers:**
225
- ${errorSummary}
226
-
227
- **Action Required:**
228
- Claude, please handle this task using your own capabilities. Do NOT retry external LLMs.`;
229
- }
230
- /**
231
- * 지연 유틸리티
232
- */
233
- delay(ms) {
234
- return new Promise(resolve => setTimeout(resolve, ms));
235
- }
236
- /**
237
- * 웹 검색 with fallback (GPT → Gemini → Claude WebSearch)
238
- */
239
47
  async smartWebSearch(query) {
240
- return this.smartRoute({
241
- type: 'web-search',
242
- prompt: query,
243
- systemPrompt: 'Search the web and provide relevant information.'
244
- });
48
+ return this.router.webSearch(query);
245
49
  }
246
- /**
247
- * 아키텍처 분석 with fallback
248
- */
249
50
  async smartArchitectureReview(prompt) {
250
- return this.smartRoute({
251
- type: 'architecture',
252
- prompt,
253
- systemPrompt: 'You are a software architect. Analyze and review the architecture.'
254
- });
51
+ return this.router.architectureReview(prompt);
255
52
  }
256
- /**
257
- * UI/UX 분석 with fallback
258
- */
259
53
  async smartUiuxReview(prompt) {
260
- return this.smartRoute({
261
- type: 'uiux',
262
- prompt,
263
- systemPrompt: 'You are a UI/UX expert. Analyze and provide feedback.'
264
- });
54
+ return this.router.uiuxReview(prompt);
265
55
  }
266
- /**
267
- * 코드 분석 with fallback
268
- */
269
56
  async smartCodeAnalysis(prompt) {
270
- return this.smartRoute({
271
- type: 'code-analysis',
272
- prompt,
273
- systemPrompt: 'You are a code analysis expert. Review and analyze the code.'
274
- });
57
+ return this.router.codeAnalysis(prompt);
275
58
  }
276
- /**
277
- * 디버깅 with fallback
278
- */
279
59
  async smartDebugging(prompt) {
280
- return this.smartRoute({
281
- type: 'debugging',
282
- prompt,
283
- systemPrompt: 'You are a debugging expert. Find bugs and suggest fixes.'
284
- });
60
+ return this.router.debugging(prompt);
285
61
  }
286
- /**
287
- * 코드 생성 with fallback (Claude 직접)
288
- */
289
62
  async smartCodeGen(description, context) {
290
- const prompt = context
291
- ? `${description}\n\nContext:\n${context}`
292
- : description;
293
- return this.smartRoute({
294
- type: 'code-gen',
295
- prompt,
296
- systemPrompt: 'Generate clean, well-documented code.'
297
- });
63
+ return this.router.codeGen(description, context);
298
64
  }
299
- /**
300
- * 에이전트 탐색
301
- */
65
+ // ============================================
66
+ // Agent Management (AgentManager 위임)
67
+ // ============================================
302
68
  async discoverAgents(category) {
303
- const result = await discoverAgents({
304
- projectPath: this.options.projectPath,
305
- category
306
- });
307
- if ('agents' in result) {
308
- return result.agents;
309
- }
310
- return [];
69
+ return this.agentManager.discover(category);
311
70
  }
312
- /**
313
- * 특정 에이전트 로드
314
- */
315
71
  async loadAgent(agentName) {
316
- return loadAgent(agentName, this.options.projectPath);
72
+ return this.agentManager.load(agentName);
317
73
  }
318
- /**
319
- * 병렬 리서치 실행
320
- */
74
+ async launchAgent(args) {
75
+ return this.agentManager.launch(args);
76
+ }
77
+ async launchAgents(configs) {
78
+ return this.agentManager.launchParallel(configs);
79
+ }
80
+ async getAgentResult(sessionId) {
81
+ return this.agentManager.getResult(sessionId);
82
+ }
83
+ cancelAgent(sessionId) {
84
+ return this.agentManager.cancel(sessionId);
85
+ }
86
+ getActiveSessions() {
87
+ return this.agentManager.getActiveSessions();
88
+ }
89
+ getHistory(limit = 10) {
90
+ return this.agentManager.getHistory(limit);
91
+ }
92
+ async runParallelReview(filePaths, techStack = []) {
93
+ const results = await this.agentManager.runParallelReview(filePaths, techStack);
94
+ if (this.options.saveResults) {
95
+ await this.saveOrchestratorResult('review', { results, filePaths, techStack });
96
+ }
97
+ return results;
98
+ }
99
+ // ============================================
100
+ // Parallel Research
101
+ // ============================================
321
102
  async runParallelResearch(args) {
322
103
  const result = await parallelResearch({
323
104
  ...args,
324
105
  projectPath: args.projectPath || this.options.projectPath
325
106
  });
326
- // 결과 저장
327
107
  if (this.options.saveResults && 'results' in result) {
328
108
  await this.saveOrchestratorResult('research', result);
329
109
  }
@@ -337,20 +117,14 @@ Claude, please handle this task using your own capabilities. Do NOT retry extern
337
117
  failureCount: 0
338
118
  };
339
119
  }
340
- /**
341
- * 기능 기반 리서치 (간편 API)
342
- * v2.5.0: Multi-LLM Research (Claude + GPT + Gemini) 지원
343
- */
344
120
  async researchFeature(feature, techStack = []) {
345
121
  const tasks = createResearchTasks(feature, techStack);
346
- // Multi-LLM 리서치 (Claude 에이전트 + GPT + Gemini 병렬 실행)
347
122
  const result = await parallelResearchWithMultiLlm({
348
123
  tasks,
349
124
  projectPath: this.options.projectPath,
350
125
  feature,
351
126
  techStack
352
127
  });
353
- // 결과 저장
354
128
  if (this.options.saveResults && 'results' in result) {
355
129
  await this.saveOrchestratorResult('research', result);
356
130
  }
@@ -364,150 +138,41 @@ Claude, please handle this task using your own capabilities. Do NOT retry extern
364
138
  failureCount: 0
365
139
  };
366
140
  }
367
- /**
368
- * 백그라운드 에이전트 시작
369
- */
370
- async launchAgent(args) {
371
- const result = await launchBackgroundAgent({
372
- ...args,
373
- projectPath: args.projectPath || this.options.projectPath
374
- });
375
- if ('handle' in result) {
376
- return result.handle;
377
- }
378
- return null;
141
+ // ============================================
142
+ // LLM Integration (LLMCluster 위임)
143
+ // ============================================
144
+ /** @deprecated GPT Codex API는 웹 검색을 지원하지 않습니다. geminiWebSearch를 사용하세요. */
145
+ async gptWebSearch(query) {
146
+ return this.llmCluster.gptWebSearch(query);
379
147
  }
380
- /**
381
- * 여러 에이전트 동시 실행
382
- */
383
- async launchAgents(configs) {
384
- const result = await launchParallelAgents(configs.map(c => ({
385
- ...c,
386
- projectPath: c.projectPath || this.options.projectPath
387
- })));
388
- if ('handles' in result) {
389
- return result.handles;
390
- }
391
- return [];
148
+ async gptOrchestrate(prompt, systemPrompt, options) {
149
+ return this.llmCluster.gptOrchestrate(prompt, systemPrompt, options);
392
150
  }
393
- /**
394
- * 에이전트 결과 조회
395
- */
396
- async getAgentResult(sessionId) {
397
- const result = await getBackgroundAgentResult(sessionId);
398
- if ('result' in result) {
399
- return result.result;
400
- }
401
- return null;
151
+ async geminiWebSearch(query) {
152
+ return this.llmCluster.geminiWebSearch(query);
402
153
  }
403
- /**
404
- * 에이전트 취소
405
- */
406
- cancelAgent(sessionId) {
407
- const result = cancelBackgroundAgent(sessionId);
408
- return result.content[0].text.includes('cancelled');
154
+ async geminiOrchestrate(prompt, systemPrompt, options) {
155
+ return this.llmCluster.geminiOrchestrate(prompt, systemPrompt, options);
409
156
  }
410
- /**
411
- * 활성 세션 목록
412
- */
413
- getActiveSessions() {
414
- return listActiveSessions();
157
+ async multiLlmQuery(prompt, options) {
158
+ return this.llmCluster.multiQuery(prompt, options);
415
159
  }
416
- /**
417
- * 세션 히스토리
418
- */
419
- getHistory(limit = 10) {
420
- return getSessionHistory(limit);
160
+ async checkLlmStatus() {
161
+ return this.llmCluster.checkStatus();
421
162
  }
422
- /**
423
- * 리뷰 에이전트 병렬 실행
424
- * /vibe.review에서 사용
425
- */
426
- async runParallelReview(filePaths, techStack = []) {
427
- // 리뷰 에이전트 탐색
428
- const reviewAgents = await listAgentsByCategory('review', this.options.projectPath);
429
- // 기술 스택에 맞는 에이전트만 필터링
430
- const relevantAgents = this.filterRelevantAgents(reviewAgents, techStack);
431
- // 각 에이전트에 대한 프롬프트 생성
432
- const agentConfigs = relevantAgents.map(agent => ({
433
- agentName: agent.name,
434
- prompt: this.buildReviewPrompt(agent, filePaths),
435
- model: DEFAULT_MODELS.REVIEW,
436
- maxTurns: 3,
437
- allowedTools: ['Read', 'Glob', 'Grep']
438
- }));
439
- // 병렬 실행
440
- const handles = await this.launchAgents(agentConfigs);
441
- // 모든 결과 수집
442
- const results = [];
443
- for (const handle of handles) {
444
- const result = await handle.getResult();
445
- results.push(result);
446
- }
447
- // 결과 저장
448
- if (this.options.saveResults) {
449
- await this.saveOrchestratorResult('review', { results, filePaths, techStack });
450
- }
451
- return results;
163
+ // ============================================
164
+ // Memory Management
165
+ // ============================================
166
+ saveToMemory(key, value, category = 'orchestrator') {
167
+ this.memoryManager.save(key, value, category);
452
168
  }
453
- /**
454
- * 기술 스택에 맞는 에이전트 필터링
455
- */
456
- filterRelevantAgents(agents, techStack) {
457
- // 항상 실행할 코어 리뷰어
458
- const coreReviewers = [
459
- 'security-reviewer',
460
- 'performance-reviewer',
461
- 'architecture-reviewer',
462
- 'complexity-reviewer',
463
- 'simplicity-reviewer',
464
- 'data-integrity-reviewer',
465
- 'test-coverage-reviewer',
466
- 'git-history-reviewer'
467
- ];
468
- // 스택별 리뷰어 매핑
469
- const stackReviewers = {
470
- typescript: ['typescript-reviewer'],
471
- python: ['python-reviewer'],
472
- react: ['react-reviewer'],
473
- rails: ['rails-reviewer'],
474
- ruby: ['rails-reviewer']
475
- };
476
- const relevantNames = new Set(coreReviewers);
477
- // 기술 스택에 맞는 리뷰어 추가
478
- for (const tech of techStack) {
479
- const reviewers = stackReviewers[tech.toLowerCase()];
480
- if (reviewers) {
481
- reviewers.forEach(r => relevantNames.add(r));
482
- }
483
- }
484
- return agents.filter(agent => {
485
- const normalizedName = agent.name.toLowerCase().replace(/\s+/g, '-');
486
- return relevantNames.has(normalizedName) ||
487
- Array.from(relevantNames).some(r => normalizedName.includes(r));
488
- });
169
+ getFromMemory(key) {
170
+ const memory = this.memoryManager.recall(key);
171
+ return memory?.value || null;
489
172
  }
490
- /**
491
- * 리뷰 프롬프트 생성
492
- */
493
- buildReviewPrompt(agent, filePaths) {
494
- return `You are a ${agent.name}. Review the following files for issues in your domain:
495
-
496
- Files to review:
497
- ${filePaths.map(f => `- ${f}`).join('\n')}
498
-
499
- ${agent.content}
500
-
501
- Provide findings in this format:
502
- - Priority: P1 (Critical), P2 (Important), P3 (Nice-to-have)
503
- - Category: Your specialty area
504
- - Location: file:line
505
- - Issue: Description
506
- - Fix: Recommendation`;
507
- }
508
- /**
509
- * 결과 저장
510
- */
173
+ // ============================================
174
+ // Internal Utilities
175
+ // ============================================
511
176
  async saveOrchestratorResult(type, data) {
512
177
  const resultsDir = path.join(this.options.projectPath, this.options.resultsPath);
513
178
  try {
@@ -523,106 +188,17 @@ Provide findings in this format:
523
188
  errorLog('Failed to save orchestrator result:', error);
524
189
  }
525
190
  }
526
- /**
527
- * 메모리에 결과 저장
528
- */
529
- saveToMemory(key, value, category = 'orchestrator') {
530
- this.memoryManager.save(key, value, category);
531
- }
532
- /**
533
- * 메모리에서 결과 조회
534
- */
535
- getFromMemory(key) {
536
- const memory = this.memoryManager.recall(key);
537
- return memory?.value || null;
538
- }
539
- // ============================================
540
- // GPT Integration (웹 검색, 아키텍처 분석)
541
191
  // ============================================
542
- /**
543
- * GPT 웹 검색 (Gemini로 위임)
544
- * @param query 검색 쿼리
545
- * @deprecated GPT Codex API는 웹 검색을 지원하지 않습니다. geminiWebSearch를 사용하세요.
546
- */
547
- async gptWebSearch(query) {
548
- // GPT Codex API는 웹 검색 미지원 → Gemini로 위임
549
- return this.geminiWebSearch(query);
550
- }
551
- /**
552
- * GPT 오케스트레이션
553
- * @param prompt 프롬프트
554
- * @param systemPrompt 시스템 프롬프트
555
- * @param options 옵션 (jsonMode 등)
556
- */
557
- async gptOrchestrate(prompt, systemPrompt = 'You are a helpful assistant.', options) {
558
- return gptApi.vibeGptOrchestrate(prompt, systemPrompt, options);
559
- }
192
+ // Component Accessors (고급 사용)
560
193
  // ============================================
561
- // Gemini Integration (UI/UX 분석, 코드 분석)
562
- // ============================================
563
- /**
564
- * Gemini 웹 검색
565
- * @param query 검색 쿼리
566
- */
567
- async geminiWebSearch(query) {
568
- return geminiApi.quickWebSearch(query);
194
+ getRouter() {
195
+ return this.router;
569
196
  }
570
- /**
571
- * Gemini 오케스트레이션
572
- * @param prompt 프롬프트
573
- * @param systemPrompt 시스템 프롬프트
574
- * @param options 옵션 (jsonMode 등)
575
- */
576
- async geminiOrchestrate(prompt, systemPrompt = 'You are a helpful assistant.', options) {
577
- return geminiApi.vibeGeminiOrchestrate(prompt, systemPrompt, options);
197
+ getLLMCluster() {
198
+ return this.llmCluster;
578
199
  }
579
- // ============================================
580
- // Multi-LLM Orchestration
581
- // ============================================
582
- /**
583
- * 멀티 LLM 병렬 쿼리
584
- * GPT, Gemini 동시 호출하여 결과 비교
585
- */
586
- async multiLlmQuery(prompt, options) {
587
- const { useGpt = true, useGemini = true } = options || {};
588
- const results = {};
589
- const promises = [];
590
- if (useGpt) {
591
- promises.push(gptApi.vibeGptOrchestrate(prompt, 'You are a helpful assistant.', { jsonMode: false })
592
- .then(r => { results.gpt = r; }).catch(e => { warnLog('GPT query failed in multiLlm', e); }));
593
- }
594
- if (useGemini) {
595
- promises.push(geminiApi.vibeGeminiOrchestrate(prompt, 'You are a helpful assistant.', { jsonMode: false })
596
- .then(r => { results.gemini = r; }).catch(e => { warnLog('Gemini query failed in multiLlm', e); }));
597
- }
598
- await Promise.all(promises);
599
- return results;
600
- }
601
- /**
602
- * LLM 상태 확인 (전체)
603
- */
604
- async checkLlmStatus() {
605
- // GPT/Gemini는 실제 호출로 확인
606
- let gptAvailable = false;
607
- let geminiAvailable = false;
608
- try {
609
- await gptApi.vibeGptOrchestrate('ping', 'Reply with pong', { jsonMode: false });
610
- gptAvailable = true;
611
- }
612
- catch (e) {
613
- warnLog('GPT status check failed', e);
614
- }
615
- try {
616
- await geminiApi.vibeGeminiOrchestrate('ping', 'Reply with pong', { jsonMode: false });
617
- geminiAvailable = true;
618
- }
619
- catch (e) {
620
- warnLog('Gemini status check failed', e);
621
- }
622
- return {
623
- gpt: { available: gptAvailable },
624
- gemini: { available: geminiAvailable }
625
- };
200
+ getAgentManager() {
201
+ return this.agentManager;
626
202
  }
627
203
  }
628
204
  // 싱글톤 인스턴스 (선택적 사용)