@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.
- package/CLAUDE.md +243 -0
- package/LICENSE +21 -21
- package/README.md +262 -262
- package/agents/architect-low.md +41 -41
- package/agents/architect-medium.md +59 -59
- package/agents/architect.md +80 -80
- package/agents/build-error-resolver.md +115 -115
- package/agents/compounder.md +261 -261
- package/agents/diagrammer.md +178 -178
- package/agents/e2e-tester.md +266 -266
- package/agents/explorer-low.md +42 -42
- package/agents/explorer-medium.md +59 -59
- package/agents/explorer.md +48 -48
- package/agents/implementer-low.md +43 -43
- package/agents/implementer-medium.md +52 -52
- package/agents/implementer.md +54 -54
- package/agents/refactor-cleaner.md +143 -143
- package/agents/research/best-practices-agent.md +189 -189
- package/agents/research/codebase-patterns-agent.md +147 -147
- package/agents/research/framework-docs-agent.md +178 -178
- package/agents/research/security-advisory-agent.md +203 -203
- package/agents/review/architecture-reviewer.md +107 -107
- package/agents/review/complexity-reviewer.md +116 -116
- package/agents/review/data-integrity-reviewer.md +88 -88
- package/agents/review/git-history-reviewer.md +103 -103
- package/agents/review/performance-reviewer.md +86 -86
- package/agents/review/python-reviewer.md +150 -150
- package/agents/review/rails-reviewer.md +139 -139
- package/agents/review/react-reviewer.md +144 -144
- package/agents/review/security-reviewer.md +80 -80
- package/agents/review/simplicity-reviewer.md +140 -140
- package/agents/review/test-coverage-reviewer.md +116 -116
- package/agents/review/typescript-reviewer.md +127 -127
- package/agents/searcher.md +54 -54
- package/agents/simplifier.md +120 -120
- package/agents/tester.md +49 -49
- package/agents/ui-previewer.md +129 -129
- package/commands/vibe.analyze.md +356 -356
- package/commands/vibe.reason.md +329 -329
- package/commands/vibe.review.md +326 -326
- package/commands/vibe.run.md +1117 -1051
- package/commands/vibe.spec.md +1058 -1058
- package/commands/vibe.utils.md +353 -296
- package/commands/vibe.verify.md +375 -375
- package/dist/cli/collaborator.js +52 -52
- package/dist/cli/detect.js +32 -32
- package/dist/cli/index.js +102 -102
- package/dist/cli/llm.js +144 -144
- 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/postinstall.js +180 -2
- package/dist/cli/postinstall.js.map +1 -1
- package/dist/cli/setup/GlobalInstaller.d.ts +24 -0
- package/dist/cli/setup/GlobalInstaller.d.ts.map +1 -0
- package/dist/cli/setup/GlobalInstaller.js +130 -0
- package/dist/cli/setup/GlobalInstaller.js.map +1 -0
- package/dist/cli/setup/LanguageDetector.d.ts +16 -0
- package/dist/cli/setup/LanguageDetector.d.ts.map +1 -0
- package/dist/cli/setup/LanguageDetector.js +49 -0
- package/dist/cli/setup/LanguageDetector.js.map +1 -0
- package/dist/cli/setup/LegacyMigration.d.ts +25 -0
- package/dist/cli/setup/LegacyMigration.d.ts.map +1 -0
- package/dist/cli/setup/LegacyMigration.js +162 -0
- package/dist/cli/setup/LegacyMigration.js.map +1 -0
- package/dist/cli/setup/ProjectSetup.d.ts +30 -0
- package/dist/cli/setup/ProjectSetup.d.ts.map +1 -0
- package/dist/cli/setup/ProjectSetup.js +238 -0
- package/dist/cli/setup/ProjectSetup.js.map +1 -0
- package/dist/cli/setup/index.d.ts +14 -0
- package/dist/cli/setup/index.d.ts.map +1 -0
- package/dist/cli/setup/index.js +18 -0
- package/dist/cli/setup/index.js.map +1 -0
- package/dist/cli/setup.d.ts +10 -77
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +15 -592
- package/dist/cli/setup.js.map +1 -1
- package/dist/lib/DeepInit.d.ts +0 -2
- package/dist/lib/DeepInit.d.ts.map +1 -1
- package/dist/lib/DeepInit.js +24 -26
- package/dist/lib/DeepInit.js.map +1 -1
- package/dist/lib/IterationTracker.d.ts +0 -2
- package/dist/lib/IterationTracker.d.ts.map +1 -1
- package/dist/lib/IterationTracker.js +11 -13
- package/dist/lib/IterationTracker.js.map +1 -1
- package/dist/lib/ModelRouter.d.ts +0 -2
- package/dist/lib/ModelRouter.d.ts.map +1 -1
- package/dist/lib/ModelRouter.js +0 -2
- package/dist/lib/ModelRouter.js.map +1 -1
- package/dist/lib/OrchestrateWorkflow.d.ts +1 -3
- package/dist/lib/OrchestrateWorkflow.d.ts.map +1 -1
- package/dist/lib/OrchestrateWorkflow.js +1 -3
- package/dist/lib/OrchestrateWorkflow.js.map +1 -1
- package/dist/lib/PythonParser.js +108 -108
- package/dist/lib/SkillFrontmatter.d.ts +0 -2
- package/dist/lib/SkillFrontmatter.d.ts.map +1 -1
- package/dist/lib/SkillFrontmatter.js +28 -30
- package/dist/lib/SkillFrontmatter.js.map +1 -1
- package/dist/lib/SkillQualityGate.d.ts +0 -2
- package/dist/lib/SkillQualityGate.d.ts.map +1 -1
- package/dist/lib/SkillQualityGate.js +9 -11
- package/dist/lib/SkillQualityGate.js.map +1 -1
- package/dist/lib/SkillRepository.d.ts +117 -0
- package/dist/lib/SkillRepository.d.ts.map +1 -0
- package/dist/lib/SkillRepository.js +477 -0
- package/dist/lib/SkillRepository.js.map +1 -0
- package/dist/lib/UltraQA.d.ts +0 -2
- package/dist/lib/UltraQA.d.ts.map +1 -1
- package/dist/lib/UltraQA.js +77 -79
- package/dist/lib/UltraQA.js.map +1 -1
- package/dist/lib/gemini-mcp.d.ts +10 -0
- package/dist/lib/gemini-mcp.d.ts.map +1 -0
- package/dist/lib/gemini-mcp.js +353 -0
- package/dist/lib/gemini-mcp.js.map +1 -0
- package/dist/lib/gpt-api.js +4 -4
- package/dist/lib/gpt-mcp.d.ts +10 -0
- package/dist/lib/gpt-mcp.d.ts.map +1 -0
- package/dist/lib/gpt-mcp.js +352 -0
- package/dist/lib/gpt-mcp.js.map +1 -0
- package/dist/lib/llm/auth/ApiKeyManager.d.ts +21 -0
- package/dist/lib/llm/auth/ApiKeyManager.d.ts.map +1 -0
- package/dist/lib/llm/auth/ApiKeyManager.js +43 -0
- package/dist/lib/llm/auth/ApiKeyManager.js.map +1 -0
- package/dist/lib/llm/auth/ConfigManager.d.ts +29 -0
- package/dist/lib/llm/auth/ConfigManager.d.ts.map +1 -0
- package/dist/lib/llm/auth/ConfigManager.js +67 -0
- package/dist/lib/llm/auth/ConfigManager.js.map +1 -0
- package/dist/lib/llm/auth/index.d.ts +25 -0
- package/dist/lib/llm/auth/index.d.ts.map +1 -0
- package/dist/lib/llm/auth/index.js +83 -0
- package/dist/lib/llm/auth/index.js.map +1 -0
- package/dist/lib/llm/index.d.ts +10 -0
- package/dist/lib/llm/index.d.ts.map +1 -0
- package/dist/lib/llm/index.js +12 -0
- package/dist/lib/llm/index.js.map +1 -0
- package/dist/lib/llm/types.d.ts +96 -0
- package/dist/lib/llm/types.d.ts.map +1 -0
- package/dist/lib/llm/types.js +17 -0
- package/dist/lib/llm/types.js.map +1 -0
- package/dist/lib/llm/utils/index.d.ts +6 -0
- package/dist/lib/llm/utils/index.d.ts.map +1 -0
- package/dist/lib/llm/utils/index.js +6 -0
- package/dist/lib/llm/utils/index.js.map +1 -0
- package/dist/lib/llm/utils/retry.d.ts +25 -0
- package/dist/lib/llm/utils/retry.d.ts.map +1 -0
- package/dist/lib/llm/utils/retry.js +72 -0
- package/dist/lib/llm/utils/retry.js.map +1 -0
- package/dist/lib/llm/utils/stream.d.ts +13 -0
- package/dist/lib/llm/utils/stream.d.ts.map +1 -0
- package/dist/lib/llm/utils/stream.js +110 -0
- package/dist/lib/llm/utils/stream.js.map +1 -0
- package/dist/lib/memory/KnowledgeGraph.js +4 -4
- package/dist/lib/memory/MemorySearch.js +20 -20
- package/dist/lib/memory/MemoryStorage.js +64 -64
- package/dist/orchestrator/AgentExecutor.d.ts +23 -0
- package/dist/orchestrator/AgentExecutor.d.ts.map +1 -0
- package/dist/orchestrator/AgentExecutor.js +231 -0
- package/dist/orchestrator/AgentExecutor.js.map +1 -0
- package/dist/orchestrator/AgentManager.d.ts +73 -0
- package/dist/orchestrator/AgentManager.d.ts.map +1 -0
- package/dist/orchestrator/AgentManager.js +184 -0
- package/dist/orchestrator/AgentManager.js.map +1 -0
- package/dist/orchestrator/LLMCluster.d.ts +70 -0
- package/dist/orchestrator/LLMCluster.d.ts.map +1 -0
- package/dist/orchestrator/LLMCluster.js +91 -0
- package/dist/orchestrator/LLMCluster.js.map +1 -0
- package/dist/orchestrator/MultiLlmResearch.d.ts +27 -0
- package/dist/orchestrator/MultiLlmResearch.d.ts.map +1 -0
- package/dist/orchestrator/MultiLlmResearch.js +145 -0
- package/dist/orchestrator/MultiLlmResearch.js.map +1 -0
- package/dist/orchestrator/SessionStore.d.ts +41 -0
- package/dist/orchestrator/SessionStore.d.ts.map +1 -0
- package/dist/orchestrator/SessionStore.js +117 -0
- package/dist/orchestrator/SessionStore.js.map +1 -0
- package/dist/orchestrator/SmartRouter.d.ts +68 -0
- package/dist/orchestrator/SmartRouter.d.ts.map +1 -0
- package/dist/orchestrator/SmartRouter.js +256 -0
- package/dist/orchestrator/SmartRouter.js.map +1 -0
- package/dist/orchestrator/backgroundAgent.d.ts +10 -28
- package/dist/orchestrator/backgroundAgent.d.ts.map +1 -1
- package/dist/orchestrator/backgroundAgent.js +11 -346
- package/dist/orchestrator/backgroundAgent.js.map +1 -1
- package/dist/orchestrator/index.d.ts +3 -0
- package/dist/orchestrator/index.d.ts.map +1 -1
- package/dist/orchestrator/index.js +4 -0
- package/dist/orchestrator/index.js.map +1 -1
- package/dist/orchestrator/orchestrator.d.ts +19 -154
- package/dist/orchestrator/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator/orchestrator.js +90 -514
- package/dist/orchestrator/orchestrator.js.map +1 -1
- package/dist/orchestrator/parallelResearch.d.ts +5 -12
- package/dist/orchestrator/parallelResearch.d.ts.map +1 -1
- package/dist/orchestrator/parallelResearch.js +10 -193
- package/dist/orchestrator/parallelResearch.js.map +1 -1
- package/dist/tools/analytics/getUsageAnalytics.d.ts +10 -0
- package/dist/tools/analytics/getUsageAnalytics.d.ts.map +1 -0
- package/dist/tools/analytics/getUsageAnalytics.js +246 -0
- package/dist/tools/analytics/getUsageAnalytics.js.map +1 -0
- package/dist/tools/analytics/index.d.ts +5 -0
- package/dist/tools/analytics/index.d.ts.map +1 -0
- package/dist/tools/analytics/index.js +5 -0
- package/dist/tools/analytics/index.js.map +1 -0
- package/dist/tools/convention/analyzeComplexity.test.js +115 -115
- package/dist/tools/convention/getCodingGuide.d.ts +7 -0
- package/dist/tools/convention/getCodingGuide.d.ts.map +1 -0
- package/dist/tools/convention/getCodingGuide.js +69 -0
- package/dist/tools/convention/getCodingGuide.js.map +1 -0
- package/dist/tools/convention/validateCodeQuality.test.js +104 -104
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/planning/analyzeRequirements.d.ts +9 -0
- package/dist/tools/planning/analyzeRequirements.d.ts.map +1 -0
- package/dist/tools/planning/analyzeRequirements.js +171 -0
- package/dist/tools/planning/analyzeRequirements.js.map +1 -0
- package/dist/tools/planning/createUserStories.d.ts +9 -0
- package/dist/tools/planning/createUserStories.d.ts.map +1 -0
- package/dist/tools/planning/createUserStories.js +124 -0
- package/dist/tools/planning/createUserStories.js.map +1 -0
- package/dist/tools/planning/featureRoadmap.d.ts +10 -0
- package/dist/tools/planning/featureRoadmap.d.ts.map +1 -0
- package/dist/tools/planning/featureRoadmap.js +207 -0
- package/dist/tools/planning/featureRoadmap.js.map +1 -0
- package/dist/tools/planning/generatePrd.d.ts +11 -0
- package/dist/tools/planning/generatePrd.d.ts.map +1 -0
- package/dist/tools/planning/generatePrd.js +161 -0
- package/dist/tools/planning/generatePrd.js.map +1 -0
- package/dist/tools/planning/index.d.ts +8 -0
- package/dist/tools/planning/index.d.ts.map +1 -0
- package/dist/tools/planning/index.js +8 -0
- package/dist/tools/planning/index.js.map +1 -0
- package/dist/tools/prompt/analyzePrompt.d.ts +7 -0
- package/dist/tools/prompt/analyzePrompt.d.ts.map +1 -0
- package/dist/tools/prompt/analyzePrompt.js +150 -0
- package/dist/tools/prompt/analyzePrompt.js.map +1 -0
- package/dist/tools/prompt/enhancePrompt.d.ts +8 -0
- package/dist/tools/prompt/enhancePrompt.d.ts.map +1 -0
- package/dist/tools/prompt/enhancePrompt.js +110 -0
- package/dist/tools/prompt/enhancePrompt.js.map +1 -0
- package/dist/tools/prompt/enhancePromptGemini.d.ts +8 -0
- package/dist/tools/prompt/enhancePromptGemini.d.ts.map +1 -0
- package/dist/tools/prompt/enhancePromptGemini.js +332 -0
- package/dist/tools/prompt/enhancePromptGemini.js.map +1 -0
- package/dist/tools/prompt/index.d.ts +7 -0
- package/dist/tools/prompt/index.d.ts.map +1 -0
- package/dist/tools/prompt/index.js +7 -0
- package/dist/tools/prompt/index.js.map +1 -0
- package/dist/tools/reasoning/applyReasoningFramework.d.ts +8 -0
- package/dist/tools/reasoning/applyReasoningFramework.d.ts.map +1 -0
- package/dist/tools/reasoning/applyReasoningFramework.js +266 -0
- package/dist/tools/reasoning/applyReasoningFramework.js.map +1 -0
- package/dist/tools/reasoning/index.d.ts +5 -0
- package/dist/tools/reasoning/index.d.ts.map +1 -0
- package/dist/tools/reasoning/index.js +5 -0
- package/dist/tools/reasoning/index.js.map +1 -0
- package/dist/tools/thinking/analyzeProblem.d.ts +7 -0
- package/dist/tools/thinking/analyzeProblem.d.ts.map +1 -0
- package/dist/tools/thinking/analyzeProblem.js +55 -0
- package/dist/tools/thinking/analyzeProblem.js.map +1 -0
- package/dist/tools/thinking/breakDownProblem.d.ts +8 -0
- package/dist/tools/thinking/breakDownProblem.d.ts.map +1 -0
- package/dist/tools/thinking/breakDownProblem.js +145 -0
- package/dist/tools/thinking/breakDownProblem.js.map +1 -0
- package/dist/tools/thinking/createThinkingChain.d.ts +7 -0
- package/dist/tools/thinking/createThinkingChain.d.ts.map +1 -0
- package/dist/tools/thinking/createThinkingChain.js +44 -0
- package/dist/tools/thinking/createThinkingChain.js.map +1 -0
- package/dist/tools/thinking/formatAsPlan.d.ts +9 -0
- package/dist/tools/thinking/formatAsPlan.d.ts.map +1 -0
- package/dist/tools/thinking/formatAsPlan.js +78 -0
- package/dist/tools/thinking/formatAsPlan.js.map +1 -0
- package/dist/tools/thinking/index.d.ts +10 -0
- package/dist/tools/thinking/index.d.ts.map +1 -0
- package/dist/tools/thinking/index.js +10 -0
- package/dist/tools/thinking/index.js.map +1 -0
- package/dist/tools/thinking/stepByStepAnalysis.d.ts +8 -0
- package/dist/tools/thinking/stepByStepAnalysis.d.ts.map +1 -0
- package/dist/tools/thinking/stepByStepAnalysis.js +63 -0
- package/dist/tools/thinking/stepByStepAnalysis.js.map +1 -0
- package/dist/tools/thinking/thinkAloudProcess.d.ts +8 -0
- package/dist/tools/thinking/thinkAloudProcess.d.ts.map +1 -0
- package/dist/tools/thinking/thinkAloudProcess.js +80 -0
- package/dist/tools/thinking/thinkAloudProcess.js.map +1 -0
- package/hooks/hooks.json +222 -222
- package/hooks/scripts/code-check.js +22 -22
- package/hooks/scripts/code-review.js +22 -22
- package/hooks/scripts/complexity.js +22 -22
- package/hooks/scripts/compound.js +23 -23
- package/hooks/scripts/context-save.js +33 -33
- package/hooks/scripts/generate-brand-assets.js +472 -0
- package/hooks/scripts/hud-multiline.js +262 -264
- package/hooks/scripts/hud-status.js +291 -293
- package/hooks/scripts/keyword-detector.js +214 -216
- package/hooks/scripts/llm-orchestrate.js +171 -171
- package/hooks/scripts/post-edit.js +97 -97
- package/hooks/scripts/post-tool-verify.js +210 -212
- package/hooks/scripts/pre-tool-guard.js +125 -127
- package/hooks/scripts/recall.js +22 -22
- package/hooks/scripts/session-start.js +30 -30
- package/hooks/scripts/skill-injector.js +191 -193
- package/hooks/scripts/utils.js +97 -97
- package/languages/csharp-unity.md +515 -515
- package/languages/gdscript-godot.md +470 -470
- package/languages/ruby-rails.md +489 -489
- package/languages/typescript-angular.md +433 -433
- package/languages/typescript-astro.md +416 -416
- package/languages/typescript-electron.md +406 -406
- package/languages/typescript-nestjs.md +524 -524
- package/languages/typescript-svelte.md +407 -407
- package/languages/typescript-tauri.md +365 -365
- package/package.json +83 -83
- package/skills/brand-assets.md +141 -0
- package/skills/commerce-patterns.md +361 -0
- package/skills/context7-usage.md +102 -102
- package/skills/e2e-commerce.md +304 -0
- package/skills/frontend-design.md +92 -0
- package/skills/git-worktree.md +181 -181
- package/skills/parallel-research.md +77 -77
- package/skills/priority-todos.md +239 -239
- package/skills/seo-checklist.md +244 -0
- package/skills/tool-fallback.md +190 -190
- package/skills/vibe-capabilities.md +161 -161
- package/vibe/constitution.md +227 -227
- package/vibe/rules/core/communication-guide.md +98 -98
- package/vibe/rules/core/development-philosophy.md +52 -52
- package/vibe/rules/core/quick-start.md +102 -102
- package/vibe/rules/quality/bdd-contract-testing.md +393 -393
- package/vibe/rules/quality/checklist.md +276 -276
- package/vibe/rules/quality/testing-strategy.md +440 -440
- package/vibe/rules/standards/anti-patterns.md +541 -541
- package/vibe/rules/standards/code-structure.md +291 -291
- package/vibe/rules/standards/complexity-metrics.md +313 -313
- package/vibe/rules/standards/naming-conventions.md +198 -198
- package/vibe/setup.sh +31 -31
- package/vibe/templates/constitution-template.md +252 -252
- package/vibe/templates/contract-backend-template.md +526 -526
- package/vibe/templates/contract-frontend-template.md +599 -599
- package/vibe/templates/feature-template.md +96 -96
- 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
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
371
|
-
|
|
372
|
-
|
|
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
|
-
|
|
425
|
-
|
|
426
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
// 싱글톤 인스턴스 (선택적 사용)
|