superqode 0.1.5__py3-none-any.whl
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.
- superqode/__init__.py +33 -0
- superqode/acp/__init__.py +23 -0
- superqode/acp/client.py +913 -0
- superqode/acp/permission_screen.py +457 -0
- superqode/acp/types.py +480 -0
- superqode/acp_discovery.py +856 -0
- superqode/agent/__init__.py +22 -0
- superqode/agent/edit_strategies.py +334 -0
- superqode/agent/loop.py +892 -0
- superqode/agent/qe_report_templates.py +39 -0
- superqode/agent/system_prompts.py +353 -0
- superqode/agent_output.py +721 -0
- superqode/agent_stream.py +953 -0
- superqode/agents/__init__.py +59 -0
- superqode/agents/acp_registry.py +305 -0
- superqode/agents/client.py +249 -0
- superqode/agents/data/augmentcode.com.toml +51 -0
- superqode/agents/data/cagent.dev.toml +51 -0
- superqode/agents/data/claude.com.toml +60 -0
- superqode/agents/data/codeassistant.dev.toml +51 -0
- superqode/agents/data/codex.openai.com.toml +57 -0
- superqode/agents/data/fastagent.ai.toml +66 -0
- superqode/agents/data/geminicli.com.toml +77 -0
- superqode/agents/data/goose.block.xyz.toml +54 -0
- superqode/agents/data/junie.jetbrains.com.toml +56 -0
- superqode/agents/data/kimi.moonshot.cn.toml +57 -0
- superqode/agents/data/llmlingagent.dev.toml +51 -0
- superqode/agents/data/molt.bot.toml +49 -0
- superqode/agents/data/opencode.ai.toml +60 -0
- superqode/agents/data/stakpak.dev.toml +51 -0
- superqode/agents/data/vtcode.dev.toml +51 -0
- superqode/agents/discovery.py +266 -0
- superqode/agents/messaging.py +160 -0
- superqode/agents/persona.py +166 -0
- superqode/agents/registry.py +421 -0
- superqode/agents/schema.py +72 -0
- superqode/agents/unified.py +367 -0
- superqode/app/__init__.py +111 -0
- superqode/app/constants.py +314 -0
- superqode/app/css.py +366 -0
- superqode/app/models.py +118 -0
- superqode/app/suggester.py +125 -0
- superqode/app/widgets.py +1591 -0
- superqode/app_enhanced.py +399 -0
- superqode/app_main.py +17187 -0
- superqode/approval.py +312 -0
- superqode/atomic.py +296 -0
- superqode/commands/__init__.py +1 -0
- superqode/commands/acp.py +965 -0
- superqode/commands/agents.py +180 -0
- superqode/commands/auth.py +278 -0
- superqode/commands/config.py +374 -0
- superqode/commands/init.py +826 -0
- superqode/commands/providers.py +819 -0
- superqode/commands/qe.py +1145 -0
- superqode/commands/roles.py +380 -0
- superqode/commands/serve.py +172 -0
- superqode/commands/suggestions.py +127 -0
- superqode/commands/superqe.py +460 -0
- superqode/config/__init__.py +51 -0
- superqode/config/loader.py +812 -0
- superqode/config/schema.py +498 -0
- superqode/core/__init__.py +111 -0
- superqode/core/roles.py +281 -0
- superqode/danger.py +386 -0
- superqode/data/superqode-template.yaml +1522 -0
- superqode/design_system.py +1080 -0
- superqode/dialogs/__init__.py +6 -0
- superqode/dialogs/base.py +39 -0
- superqode/dialogs/model.py +130 -0
- superqode/dialogs/provider.py +870 -0
- superqode/diff_view.py +919 -0
- superqode/enterprise.py +21 -0
- superqode/evaluation/__init__.py +25 -0
- superqode/evaluation/adapters.py +93 -0
- superqode/evaluation/behaviors.py +89 -0
- superqode/evaluation/engine.py +209 -0
- superqode/evaluation/scenarios.py +96 -0
- superqode/execution/__init__.py +36 -0
- superqode/execution/linter.py +538 -0
- superqode/execution/modes.py +347 -0
- superqode/execution/resolver.py +283 -0
- superqode/execution/runner.py +642 -0
- superqode/file_explorer.py +811 -0
- superqode/file_viewer.py +471 -0
- superqode/flash.py +183 -0
- superqode/guidance/__init__.py +58 -0
- superqode/guidance/config.py +203 -0
- superqode/guidance/prompts.py +71 -0
- superqode/harness/__init__.py +54 -0
- superqode/harness/accelerator.py +291 -0
- superqode/harness/config.py +319 -0
- superqode/harness/validator.py +147 -0
- superqode/history.py +279 -0
- superqode/integrations/superopt_runner.py +124 -0
- superqode/logging/__init__.py +49 -0
- superqode/logging/adapters.py +219 -0
- superqode/logging/formatter.py +923 -0
- superqode/logging/integration.py +341 -0
- superqode/logging/sinks.py +170 -0
- superqode/logging/unified_log.py +417 -0
- superqode/lsp/__init__.py +26 -0
- superqode/lsp/client.py +544 -0
- superqode/main.py +1069 -0
- superqode/mcp/__init__.py +89 -0
- superqode/mcp/auth_storage.py +380 -0
- superqode/mcp/client.py +1236 -0
- superqode/mcp/config.py +319 -0
- superqode/mcp/integration.py +337 -0
- superqode/mcp/oauth.py +436 -0
- superqode/mcp/oauth_callback.py +385 -0
- superqode/mcp/types.py +290 -0
- superqode/memory/__init__.py +31 -0
- superqode/memory/feedback.py +342 -0
- superqode/memory/store.py +522 -0
- superqode/notifications.py +369 -0
- superqode/optimization/__init__.py +5 -0
- superqode/optimization/config.py +33 -0
- superqode/permissions/__init__.py +25 -0
- superqode/permissions/rules.py +488 -0
- superqode/plan.py +323 -0
- superqode/providers/__init__.py +33 -0
- superqode/providers/gateway/__init__.py +165 -0
- superqode/providers/gateway/base.py +228 -0
- superqode/providers/gateway/litellm_gateway.py +1170 -0
- superqode/providers/gateway/openresponses_gateway.py +436 -0
- superqode/providers/health.py +297 -0
- superqode/providers/huggingface/__init__.py +74 -0
- superqode/providers/huggingface/downloader.py +472 -0
- superqode/providers/huggingface/endpoints.py +442 -0
- superqode/providers/huggingface/hub.py +531 -0
- superqode/providers/huggingface/inference.py +394 -0
- superqode/providers/huggingface/transformers_runner.py +516 -0
- superqode/providers/local/__init__.py +100 -0
- superqode/providers/local/base.py +438 -0
- superqode/providers/local/discovery.py +418 -0
- superqode/providers/local/lmstudio.py +256 -0
- superqode/providers/local/mlx.py +457 -0
- superqode/providers/local/ollama.py +486 -0
- superqode/providers/local/sglang.py +268 -0
- superqode/providers/local/tgi.py +260 -0
- superqode/providers/local/tool_support.py +477 -0
- superqode/providers/local/vllm.py +258 -0
- superqode/providers/manager.py +1338 -0
- superqode/providers/models.py +1016 -0
- superqode/providers/models_dev.py +578 -0
- superqode/providers/openresponses/__init__.py +87 -0
- superqode/providers/openresponses/converters/__init__.py +17 -0
- superqode/providers/openresponses/converters/messages.py +343 -0
- superqode/providers/openresponses/converters/tools.py +268 -0
- superqode/providers/openresponses/schema/__init__.py +56 -0
- superqode/providers/openresponses/schema/models.py +585 -0
- superqode/providers/openresponses/streaming/__init__.py +5 -0
- superqode/providers/openresponses/streaming/parser.py +338 -0
- superqode/providers/openresponses/tools/__init__.py +21 -0
- superqode/providers/openresponses/tools/apply_patch.py +352 -0
- superqode/providers/openresponses/tools/code_interpreter.py +290 -0
- superqode/providers/openresponses/tools/file_search.py +333 -0
- superqode/providers/openresponses/tools/mcp_adapter.py +252 -0
- superqode/providers/registry.py +716 -0
- superqode/providers/usage.py +332 -0
- superqode/pure_mode.py +384 -0
- superqode/qr/__init__.py +23 -0
- superqode/qr/dashboard.py +781 -0
- superqode/qr/generator.py +1018 -0
- superqode/qr/templates.py +135 -0
- superqode/safety/__init__.py +41 -0
- superqode/safety/sandbox.py +413 -0
- superqode/safety/warnings.py +256 -0
- superqode/server/__init__.py +33 -0
- superqode/server/lsp_server.py +775 -0
- superqode/server/web.py +250 -0
- superqode/session/__init__.py +25 -0
- superqode/session/persistence.py +580 -0
- superqode/session/sharing.py +477 -0
- superqode/session.py +475 -0
- superqode/sidebar.py +2991 -0
- superqode/stream_view.py +648 -0
- superqode/styles/__init__.py +3 -0
- superqode/superqe/__init__.py +184 -0
- superqode/superqe/acp_runner.py +1064 -0
- superqode/superqe/constitution/__init__.py +62 -0
- superqode/superqe/constitution/evaluator.py +308 -0
- superqode/superqe/constitution/loader.py +432 -0
- superqode/superqe/constitution/schema.py +250 -0
- superqode/superqe/events.py +591 -0
- superqode/superqe/frameworks/__init__.py +65 -0
- superqode/superqe/frameworks/base.py +234 -0
- superqode/superqe/frameworks/e2e.py +263 -0
- superqode/superqe/frameworks/executor.py +237 -0
- superqode/superqe/frameworks/javascript.py +409 -0
- superqode/superqe/frameworks/python.py +373 -0
- superqode/superqe/frameworks/registry.py +92 -0
- superqode/superqe/mcp_tools/__init__.py +47 -0
- superqode/superqe/mcp_tools/core_tools.py +418 -0
- superqode/superqe/mcp_tools/registry.py +230 -0
- superqode/superqe/mcp_tools/testing_tools.py +167 -0
- superqode/superqe/noise.py +89 -0
- superqode/superqe/orchestrator.py +778 -0
- superqode/superqe/roles.py +609 -0
- superqode/superqe/session.py +713 -0
- superqode/superqe/skills/__init__.py +57 -0
- superqode/superqe/skills/base.py +106 -0
- superqode/superqe/skills/core_skills.py +899 -0
- superqode/superqe/skills/registry.py +90 -0
- superqode/superqe/verifier.py +101 -0
- superqode/superqe_cli.py +76 -0
- superqode/tool_call.py +358 -0
- superqode/tools/__init__.py +93 -0
- superqode/tools/agent_tools.py +496 -0
- superqode/tools/base.py +324 -0
- superqode/tools/batch_tool.py +133 -0
- superqode/tools/diagnostics.py +311 -0
- superqode/tools/edit_tools.py +653 -0
- superqode/tools/enhanced_base.py +515 -0
- superqode/tools/file_tools.py +269 -0
- superqode/tools/file_tracking.py +45 -0
- superqode/tools/lsp_tools.py +610 -0
- superqode/tools/network_tools.py +350 -0
- superqode/tools/permissions.py +400 -0
- superqode/tools/question_tool.py +324 -0
- superqode/tools/search_tools.py +598 -0
- superqode/tools/shell_tools.py +259 -0
- superqode/tools/todo_tools.py +121 -0
- superqode/tools/validation.py +80 -0
- superqode/tools/web_tools.py +639 -0
- superqode/tui.py +1152 -0
- superqode/tui_integration.py +875 -0
- superqode/tui_widgets/__init__.py +27 -0
- superqode/tui_widgets/widgets/__init__.py +18 -0
- superqode/tui_widgets/widgets/progress.py +185 -0
- superqode/tui_widgets/widgets/tool_display.py +188 -0
- superqode/undo_manager.py +574 -0
- superqode/utils/__init__.py +5 -0
- superqode/utils/error_handling.py +323 -0
- superqode/utils/fuzzy.py +257 -0
- superqode/widgets/__init__.py +477 -0
- superqode/widgets/agent_collab.py +390 -0
- superqode/widgets/agent_store.py +936 -0
- superqode/widgets/agent_switcher.py +395 -0
- superqode/widgets/animation_manager.py +284 -0
- superqode/widgets/code_context.py +356 -0
- superqode/widgets/command_palette.py +412 -0
- superqode/widgets/connection_status.py +537 -0
- superqode/widgets/conversation_history.py +470 -0
- superqode/widgets/diff_indicator.py +155 -0
- superqode/widgets/enhanced_status_bar.py +385 -0
- superqode/widgets/enhanced_toast.py +476 -0
- superqode/widgets/file_browser.py +809 -0
- superqode/widgets/file_reference.py +585 -0
- superqode/widgets/issue_timeline.py +340 -0
- superqode/widgets/leader_key.py +264 -0
- superqode/widgets/mode_switcher.py +445 -0
- superqode/widgets/model_picker.py +234 -0
- superqode/widgets/permission_preview.py +1205 -0
- superqode/widgets/prompt.py +358 -0
- superqode/widgets/provider_connect.py +725 -0
- superqode/widgets/pty_shell.py +587 -0
- superqode/widgets/qe_dashboard.py +321 -0
- superqode/widgets/resizable_sidebar.py +377 -0
- superqode/widgets/response_changes.py +218 -0
- superqode/widgets/response_display.py +528 -0
- superqode/widgets/rich_tool_display.py +613 -0
- superqode/widgets/sidebar_panels.py +1180 -0
- superqode/widgets/slash_complete.py +356 -0
- superqode/widgets/split_view.py +612 -0
- superqode/widgets/status_bar.py +273 -0
- superqode/widgets/superqode_display.py +786 -0
- superqode/widgets/thinking_display.py +815 -0
- superqode/widgets/throbber.py +87 -0
- superqode/widgets/toast.py +206 -0
- superqode/widgets/unified_output.py +1073 -0
- superqode/workspace/__init__.py +75 -0
- superqode/workspace/artifacts.py +472 -0
- superqode/workspace/coordinator.py +353 -0
- superqode/workspace/diff_tracker.py +429 -0
- superqode/workspace/git_guard.py +373 -0
- superqode/workspace/git_snapshot.py +526 -0
- superqode/workspace/manager.py +750 -0
- superqode/workspace/snapshot.py +357 -0
- superqode/workspace/watcher.py +535 -0
- superqode/workspace/worktree.py +440 -0
- superqode-0.1.5.dist-info/METADATA +204 -0
- superqode-0.1.5.dist-info/RECORD +288 -0
- superqode-0.1.5.dist-info/WHEEL +5 -0
- superqode-0.1.5.dist-info/entry_points.txt +3 -0
- superqode-0.1.5.dist-info/licenses/LICENSE +648 -0
- superqode-0.1.5.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
"""
|
|
2
|
+
SuperQE Advanced Commands (CodeOptiX).
|
|
3
|
+
|
|
4
|
+
Advanced quality engineering powered by CodeOptiX integration:
|
|
5
|
+
• 🔬 Deep behavioral evaluation
|
|
6
|
+
• 🧬 GEPA evolution engine
|
|
7
|
+
• 🌸 Bloom scenario generation
|
|
8
|
+
• 🛡️ Advanced security analysis
|
|
9
|
+
|
|
10
|
+
Requires CodeOptiX (core dependency).
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import json
|
|
16
|
+
import sys
|
|
17
|
+
from datetime import datetime
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
from typing import Optional
|
|
20
|
+
|
|
21
|
+
import click
|
|
22
|
+
from rich.console import Console
|
|
23
|
+
from rich.panel import Panel
|
|
24
|
+
from rich.table import Table
|
|
25
|
+
|
|
26
|
+
from superqode.evaluation import CODEOPTIX_AVAILABLE
|
|
27
|
+
|
|
28
|
+
console = Console()
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def check_codeoptix():
|
|
32
|
+
"""Check if CodeOptiX is available and show helpful message if not."""
|
|
33
|
+
if not CODEOPTIX_AVAILABLE:
|
|
34
|
+
console.print("[red]CodeOptiX is required for SuperQE.[/red]")
|
|
35
|
+
console.print("[dim]Install dependencies and retry.[/dim]")
|
|
36
|
+
return False
|
|
37
|
+
return True
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@click.group()
|
|
41
|
+
def superqe():
|
|
42
|
+
"""🚀 SuperQE Advanced: CodeOptiX-powered quality engineering.
|
|
43
|
+
|
|
44
|
+
Supercharges your QE with AI agent optimization:
|
|
45
|
+
• 🔬 Deep behavioral evaluation (beyond basic checks)
|
|
46
|
+
• 🧬 GEPA evolution engine (agent improvement)
|
|
47
|
+
• 🌸 Bloom scenario generation (intelligent testing)
|
|
48
|
+
• 🛡️ Advanced security analysis (comprehensive)
|
|
49
|
+
|
|
50
|
+
💡 Works with any LLM provider: Ollama, OpenAI, Anthropic, Google
|
|
51
|
+
✨ All SuperQE advanced features are available in this package
|
|
52
|
+
|
|
53
|
+
Note: Use these commands via `superqe advanced ...`.
|
|
54
|
+
"""
|
|
55
|
+
pass
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@superqe.command("run")
|
|
59
|
+
@click.argument("path", type=click.Path(exists=True), default=".")
|
|
60
|
+
@click.option(
|
|
61
|
+
"--behaviors",
|
|
62
|
+
help="Comma-separated enhanced behaviors to evaluate "
|
|
63
|
+
"(security-vulnerabilities,test-quality,plan-adherence)",
|
|
64
|
+
)
|
|
65
|
+
@click.option(
|
|
66
|
+
"--use-bloom", is_flag=True, help="Use Bloom scenario generation for intelligent testing"
|
|
67
|
+
)
|
|
68
|
+
@click.option("--agent", help="Specific agent to evaluate (claude-code, codex, gemini-cli)")
|
|
69
|
+
@click.option("--output", "-o", type=click.Path(), help="Output directory for enhanced results")
|
|
70
|
+
@click.option("--json", "json_output", is_flag=True, help="Output enhanced results as JSON")
|
|
71
|
+
@click.option("--verbose", "-v", is_flag=True, help="Show detailed SuperQE analysis logs")
|
|
72
|
+
def superqe_run(
|
|
73
|
+
path: str,
|
|
74
|
+
behaviors: str,
|
|
75
|
+
use_bloom: bool,
|
|
76
|
+
agent: str,
|
|
77
|
+
output: str,
|
|
78
|
+
json_output: bool,
|
|
79
|
+
verbose: bool,
|
|
80
|
+
):
|
|
81
|
+
"""Run SuperQE enhanced evaluation with integrated CodeOptiX.
|
|
82
|
+
|
|
83
|
+
Examples:
|
|
84
|
+
|
|
85
|
+
superqe advanced run . --behaviors security-vulnerabilities,test-quality
|
|
86
|
+
|
|
87
|
+
superqe advanced run . --behaviors all --use-bloom
|
|
88
|
+
|
|
89
|
+
superqe advanced run . --agent claude-code --behaviors security-vulnerabilities
|
|
90
|
+
"""
|
|
91
|
+
if not check_codeoptix():
|
|
92
|
+
return
|
|
93
|
+
|
|
94
|
+
from superqode.evaluation.engine import EnhancedQEEngine
|
|
95
|
+
|
|
96
|
+
project_root = Path(path).resolve()
|
|
97
|
+
|
|
98
|
+
# Parse behaviors
|
|
99
|
+
behavior_list = None
|
|
100
|
+
if behaviors:
|
|
101
|
+
if behaviors.lower() == "all":
|
|
102
|
+
# Use all available enhanced behaviors
|
|
103
|
+
from superqode.evaluation.behaviors import get_enhanced_behaviors
|
|
104
|
+
|
|
105
|
+
available = get_enhanced_behaviors()
|
|
106
|
+
behavior_list = list(available.keys())
|
|
107
|
+
else:
|
|
108
|
+
behavior_list = [b.strip() for b in behaviors.split(",")]
|
|
109
|
+
|
|
110
|
+
# Setup enhanced config
|
|
111
|
+
enhanced_config = {
|
|
112
|
+
"use_bloom_scenarios": use_bloom,
|
|
113
|
+
"agent": agent,
|
|
114
|
+
"verbose": verbose,
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
console.print()
|
|
118
|
+
console.print(
|
|
119
|
+
Panel("[bold cyan]🚀 SuperQE Enhanced Evaluation[/bold cyan]", border_style="cyan")
|
|
120
|
+
)
|
|
121
|
+
console.print()
|
|
122
|
+
|
|
123
|
+
if behavior_list:
|
|
124
|
+
console.print(f"[cyan]Behaviors:[/cyan] {', '.join(behavior_list)}")
|
|
125
|
+
if use_bloom:
|
|
126
|
+
console.print("[cyan]Bloom Scenarios:[/cyan] Enabled")
|
|
127
|
+
if agent:
|
|
128
|
+
console.print(f"[cyan]Agent Focus:[/cyan] {agent}")
|
|
129
|
+
console.print()
|
|
130
|
+
|
|
131
|
+
try:
|
|
132
|
+
# Run enhanced evaluation
|
|
133
|
+
engine = EnhancedQEEngine()
|
|
134
|
+
results = engine.analyze_with_codeoptix(
|
|
135
|
+
codebase_path=project_root, config=enhanced_config, behaviors=behavior_list
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
# Check for errors in results
|
|
139
|
+
if "error" in results:
|
|
140
|
+
error_msg = results["error"]
|
|
141
|
+
if "Ollama" in error_msg and ("daemon" in error_msg or "contact" in error_msg):
|
|
142
|
+
console.print()
|
|
143
|
+
console.print("[yellow]⚠️ LLM provider not available[/yellow]")
|
|
144
|
+
console.print("SuperQE requires an LLM provider for enhanced evaluation.")
|
|
145
|
+
console.print()
|
|
146
|
+
console.print("Configure any supported provider:")
|
|
147
|
+
console.print(
|
|
148
|
+
"• [cyan]Ollama (free)[/cyan]: Install Ollama and run [cyan]ollama serve[/cyan]"
|
|
149
|
+
)
|
|
150
|
+
console.print(
|
|
151
|
+
"• [cyan]OpenAI[/cyan]: Set [cyan]OPENAI_API_KEY[/cyan] environment variable"
|
|
152
|
+
)
|
|
153
|
+
console.print(
|
|
154
|
+
"• [cyan]Anthropic[/cyan]: Set [cyan]ANTHROPIC_API_KEY[/cyan] environment variable"
|
|
155
|
+
)
|
|
156
|
+
console.print(
|
|
157
|
+
"• [cyan]Google[/cyan]: Set [cyan]GOOGLE_API_KEY[/cyan] environment variable"
|
|
158
|
+
)
|
|
159
|
+
console.print()
|
|
160
|
+
console.print("Alternatively, use basic QE: [cyan]superqe run .[/cyan]")
|
|
161
|
+
else:
|
|
162
|
+
console.print(f"[red]❌ SuperQE evaluation failed: {error_msg}[/red]")
|
|
163
|
+
if verbose:
|
|
164
|
+
import traceback
|
|
165
|
+
|
|
166
|
+
console.print(f"[dim]{traceback.format_exc()}[/dim]")
|
|
167
|
+
return 1
|
|
168
|
+
|
|
169
|
+
# Display results
|
|
170
|
+
if json_output:
|
|
171
|
+
console.print(json.dumps(results, indent=2))
|
|
172
|
+
else:
|
|
173
|
+
_display_superqe_results(results, behavior_list, use_bloom)
|
|
174
|
+
|
|
175
|
+
# Save output if requested
|
|
176
|
+
if output:
|
|
177
|
+
output_path = Path(output)
|
|
178
|
+
output_path.mkdir(parents=True, exist_ok=True)
|
|
179
|
+
|
|
180
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
181
|
+
results_file = output_path / f"superqe_results_{timestamp}.json"
|
|
182
|
+
|
|
183
|
+
with open(results_file, "w") as f:
|
|
184
|
+
json.dump(results, f, indent=2)
|
|
185
|
+
|
|
186
|
+
console.print(f"\n[green]✓[/green] Results saved to: {results_file}")
|
|
187
|
+
|
|
188
|
+
# Return success/failure
|
|
189
|
+
return 0
|
|
190
|
+
|
|
191
|
+
except Exception as e:
|
|
192
|
+
error_msg = str(e)
|
|
193
|
+
if "Ollama" in error_msg and "daemon" in error_msg:
|
|
194
|
+
console.print()
|
|
195
|
+
console.print("[yellow]⚠️ Ollama not available[/yellow]")
|
|
196
|
+
console.print("SuperQE requires Ollama for enhanced evaluation.")
|
|
197
|
+
console.print()
|
|
198
|
+
console.print("To use SuperQE features:")
|
|
199
|
+
console.print("1. Install Ollama: https://ollama.ai")
|
|
200
|
+
console.print("2. Start Ollama: [cyan]ollama serve[/cyan]")
|
|
201
|
+
console.print("3. Pull a model: [cyan]ollama pull llama3.1[/cyan]")
|
|
202
|
+
console.print()
|
|
203
|
+
console.print("Alternatively, use basic QE: [cyan]superqe run .[/cyan]")
|
|
204
|
+
else:
|
|
205
|
+
console.print(f"[red]❌ SuperQE evaluation failed: {error_msg}[/red]")
|
|
206
|
+
if verbose:
|
|
207
|
+
import traceback
|
|
208
|
+
|
|
209
|
+
console.print(f"[dim]{traceback.format_exc()}[/dim]")
|
|
210
|
+
return 1
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
@superqe.command("behaviors")
|
|
214
|
+
def superqe_behaviors():
|
|
215
|
+
"""List all available SuperQE enhanced behaviors."""
|
|
216
|
+
if not check_codeoptix():
|
|
217
|
+
return
|
|
218
|
+
from superqode.evaluation.behaviors import get_enhanced_behaviors
|
|
219
|
+
|
|
220
|
+
console.print()
|
|
221
|
+
console.print(
|
|
222
|
+
Panel("[bold cyan]🚀 SuperQE Enhanced Behaviors[/bold cyan]", border_style="cyan")
|
|
223
|
+
)
|
|
224
|
+
console.print()
|
|
225
|
+
|
|
226
|
+
enhanced_behaviors = get_enhanced_behaviors()
|
|
227
|
+
|
|
228
|
+
if enhanced_behaviors:
|
|
229
|
+
table = Table(show_header=True, header_style="bold cyan")
|
|
230
|
+
table.add_column("Behavior", style="cyan", no_wrap=True)
|
|
231
|
+
table.add_column("Description", style="white")
|
|
232
|
+
table.add_column("Status", style="green", no_wrap=True)
|
|
233
|
+
|
|
234
|
+
for name, desc in enhanced_behaviors.items():
|
|
235
|
+
table.add_row(f"🔬 {name}", desc, "Available")
|
|
236
|
+
|
|
237
|
+
console.print(table)
|
|
238
|
+
else:
|
|
239
|
+
console.print("[yellow]⚠️ No enhanced behaviors available[/yellow]")
|
|
240
|
+
|
|
241
|
+
console.print()
|
|
242
|
+
console.print(
|
|
243
|
+
"[dim]Usage: superqe advanced run . --behaviors security-vulnerabilities,test-quality[/dim]"
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
@superqe.command("agent-eval")
|
|
248
|
+
@click.argument("path", type=click.Path(exists=True), default=".")
|
|
249
|
+
@click.option(
|
|
250
|
+
"--agents",
|
|
251
|
+
required=True,
|
|
252
|
+
help="Comma-separated list of agents to evaluate (e.g., claude-code,codex,gemini-cli)",
|
|
253
|
+
)
|
|
254
|
+
@click.option(
|
|
255
|
+
"--behaviors", help="Behaviors to evaluate (default: security-vulnerabilities,test-quality)"
|
|
256
|
+
)
|
|
257
|
+
@click.option("--output", "-o", type=click.Path(), help="Output directory for comparison results")
|
|
258
|
+
def superqe_agent_eval(path: str, agents: str, behaviors: str, output: str):
|
|
259
|
+
"""Compare multiple AI agents using SuperQE evaluation.
|
|
260
|
+
|
|
261
|
+
Examples:
|
|
262
|
+
|
|
263
|
+
superqe advanced agent-eval . --agents claude-code,codex
|
|
264
|
+
|
|
265
|
+
superqe advanced agent-eval . --agents claude-code,gemini-cli --behaviors all
|
|
266
|
+
"""
|
|
267
|
+
if not check_codeoptix():
|
|
268
|
+
return
|
|
269
|
+
from superqode.evaluation.adapters import get_codeoptix_adapter
|
|
270
|
+
|
|
271
|
+
project_root = Path(path).resolve()
|
|
272
|
+
agent_list = [a.strip() for a in agents.split(",")]
|
|
273
|
+
|
|
274
|
+
# Default behaviors if not specified
|
|
275
|
+
if not behaviors:
|
|
276
|
+
behaviors = "security-vulnerabilities,test-quality"
|
|
277
|
+
behavior_list = [b.strip() for b in behaviors.split(",")]
|
|
278
|
+
|
|
279
|
+
console.print()
|
|
280
|
+
console.print(Panel("[bold cyan]🤖 SuperQE Agent Comparison[/bold cyan]", border_style="cyan"))
|
|
281
|
+
console.print()
|
|
282
|
+
|
|
283
|
+
console.print(f"[cyan]Agents:[/cyan] {', '.join(agent_list)}")
|
|
284
|
+
console.print(f"[cyan]Behaviors:[/cyan] {', '.join(behavior_list)}")
|
|
285
|
+
console.print()
|
|
286
|
+
|
|
287
|
+
try:
|
|
288
|
+
results = {}
|
|
289
|
+
for agent_name in agent_list:
|
|
290
|
+
console.print(f"[yellow]Evaluating {agent_name}...[/yellow]")
|
|
291
|
+
|
|
292
|
+
# Get adapter for this agent
|
|
293
|
+
adapter = get_codeoptix_adapter({"type": agent_name, "name": agent_name})
|
|
294
|
+
if not adapter:
|
|
295
|
+
console.print(f"[red]❌ No adapter available for {agent_name}[/red]")
|
|
296
|
+
continue
|
|
297
|
+
|
|
298
|
+
# Run evaluation (simplified for now)
|
|
299
|
+
# In full implementation, this would run CodeOptiX evaluation
|
|
300
|
+
results[agent_name] = {
|
|
301
|
+
"behaviors_evaluated": behavior_list,
|
|
302
|
+
"status": "completed",
|
|
303
|
+
"score": 0.85, # Mock score
|
|
304
|
+
"findings": [],
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
# Display comparison
|
|
308
|
+
_display_agent_comparison(results, agent_list, behavior_list)
|
|
309
|
+
|
|
310
|
+
# Save output if requested
|
|
311
|
+
if output:
|
|
312
|
+
output_path = Path(output)
|
|
313
|
+
output_path.mkdir(parents=True, exist_ok=True)
|
|
314
|
+
|
|
315
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
316
|
+
results_file = output_path / f"agent_comparison_{timestamp}.json"
|
|
317
|
+
|
|
318
|
+
with open(results_file, "w") as f:
|
|
319
|
+
json.dump(results, f, indent=2)
|
|
320
|
+
|
|
321
|
+
console.print(f"\n[green]✓[/green] Comparison saved to: {results_file}")
|
|
322
|
+
|
|
323
|
+
return 0
|
|
324
|
+
|
|
325
|
+
except Exception as e:
|
|
326
|
+
console.print(f"[red]❌ Agent evaluation failed: {e}[/red]")
|
|
327
|
+
return 1
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
@superqe.command("scenarios")
|
|
331
|
+
@click.argument("action", type=click.Choice(["generate", "list"]))
|
|
332
|
+
@click.argument("path", type=click.Path(exists=True), default=".")
|
|
333
|
+
@click.option("--behavior", help="Behavior to generate scenarios for")
|
|
334
|
+
@click.option("--count", type=int, default=5, help="Number of scenarios to generate")
|
|
335
|
+
@click.option("--output", "-o", type=click.Path(), help="Output file for scenarios")
|
|
336
|
+
def superqe_scenarios(action: str, path: str, behavior: str, count: int, output: str):
|
|
337
|
+
"""Manage Bloom scenario generation for SuperQE.
|
|
338
|
+
|
|
339
|
+
Examples:
|
|
340
|
+
|
|
341
|
+
superqe advanced scenarios generate . --behavior security-vulnerabilities --count 10
|
|
342
|
+
|
|
343
|
+
superqe advanced scenarios list
|
|
344
|
+
"""
|
|
345
|
+
if not check_codeoptix():
|
|
346
|
+
return
|
|
347
|
+
from superqode.evaluation.scenarios import generate_enhanced_scenarios
|
|
348
|
+
|
|
349
|
+
project_root = Path(path).resolve()
|
|
350
|
+
|
|
351
|
+
if action == "generate":
|
|
352
|
+
if not behavior:
|
|
353
|
+
console.print("[red]❌ --behavior is required for generate action[/red]")
|
|
354
|
+
return 1
|
|
355
|
+
|
|
356
|
+
console.print()
|
|
357
|
+
console.print(
|
|
358
|
+
Panel(
|
|
359
|
+
"[bold cyan]🌸 SuperQE Bloom Scenario Generation[/bold cyan]", border_style="cyan"
|
|
360
|
+
)
|
|
361
|
+
)
|
|
362
|
+
console.print()
|
|
363
|
+
|
|
364
|
+
console.print(f"[cyan]Behavior:[/cyan] {behavior}")
|
|
365
|
+
console.print(f"[cyan]Count:[/cyan] {count}")
|
|
366
|
+
console.print()
|
|
367
|
+
|
|
368
|
+
try:
|
|
369
|
+
scenarios = generate_enhanced_scenarios(
|
|
370
|
+
behavior_name=behavior,
|
|
371
|
+
behavior_description=f"Advanced evaluation scenarios for {behavior}",
|
|
372
|
+
codebase_path=project_root,
|
|
373
|
+
examples=[], # Could be populated from previous runs
|
|
374
|
+
)
|
|
375
|
+
|
|
376
|
+
# Take only the requested count
|
|
377
|
+
scenarios = scenarios[:count] if len(scenarios) > count else scenarios
|
|
378
|
+
|
|
379
|
+
# Display scenarios
|
|
380
|
+
for i, scenario in enumerate(scenarios, 1):
|
|
381
|
+
console.print(f"[yellow]{i}.[/yellow] {scenario.get('name', f'Scenario {i}')}")
|
|
382
|
+
console.print(f" {scenario.get('description', 'No description')}")
|
|
383
|
+
console.print()
|
|
384
|
+
|
|
385
|
+
# Save output if requested
|
|
386
|
+
if output:
|
|
387
|
+
output_path = Path(output)
|
|
388
|
+
output_data = {
|
|
389
|
+
"behavior": behavior,
|
|
390
|
+
"scenarios": scenarios,
|
|
391
|
+
"generated_at": datetime.now().isoformat(),
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
with open(output_path, "w") as f:
|
|
395
|
+
json.dump(output_data, f, indent=2)
|
|
396
|
+
|
|
397
|
+
console.print(f"[green]✓[/green] Scenarios saved to: {output_path}")
|
|
398
|
+
|
|
399
|
+
console.print(f"[green]✓[/green] Generated {len(scenarios)} scenarios")
|
|
400
|
+
|
|
401
|
+
except Exception as e:
|
|
402
|
+
console.print(f"[red]❌ Scenario generation failed: {e}[/red]")
|
|
403
|
+
return 1
|
|
404
|
+
|
|
405
|
+
elif action == "list":
|
|
406
|
+
console.print("[yellow]⚠️ Scenario listing not yet implemented[/yellow]")
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
def _display_superqe_results(results: dict, behavior_list: list, use_bloom: bool):
|
|
410
|
+
"""Display SuperQE evaluation results in a nice format."""
|
|
411
|
+
if "error" in results:
|
|
412
|
+
console.print(f"[red]❌ {results['error']}[/red]")
|
|
413
|
+
return
|
|
414
|
+
|
|
415
|
+
# Summary
|
|
416
|
+
behaviors_evaluated = results.get("behaviors_evaluated", [])
|
|
417
|
+
scenarios_used = results.get("scenarios_used", 0)
|
|
418
|
+
|
|
419
|
+
console.print("[green]✓ SuperQE evaluation completed![/green]")
|
|
420
|
+
console.print(f" Behaviors evaluated: {len(behaviors_evaluated)}")
|
|
421
|
+
console.print(f" Scenarios used: {scenarios_used}")
|
|
422
|
+
|
|
423
|
+
# Show results for each behavior
|
|
424
|
+
if "results" in results:
|
|
425
|
+
console.print()
|
|
426
|
+
console.print("[bold cyan]Behavior Results:[/bold cyan]")
|
|
427
|
+
|
|
428
|
+
for behavior_name, behavior_results in results["results"].items():
|
|
429
|
+
status = behavior_results.get("status", "unknown")
|
|
430
|
+
if status == "success":
|
|
431
|
+
console.print(f" [green]✓[/green] {behavior_name}: Completed")
|
|
432
|
+
elif "error" in behavior_results:
|
|
433
|
+
console.print(f" [red]❌[/red] {behavior_name}: {behavior_results['error']}")
|
|
434
|
+
else:
|
|
435
|
+
console.print(f" [yellow]⚠️[/yellow] {behavior_name}: {status}")
|
|
436
|
+
|
|
437
|
+
|
|
438
|
+
def _display_agent_comparison(results: dict, agent_list: list, behavior_list: list):
|
|
439
|
+
"""Display agent comparison results."""
|
|
440
|
+
console.print("[green]✓ Agent comparison completed![/green]")
|
|
441
|
+
console.print()
|
|
442
|
+
|
|
443
|
+
table = Table(show_header=True, header_style="bold cyan")
|
|
444
|
+
table.add_column("Agent", style="cyan", no_wrap=True)
|
|
445
|
+
table.add_column("Behaviors", style="white")
|
|
446
|
+
table.add_column("Status", style="green", no_wrap=True)
|
|
447
|
+
table.add_column("Score", style="yellow", justify="right")
|
|
448
|
+
|
|
449
|
+
for agent_name in agent_list:
|
|
450
|
+
if agent_name in results:
|
|
451
|
+
agent_results = results[agent_name]
|
|
452
|
+
behaviors = agent_results.get("behaviors_evaluated", [])
|
|
453
|
+
status = agent_results.get("status", "unknown")
|
|
454
|
+
score = agent_results.get("score", 0.0)
|
|
455
|
+
|
|
456
|
+
table.add_row(agent_name, str(len(behaviors)), status.title(), f"{score:.2f}")
|
|
457
|
+
else:
|
|
458
|
+
table.add_row(agent_name, "0", "Failed", "0.00")
|
|
459
|
+
|
|
460
|
+
console.print(table)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""SuperQode configuration system."""
|
|
2
|
+
|
|
3
|
+
from .loader import (
|
|
4
|
+
load_config,
|
|
5
|
+
save_config,
|
|
6
|
+
create_default_config,
|
|
7
|
+
find_config_file,
|
|
8
|
+
ConfigError,
|
|
9
|
+
load_enabled_modes,
|
|
10
|
+
resolve_role,
|
|
11
|
+
resolve_model_spec,
|
|
12
|
+
)
|
|
13
|
+
from .schema import (
|
|
14
|
+
Config,
|
|
15
|
+
SuperQodeConfig,
|
|
16
|
+
TeamConfig,
|
|
17
|
+
ModeConfig,
|
|
18
|
+
RoleConfig,
|
|
19
|
+
ProviderConfig,
|
|
20
|
+
ResolvedRole,
|
|
21
|
+
ResolvedMode,
|
|
22
|
+
AgentConfigBlock,
|
|
23
|
+
GatewayConfig,
|
|
24
|
+
CostTrackingConfig,
|
|
25
|
+
ErrorConfig,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
__all__ = [
|
|
29
|
+
# Loader functions
|
|
30
|
+
"load_config",
|
|
31
|
+
"save_config",
|
|
32
|
+
"create_default_config",
|
|
33
|
+
"find_config_file",
|
|
34
|
+
"load_enabled_modes",
|
|
35
|
+
"resolve_role",
|
|
36
|
+
"resolve_model_spec",
|
|
37
|
+
"ConfigError",
|
|
38
|
+
# Schema classes
|
|
39
|
+
"Config",
|
|
40
|
+
"SuperQodeConfig",
|
|
41
|
+
"TeamConfig",
|
|
42
|
+
"ModeConfig",
|
|
43
|
+
"RoleConfig",
|
|
44
|
+
"ProviderConfig",
|
|
45
|
+
"ResolvedRole",
|
|
46
|
+
"ResolvedMode",
|
|
47
|
+
"AgentConfigBlock",
|
|
48
|
+
"GatewayConfig",
|
|
49
|
+
"CostTrackingConfig",
|
|
50
|
+
"ErrorConfig",
|
|
51
|
+
]
|