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.
Files changed (288) hide show
  1. superqode/__init__.py +33 -0
  2. superqode/acp/__init__.py +23 -0
  3. superqode/acp/client.py +913 -0
  4. superqode/acp/permission_screen.py +457 -0
  5. superqode/acp/types.py +480 -0
  6. superqode/acp_discovery.py +856 -0
  7. superqode/agent/__init__.py +22 -0
  8. superqode/agent/edit_strategies.py +334 -0
  9. superqode/agent/loop.py +892 -0
  10. superqode/agent/qe_report_templates.py +39 -0
  11. superqode/agent/system_prompts.py +353 -0
  12. superqode/agent_output.py +721 -0
  13. superqode/agent_stream.py +953 -0
  14. superqode/agents/__init__.py +59 -0
  15. superqode/agents/acp_registry.py +305 -0
  16. superqode/agents/client.py +249 -0
  17. superqode/agents/data/augmentcode.com.toml +51 -0
  18. superqode/agents/data/cagent.dev.toml +51 -0
  19. superqode/agents/data/claude.com.toml +60 -0
  20. superqode/agents/data/codeassistant.dev.toml +51 -0
  21. superqode/agents/data/codex.openai.com.toml +57 -0
  22. superqode/agents/data/fastagent.ai.toml +66 -0
  23. superqode/agents/data/geminicli.com.toml +77 -0
  24. superqode/agents/data/goose.block.xyz.toml +54 -0
  25. superqode/agents/data/junie.jetbrains.com.toml +56 -0
  26. superqode/agents/data/kimi.moonshot.cn.toml +57 -0
  27. superqode/agents/data/llmlingagent.dev.toml +51 -0
  28. superqode/agents/data/molt.bot.toml +49 -0
  29. superqode/agents/data/opencode.ai.toml +60 -0
  30. superqode/agents/data/stakpak.dev.toml +51 -0
  31. superqode/agents/data/vtcode.dev.toml +51 -0
  32. superqode/agents/discovery.py +266 -0
  33. superqode/agents/messaging.py +160 -0
  34. superqode/agents/persona.py +166 -0
  35. superqode/agents/registry.py +421 -0
  36. superqode/agents/schema.py +72 -0
  37. superqode/agents/unified.py +367 -0
  38. superqode/app/__init__.py +111 -0
  39. superqode/app/constants.py +314 -0
  40. superqode/app/css.py +366 -0
  41. superqode/app/models.py +118 -0
  42. superqode/app/suggester.py +125 -0
  43. superqode/app/widgets.py +1591 -0
  44. superqode/app_enhanced.py +399 -0
  45. superqode/app_main.py +17187 -0
  46. superqode/approval.py +312 -0
  47. superqode/atomic.py +296 -0
  48. superqode/commands/__init__.py +1 -0
  49. superqode/commands/acp.py +965 -0
  50. superqode/commands/agents.py +180 -0
  51. superqode/commands/auth.py +278 -0
  52. superqode/commands/config.py +374 -0
  53. superqode/commands/init.py +826 -0
  54. superqode/commands/providers.py +819 -0
  55. superqode/commands/qe.py +1145 -0
  56. superqode/commands/roles.py +380 -0
  57. superqode/commands/serve.py +172 -0
  58. superqode/commands/suggestions.py +127 -0
  59. superqode/commands/superqe.py +460 -0
  60. superqode/config/__init__.py +51 -0
  61. superqode/config/loader.py +812 -0
  62. superqode/config/schema.py +498 -0
  63. superqode/core/__init__.py +111 -0
  64. superqode/core/roles.py +281 -0
  65. superqode/danger.py +386 -0
  66. superqode/data/superqode-template.yaml +1522 -0
  67. superqode/design_system.py +1080 -0
  68. superqode/dialogs/__init__.py +6 -0
  69. superqode/dialogs/base.py +39 -0
  70. superqode/dialogs/model.py +130 -0
  71. superqode/dialogs/provider.py +870 -0
  72. superqode/diff_view.py +919 -0
  73. superqode/enterprise.py +21 -0
  74. superqode/evaluation/__init__.py +25 -0
  75. superqode/evaluation/adapters.py +93 -0
  76. superqode/evaluation/behaviors.py +89 -0
  77. superqode/evaluation/engine.py +209 -0
  78. superqode/evaluation/scenarios.py +96 -0
  79. superqode/execution/__init__.py +36 -0
  80. superqode/execution/linter.py +538 -0
  81. superqode/execution/modes.py +347 -0
  82. superqode/execution/resolver.py +283 -0
  83. superqode/execution/runner.py +642 -0
  84. superqode/file_explorer.py +811 -0
  85. superqode/file_viewer.py +471 -0
  86. superqode/flash.py +183 -0
  87. superqode/guidance/__init__.py +58 -0
  88. superqode/guidance/config.py +203 -0
  89. superqode/guidance/prompts.py +71 -0
  90. superqode/harness/__init__.py +54 -0
  91. superqode/harness/accelerator.py +291 -0
  92. superqode/harness/config.py +319 -0
  93. superqode/harness/validator.py +147 -0
  94. superqode/history.py +279 -0
  95. superqode/integrations/superopt_runner.py +124 -0
  96. superqode/logging/__init__.py +49 -0
  97. superqode/logging/adapters.py +219 -0
  98. superqode/logging/formatter.py +923 -0
  99. superqode/logging/integration.py +341 -0
  100. superqode/logging/sinks.py +170 -0
  101. superqode/logging/unified_log.py +417 -0
  102. superqode/lsp/__init__.py +26 -0
  103. superqode/lsp/client.py +544 -0
  104. superqode/main.py +1069 -0
  105. superqode/mcp/__init__.py +89 -0
  106. superqode/mcp/auth_storage.py +380 -0
  107. superqode/mcp/client.py +1236 -0
  108. superqode/mcp/config.py +319 -0
  109. superqode/mcp/integration.py +337 -0
  110. superqode/mcp/oauth.py +436 -0
  111. superqode/mcp/oauth_callback.py +385 -0
  112. superqode/mcp/types.py +290 -0
  113. superqode/memory/__init__.py +31 -0
  114. superqode/memory/feedback.py +342 -0
  115. superqode/memory/store.py +522 -0
  116. superqode/notifications.py +369 -0
  117. superqode/optimization/__init__.py +5 -0
  118. superqode/optimization/config.py +33 -0
  119. superqode/permissions/__init__.py +25 -0
  120. superqode/permissions/rules.py +488 -0
  121. superqode/plan.py +323 -0
  122. superqode/providers/__init__.py +33 -0
  123. superqode/providers/gateway/__init__.py +165 -0
  124. superqode/providers/gateway/base.py +228 -0
  125. superqode/providers/gateway/litellm_gateway.py +1170 -0
  126. superqode/providers/gateway/openresponses_gateway.py +436 -0
  127. superqode/providers/health.py +297 -0
  128. superqode/providers/huggingface/__init__.py +74 -0
  129. superqode/providers/huggingface/downloader.py +472 -0
  130. superqode/providers/huggingface/endpoints.py +442 -0
  131. superqode/providers/huggingface/hub.py +531 -0
  132. superqode/providers/huggingface/inference.py +394 -0
  133. superqode/providers/huggingface/transformers_runner.py +516 -0
  134. superqode/providers/local/__init__.py +100 -0
  135. superqode/providers/local/base.py +438 -0
  136. superqode/providers/local/discovery.py +418 -0
  137. superqode/providers/local/lmstudio.py +256 -0
  138. superqode/providers/local/mlx.py +457 -0
  139. superqode/providers/local/ollama.py +486 -0
  140. superqode/providers/local/sglang.py +268 -0
  141. superqode/providers/local/tgi.py +260 -0
  142. superqode/providers/local/tool_support.py +477 -0
  143. superqode/providers/local/vllm.py +258 -0
  144. superqode/providers/manager.py +1338 -0
  145. superqode/providers/models.py +1016 -0
  146. superqode/providers/models_dev.py +578 -0
  147. superqode/providers/openresponses/__init__.py +87 -0
  148. superqode/providers/openresponses/converters/__init__.py +17 -0
  149. superqode/providers/openresponses/converters/messages.py +343 -0
  150. superqode/providers/openresponses/converters/tools.py +268 -0
  151. superqode/providers/openresponses/schema/__init__.py +56 -0
  152. superqode/providers/openresponses/schema/models.py +585 -0
  153. superqode/providers/openresponses/streaming/__init__.py +5 -0
  154. superqode/providers/openresponses/streaming/parser.py +338 -0
  155. superqode/providers/openresponses/tools/__init__.py +21 -0
  156. superqode/providers/openresponses/tools/apply_patch.py +352 -0
  157. superqode/providers/openresponses/tools/code_interpreter.py +290 -0
  158. superqode/providers/openresponses/tools/file_search.py +333 -0
  159. superqode/providers/openresponses/tools/mcp_adapter.py +252 -0
  160. superqode/providers/registry.py +716 -0
  161. superqode/providers/usage.py +332 -0
  162. superqode/pure_mode.py +384 -0
  163. superqode/qr/__init__.py +23 -0
  164. superqode/qr/dashboard.py +781 -0
  165. superqode/qr/generator.py +1018 -0
  166. superqode/qr/templates.py +135 -0
  167. superqode/safety/__init__.py +41 -0
  168. superqode/safety/sandbox.py +413 -0
  169. superqode/safety/warnings.py +256 -0
  170. superqode/server/__init__.py +33 -0
  171. superqode/server/lsp_server.py +775 -0
  172. superqode/server/web.py +250 -0
  173. superqode/session/__init__.py +25 -0
  174. superqode/session/persistence.py +580 -0
  175. superqode/session/sharing.py +477 -0
  176. superqode/session.py +475 -0
  177. superqode/sidebar.py +2991 -0
  178. superqode/stream_view.py +648 -0
  179. superqode/styles/__init__.py +3 -0
  180. superqode/superqe/__init__.py +184 -0
  181. superqode/superqe/acp_runner.py +1064 -0
  182. superqode/superqe/constitution/__init__.py +62 -0
  183. superqode/superqe/constitution/evaluator.py +308 -0
  184. superqode/superqe/constitution/loader.py +432 -0
  185. superqode/superqe/constitution/schema.py +250 -0
  186. superqode/superqe/events.py +591 -0
  187. superqode/superqe/frameworks/__init__.py +65 -0
  188. superqode/superqe/frameworks/base.py +234 -0
  189. superqode/superqe/frameworks/e2e.py +263 -0
  190. superqode/superqe/frameworks/executor.py +237 -0
  191. superqode/superqe/frameworks/javascript.py +409 -0
  192. superqode/superqe/frameworks/python.py +373 -0
  193. superqode/superqe/frameworks/registry.py +92 -0
  194. superqode/superqe/mcp_tools/__init__.py +47 -0
  195. superqode/superqe/mcp_tools/core_tools.py +418 -0
  196. superqode/superqe/mcp_tools/registry.py +230 -0
  197. superqode/superqe/mcp_tools/testing_tools.py +167 -0
  198. superqode/superqe/noise.py +89 -0
  199. superqode/superqe/orchestrator.py +778 -0
  200. superqode/superqe/roles.py +609 -0
  201. superqode/superqe/session.py +713 -0
  202. superqode/superqe/skills/__init__.py +57 -0
  203. superqode/superqe/skills/base.py +106 -0
  204. superqode/superqe/skills/core_skills.py +899 -0
  205. superqode/superqe/skills/registry.py +90 -0
  206. superqode/superqe/verifier.py +101 -0
  207. superqode/superqe_cli.py +76 -0
  208. superqode/tool_call.py +358 -0
  209. superqode/tools/__init__.py +93 -0
  210. superqode/tools/agent_tools.py +496 -0
  211. superqode/tools/base.py +324 -0
  212. superqode/tools/batch_tool.py +133 -0
  213. superqode/tools/diagnostics.py +311 -0
  214. superqode/tools/edit_tools.py +653 -0
  215. superqode/tools/enhanced_base.py +515 -0
  216. superqode/tools/file_tools.py +269 -0
  217. superqode/tools/file_tracking.py +45 -0
  218. superqode/tools/lsp_tools.py +610 -0
  219. superqode/tools/network_tools.py +350 -0
  220. superqode/tools/permissions.py +400 -0
  221. superqode/tools/question_tool.py +324 -0
  222. superqode/tools/search_tools.py +598 -0
  223. superqode/tools/shell_tools.py +259 -0
  224. superqode/tools/todo_tools.py +121 -0
  225. superqode/tools/validation.py +80 -0
  226. superqode/tools/web_tools.py +639 -0
  227. superqode/tui.py +1152 -0
  228. superqode/tui_integration.py +875 -0
  229. superqode/tui_widgets/__init__.py +27 -0
  230. superqode/tui_widgets/widgets/__init__.py +18 -0
  231. superqode/tui_widgets/widgets/progress.py +185 -0
  232. superqode/tui_widgets/widgets/tool_display.py +188 -0
  233. superqode/undo_manager.py +574 -0
  234. superqode/utils/__init__.py +5 -0
  235. superqode/utils/error_handling.py +323 -0
  236. superqode/utils/fuzzy.py +257 -0
  237. superqode/widgets/__init__.py +477 -0
  238. superqode/widgets/agent_collab.py +390 -0
  239. superqode/widgets/agent_store.py +936 -0
  240. superqode/widgets/agent_switcher.py +395 -0
  241. superqode/widgets/animation_manager.py +284 -0
  242. superqode/widgets/code_context.py +356 -0
  243. superqode/widgets/command_palette.py +412 -0
  244. superqode/widgets/connection_status.py +537 -0
  245. superqode/widgets/conversation_history.py +470 -0
  246. superqode/widgets/diff_indicator.py +155 -0
  247. superqode/widgets/enhanced_status_bar.py +385 -0
  248. superqode/widgets/enhanced_toast.py +476 -0
  249. superqode/widgets/file_browser.py +809 -0
  250. superqode/widgets/file_reference.py +585 -0
  251. superqode/widgets/issue_timeline.py +340 -0
  252. superqode/widgets/leader_key.py +264 -0
  253. superqode/widgets/mode_switcher.py +445 -0
  254. superqode/widgets/model_picker.py +234 -0
  255. superqode/widgets/permission_preview.py +1205 -0
  256. superqode/widgets/prompt.py +358 -0
  257. superqode/widgets/provider_connect.py +725 -0
  258. superqode/widgets/pty_shell.py +587 -0
  259. superqode/widgets/qe_dashboard.py +321 -0
  260. superqode/widgets/resizable_sidebar.py +377 -0
  261. superqode/widgets/response_changes.py +218 -0
  262. superqode/widgets/response_display.py +528 -0
  263. superqode/widgets/rich_tool_display.py +613 -0
  264. superqode/widgets/sidebar_panels.py +1180 -0
  265. superqode/widgets/slash_complete.py +356 -0
  266. superqode/widgets/split_view.py +612 -0
  267. superqode/widgets/status_bar.py +273 -0
  268. superqode/widgets/superqode_display.py +786 -0
  269. superqode/widgets/thinking_display.py +815 -0
  270. superqode/widgets/throbber.py +87 -0
  271. superqode/widgets/toast.py +206 -0
  272. superqode/widgets/unified_output.py +1073 -0
  273. superqode/workspace/__init__.py +75 -0
  274. superqode/workspace/artifacts.py +472 -0
  275. superqode/workspace/coordinator.py +353 -0
  276. superqode/workspace/diff_tracker.py +429 -0
  277. superqode/workspace/git_guard.py +373 -0
  278. superqode/workspace/git_snapshot.py +526 -0
  279. superqode/workspace/manager.py +750 -0
  280. superqode/workspace/snapshot.py +357 -0
  281. superqode/workspace/watcher.py +535 -0
  282. superqode/workspace/worktree.py +440 -0
  283. superqode-0.1.5.dist-info/METADATA +204 -0
  284. superqode-0.1.5.dist-info/RECORD +288 -0
  285. superqode-0.1.5.dist-info/WHEEL +5 -0
  286. superqode-0.1.5.dist-info/entry_points.txt +3 -0
  287. superqode-0.1.5.dist-info/licenses/LICENSE +648 -0
  288. superqode-0.1.5.dist-info/top_level.txt +1 -0
@@ -0,0 +1,21 @@
1
+ """Enterprise feature gating for SuperQode OSS."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from rich.console import Console
6
+
7
+
8
+ _console = Console()
9
+
10
+
11
+ def require_enterprise(feature_name: str) -> bool:
12
+ """Check if enterprise features are available."""
13
+ try:
14
+ import superqode_enterprise # noqa: F401
15
+ except Exception:
16
+ _console.print(
17
+ f"[yellow]{feature_name} is available in SuperQode Enterprise.[/yellow]\n"
18
+ "[dim]Install the enterprise package to enable this feature.[/dim]"
19
+ )
20
+ return False
21
+ return True
@@ -0,0 +1,25 @@
1
+ """Enhanced evaluation capabilities with CodeOptiX integration."""
2
+
3
+ # Import CodeOptiX modules as normal dependencies
4
+ try:
5
+ from codeoptix.evaluation import EvaluationEngine as CodeOptiXEngine
6
+ from codeoptix.behaviors import create_behavior
7
+ from codeoptix.evaluation.bloom_integration import BloomIdeationIntegration
8
+ from codeoptix.evolution import EvolutionEngine as CodeOptiXEvolutionEngine
9
+
10
+ CODEOPTIX_AVAILABLE = True
11
+ except ImportError:
12
+ CODEOPTIX_AVAILABLE = False
13
+ CodeOptiXEngine = None
14
+ create_behavior = None
15
+ BloomIdeationIntegration = None
16
+ CodeOptiXEvolutionEngine = None
17
+
18
+ # Export what's available
19
+ __all__ = [
20
+ "CODEOPTIX_AVAILABLE",
21
+ "CodeOptiXEngine",
22
+ "create_behavior",
23
+ "BloomIdeationIntegration",
24
+ "CodeOptiXEvolutionEngine",
25
+ ]
@@ -0,0 +1,93 @@
1
+ """Agent adapters for CodeOptiX integration."""
2
+
3
+ from typing import Dict, Any, Optional
4
+ import logging
5
+
6
+ from superqode.evaluation import CODEOPTIX_AVAILABLE
7
+
8
+ logger = logging.getLogger(__name__)
9
+
10
+
11
+ class SuperQodeCodeOptiXAdapter:
12
+ """Adapter to connect SuperQode agents with CodeOptiX evaluation."""
13
+
14
+ def __init__(self):
15
+ """Initialize the adapter."""
16
+ self.codeoptix_adapter = None
17
+
18
+ if CODEOPTIX_AVAILABLE:
19
+ try:
20
+ from codeoptix.adapters.factory import create_adapter
21
+
22
+ self.create_adapter = create_adapter
23
+ self.codeoptix_adapter = create_adapter("basic") # Default adapter
24
+ except Exception as e:
25
+ logger.warning(f"CodeOptiX adapter creation failed: {e}")
26
+
27
+ def create_agent_adapter(self, agent_config: Dict[str, Any]):
28
+ """Create a CodeOptiX adapter for a specific agent configuration."""
29
+ if not self.codeoptix_adapter:
30
+ return None
31
+
32
+ try:
33
+ agent_type = agent_config.get("type", "basic")
34
+
35
+ # Map SuperQode agent types to CodeOptiX adapter types
36
+ adapter_mapping = {
37
+ "claude-code": "claude-code",
38
+ "codex": "codex",
39
+ "gemini-cli": "gemini-cli",
40
+ "basic": "basic",
41
+ }
42
+
43
+ codeoptix_type = adapter_mapping.get(agent_type, "basic")
44
+
45
+ adapter = self.create_adapter(codeoptix_type, agent_config)
46
+ logger.info(f"Created CodeOptiX adapter for {agent_type}")
47
+ return adapter
48
+
49
+ except Exception as e:
50
+ logger.error(f"Failed to create agent adapter: {e}")
51
+ return None
52
+
53
+ def adapt_agent_output(self, agent_output: Any) -> Optional[Dict[str, Any]]:
54
+ """Adapt SuperQode agent output to CodeOptiX format."""
55
+ if not agent_output:
56
+ return None
57
+
58
+ try:
59
+ # Convert SuperQode output format to CodeOptiX expected format
60
+ adapted = {
61
+ "content": getattr(agent_output, "content", str(agent_output)),
62
+ "metadata": getattr(agent_output, "metadata", {}),
63
+ "success": getattr(agent_output, "success", True),
64
+ "timestamp": getattr(agent_output, "timestamp", None),
65
+ }
66
+ return adapted
67
+
68
+ except Exception as e:
69
+ logger.error(f"Agent output adaptation failed: {e}")
70
+ return None
71
+
72
+ def is_adapter_available(self) -> bool:
73
+ """Check if CodeOptiX adapter is available."""
74
+ return self.codeoptix_adapter is not None
75
+
76
+
77
+ # Global adapter instance
78
+ adapter_manager = SuperQodeCodeOptiXAdapter()
79
+
80
+
81
+ def get_codeoptix_adapter(agent_config: Dict[str, Any]):
82
+ """Get a CodeOptiX adapter for the given agent configuration."""
83
+ return adapter_manager.create_agent_adapter(agent_config)
84
+
85
+
86
+ def adapt_agent_output_for_evaluation(agent_output: Any) -> Optional[Dict[str, Any]]:
87
+ """Adapt agent output for CodeOptiX evaluation."""
88
+ return adapter_manager.adapt_agent_output(agent_output)
89
+
90
+
91
+ def is_codeoptix_integration_available() -> bool:
92
+ """Check if CodeOptiX integration is available."""
93
+ return adapter_manager.is_adapter_available()
@@ -0,0 +1,89 @@
1
+ """Enhanced behaviors for quality evaluation using CodeOptiX."""
2
+
3
+ from typing import Dict, Any, List
4
+ from pathlib import Path
5
+
6
+ from superqode.evaluation import CODEOPTIX_AVAILABLE
7
+
8
+
9
+ class EnhancedBehaviorManager:
10
+ """Manager for enhanced evaluation behaviors."""
11
+
12
+ def __init__(self):
13
+ """Initialize behavior manager."""
14
+ self._behaviors = {}
15
+
16
+ if CODEOPTIX_AVAILABLE:
17
+ self._load_codeoptix_behaviors()
18
+
19
+ def _load_codeoptix_behaviors(self):
20
+ """Load CodeOptiX behaviors."""
21
+ try:
22
+ from codeoptix.behaviors import insecure_code, vacuous_tests, plan_drift
23
+
24
+ self._behaviors.update(
25
+ {
26
+ "security-vulnerabilities": insecure_code.InsecureCodeBehavior(),
27
+ "test-quality": vacuous_tests.VacuousTestsBehavior(),
28
+ "plan-adherence": plan_drift.PlanDriftBehavior(),
29
+ }
30
+ )
31
+ except ImportError:
32
+ pass
33
+
34
+ def get_behavior(self, name: str):
35
+ """Get a behavior by name."""
36
+ return self._behaviors.get(name)
37
+
38
+ def list_behaviors(self) -> Dict[str, str]:
39
+ """List all available behaviors with descriptions."""
40
+ descriptions = {
41
+ "security-vulnerabilities": "Detects hardcoded secrets, SQL injection, XSS vulnerabilities",
42
+ "test-quality": "Evaluates test completeness, assertion quality, and coverage",
43
+ "plan-adherence": "Checks if implementation matches requirements and plans",
44
+ }
45
+
46
+ # Only return behaviors that are actually available
47
+ available = {}
48
+ for name, behavior in self._behaviors.items():
49
+ if behavior is not None:
50
+ available[name] = descriptions.get(name, f"Enhanced {name} analysis")
51
+
52
+ return available
53
+
54
+ def evaluate_behavior(
55
+ self, behavior_name: str, codebase_path: Path, config: Dict[str, Any]
56
+ ) -> Dict[str, Any]:
57
+ """Evaluate a specific behavior on the codebase."""
58
+ behavior = self.get_behavior(behavior_name)
59
+ if not behavior:
60
+ return {"error": f"Behavior {behavior_name} not available"}
61
+
62
+ try:
63
+ # This is a simplified interface - in practice, you'd need to
64
+ # adapt the behavior to work with the codebase
65
+ return {
66
+ "behavior": behavior_name,
67
+ "status": "completed",
68
+ "findings": [], # Would contain actual findings
69
+ "score": 0.85, # Example quality score
70
+ "details": f"Evaluated {behavior_name} on {codebase_path}",
71
+ }
72
+ except Exception as e:
73
+ return {"error": f"Evaluation failed: {str(e)}"}
74
+
75
+
76
+ # Global behavior manager instance
77
+ behavior_manager = EnhancedBehaviorManager()
78
+
79
+
80
+ def get_enhanced_behaviors() -> Dict[str, str]:
81
+ """Get available enhanced behaviors."""
82
+ return behavior_manager.list_behaviors()
83
+
84
+
85
+ def evaluate_enhanced_behavior(
86
+ behavior_name: str, codebase_path: Path, config: Dict[str, Any]
87
+ ) -> Dict[str, Any]:
88
+ """Evaluate an enhanced behavior."""
89
+ return behavior_manager.evaluate_behavior(behavior_name, codebase_path, config)
@@ -0,0 +1,209 @@
1
+ """Enhanced evaluation engine integrating CodeOptiX capabilities."""
2
+
3
+ from pathlib import Path
4
+ from typing import Dict, Any, List, Optional
5
+ import logging
6
+
7
+ from superqode.evaluation import (
8
+ CODEOPTIX_AVAILABLE,
9
+ CodeOptiXEngine,
10
+ create_behavior,
11
+ BloomIdeationIntegration,
12
+ )
13
+
14
+ # Import CodeOptiX utilities if available
15
+ try:
16
+ from codeoptix.utils.llm import create_llm_client, LLMProvider
17
+ from codeoptix.adapters.factory import create_adapter
18
+ except ImportError:
19
+ create_llm_client = None
20
+ LLMProvider = None
21
+ create_adapter = None
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ class EnhancedQEEngine:
27
+ """Enhanced Quality Engineering engine with CodeOptiX integration."""
28
+
29
+ def __init__(self):
30
+ """Initialize the enhanced QE engine."""
31
+ self.codeoptix_engine = None
32
+ self.bloom_generator = None
33
+
34
+ if CODEOPTIX_AVAILABLE and create_llm_client and create_adapter:
35
+ try:
36
+ # Try to create LLM client (try all available providers)
37
+ llm_client = None
38
+ import os
39
+
40
+ # Provider priority: Ollama (free) -> OpenAI -> Anthropic -> Google
41
+ provider_configs = [
42
+ (LLMProvider.OLLAMA, None, "llama3.1"),
43
+ (LLMProvider.OPENAI, os.getenv("OPENAI_API_KEY"), None),
44
+ (LLMProvider.ANTHROPIC, os.getenv("ANTHROPIC_API_KEY"), None),
45
+ (LLMProvider.GOOGLE, os.getenv("GOOGLE_API_KEY"), None),
46
+ ]
47
+
48
+ for provider, api_key, model in provider_configs:
49
+ try:
50
+ if provider == LLMProvider.OLLAMA or api_key:
51
+ llm_client = create_llm_client(provider, api_key=api_key, model=model)
52
+ break # Successfully created client
53
+ except Exception:
54
+ continue # Try next provider
55
+
56
+ if llm_client:
57
+ # Create basic adapter for testing/development
58
+ # BasicAdapter needs llm_config to create its own llm_client
59
+ adapter_config = {
60
+ "llm_config": {
61
+ "provider": "ollama", # Default to ollama
62
+ "model": "llama3.1",
63
+ }
64
+ }
65
+ adapter = create_adapter("basic", adapter_config)
66
+
67
+ # Initialize CodeOptiX evaluation engine
68
+ # Note: we're passing llm_client to EvaluationEngine, but BasicAdapter creates its own
69
+ # This might work if they're compatible
70
+ self.codeoptix_engine = CodeOptiXEngine(
71
+ adapter=adapter,
72
+ llm_client=llm_client,
73
+ config={"scenario_generator": {"use_bloom": True}},
74
+ )
75
+
76
+ # Initialize Bloom generator with the same llm_client
77
+ self.bloom_generator = BloomIdeationIntegration(llm_client=llm_client)
78
+
79
+ # Initialize enhanced behaviors
80
+ self.enhanced_behaviors = {
81
+ "security-vulnerabilities": self._create_security_behavior(),
82
+ "test-quality": self._create_test_behavior(),
83
+ "plan-adherence": self._create_plan_behavior(),
84
+ }
85
+ else:
86
+ logger.warning("No LLM client available for CodeOptiX evaluation")
87
+ self.enhanced_behaviors = {}
88
+ except Exception as e:
89
+ logger.error(f"Failed to initialize CodeOptiX engine: {e}")
90
+ self.enhanced_behaviors = {}
91
+ else:
92
+ self.enhanced_behaviors = {}
93
+
94
+ def _create_security_behavior(self):
95
+ """Create security vulnerability behavior."""
96
+ if CODEOPTIX_AVAILABLE and create_behavior:
97
+ return create_behavior("insecure-code")
98
+ return None
99
+
100
+ def _create_test_behavior(self):
101
+ """Create test quality behavior."""
102
+ if CODEOPTIX_AVAILABLE and create_behavior:
103
+ return create_behavior("vacuous-tests")
104
+ return None
105
+
106
+ def _create_plan_behavior(self):
107
+ """Create plan adherence behavior."""
108
+ if CODEOPTIX_AVAILABLE and create_behavior:
109
+ return create_behavior("plan-drift")
110
+ return None
111
+
112
+ def analyze_with_codeoptix(
113
+ self, codebase_path: Path, config: Dict[str, Any], behaviors: Optional[List[str]] = None
114
+ ) -> Dict[str, Any]:
115
+ """Perform enhanced analysis using CodeOptiX capabilities."""
116
+ if not CODEOPTIX_AVAILABLE or not self.codeoptix_engine:
117
+ return {"error": "CodeOptiX evaluation engine not available"}
118
+
119
+ try:
120
+ # Determine which behaviors to run
121
+ if behaviors is None:
122
+ behaviors = ["insecure-code", "vacuous-tests"] # Use CodeOptiX behavior names
123
+
124
+ # Map SuperQode behavior names to CodeOptiX behavior names
125
+ behavior_mapping = {
126
+ "security-vulnerabilities": "insecure-code",
127
+ "test-quality": "vacuous-tests",
128
+ "plan-adherence": "plan-drift",
129
+ }
130
+
131
+ # Convert to CodeOptiX behavior names
132
+ codeoptix_behaviors = []
133
+ for behavior in behaviors:
134
+ codeoptix_name = behavior_mapping.get(behavior, behavior)
135
+ codeoptix_behaviors.append(codeoptix_name)
136
+
137
+ # Generate scenarios if requested
138
+ scenarios = None
139
+ if config.get("use_bloom_scenarios", False) and self.bloom_generator:
140
+ try:
141
+ scenarios = self.bloom_generator.generate_scenarios(
142
+ behavior_name="comprehensive-quality",
143
+ behavior_description="Multi-dimensional code quality evaluation",
144
+ examples=config.get("scenario_examples", []),
145
+ )
146
+ except Exception as e:
147
+ logger.warning(f"Bloom scenario generation failed: {e}")
148
+
149
+ # Run CodeOptiX evaluation
150
+ try:
151
+ results = self.codeoptix_engine.evaluate_behaviors(
152
+ behavior_names=codeoptix_behaviors,
153
+ scenarios=scenarios,
154
+ context={"codebase_path": str(codebase_path)},
155
+ )
156
+
157
+ return {
158
+ "enhanced_analysis": True,
159
+ "behaviors_evaluated": behaviors,
160
+ "results": results,
161
+ "scenarios_used": len(scenarios) if scenarios else 0,
162
+ }
163
+
164
+ except Exception as e:
165
+ error_msg = str(e)
166
+ # Provide cleaner error messages for common issues
167
+ if "Ollama" in error_msg and ("daemon" in error_msg or "contact" in error_msg):
168
+ clean_error = "LLM provider not available. Configure one of: Ollama (ollama serve), OpenAI (OPENAI_API_KEY), Anthropic (ANTHROPIC_API_KEY), or Google (GOOGLE_API_KEY)"
169
+ else:
170
+ clean_error = f"CodeOptiX evaluation failed: {error_msg}"
171
+ logger.error(clean_error)
172
+
173
+ return {"error": clean_error, "enhanced_analysis": False}
174
+
175
+ except Exception as e:
176
+ logger.error(f"Enhanced CodeOptiX analysis failed: {e}")
177
+ return {"error": f"Enhanced analysis failed: {str(e)}", "enhanced_analysis": False}
178
+
179
+ def get_available_behaviors(self) -> Dict[str, str]:
180
+ """Get all available behaviors (basic + enhanced)."""
181
+ behaviors = {
182
+ # Basic behaviors (always available)
183
+ "syntax-errors": "Basic syntax validation",
184
+ "code-style": "PEP8 and style checking",
185
+ "imports": "Import organization and dependencies",
186
+ "documentation": "Documentation completeness",
187
+ }
188
+
189
+ # Add enhanced behaviors if available
190
+ if CODEOPTIX_AVAILABLE:
191
+ behaviors.update(
192
+ {
193
+ "security-vulnerabilities": "Advanced security analysis (CodeOptiX)",
194
+ "test-quality": "Intelligent test evaluation (CodeOptiX)",
195
+ "plan-adherence": "Requirements alignment checking (CodeOptiX)",
196
+ }
197
+ )
198
+ else:
199
+ behaviors["codeoptix-integration"] = (
200
+ "CodeOptiX integration is available (codeoptix dependency required)."
201
+ )
202
+
203
+ return behaviors
204
+
205
+ def is_behavior_available(self, behavior_name: str) -> bool:
206
+ """Check if a specific behavior is available."""
207
+ if behavior_name in self.enhanced_behaviors:
208
+ return self.enhanced_behaviors[behavior_name] is not None
209
+ return behavior_name in ["syntax-errors", "code-style", "imports", "documentation"]
@@ -0,0 +1,96 @@
1
+ """Bloom scenario generation integration for enhanced testing."""
2
+
3
+ from pathlib import Path
4
+ from typing import Dict, Any, List, Optional
5
+ import logging
6
+
7
+ from superqode.evaluation import CODEOPTIX_AVAILABLE, BloomIdeationIntegration
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ class EnhancedScenarioGenerator:
13
+ """Enhanced scenario generator using Bloom ideation."""
14
+
15
+ def __init__(self):
16
+ """Initialize the scenario generator."""
17
+ self.bloom_generator = None
18
+
19
+ if CODEOPTIX_AVAILABLE:
20
+ try:
21
+ self.bloom_generator = BloomIdeationIntegration()
22
+ except Exception as e:
23
+ logger.warning(f"Bloom integration failed: {e}")
24
+
25
+ def generate_bloom_scenarios(
26
+ self,
27
+ behavior_name: str,
28
+ behavior_description: str,
29
+ codebase_path: Path,
30
+ examples: Optional[List[Dict[str, Any]]] = None,
31
+ ) -> List[Dict[str, Any]]:
32
+ """Generate intelligent test scenarios using Bloom."""
33
+ if not self.bloom_generator:
34
+ logger.info("Bloom generator not available, using basic scenarios")
35
+ return self._generate_basic_scenarios(behavior_name, codebase_path)
36
+
37
+ try:
38
+ scenarios = self.bloom_generator.generate_scenarios(
39
+ behavior_name=behavior_name,
40
+ behavior_description=behavior_description,
41
+ examples=examples or [],
42
+ )
43
+
44
+ logger.info(f"Generated {len(scenarios)} Bloom scenarios for {behavior_name}")
45
+ return scenarios
46
+
47
+ except Exception as e:
48
+ logger.error(f"Bloom scenario generation failed: {e}")
49
+ return self._generate_basic_scenarios(behavior_name, codebase_path)
50
+
51
+ def _generate_basic_scenarios(
52
+ self, behavior_name: str, codebase_path: Path
53
+ ) -> List[Dict[str, Any]]:
54
+ """Generate basic fallback scenarios."""
55
+ # Basic scenarios as fallback when Bloom is not available
56
+ base_scenarios = [
57
+ {
58
+ "name": f"basic-{behavior_name}-scenario-1",
59
+ "description": f"Basic scenario for {behavior_name}",
60
+ "complexity": "low",
61
+ "tags": ["basic", behavior_name],
62
+ },
63
+ {
64
+ "name": f"basic-{behavior_name}-scenario-2",
65
+ "description": f"Alternative scenario for {behavior_name}",
66
+ "complexity": "medium",
67
+ "tags": ["basic", "alternative", behavior_name],
68
+ },
69
+ ]
70
+
71
+ logger.info(f"Generated {len(base_scenarios)} basic scenarios as fallback")
72
+ return base_scenarios
73
+
74
+ def is_bloom_available(self) -> bool:
75
+ """Check if Bloom scenario generation is available."""
76
+ return self.bloom_generator is not None
77
+
78
+
79
+ # Global scenario generator instance
80
+ scenario_generator = EnhancedScenarioGenerator()
81
+
82
+
83
+ def generate_enhanced_scenarios(
84
+ behavior_name: str,
85
+ behavior_description: str,
86
+ codebase_path: Path,
87
+ examples: Optional[List[Dict[str, Any]]] = None,
88
+ use_bloom: bool = True,
89
+ ) -> List[Dict[str, Any]]:
90
+ """Generate enhanced scenarios with optional Bloom integration."""
91
+ if use_bloom and scenario_generator.is_bloom_available():
92
+ return scenario_generator.generate_bloom_scenarios(
93
+ behavior_name, behavior_description, codebase_path, examples
94
+ )
95
+ else:
96
+ return scenario_generator._generate_basic_scenarios(behavior_name, codebase_path)
@@ -0,0 +1,36 @@
1
+ """
2
+ Execution module - Hard-constrained test execution roles.
3
+
4
+ These are "dumb runners" that execute existing tests without
5
+ discovery, inference, or generation.
6
+
7
+ Roles:
8
+ - Smoke Tester: Runs smoke tests, fail-fast, no discovery
9
+ - Sanity Tester: Runs sanity tests, verifies recent changes
10
+ - Regression Tester: Runs full regression suite, detects flakes
11
+ """
12
+
13
+ from .runner import (
14
+ TestRunner,
15
+ SmokeRunner,
16
+ SanityRunner,
17
+ RegressionRunner,
18
+ TestResult,
19
+ TestSuiteResult,
20
+ )
21
+ from .linter import LinterRunner, LinterRunResult
22
+ from .modes import ExecutionMode, QuickScanConfig, DeepQEConfig
23
+
24
+ __all__ = [
25
+ "TestRunner",
26
+ "SmokeRunner",
27
+ "SanityRunner",
28
+ "RegressionRunner",
29
+ "TestResult",
30
+ "TestSuiteResult",
31
+ "LinterRunner",
32
+ "LinterRunResult",
33
+ "ExecutionMode",
34
+ "QuickScanConfig",
35
+ "DeepQEConfig",
36
+ ]