@su-record/vibe 3.0.0 → 3.1.0
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/hooks/scripts/__tests__/.vibe/command-log.txt +3 -78
- package/hooks/scripts/__tests__/.vibe/memories/memories.db +0 -0
- package/hooks/scripts/__tests__/.vibe/memories/memories.db-shm +0 -0
- package/hooks/scripts/__tests__/.vibe/memories/memories.db-wal +0 -0
- package/hooks/scripts/__tests__/clone-behaviors.test.js +64 -0
- package/hooks/scripts/__tests__/clone-merge-responsive.test.js +106 -0
- package/hooks/scripts/clone-extract.js +242 -28
- package/hooks/scripts/clone-merge-responsive.js +184 -0
- package/hooks/scripts/clone-spec.js +33 -8
- package/hooks/scripts/clone-validate.js +15 -9
- package/package.json +5 -2
- package/skills/clone/SKILL.md +132 -55
- package/skills/vibe.clone/SKILL.md +39 -19
- package/dist/cli/llm/gemini-commands.d.ts +0 -25
- package/dist/cli/llm/gemini-commands.d.ts.map +0 -1
- package/dist/cli/llm/gemini-commands.js +0 -143
- package/dist/cli/llm/gemini-commands.js.map +0 -1
- package/dist/cli/postinstall/codex-agents.d.ts +0 -24
- package/dist/cli/postinstall/codex-agents.d.ts.map +0 -1
- package/dist/cli/postinstall/codex-agents.js +0 -114
- package/dist/cli/postinstall/codex-agents.js.map +0 -1
- package/dist/cli/postinstall/codex-instruction.d.ts +0 -10
- package/dist/cli/postinstall/codex-instruction.d.ts.map +0 -1
- package/dist/cli/postinstall/codex-instruction.js +0 -56
- package/dist/cli/postinstall/codex-instruction.js.map +0 -1
- package/dist/cli/postinstall/gemini-agents.d.ts +0 -12
- package/dist/cli/postinstall/gemini-agents.d.ts.map +0 -1
- package/dist/cli/postinstall/gemini-agents.js +0 -80
- package/dist/cli/postinstall/gemini-agents.js.map +0 -1
- package/dist/cli/postinstall/gemini-instruction.d.ts +0 -10
- package/dist/cli/postinstall/gemini-instruction.d.ts.map +0 -1
- package/dist/cli/postinstall/gemini-instruction.js +0 -59
- package/dist/cli/postinstall/gemini-instruction.js.map +0 -1
- package/dist/infra/lib/ContextCompressor.d.ts +0 -104
- package/dist/infra/lib/ContextCompressor.d.ts.map +0 -1
- package/dist/infra/lib/ContextCompressor.js +0 -297
- package/dist/infra/lib/ContextCompressor.js.map +0 -1
- package/dist/infra/lib/ContextCompressor.test.d.ts +0 -2
- package/dist/infra/lib/ContextCompressor.test.d.ts.map +0 -1
- package/dist/infra/lib/ContextCompressor.test.js +0 -25
- package/dist/infra/lib/ContextCompressor.test.js.map +0 -1
- package/dist/infra/lib/ProgressTracker.d.ts +0 -73
- package/dist/infra/lib/ProgressTracker.d.ts.map +0 -1
- package/dist/infra/lib/ProgressTracker.js +0 -267
- package/dist/infra/lib/ProgressTracker.js.map +0 -1
- package/dist/infra/lib/TokenBudgetTracker.d.ts +0 -68
- package/dist/infra/lib/TokenBudgetTracker.d.ts.map +0 -1
- package/dist/infra/lib/TokenBudgetTracker.js +0 -191
- package/dist/infra/lib/TokenBudgetTracker.js.map +0 -1
- package/dist/infra/lib/autonomy/AuditStore.d.ts +0 -63
- package/dist/infra/lib/autonomy/AuditStore.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/AuditStore.js +0 -185
- package/dist/infra/lib/autonomy/AuditStore.js.map +0 -1
- package/dist/infra/lib/autonomy/AutonomyConfig.d.ts +0 -84
- package/dist/infra/lib/autonomy/AutonomyConfig.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/AutonomyConfig.js +0 -49
- package/dist/infra/lib/autonomy/AutonomyConfig.js.map +0 -1
- package/dist/infra/lib/autonomy/AutonomyOrchestrator.d.ts +0 -78
- package/dist/infra/lib/autonomy/AutonomyOrchestrator.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/AutonomyOrchestrator.js +0 -246
- package/dist/infra/lib/autonomy/AutonomyOrchestrator.js.map +0 -1
- package/dist/infra/lib/autonomy/BackgroundMonitor.d.ts +0 -36
- package/dist/infra/lib/autonomy/BackgroundMonitor.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/BackgroundMonitor.js +0 -138
- package/dist/infra/lib/autonomy/BackgroundMonitor.js.map +0 -1
- package/dist/infra/lib/autonomy/CollaborationProtocol.d.ts +0 -56
- package/dist/infra/lib/autonomy/CollaborationProtocol.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/CollaborationProtocol.js +0 -122
- package/dist/infra/lib/autonomy/CollaborationProtocol.js.map +0 -1
- package/dist/infra/lib/autonomy/ConfirmationManager.d.ts +0 -42
- package/dist/infra/lib/autonomy/ConfirmationManager.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/ConfirmationManager.js +0 -200
- package/dist/infra/lib/autonomy/ConfirmationManager.js.map +0 -1
- package/dist/infra/lib/autonomy/ConfirmationStore.d.ts +0 -55
- package/dist/infra/lib/autonomy/ConfirmationStore.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/ConfirmationStore.js +0 -130
- package/dist/infra/lib/autonomy/ConfirmationStore.js.map +0 -1
- package/dist/infra/lib/autonomy/EventBus.d.ts +0 -20
- package/dist/infra/lib/autonomy/EventBus.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/EventBus.js +0 -119
- package/dist/infra/lib/autonomy/EventBus.js.map +0 -1
- package/dist/infra/lib/autonomy/EventOutbox.d.ts +0 -32
- package/dist/infra/lib/autonomy/EventOutbox.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/EventOutbox.js +0 -152
- package/dist/infra/lib/autonomy/EventOutbox.js.map +0 -1
- package/dist/infra/lib/autonomy/NotificationDispatcher.d.ts +0 -24
- package/dist/infra/lib/autonomy/NotificationDispatcher.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/NotificationDispatcher.js +0 -112
- package/dist/infra/lib/autonomy/NotificationDispatcher.js.map +0 -1
- package/dist/infra/lib/autonomy/PolicyEngine.d.ts +0 -76
- package/dist/infra/lib/autonomy/PolicyEngine.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/PolicyEngine.js +0 -208
- package/dist/infra/lib/autonomy/PolicyEngine.js.map +0 -1
- package/dist/infra/lib/autonomy/ProactiveAnalyzer.d.ts +0 -61
- package/dist/infra/lib/autonomy/ProactiveAnalyzer.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/ProactiveAnalyzer.js +0 -236
- package/dist/infra/lib/autonomy/ProactiveAnalyzer.js.map +0 -1
- package/dist/infra/lib/autonomy/RiskClassifier.d.ts +0 -35
- package/dist/infra/lib/autonomy/RiskClassifier.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/RiskClassifier.js +0 -147
- package/dist/infra/lib/autonomy/RiskClassifier.js.map +0 -1
- package/dist/infra/lib/autonomy/SecuritySentinel.d.ts +0 -51
- package/dist/infra/lib/autonomy/SecuritySentinel.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/SecuritySentinel.js +0 -162
- package/dist/infra/lib/autonomy/SecuritySentinel.js.map +0 -1
- package/dist/infra/lib/autonomy/SuggestionStore.d.ts +0 -54
- package/dist/infra/lib/autonomy/SuggestionStore.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/SuggestionStore.js +0 -144
- package/dist/infra/lib/autonomy/SuggestionStore.js.map +0 -1
- package/dist/infra/lib/autonomy/TaskDecomposer.d.ts +0 -38
- package/dist/infra/lib/autonomy/TaskDecomposer.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/TaskDecomposer.js +0 -175
- package/dist/infra/lib/autonomy/TaskDecomposer.js.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/audit-store.test.d.ts +0 -2
- package/dist/infra/lib/autonomy/__tests__/audit-store.test.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/audit-store.test.js +0 -198
- package/dist/infra/lib/autonomy/__tests__/audit-store.test.js.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/event-bus.test.d.ts +0 -2
- package/dist/infra/lib/autonomy/__tests__/event-bus.test.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/event-bus.test.js +0 -225
- package/dist/infra/lib/autonomy/__tests__/event-bus.test.js.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/event-core.test.d.ts +0 -2
- package/dist/infra/lib/autonomy/__tests__/event-core.test.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/event-core.test.js +0 -194
- package/dist/infra/lib/autonomy/__tests__/event-core.test.js.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/governance.test.d.ts +0 -2
- package/dist/infra/lib/autonomy/__tests__/governance.test.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/governance.test.js +0 -540
- package/dist/infra/lib/autonomy/__tests__/governance.test.js.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/integration.test.d.ts +0 -2
- package/dist/infra/lib/autonomy/__tests__/integration.test.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/integration.test.js +0 -480
- package/dist/infra/lib/autonomy/__tests__/integration.test.js.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/proactive.test.d.ts +0 -2
- package/dist/infra/lib/autonomy/__tests__/proactive.test.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/proactive.test.js +0 -410
- package/dist/infra/lib/autonomy/__tests__/proactive.test.js.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/sentinel.test.d.ts +0 -2
- package/dist/infra/lib/autonomy/__tests__/sentinel.test.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/sentinel.test.js +0 -486
- package/dist/infra/lib/autonomy/__tests__/sentinel.test.js.map +0 -1
- package/dist/infra/lib/autonomy/index.d.ts +0 -18
- package/dist/infra/lib/autonomy/index.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/index.js +0 -22
- package/dist/infra/lib/autonomy/index.js.map +0 -1
- package/dist/infra/lib/autonomy/schemas.d.ts +0 -317
- package/dist/infra/lib/autonomy/schemas.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/schemas.js +0 -90
- package/dist/infra/lib/autonomy/schemas.js.map +0 -1
- package/dist/infra/lib/claude/index.d.ts +0 -5
- package/dist/infra/lib/claude/index.d.ts.map +0 -1
- package/dist/infra/lib/claude/index.js +0 -5
- package/dist/infra/lib/claude/index.js.map +0 -1
- package/dist/infra/lib/claude/storage.d.ts +0 -12
- package/dist/infra/lib/claude/storage.d.ts.map +0 -1
- package/dist/infra/lib/claude/storage.js +0 -54
- package/dist/infra/lib/claude/storage.js.map +0 -1
- package/dist/infra/lib/gemini/auth.d.ts +0 -18
- package/dist/infra/lib/gemini/auth.d.ts.map +0 -1
- package/dist/infra/lib/gemini/auth.js +0 -32
- package/dist/infra/lib/gemini/auth.js.map +0 -1
- package/dist/infra/lib/gemini/capabilities.d.ts +0 -28
- package/dist/infra/lib/gemini/capabilities.d.ts.map +0 -1
- package/dist/infra/lib/gemini/capabilities.js +0 -178
- package/dist/infra/lib/gemini/capabilities.js.map +0 -1
- package/dist/infra/lib/gemini/chat.d.ts +0 -35
- package/dist/infra/lib/gemini/chat.d.ts.map +0 -1
- package/dist/infra/lib/gemini/chat.js +0 -161
- package/dist/infra/lib/gemini/chat.js.map +0 -1
- package/dist/infra/lib/gemini/completion.d.ts +0 -12
- package/dist/infra/lib/gemini/completion.d.ts.map +0 -1
- package/dist/infra/lib/gemini/completion.js +0 -13
- package/dist/infra/lib/gemini/completion.js.map +0 -1
- package/dist/infra/lib/gemini/constants.d.ts +0 -8
- package/dist/infra/lib/gemini/constants.d.ts.map +0 -1
- package/dist/infra/lib/gemini/constants.js +0 -11
- package/dist/infra/lib/gemini/constants.js.map +0 -1
- package/dist/infra/lib/gemini/index.d.ts +0 -13
- package/dist/infra/lib/gemini/index.d.ts.map +0 -1
- package/dist/infra/lib/gemini/index.js +0 -12
- package/dist/infra/lib/gemini/index.js.map +0 -1
- package/dist/infra/lib/gemini/models.d.ts +0 -11
- package/dist/infra/lib/gemini/models.d.ts.map +0 -1
- package/dist/infra/lib/gemini/models.js +0 -38
- package/dist/infra/lib/gemini/models.js.map +0 -1
- package/dist/infra/lib/gemini/orchestration.d.ts +0 -33
- package/dist/infra/lib/gemini/orchestration.d.ts.map +0 -1
- package/dist/infra/lib/gemini/orchestration.js +0 -62
- package/dist/infra/lib/gemini/orchestration.js.map +0 -1
- package/dist/infra/lib/gemini/types.d.ts +0 -115
- package/dist/infra/lib/gemini/types.d.ts.map +0 -1
- package/dist/infra/lib/gemini/types.js +0 -5
- package/dist/infra/lib/gemini/types.js.map +0 -1
- package/dist/infra/orchestrator/AgentAnnouncer.d.ts +0 -64
- package/dist/infra/orchestrator/AgentAnnouncer.d.ts.map +0 -1
- package/dist/infra/orchestrator/AgentAnnouncer.js +0 -127
- package/dist/infra/orchestrator/AgentAnnouncer.js.map +0 -1
- package/dist/infra/orchestrator/AgentAnnouncer.test.d.ts +0 -5
- package/dist/infra/orchestrator/AgentAnnouncer.test.d.ts.map +0 -1
- package/dist/infra/orchestrator/AgentAnnouncer.test.js +0 -119
- package/dist/infra/orchestrator/AgentAnnouncer.test.js.map +0 -1
- package/dist/infra/orchestrator/AgentExecutor.d.ts +0 -22
- package/dist/infra/orchestrator/AgentExecutor.d.ts.map +0 -1
- package/dist/infra/orchestrator/AgentExecutor.js +0 -272
- package/dist/infra/orchestrator/AgentExecutor.js.map +0 -1
- package/dist/infra/orchestrator/AgentManager.d.ts +0 -72
- package/dist/infra/orchestrator/AgentManager.d.ts.map +0 -1
- package/dist/infra/orchestrator/AgentManager.js +0 -183
- package/dist/infra/orchestrator/AgentManager.js.map +0 -1
- package/dist/infra/orchestrator/AgentManifestCache.d.ts +0 -54
- package/dist/infra/orchestrator/AgentManifestCache.d.ts.map +0 -1
- package/dist/infra/orchestrator/AgentManifestCache.js +0 -191
- package/dist/infra/orchestrator/AgentManifestCache.js.map +0 -1
- package/dist/infra/orchestrator/AgentRegistry.d.ts +0 -76
- package/dist/infra/orchestrator/AgentRegistry.d.ts.map +0 -1
- package/dist/infra/orchestrator/AgentRegistry.js +0 -217
- package/dist/infra/orchestrator/AgentRegistry.js.map +0 -1
- package/dist/infra/orchestrator/AgentRegistry.test.d.ts +0 -5
- package/dist/infra/orchestrator/AgentRegistry.test.d.ts.map +0 -1
- package/dist/infra/orchestrator/AgentRegistry.test.js +0 -122
- package/dist/infra/orchestrator/AgentRegistry.test.js.map +0 -1
- package/dist/infra/orchestrator/BackgroundManager.d.ts +0 -128
- package/dist/infra/orchestrator/BackgroundManager.d.ts.map +0 -1
- package/dist/infra/orchestrator/BackgroundManager.js +0 -620
- package/dist/infra/orchestrator/BackgroundManager.js.map +0 -1
- package/dist/infra/orchestrator/BackgroundManager.test.d.ts +0 -6
- package/dist/infra/orchestrator/BackgroundManager.test.d.ts.map +0 -1
- package/dist/infra/orchestrator/BackgroundManager.test.js +0 -162
- package/dist/infra/orchestrator/BackgroundManager.test.js.map +0 -1
- package/dist/infra/orchestrator/CheckpointManager.d.ts +0 -54
- package/dist/infra/orchestrator/CheckpointManager.d.ts.map +0 -1
- package/dist/infra/orchestrator/CheckpointManager.js +0 -121
- package/dist/infra/orchestrator/CheckpointManager.js.map +0 -1
- package/dist/infra/orchestrator/CodexAgentRuntime.d.ts +0 -12
- package/dist/infra/orchestrator/CodexAgentRuntime.d.ts.map +0 -1
- package/dist/infra/orchestrator/CodexAgentRuntime.js +0 -94
- package/dist/infra/orchestrator/CodexAgentRuntime.js.map +0 -1
- package/dist/infra/orchestrator/CodexAgentRuntime.test.d.ts +0 -2
- package/dist/infra/orchestrator/CodexAgentRuntime.test.d.ts.map +0 -1
- package/dist/infra/orchestrator/CodexAgentRuntime.test.js +0 -37
- package/dist/infra/orchestrator/CodexAgentRuntime.test.js.map +0 -1
- package/dist/infra/orchestrator/LLMCluster.d.ts +0 -82
- package/dist/infra/orchestrator/LLMCluster.d.ts.map +0 -1
- package/dist/infra/orchestrator/LLMCluster.js +0 -146
- package/dist/infra/orchestrator/LLMCluster.js.map +0 -1
- package/dist/infra/orchestrator/MultiLlmResearch.d.ts +0 -31
- package/dist/infra/orchestrator/MultiLlmResearch.d.ts.map +0 -1
- package/dist/infra/orchestrator/MultiLlmResearch.js +0 -160
- package/dist/infra/orchestrator/MultiLlmResearch.js.map +0 -1
- package/dist/infra/orchestrator/PhasePipeline.d.ts +0 -122
- package/dist/infra/orchestrator/PhasePipeline.d.ts.map +0 -1
- package/dist/infra/orchestrator/PhasePipeline.js +0 -385
- package/dist/infra/orchestrator/PhasePipeline.js.map +0 -1
- package/dist/infra/orchestrator/PhaseResultStore.d.ts +0 -39
- package/dist/infra/orchestrator/PhaseResultStore.d.ts.map +0 -1
- package/dist/infra/orchestrator/PhaseResultStore.js +0 -151
- package/dist/infra/orchestrator/PhaseResultStore.js.map +0 -1
- package/dist/infra/orchestrator/SessionStore.d.ts +0 -40
- package/dist/infra/orchestrator/SessionStore.d.ts.map +0 -1
- package/dist/infra/orchestrator/SessionStore.js +0 -116
- package/dist/infra/orchestrator/SessionStore.js.map +0 -1
- package/dist/infra/orchestrator/SmartRouter.d.ts +0 -90
- package/dist/infra/orchestrator/SmartRouter.d.ts.map +0 -1
- package/dist/infra/orchestrator/SmartRouter.js +0 -277
- package/dist/infra/orchestrator/SmartRouter.js.map +0 -1
- package/dist/infra/orchestrator/SmartRouter.test.d.ts +0 -5
- package/dist/infra/orchestrator/SmartRouter.test.d.ts.map +0 -1
- package/dist/infra/orchestrator/SmartRouter.test.js +0 -484
- package/dist/infra/orchestrator/SmartRouter.test.js.map +0 -1
- package/dist/infra/orchestrator/SwarmOrchestrator.d.ts +0 -143
- package/dist/infra/orchestrator/SwarmOrchestrator.d.ts.map +0 -1
- package/dist/infra/orchestrator/SwarmOrchestrator.js +0 -378
- package/dist/infra/orchestrator/SwarmOrchestrator.js.map +0 -1
- package/dist/infra/orchestrator/SwarmOrchestrator.test.d.ts +0 -5
- package/dist/infra/orchestrator/SwarmOrchestrator.test.d.ts.map +0 -1
- package/dist/infra/orchestrator/SwarmOrchestrator.test.js +0 -95
- package/dist/infra/orchestrator/SwarmOrchestrator.test.js.map +0 -1
- package/dist/infra/orchestrator/agentDiscovery.d.ts +0 -26
- package/dist/infra/orchestrator/agentDiscovery.d.ts.map +0 -1
- package/dist/infra/orchestrator/agentDiscovery.js +0 -175
- package/dist/infra/orchestrator/agentDiscovery.js.map +0 -1
- package/dist/infra/orchestrator/backgroundAgent.d.ts +0 -9
- package/dist/infra/orchestrator/backgroundAgent.d.ts.map +0 -1
- package/dist/infra/orchestrator/backgroundAgent.js +0 -10
- package/dist/infra/orchestrator/backgroundAgent.js.map +0 -1
- package/dist/infra/orchestrator/index.d.ts +0 -207
- package/dist/infra/orchestrator/index.d.ts.map +0 -1
- package/dist/infra/orchestrator/index.js +0 -362
- package/dist/infra/orchestrator/index.js.map +0 -1
- package/dist/infra/orchestrator/orchestrator.d.ts +0 -60
- package/dist/infra/orchestrator/orchestrator.d.ts.map +0 -1
- package/dist/infra/orchestrator/orchestrator.js +0 -214
- package/dist/infra/orchestrator/orchestrator.js.map +0 -1
- package/dist/infra/orchestrator/parallelResearch.d.ts +0 -27
- package/dist/infra/orchestrator/parallelResearch.d.ts.map +0 -1
- package/dist/infra/orchestrator/parallelResearch.js +0 -285
- package/dist/infra/orchestrator/parallelResearch.js.map +0 -1
- package/dist/infra/orchestrator/types.d.ts +0 -205
- package/dist/infra/orchestrator/types.d.ts.map +0 -1
- package/dist/infra/orchestrator/types.js +0 -87
- package/dist/infra/orchestrator/types.js.map +0 -1
- package/dist/infra/orchestrator/types.test.d.ts +0 -2
- package/dist/infra/orchestrator/types.test.d.ts.map +0 -1
- package/dist/infra/orchestrator/types.test.js +0 -57
- package/dist/infra/orchestrator/types.test.js.map +0 -1
- package/dist/tools/semantic/analyzeDependencyGraph.d.ts +0 -12
- package/dist/tools/semantic/analyzeDependencyGraph.d.ts.map +0 -1
- package/dist/tools/semantic/analyzeDependencyGraph.js +0 -359
- package/dist/tools/semantic/analyzeDependencyGraph.js.map +0 -1
- package/dist/tools/semantic/astGrep.d.ts +0 -25
- package/dist/tools/semantic/astGrep.d.ts.map +0 -1
- package/dist/tools/semantic/astGrep.js +0 -324
- package/dist/tools/semantic/astGrep.js.map +0 -1
- package/dist/tools/semantic/astGrep.test.d.ts +0 -2
- package/dist/tools/semantic/astGrep.test.d.ts.map +0 -1
- package/dist/tools/semantic/astGrep.test.js +0 -74
- package/dist/tools/semantic/astGrep.test.js.map +0 -1
- package/dist/tools/semantic/findReferences.d.ts +0 -9
- package/dist/tools/semantic/findReferences.d.ts.map +0 -1
- package/dist/tools/semantic/findReferences.js +0 -200
- package/dist/tools/semantic/findReferences.js.map +0 -1
- package/dist/tools/semantic/findSymbol.d.ts +0 -8
- package/dist/tools/semantic/findSymbol.d.ts.map +0 -1
- package/dist/tools/semantic/findSymbol.js +0 -204
- package/dist/tools/semantic/findSymbol.js.map +0 -1
- package/dist/tools/semantic/index.d.ts +0 -9
- package/dist/tools/semantic/index.d.ts.map +0 -1
- package/dist/tools/semantic/index.js +0 -11
- package/dist/tools/semantic/index.js.map +0 -1
- package/dist/tools/semantic/lsp.d.ts +0 -68
- package/dist/tools/semantic/lsp.d.ts.map +0 -1
- package/dist/tools/semantic/lsp.js +0 -561
- package/dist/tools/semantic/lsp.js.map +0 -1
- package/dist/tools/spec/e2eTestGenerator.d.ts +0 -61
- package/dist/tools/spec/e2eTestGenerator.d.ts.map +0 -1
- package/dist/tools/spec/e2eTestGenerator.js +0 -255
- package/dist/tools/spec/e2eTestGenerator.js.map +0 -1
- package/dist/tools/spec/specVersioning.d.ts +0 -76
- package/dist/tools/spec/specVersioning.d.ts.map +0 -1
- package/dist/tools/spec/specVersioning.js +0 -236
- package/dist/tools/spec/specVersioning.js.map +0 -1
|
@@ -1,484 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SmartRouter Tests - LLM smart routing and fallback management
|
|
3
|
-
*/
|
|
4
|
-
import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
|
|
5
|
-
import { SmartRouter, AllProvidersFailedError, getSmartRouter } from './SmartRouter.js';
|
|
6
|
-
// Mock external LLM APIs
|
|
7
|
-
vi.mock('../lib/gpt/index.js', () => ({
|
|
8
|
-
coreGptOrchestrate: vi.fn(),
|
|
9
|
-
}));
|
|
10
|
-
vi.mock('../lib/antigravity/index.js', () => ({
|
|
11
|
-
coreAntigravityOrchestrate: vi.fn(),
|
|
12
|
-
}));
|
|
13
|
-
vi.mock('../lib/utils.js', () => ({
|
|
14
|
-
debugLog: vi.fn(),
|
|
15
|
-
}));
|
|
16
|
-
// Dynamic priority: codex=true, antigravity=true
|
|
17
|
-
// architecture → ['gpt', 'antigravity', 'claude']
|
|
18
|
-
// debugging → ['gpt', 'claude']
|
|
19
|
-
// code-analysis → ['gpt', 'claude']
|
|
20
|
-
// code-gen → ['gpt', 'claude']
|
|
21
|
-
// code-review → ['gpt', 'antigravity', 'claude']
|
|
22
|
-
// web-search → ['antigravity', 'claude']
|
|
23
|
-
// uiux → ['antigravity', 'claude']
|
|
24
|
-
// general → ['claude'] (not in any codex/antigravity list)
|
|
25
|
-
// reasoning → ['gpt', 'antigravity', 'claude']
|
|
26
|
-
vi.mock('../lib/llm-availability.js', () => ({
|
|
27
|
-
detectLlmAvailability: vi.fn(() => ({ codex: true, antigravity: true })),
|
|
28
|
-
}));
|
|
29
|
-
// Import mocked modules
|
|
30
|
-
import { coreGptOrchestrate } from '../lib/gpt/index.js';
|
|
31
|
-
import { coreAntigravityOrchestrate } from '../lib/antigravity/index.js';
|
|
32
|
-
const mockGpt = coreGptOrchestrate;
|
|
33
|
-
const mockAntigravity = coreAntigravityOrchestrate;
|
|
34
|
-
describe('SmartRouter', () => {
|
|
35
|
-
let router;
|
|
36
|
-
beforeEach(() => {
|
|
37
|
-
vi.clearAllMocks();
|
|
38
|
-
vi.useRealTimers();
|
|
39
|
-
// 기본 router 의 claude fallback 은 테스트에서 실패하도록 주입한다.
|
|
40
|
-
// (주입하지 않으면 "all providers fail" 테스트가 실제 claude CLI 를 spawn한다)
|
|
41
|
-
router = new SmartRouter({
|
|
42
|
-
claudeRunner: {
|
|
43
|
-
claudeOrchestrate: vi.fn().mockRejectedValue(new Error('claude unavailable in test')),
|
|
44
|
-
},
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
afterEach(() => {
|
|
48
|
-
vi.useRealTimers();
|
|
49
|
-
});
|
|
50
|
-
// ─── Provider Selection Based on Task Type ───
|
|
51
|
-
describe('provider selection by task type', () => {
|
|
52
|
-
it('should use GPT first for architecture tasks', async () => {
|
|
53
|
-
mockGpt.mockResolvedValueOnce('GPT architecture response');
|
|
54
|
-
const result = await router.route({
|
|
55
|
-
type: 'architecture',
|
|
56
|
-
prompt: 'Review this architecture',
|
|
57
|
-
});
|
|
58
|
-
expect(result.provider).toBe('gpt');
|
|
59
|
-
expect(result.content).toBe('GPT architecture response');
|
|
60
|
-
expect(result.success).toBe(true);
|
|
61
|
-
expect(result.usedFallback).toBe(false);
|
|
62
|
-
expect(mockGpt).toHaveBeenCalledOnce();
|
|
63
|
-
expect(mockAntigravity).not.toHaveBeenCalled();
|
|
64
|
-
});
|
|
65
|
-
it('should use GPT first for debugging tasks', async () => {
|
|
66
|
-
mockGpt.mockResolvedValueOnce('GPT debug response');
|
|
67
|
-
const result = await router.route({
|
|
68
|
-
type: 'debugging',
|
|
69
|
-
prompt: 'Debug this issue',
|
|
70
|
-
});
|
|
71
|
-
expect(result.provider).toBe('gpt');
|
|
72
|
-
expect(result.success).toBe(true);
|
|
73
|
-
});
|
|
74
|
-
it('should use GPT first for code-analysis tasks', async () => {
|
|
75
|
-
mockGpt.mockResolvedValueOnce('GPT analysis');
|
|
76
|
-
const result = await router.route({
|
|
77
|
-
type: 'code-analysis',
|
|
78
|
-
prompt: 'Analyze this code',
|
|
79
|
-
});
|
|
80
|
-
expect(result.provider).toBe('gpt');
|
|
81
|
-
});
|
|
82
|
-
it('should use Antigravity first for web-search tasks', async () => {
|
|
83
|
-
mockAntigravity.mockResolvedValueOnce('Antigravity search result');
|
|
84
|
-
const result = await router.route({
|
|
85
|
-
type: 'web-search',
|
|
86
|
-
prompt: 'Search for something',
|
|
87
|
-
});
|
|
88
|
-
expect(result.provider).toBe('antigravity');
|
|
89
|
-
expect(result.content).toBe('Antigravity search result');
|
|
90
|
-
expect(mockAntigravity).toHaveBeenCalledOnce();
|
|
91
|
-
expect(mockGpt).not.toHaveBeenCalled();
|
|
92
|
-
});
|
|
93
|
-
it('should use Antigravity first for uiux tasks', async () => {
|
|
94
|
-
mockAntigravity.mockResolvedValueOnce('Antigravity UI feedback');
|
|
95
|
-
const result = await router.route({
|
|
96
|
-
type: 'uiux',
|
|
97
|
-
prompt: 'Review this UI',
|
|
98
|
-
});
|
|
99
|
-
expect(result.provider).toBe('antigravity');
|
|
100
|
-
expect(result.content).toBe('Antigravity UI feedback');
|
|
101
|
-
});
|
|
102
|
-
it('should respect preferredLlm override', async () => {
|
|
103
|
-
mockAntigravity.mockResolvedValueOnce('Antigravity response');
|
|
104
|
-
const result = await router.route({
|
|
105
|
-
type: 'architecture', // normally GPT-first
|
|
106
|
-
prompt: 'Review this',
|
|
107
|
-
preferredLlm: 'antigravity',
|
|
108
|
-
});
|
|
109
|
-
expect(result.provider).toBe('antigravity');
|
|
110
|
-
expect(result.content).toBe('Antigravity response');
|
|
111
|
-
expect(mockGpt).not.toHaveBeenCalled();
|
|
112
|
-
});
|
|
113
|
-
it('should use GPT first for code-review tasks', async () => {
|
|
114
|
-
mockGpt.mockResolvedValueOnce('GPT code review');
|
|
115
|
-
const result = await router.route({
|
|
116
|
-
type: 'code-review',
|
|
117
|
-
prompt: 'Review this code',
|
|
118
|
-
});
|
|
119
|
-
expect(result.provider).toBe('gpt');
|
|
120
|
-
});
|
|
121
|
-
it('should use GPT first for reasoning tasks', async () => {
|
|
122
|
-
mockGpt.mockResolvedValueOnce('GPT reasoning');
|
|
123
|
-
const result = await router.route({
|
|
124
|
-
type: 'reasoning',
|
|
125
|
-
prompt: 'Reason about this',
|
|
126
|
-
});
|
|
127
|
-
expect(result.provider).toBe('gpt');
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
// ─── Fallback Chain ───
|
|
131
|
-
describe('fallback chain', () => {
|
|
132
|
-
it('should fall back to Antigravity when GPT fails for architecture', async () => {
|
|
133
|
-
// architecture: ['gpt', 'antigravity', 'claude']
|
|
134
|
-
mockGpt.mockRejectedValueOnce(new Error('GPT rate limit exceeded'));
|
|
135
|
-
mockAntigravity.mockResolvedValueOnce('Antigravity fallback response');
|
|
136
|
-
const result = await router.route({
|
|
137
|
-
type: 'architecture',
|
|
138
|
-
prompt: 'Review this',
|
|
139
|
-
maxRetries: 0,
|
|
140
|
-
});
|
|
141
|
-
expect(result.provider).toBe('antigravity');
|
|
142
|
-
expect(result.content).toBe('Antigravity fallback response');
|
|
143
|
-
expect(result.usedFallback).toBe(true);
|
|
144
|
-
expect(result.attemptedProviders).toContain('gpt');
|
|
145
|
-
expect(result.attemptedProviders).toContain('antigravity');
|
|
146
|
-
});
|
|
147
|
-
it('should fall back to GPT when Antigravity fails for code-review with preferredLlm', async () => {
|
|
148
|
-
// code-review: ['gpt', 'antigravity', 'claude'] — override with preferredLlm=antigravity → ['antigravity', 'gpt', 'claude']
|
|
149
|
-
mockAntigravity.mockRejectedValueOnce(new Error('Antigravity quota exhausted'));
|
|
150
|
-
mockGpt.mockResolvedValueOnce('GPT fallback');
|
|
151
|
-
const result = await router.route({
|
|
152
|
-
type: 'code-review',
|
|
153
|
-
prompt: 'Review code',
|
|
154
|
-
preferredLlm: 'antigravity',
|
|
155
|
-
maxRetries: 0,
|
|
156
|
-
});
|
|
157
|
-
expect(result.provider).toBe('gpt');
|
|
158
|
-
expect(result.usedFallback).toBe(true);
|
|
159
|
-
});
|
|
160
|
-
it('should skip retries for auth errors and move to next provider', async () => {
|
|
161
|
-
// architecture: ['gpt', 'antigravity', 'claude']
|
|
162
|
-
mockGpt.mockRejectedValueOnce(new Error('No API key set'));
|
|
163
|
-
mockAntigravity.mockResolvedValueOnce('Antigravity response');
|
|
164
|
-
const result = await router.route({
|
|
165
|
-
type: 'architecture',
|
|
166
|
-
prompt: 'Analyze code',
|
|
167
|
-
maxRetries: 2,
|
|
168
|
-
});
|
|
169
|
-
// GPT should only be called once (no retries for auth errors)
|
|
170
|
-
expect(mockGpt).toHaveBeenCalledTimes(1);
|
|
171
|
-
expect(result.provider).toBe('antigravity');
|
|
172
|
-
expect(result.usedFallback).toBe(true);
|
|
173
|
-
});
|
|
174
|
-
it('should skip retries for rate limit errors (429)', async () => {
|
|
175
|
-
// code-review: ['gpt', 'antigravity', 'claude']
|
|
176
|
-
mockGpt.mockRejectedValueOnce(new Error('429 Too Many Requests'));
|
|
177
|
-
mockAntigravity.mockResolvedValueOnce('OK');
|
|
178
|
-
await router.route({
|
|
179
|
-
type: 'code-review',
|
|
180
|
-
prompt: 'Test',
|
|
181
|
-
maxRetries: 2,
|
|
182
|
-
});
|
|
183
|
-
expect(mockGpt).toHaveBeenCalledTimes(1);
|
|
184
|
-
});
|
|
185
|
-
it('should retry on transient errors before falling back', async () => {
|
|
186
|
-
// architecture: ['gpt', 'antigravity', 'claude']
|
|
187
|
-
mockGpt
|
|
188
|
-
.mockRejectedValueOnce(new Error('Network timeout'))
|
|
189
|
-
.mockRejectedValueOnce(new Error('Network timeout'))
|
|
190
|
-
.mockResolvedValueOnce('GPT recovered');
|
|
191
|
-
const result = await router.route({
|
|
192
|
-
type: 'architecture',
|
|
193
|
-
prompt: 'Test',
|
|
194
|
-
maxRetries: 2,
|
|
195
|
-
});
|
|
196
|
-
expect(mockGpt).toHaveBeenCalledTimes(3); // initial + 2 retries
|
|
197
|
-
expect(result.provider).toBe('gpt');
|
|
198
|
-
expect(result.usedFallback).toBe(false);
|
|
199
|
-
});
|
|
200
|
-
it('should use custom systemPrompt when provided', async () => {
|
|
201
|
-
// architecture: ['gpt', 'antigravity', 'claude']
|
|
202
|
-
mockGpt.mockResolvedValueOnce('Response');
|
|
203
|
-
await router.route({
|
|
204
|
-
type: 'architecture',
|
|
205
|
-
prompt: 'Test prompt',
|
|
206
|
-
systemPrompt: 'Custom system prompt',
|
|
207
|
-
});
|
|
208
|
-
expect(mockGpt).toHaveBeenCalledWith('Test prompt', 'Custom system prompt', expect.objectContaining({ jsonMode: false, signal: expect.any(AbortSignal) }));
|
|
209
|
-
});
|
|
210
|
-
it('should use default systemPrompt when not provided', async () => {
|
|
211
|
-
// architecture: ['gpt', 'antigravity', 'claude']
|
|
212
|
-
mockGpt.mockResolvedValueOnce('Response');
|
|
213
|
-
await router.route({
|
|
214
|
-
type: 'architecture',
|
|
215
|
-
prompt: 'Test prompt',
|
|
216
|
-
});
|
|
217
|
-
expect(mockGpt).toHaveBeenCalledWith('Test prompt', 'You are a helpful assistant.', expect.objectContaining({ jsonMode: false, signal: expect.any(AbortSignal) }));
|
|
218
|
-
});
|
|
219
|
-
});
|
|
220
|
-
// ─── Availability Caching (5min TTL) ───
|
|
221
|
-
describe('availability caching', () => {
|
|
222
|
-
it('should skip providers marked as unavailable', async () => {
|
|
223
|
-
// code-review: ['gpt', 'antigravity', 'claude']
|
|
224
|
-
// Fail GPT with rate-limit (skip-retry pattern) to quickly mark unavailable
|
|
225
|
-
mockGpt.mockRejectedValue(new Error('GPT server error'));
|
|
226
|
-
mockAntigravity.mockResolvedValue('Antigravity response');
|
|
227
|
-
// Route 3 times with maxRetries=0 to accumulate 3 error counts on GPT
|
|
228
|
-
await router.route({ type: 'code-review', prompt: 'test1', maxRetries: 0 });
|
|
229
|
-
await router.route({ type: 'code-review', prompt: 'test2', maxRetries: 0 });
|
|
230
|
-
await router.route({ type: 'code-review', prompt: 'test3', maxRetries: 0 });
|
|
231
|
-
// After 3 failures, GPT is marked unavailable
|
|
232
|
-
const cache = router.getCacheStatus();
|
|
233
|
-
expect(cache.gpt.errorCount).toBeGreaterThanOrEqual(3);
|
|
234
|
-
expect(cache.gpt.available).toBe(false);
|
|
235
|
-
// Reset call counts
|
|
236
|
-
mockGpt.mockClear();
|
|
237
|
-
mockAntigravity.mockClear();
|
|
238
|
-
mockAntigravity.mockResolvedValueOnce('Antigravity from cache');
|
|
239
|
-
// Next route should skip GPT entirely
|
|
240
|
-
const result = await router.route({
|
|
241
|
-
type: 'code-review',
|
|
242
|
-
prompt: 'test4',
|
|
243
|
-
maxRetries: 0,
|
|
244
|
-
});
|
|
245
|
-
expect(mockGpt).not.toHaveBeenCalled();
|
|
246
|
-
expect(result.provider).toBe('antigravity');
|
|
247
|
-
});
|
|
248
|
-
it('should reset availability after TTL expires', async () => {
|
|
249
|
-
// code-review: ['gpt', 'antigravity', 'claude']
|
|
250
|
-
mockGpt.mockRejectedValue(new Error('GPT server error'));
|
|
251
|
-
mockAntigravity.mockResolvedValue('Antigravity');
|
|
252
|
-
// Accumulate 3 failures
|
|
253
|
-
await router.route({ type: 'code-review', prompt: 'test', maxRetries: 0 });
|
|
254
|
-
await router.route({ type: 'code-review', prompt: 'test', maxRetries: 0 });
|
|
255
|
-
await router.route({ type: 'code-review', prompt: 'test', maxRetries: 0 });
|
|
256
|
-
expect(router.getCacheStatus().gpt.available).toBe(false);
|
|
257
|
-
// Simulate TTL expiry by advancing time
|
|
258
|
-
vi.useFakeTimers();
|
|
259
|
-
const now = Date.now();
|
|
260
|
-
vi.setSystemTime(now + 5 * 60 * 1000 + 1); // 5min + 1ms
|
|
261
|
-
mockGpt.mockClear();
|
|
262
|
-
mockGpt.mockResolvedValueOnce('GPT recovered');
|
|
263
|
-
const result = await router.route({
|
|
264
|
-
type: 'code-review',
|
|
265
|
-
prompt: 'test',
|
|
266
|
-
});
|
|
267
|
-
expect(mockGpt).toHaveBeenCalled();
|
|
268
|
-
expect(result.provider).toBe('gpt');
|
|
269
|
-
vi.useRealTimers();
|
|
270
|
-
});
|
|
271
|
-
it('should mark provider available on success', async () => {
|
|
272
|
-
// architecture: ['gpt', 'antigravity', 'claude']
|
|
273
|
-
mockGpt.mockResolvedValueOnce('GPT OK');
|
|
274
|
-
await router.route({ type: 'architecture', prompt: 'test' });
|
|
275
|
-
const cache = router.getCacheStatus();
|
|
276
|
-
expect(cache.gpt.available).toBe(true);
|
|
277
|
-
expect(cache.gpt.errorCount).toBe(0);
|
|
278
|
-
});
|
|
279
|
-
it('should reset cache via resetCache()', () => {
|
|
280
|
-
const router2 = new SmartRouter();
|
|
281
|
-
const cache = router2.getCacheStatus();
|
|
282
|
-
expect(cache.gpt.available).toBe(true);
|
|
283
|
-
expect(cache.antigravity.available).toBe(true);
|
|
284
|
-
router2.resetCache();
|
|
285
|
-
const reset = router2.getCacheStatus();
|
|
286
|
-
expect(reset.gpt.errorCount).toBe(0);
|
|
287
|
-
expect(reset.antigravity.errorCount).toBe(0);
|
|
288
|
-
});
|
|
289
|
-
it('should not cache claude provider availability', async () => {
|
|
290
|
-
// web-search: ['antigravity', 'claude'] — claude is always considered available
|
|
291
|
-
mockAntigravity.mockRejectedValueOnce(new Error('Antigravity auth'));
|
|
292
|
-
// claude will fail with "Claude fallback - handled by caller"
|
|
293
|
-
// but isUnavailable('claude') always returns false
|
|
294
|
-
await expect(router.route({ type: 'web-search', prompt: 'test', maxRetries: 0 })).rejects.toThrow(AllProvidersFailedError);
|
|
295
|
-
// claude should still be "available" (not cached)
|
|
296
|
-
// Verify by checking that subsequent calls still attempt claude
|
|
297
|
-
mockAntigravity.mockRejectedValueOnce(new Error('Antigravity auth'));
|
|
298
|
-
const errorPromise = router.route({ type: 'web-search', prompt: 'test', maxRetries: 0 });
|
|
299
|
-
await expect(errorPromise).rejects.toThrow(AllProvidersFailedError);
|
|
300
|
-
});
|
|
301
|
-
});
|
|
302
|
-
// ─── Edge Cases ───
|
|
303
|
-
describe('edge cases', () => {
|
|
304
|
-
it('should throw AllProvidersFailedError when all providers fail', async () => {
|
|
305
|
-
// architecture: ['gpt', 'antigravity', 'claude']
|
|
306
|
-
mockGpt.mockRejectedValueOnce(new Error('GPT auth failure'));
|
|
307
|
-
mockAntigravity.mockRejectedValueOnce(new Error('Antigravity auth failure'));
|
|
308
|
-
await expect(router.route({
|
|
309
|
-
type: 'architecture',
|
|
310
|
-
prompt: 'Test',
|
|
311
|
-
maxRetries: 0,
|
|
312
|
-
})).rejects.toThrow(AllProvidersFailedError);
|
|
313
|
-
});
|
|
314
|
-
it('AllProvidersFailedError should contain attempted providers and errors', async () => {
|
|
315
|
-
// architecture: ['gpt', 'antigravity', 'claude']
|
|
316
|
-
mockGpt.mockRejectedValueOnce(new Error('GPT unauthorized'));
|
|
317
|
-
mockAntigravity.mockRejectedValueOnce(new Error('Antigravity unauthorized'));
|
|
318
|
-
try {
|
|
319
|
-
await router.route({
|
|
320
|
-
type: 'architecture',
|
|
321
|
-
prompt: 'Test',
|
|
322
|
-
maxRetries: 0,
|
|
323
|
-
});
|
|
324
|
-
expect.fail('Should have thrown');
|
|
325
|
-
}
|
|
326
|
-
catch (err) {
|
|
327
|
-
const error = err;
|
|
328
|
-
expect(error).toBeInstanceOf(AllProvidersFailedError);
|
|
329
|
-
expect(error.attemptedProviders).toContain('gpt');
|
|
330
|
-
expect(error.attemptedProviders).toContain('antigravity');
|
|
331
|
-
expect(error.errors['gpt']).toContain('GPT unauthorized');
|
|
332
|
-
expect(error.errors['antigravity']).toContain('Antigravity unauthorized');
|
|
333
|
-
expect(error.duration).toBeGreaterThanOrEqual(0);
|
|
334
|
-
expect(error.name).toBe('AllProvidersFailedError');
|
|
335
|
-
}
|
|
336
|
-
});
|
|
337
|
-
it('should fall back to claude when gpt and antigravity fail', async () => {
|
|
338
|
-
// architecture: ['gpt', 'antigravity', 'claude']
|
|
339
|
-
mockGpt.mockRejectedValueOnce(new Error('GPT auth'));
|
|
340
|
-
mockAntigravity.mockRejectedValueOnce(new Error('Antigravity auth'));
|
|
341
|
-
const claudeOrchestrate = vi.fn().mockResolvedValue('Claude fallback response');
|
|
342
|
-
const claudeRouter = new SmartRouter({ claudeRunner: { claudeOrchestrate } });
|
|
343
|
-
const result = await claudeRouter.route({
|
|
344
|
-
type: 'architecture',
|
|
345
|
-
prompt: 'Test',
|
|
346
|
-
maxRetries: 0,
|
|
347
|
-
});
|
|
348
|
-
expect(result.provider).toBe('claude');
|
|
349
|
-
expect(result.content).toBe('Claude fallback response');
|
|
350
|
-
expect(result.success).toBe(true);
|
|
351
|
-
expect(result.usedFallback).toBe(true);
|
|
352
|
-
expect(result.attemptedProviders).toContain('claude');
|
|
353
|
-
expect(claudeOrchestrate).toHaveBeenCalledOnce();
|
|
354
|
-
});
|
|
355
|
-
it('should use claude directly for a claude-only task (general)', async () => {
|
|
356
|
-
// general → ['claude']
|
|
357
|
-
const claudeOrchestrate = vi.fn().mockResolvedValue('Claude only response');
|
|
358
|
-
const claudeRouter = new SmartRouter({ claudeRunner: { claudeOrchestrate } });
|
|
359
|
-
const result = await claudeRouter.route({
|
|
360
|
-
type: 'general',
|
|
361
|
-
prompt: 'Test',
|
|
362
|
-
maxRetries: 0,
|
|
363
|
-
});
|
|
364
|
-
expect(result.provider).toBe('claude');
|
|
365
|
-
expect(result.content).toBe('Claude only response');
|
|
366
|
-
expect(result.usedFallback).toBe(false);
|
|
367
|
-
expect(mockGpt).not.toHaveBeenCalled();
|
|
368
|
-
});
|
|
369
|
-
it('should throw AllProvidersFailedError when claude fallback also fails', async () => {
|
|
370
|
-
mockGpt.mockRejectedValueOnce(new Error('GPT auth'));
|
|
371
|
-
mockAntigravity.mockRejectedValueOnce(new Error('Antigravity auth'));
|
|
372
|
-
const claudeOrchestrate = vi.fn().mockRejectedValue(new Error('claude CLI not found'));
|
|
373
|
-
const claudeRouter = new SmartRouter({ claudeRunner: { claudeOrchestrate } });
|
|
374
|
-
await expect(claudeRouter.route({ type: 'architecture', prompt: 'Test', maxRetries: 0 })).rejects.toBeInstanceOf(AllProvidersFailedError);
|
|
375
|
-
expect(claudeOrchestrate).toHaveBeenCalled();
|
|
376
|
-
});
|
|
377
|
-
it('should track duration in result', async () => {
|
|
378
|
-
mockGpt.mockResolvedValueOnce('Response');
|
|
379
|
-
const result = await router.route({
|
|
380
|
-
type: 'architecture',
|
|
381
|
-
prompt: 'Test',
|
|
382
|
-
});
|
|
383
|
-
expect(typeof result.duration).toBe('number');
|
|
384
|
-
expect(result.duration).toBeGreaterThanOrEqual(0);
|
|
385
|
-
});
|
|
386
|
-
it('should set maxRetries to 2 by default', async () => {
|
|
387
|
-
// architecture: ['gpt', 'antigravity', 'claude']
|
|
388
|
-
mockGpt
|
|
389
|
-
.mockRejectedValueOnce(new Error('Transient error 1'))
|
|
390
|
-
.mockRejectedValueOnce(new Error('Transient error 2'))
|
|
391
|
-
.mockResolvedValueOnce('Success on third attempt');
|
|
392
|
-
const result = await router.route({
|
|
393
|
-
type: 'architecture',
|
|
394
|
-
prompt: 'Test',
|
|
395
|
-
// maxRetries not specified — default is 2
|
|
396
|
-
});
|
|
397
|
-
expect(mockGpt).toHaveBeenCalledTimes(3);
|
|
398
|
-
expect(result.provider).toBe('gpt');
|
|
399
|
-
expect(result.success).toBe(true);
|
|
400
|
-
});
|
|
401
|
-
it('should report attemptedProviders length of 1 when first provider succeeds', async () => {
|
|
402
|
-
mockGpt.mockResolvedValueOnce('OK');
|
|
403
|
-
const result = await router.route({
|
|
404
|
-
type: 'architecture',
|
|
405
|
-
prompt: 'Test',
|
|
406
|
-
});
|
|
407
|
-
expect(result.attemptedProviders).toEqual(['gpt']);
|
|
408
|
-
expect(result.usedFallback).toBe(false);
|
|
409
|
-
});
|
|
410
|
-
});
|
|
411
|
-
// ─── Convenience Methods ───
|
|
412
|
-
describe('convenience methods', () => {
|
|
413
|
-
it('webSearch should route with web-search type', async () => {
|
|
414
|
-
mockAntigravity.mockResolvedValueOnce('Search results');
|
|
415
|
-
const result = await router.webSearch('test query');
|
|
416
|
-
expect(result.provider).toBe('antigravity');
|
|
417
|
-
expect(result.content).toBe('Search results');
|
|
418
|
-
});
|
|
419
|
-
it('architectureReview should route with architecture type', async () => {
|
|
420
|
-
mockGpt.mockResolvedValueOnce('Architecture analysis');
|
|
421
|
-
const result = await router.architectureReview('Review this');
|
|
422
|
-
expect(result.provider).toBe('gpt');
|
|
423
|
-
});
|
|
424
|
-
it('uiuxReview should route with uiux type', async () => {
|
|
425
|
-
mockAntigravity.mockResolvedValueOnce('UI feedback');
|
|
426
|
-
const result = await router.uiuxReview('Review UI');
|
|
427
|
-
expect(result.provider).toBe('antigravity');
|
|
428
|
-
});
|
|
429
|
-
it('codeAnalysis should route with code-analysis type', async () => {
|
|
430
|
-
mockGpt.mockResolvedValueOnce('Code analysis');
|
|
431
|
-
const result = await router.codeAnalysis('Analyze');
|
|
432
|
-
expect(result.provider).toBe('gpt');
|
|
433
|
-
});
|
|
434
|
-
it('debugging should route with debugging type', async () => {
|
|
435
|
-
mockGpt.mockResolvedValueOnce('Debug info');
|
|
436
|
-
const result = await router.debugging('Debug this');
|
|
437
|
-
expect(result.provider).toBe('gpt');
|
|
438
|
-
});
|
|
439
|
-
it('codeGen should route with code-gen type', async () => {
|
|
440
|
-
mockGpt.mockResolvedValueOnce('Generated code');
|
|
441
|
-
const result = await router.codeGen('Generate a function');
|
|
442
|
-
expect(result.provider).toBe('gpt');
|
|
443
|
-
});
|
|
444
|
-
it('codeGen should include context when provided', async () => {
|
|
445
|
-
mockGpt.mockResolvedValueOnce('Generated code');
|
|
446
|
-
await router.codeGen('Generate a function', 'Some context');
|
|
447
|
-
expect(mockGpt).toHaveBeenCalledWith('Generate a function\n\nContext:\nSome context', 'Generate clean, well-documented code.', expect.objectContaining({ jsonMode: false, signal: expect.any(AbortSignal) }));
|
|
448
|
-
});
|
|
449
|
-
});
|
|
450
|
-
// ─── Singleton ───
|
|
451
|
-
describe('getSmartRouter singleton', () => {
|
|
452
|
-
it('should return a SmartRouter instance', () => {
|
|
453
|
-
const instance = getSmartRouter();
|
|
454
|
-
expect(instance).toBeInstanceOf(SmartRouter);
|
|
455
|
-
});
|
|
456
|
-
it('should create new instance when options are provided', () => {
|
|
457
|
-
const instance1 = getSmartRouter();
|
|
458
|
-
const instance2 = getSmartRouter({ verbose: true });
|
|
459
|
-
expect(instance2).toBeInstanceOf(SmartRouter);
|
|
460
|
-
});
|
|
461
|
-
});
|
|
462
|
-
// ─── AllProvidersFailedError ───
|
|
463
|
-
describe('AllProvidersFailedError', () => {
|
|
464
|
-
it('should format message with last provider error', () => {
|
|
465
|
-
const error = new AllProvidersFailedError(['gpt', 'antigravity'], { gpt: 'GPT failed', antigravity: 'Antigravity failed' }, 1500);
|
|
466
|
-
expect(error.message).toContain('antigravity');
|
|
467
|
-
expect(error.message).toContain('Antigravity failed');
|
|
468
|
-
expect(error.attemptedProviders).toEqual(['gpt', 'antigravity']);
|
|
469
|
-
expect(error.duration).toBe(1500);
|
|
470
|
-
});
|
|
471
|
-
it('should handle empty providers list', () => {
|
|
472
|
-
const error = new AllProvidersFailedError([], {}, 100);
|
|
473
|
-
expect(error.message).toContain('No providers attempted');
|
|
474
|
-
});
|
|
475
|
-
});
|
|
476
|
-
// ─── Verbose mode ───
|
|
477
|
-
describe('verbose mode', () => {
|
|
478
|
-
it('should create router with verbose option', () => {
|
|
479
|
-
const verboseRouter = new SmartRouter({ verbose: true });
|
|
480
|
-
expect(verboseRouter).toBeInstanceOf(SmartRouter);
|
|
481
|
-
});
|
|
482
|
-
});
|
|
483
|
-
});
|
|
484
|
-
//# sourceMappingURL=SmartRouter.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SmartRouter.test.js","sourceRoot":"","sources":["../../../src/infra/orchestrator/SmartRouter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SwarmOrchestrator - 에이전트 자가 복제 패턴 (Swarm Pattern)
|
|
3
|
-
*
|
|
4
|
-
* SKILL.md 참조: Claude Code의 Swarm 패턴을 Core 자체 구현으로 재현
|
|
5
|
-
* - 에이전트가 "너무 복잡하다" 판단 시 하위 에이전트 동적 생성
|
|
6
|
-
* - 기존 launch()/poll() 인프라 활용
|
|
7
|
-
* - Claude Code + Cursor IDE 모두 지원 (플랫폼 독립)
|
|
8
|
-
*/
|
|
9
|
-
import { ToolResult } from '../types/tool.js';
|
|
10
|
-
import type { AgentResult, ClaudeModel } from './types.js';
|
|
11
|
-
/** Swarm 설정 */
|
|
12
|
-
export interface SwarmConfig {
|
|
13
|
-
/** 루트 프롬프트 */
|
|
14
|
-
prompt: string;
|
|
15
|
-
/** 에이전트 이름 (선택) */
|
|
16
|
-
agentName?: string;
|
|
17
|
-
/** 모델 (기본: sonnet) */
|
|
18
|
-
model?: ClaudeModel;
|
|
19
|
-
/** 최대 분할 깊이 (기본: 2) */
|
|
20
|
-
maxDepth?: number;
|
|
21
|
-
/** 복잡도 임계값 - 이 이상이면 분할 (기본: 15) */
|
|
22
|
-
splitThreshold?: number;
|
|
23
|
-
/** 최대 동시 하위 에이전트 수 (기본: 5) */
|
|
24
|
-
maxConcurrentChildren?: number;
|
|
25
|
-
/** 분할 시 콜백 */
|
|
26
|
-
onSplit?: (task: SwarmTask) => void;
|
|
27
|
-
/** 완료 시 콜백 */
|
|
28
|
-
onComplete?: (task: SwarmTask, result: AgentResult) => void;
|
|
29
|
-
/** 프로젝트 경로 */
|
|
30
|
-
projectPath?: string;
|
|
31
|
-
/** 타임아웃 (ms, 기본: 5분) */
|
|
32
|
-
timeout?: number;
|
|
33
|
-
}
|
|
34
|
-
/** Swarm 작업 */
|
|
35
|
-
export interface SwarmTask {
|
|
36
|
-
id: string;
|
|
37
|
-
parentId: string | null;
|
|
38
|
-
prompt: string;
|
|
39
|
-
depth: number;
|
|
40
|
-
status: 'pending' | 'analyzing' | 'running' | 'splitting' | 'completed' | 'failed';
|
|
41
|
-
complexity?: number;
|
|
42
|
-
children: string[];
|
|
43
|
-
taskId?: string;
|
|
44
|
-
result?: AgentResult;
|
|
45
|
-
error?: string;
|
|
46
|
-
createdAt: number;
|
|
47
|
-
startedAt?: number;
|
|
48
|
-
completedAt?: number;
|
|
49
|
-
}
|
|
50
|
-
/** Swarm 결과 */
|
|
51
|
-
export interface SwarmResult {
|
|
52
|
-
rootTaskId: string;
|
|
53
|
-
tasks: SwarmTask[];
|
|
54
|
-
totalDuration: number;
|
|
55
|
-
splitCount: number;
|
|
56
|
-
successCount: number;
|
|
57
|
-
failureCount: number;
|
|
58
|
-
maxDepthReached: number;
|
|
59
|
-
mergedResult: string;
|
|
60
|
-
}
|
|
61
|
-
/** 복잡도 분석 결과 */
|
|
62
|
-
interface ComplexityAnalysis {
|
|
63
|
-
score: number;
|
|
64
|
-
factors: string[];
|
|
65
|
-
suggestedSplits?: string[];
|
|
66
|
-
}
|
|
67
|
-
export declare class SwarmOrchestrator {
|
|
68
|
-
private tasks;
|
|
69
|
-
private config;
|
|
70
|
-
private startTime;
|
|
71
|
-
constructor(config: SwarmConfig);
|
|
72
|
-
/**
|
|
73
|
-
* Swarm 실행
|
|
74
|
-
*/
|
|
75
|
-
execute(): Promise<SwarmResult>;
|
|
76
|
-
/**
|
|
77
|
-
* 태스크 처리
|
|
78
|
-
*/
|
|
79
|
-
private processTask;
|
|
80
|
-
/**
|
|
81
|
-
* 복잡도 분석
|
|
82
|
-
*/
|
|
83
|
-
private analyzeComplexity;
|
|
84
|
-
/**
|
|
85
|
-
* 분할 제안 생성
|
|
86
|
-
*/
|
|
87
|
-
private suggestSplits;
|
|
88
|
-
/**
|
|
89
|
-
* 분할 여부 결정
|
|
90
|
-
*/
|
|
91
|
-
private shouldSplit;
|
|
92
|
-
/**
|
|
93
|
-
* 태스크 분할
|
|
94
|
-
*/
|
|
95
|
-
private splitTask;
|
|
96
|
-
/**
|
|
97
|
-
* 하위 프롬프트 생성
|
|
98
|
-
*/
|
|
99
|
-
private createChildPrompt;
|
|
100
|
-
/**
|
|
101
|
-
* 하위 결과 병합
|
|
102
|
-
*/
|
|
103
|
-
private mergeChildResults;
|
|
104
|
-
/**
|
|
105
|
-
* 태스크 실행 (분할 없이) — 실패 시 자동 재시도
|
|
106
|
-
*/
|
|
107
|
-
private executeTask;
|
|
108
|
-
/**
|
|
109
|
-
* 결과 수집
|
|
110
|
-
*/
|
|
111
|
-
private collectResults;
|
|
112
|
-
/**
|
|
113
|
-
* 태스크 생성
|
|
114
|
-
*/
|
|
115
|
-
private createTask;
|
|
116
|
-
private sleep;
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Swarm 패턴으로 복잡한 작업 실행
|
|
120
|
-
*
|
|
121
|
-
* @example
|
|
122
|
-
* import { swarm } from '@su-record/vibe/orchestrator';
|
|
123
|
-
*
|
|
124
|
-
* const result = await swarm({
|
|
125
|
-
* prompt: 'Implement login feature with: 1. UI form 2. Validation 3. API call 4. Error handling',
|
|
126
|
-
* maxDepth: 2,
|
|
127
|
-
* splitThreshold: 15,
|
|
128
|
-
* onSplit: (task) => console.log(`Splitting: ${task.id}`),
|
|
129
|
-
* });
|
|
130
|
-
*/
|
|
131
|
-
export declare function swarm(config: SwarmConfig): Promise<ToolResult & {
|
|
132
|
-
swarmResult: SwarmResult;
|
|
133
|
-
}>;
|
|
134
|
-
/**
|
|
135
|
-
* 작업 복잡도 분석 (swarm 없이)
|
|
136
|
-
*
|
|
137
|
-
* @example
|
|
138
|
-
* const analysis = analyzeTaskComplexity('Implement login with validation and error handling');
|
|
139
|
-
* console.log(analysis.score); // 15
|
|
140
|
-
*/
|
|
141
|
-
export declare function analyzeTaskComplexity(prompt: string): ComplexityAnalysis;
|
|
142
|
-
export {};
|
|
143
|
-
//# sourceMappingURL=SwarmOrchestrator.d.ts.map
|