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,498 @@
1
+ """Configuration schema definitions for SuperQode."""
2
+
3
+ from typing import Dict, List, Optional, Any, Literal
4
+ from dataclasses import dataclass, field
5
+ from pathlib import Path
6
+
7
+
8
+ @dataclass
9
+ class ProviderConfig:
10
+ """Configuration for an AI provider."""
11
+
12
+ api_key_env: str = ""
13
+ description: str = ""
14
+ base_url: Optional[str] = None
15
+ recommended_models: List[str] = field(default_factory=list)
16
+ custom_models_allowed: bool = True
17
+ # New: Provider type for custom providers
18
+ type: Optional[str] = None # "openai-compatible" for custom endpoints
19
+
20
+
21
+ @dataclass
22
+ class HandoffConfig:
23
+ """Configuration for role handoff."""
24
+
25
+ to: str # Target role (e.g., "qa.reviewer")
26
+ when: str = "task_complete" # Trigger condition
27
+ include: List[str] = field(default_factory=lambda: ["summary", "files_modified"])
28
+
29
+
30
+ @dataclass
31
+ class CrossValidationConfig:
32
+ """Configuration for cross-model validation."""
33
+
34
+ enabled: bool = True
35
+ exclude_same_model: bool = True
36
+ exclude_same_provider: bool = False
37
+
38
+
39
+ @dataclass
40
+ class AgentConfigBlock:
41
+ """Configuration for an ACP agent's internal LLM settings."""
42
+
43
+ provider: Optional[str] = None
44
+ model: Optional[str] = None
45
+
46
+
47
+ @dataclass
48
+ class RoleConfig:
49
+ """Configuration for a team role.
50
+
51
+ Supports three execution modes:
52
+ - BYOK (mode="byok"): Direct LLM API calls via gateway
53
+ - ACP (mode="acp"): Full coding agent via Agent Client Protocol
54
+ - LOCAL (mode="local"): Local/self-hosted models (no API keys)
55
+ """
56
+
57
+ description: str
58
+
59
+ # Execution mode: "byok", "acp", or "local"
60
+ mode: Literal["byok", "acp", "local"] = "byok"
61
+
62
+ # BYOK mode settings
63
+ provider: Optional[str] = None # LLM provider (e.g., "anthropic")
64
+ model: Optional[str] = None # Model ID (e.g., "claude-sonnet-4")
65
+
66
+ # ACP mode settings
67
+ agent: Optional[str] = None # Agent ID (e.g., "opencode")
68
+ agent_config: Optional[AgentConfigBlock] = None # Agent's internal LLM config
69
+
70
+ # Common settings
71
+ job_description: str = ""
72
+ enabled: bool = True
73
+ mcp_servers: List[str] = field(default_factory=list)
74
+ handoff: Optional[HandoffConfig] = None
75
+ cross_validation: Optional[CrossValidationConfig] = None
76
+
77
+ # Expert prompt configuration (for QE roles)
78
+ expert_prompt_enabled: bool = False # Default: OSS disables expert prompts
79
+ expert_prompt: Optional[str] = None # Optional: custom expert prompt override
80
+
81
+ # Legacy field (deprecated, use 'agent' instead)
82
+ coding_agent: str = "superqode"
83
+
84
+
85
+ @dataclass
86
+ class ModeConfig:
87
+ """Configuration for a team mode (category of roles)."""
88
+
89
+ description: str
90
+ enabled: bool = True
91
+ roles: Dict[str, RoleConfig] = field(default_factory=dict)
92
+ # For QE mode: specify which roles to run in deep analysis
93
+ # If empty, uses all enabled QE roles
94
+ deep_analysis_roles: List[str] = field(default_factory=list)
95
+ # For direct modes (no sub-roles)
96
+ coding_agent: Optional[str] = None
97
+ provider: Optional[str] = None
98
+ model: Optional[str] = None
99
+ job_description: Optional[str] = None
100
+ mcp_servers: List[str] = field(default_factory=list)
101
+
102
+
103
+ @dataclass
104
+ class TeamConfig:
105
+ """Configuration for the development team."""
106
+
107
+ modes: Dict[str, ModeConfig] = field(default_factory=dict)
108
+
109
+
110
+ @dataclass
111
+ class MCPServerConfigYAML:
112
+ """MCP server configuration in YAML format."""
113
+
114
+ transport: Literal["stdio", "http", "sse"] = "stdio"
115
+ enabled: bool = True
116
+ auto_connect: bool = True
117
+ # Stdio transport
118
+ command: Optional[str] = None
119
+ args: List[str] = field(default_factory=list)
120
+ env: Dict[str, str] = field(default_factory=dict)
121
+ cwd: Optional[str] = None
122
+ # HTTP/SSE transport
123
+ url: Optional[str] = None
124
+ headers: Dict[str, str] = field(default_factory=dict)
125
+ timeout: float = 30.0
126
+
127
+
128
+ @dataclass
129
+ class BYOKConfig:
130
+ """Configuration for BYOK persistent settings."""
131
+
132
+ last_provider: str = ""
133
+ last_model: str = ""
134
+ favorites: List[str] = field(default_factory=list) # "provider/model" format
135
+ history: List[str] = field(default_factory=list) # Recent connections
136
+ auto_connect: bool = False # Auto-connect on startup
137
+ show_pricing: bool = True # Show pricing in model list
138
+
139
+
140
+ @dataclass
141
+ class OpenResponsesConfig:
142
+ """Configuration for Open Responses gateway.
143
+
144
+ Open Responses provides a unified API for local and custom AI providers
145
+ with support for reasoning/thinking, built-in tools, and streaming.
146
+ """
147
+
148
+ # API endpoint
149
+ base_url: str = "http://localhost:11434"
150
+ api_key: Optional[str] = None
151
+
152
+ # Reasoning configuration
153
+ reasoning_effort: Literal["low", "medium", "high"] = "medium"
154
+
155
+ # Context handling
156
+ truncation: Literal["auto", "disabled"] = "auto"
157
+
158
+ # Request settings
159
+ timeout: float = 300.0
160
+
161
+ # Built-in tools
162
+ enable_apply_patch: bool = True
163
+ enable_code_interpreter: bool = True
164
+ enable_file_search: bool = False
165
+ enable_web_search: bool = False
166
+
167
+
168
+ @dataclass
169
+ class GatewayConfig:
170
+ """Configuration for the LLM gateway (BYOK mode).
171
+
172
+ Supports multiple gateway types:
173
+ - litellm: LiteLLM for unified access to 100+ providers (default)
174
+ - openresponses: Open Responses specification for local/custom providers
175
+ """
176
+
177
+ type: Literal["litellm", "openresponses"] = "litellm"
178
+ byok: BYOKConfig = field(default_factory=BYOKConfig)
179
+ openresponses: OpenResponsesConfig = field(default_factory=OpenResponsesConfig)
180
+
181
+
182
+ @dataclass
183
+ class CostTrackingConfig:
184
+ """Configuration for cost tracking."""
185
+
186
+ enabled: bool = True
187
+ show_after_task: bool = True
188
+
189
+
190
+ @dataclass
191
+ class ErrorConfig:
192
+ """Configuration for error handling."""
193
+
194
+ surface_rate_limits: bool = True
195
+ surface_auth_errors: bool = True
196
+
197
+
198
+ @dataclass
199
+ class OutputConfig:
200
+ """Configuration for QE output."""
201
+
202
+ directory: str = ".superqode"
203
+ reports_format: Literal["markdown", "html", "json"] = "markdown"
204
+ keep_history: bool = True
205
+
206
+
207
+ @dataclass
208
+ class QEModeConfig:
209
+ """Configuration for a QE execution mode."""
210
+
211
+ timeout: int = 60 # Timeout in seconds
212
+ depth: Literal["shallow", "full"] = "shallow"
213
+ generate_tests: bool = False
214
+ destructive: bool = False # Can run stress/load tests
215
+
216
+
217
+ @dataclass
218
+ class ExecutionRoleConfig:
219
+ """Configuration for execution roles (smoke/sanity/regression).
220
+
221
+ These are hard-constraint runners - they execute existing tests only.
222
+ No discovery, no inference, no generation.
223
+ """
224
+
225
+ test_pattern: str = "**/test_*.py"
226
+ fail_fast: bool = False
227
+ allow_generation: bool = False # Always False for execution roles
228
+ detect_flakes: bool = False
229
+
230
+
231
+ @dataclass
232
+ class TestGenerationConfig:
233
+ """Configuration for test generation."""
234
+
235
+ output_dir: str = ".superqode/qe-artifacts/generated-tests"
236
+ frameworks: Dict[str, str] = field(
237
+ default_factory=lambda: {
238
+ "python": "pytest",
239
+ "javascript": "jest",
240
+ "go": "go test",
241
+ }
242
+ )
243
+ coverage_target: int = 80
244
+
245
+
246
+ @dataclass
247
+ class HarnessToolConfig:
248
+ """Configuration for a harness validation tool."""
249
+
250
+ name: str = ""
251
+ enabled: bool = True
252
+ args: List[str] = field(default_factory=list)
253
+ timeout_seconds: int = 10
254
+
255
+
256
+ @dataclass
257
+ class HarnessLanguageConfig:
258
+ """Configuration for a language's harness validators."""
259
+
260
+ enabled: bool = True
261
+ tools: List[str] = field(default_factory=list)
262
+ extensions: List[str] = field(default_factory=list)
263
+
264
+
265
+ @dataclass
266
+ class HarnessConfig:
267
+ """Configuration for patch harness validation."""
268
+
269
+ enabled: bool = True
270
+ timeout_seconds: int = 30
271
+ fail_on_error: bool = False
272
+
273
+ # Structural validators (JSON, YAML, TOML)
274
+ structural_formats: List[str] = field(default_factory=lambda: ["json", "yaml", "toml"])
275
+
276
+ # Language validators
277
+ python_tools: List[str] = field(default_factory=lambda: ["ruff", "mypy"])
278
+ javascript_tools: List[str] = field(default_factory=lambda: ["eslint"])
279
+ typescript_tools: List[str] = field(default_factory=lambda: ["tsc", "eslint"])
280
+ go_tools: List[str] = field(default_factory=lambda: ["go vet", "golangci-lint"])
281
+ rust_tools: List[str] = field(default_factory=lambda: ["cargo check"])
282
+ shell_tools: List[str] = field(default_factory=lambda: ["shellcheck"])
283
+
284
+
285
+ @dataclass
286
+ class GuidanceModeConfig:
287
+ """Configuration for QE guidance mode."""
288
+
289
+ timeout_seconds: int = 60
290
+ verification_first: bool = True
291
+ fail_fast: bool = False
292
+ exploration_allowed: bool = False
293
+ destructive_testing: bool = False
294
+ focus_areas: List[str] = field(default_factory=list)
295
+ forbidden_actions: List[str] = field(default_factory=list)
296
+
297
+
298
+ @dataclass
299
+ class GuidanceConfig:
300
+ """Configuration for QE guidance prompts."""
301
+
302
+ enabled: bool = True
303
+ require_proof: bool = True # Must verify before claiming success
304
+
305
+ # Mode-specific settings
306
+ quick_scan: GuidanceModeConfig = field(
307
+ default_factory=lambda: GuidanceModeConfig(
308
+ timeout_seconds=60,
309
+ verification_first=True,
310
+ fail_fast=True,
311
+ focus_areas=["Run smoke tests", "Validate critical paths"],
312
+ )
313
+ )
314
+
315
+ deep_qe: GuidanceModeConfig = field(
316
+ default_factory=lambda: GuidanceModeConfig(
317
+ timeout_seconds=1800,
318
+ verification_first=True,
319
+ exploration_allowed=True,
320
+ destructive_testing=True,
321
+ focus_areas=["Comprehensive coverage", "Edge cases", "Security", "Performance"],
322
+ )
323
+ )
324
+
325
+ # Anti-patterns to detect
326
+ anti_patterns: List[str] = field(
327
+ default_factory=lambda: [
328
+ "skip_verification",
329
+ "unconditional_success",
330
+ "weaken_tests",
331
+ ]
332
+ )
333
+
334
+
335
+ @dataclass
336
+ class NoiseConfig:
337
+ """Configuration for noise filtering in QE findings."""
338
+
339
+ min_confidence: float = 0.7 # Filter findings below this threshold
340
+ deduplicate: bool = True # Remove similar findings
341
+ min_severity: Literal["low", "medium", "high", "critical"] = "low"
342
+ suppress_known_risks: bool = False # Suppress acknowledged risks
343
+ max_per_file: int = 10 # Max findings per file
344
+ max_total: int = 100 # Max total findings
345
+
346
+
347
+ @dataclass
348
+ class SuggestionConfig:
349
+ """Configuration for the allow_suggestions workflow.
350
+
351
+ When enabled, SuperQode will:
352
+ 1. Detect bugs during QE analysis
353
+ 2. Fix bugs in an isolated workspace (Add-on)
354
+ 3. Verify fixes by running tests
355
+ 4. Prove improvement with before/after metrics
356
+ 5. Report outcomes with evidence
357
+ 6. Add findings to QIR with fix verification
358
+ 7. REVERT all changes (original code restored)
359
+ 8. Preserve patches for user to accept/reject
360
+ """
361
+
362
+ enabled: bool = False # OFF by default - never modify without consent
363
+ verify_fixes: bool = True # Run tests to verify suggested fixes
364
+ require_proof: bool = True # Require before/after metrics
365
+ auto_generate_tests: bool = False # Generate regression tests for fixes
366
+ max_fix_attempts: int = 3 # Max attempts to fix an issue
367
+ revert_on_failure: bool = True # Revert if fix verification fails
368
+
369
+
370
+ @dataclass
371
+ class QEConfig:
372
+ """QE-specific configuration."""
373
+
374
+ # Output settings
375
+ output: OutputConfig = field(default_factory=OutputConfig)
376
+
377
+ # Suggestion workflow (allow_suggestions mode)
378
+ # When enabled, agents can demonstrate fixes in an isolated workspace, then revert
379
+ allow_suggestions: bool = False # CRITICAL: OFF by default
380
+ suggestions: SuggestionConfig = field(default_factory=SuggestionConfig)
381
+
382
+ # Noise filtering
383
+ noise: NoiseConfig = field(default_factory=NoiseConfig)
384
+
385
+ # Execution modes
386
+ modes: Dict[str, QEModeConfig] = field(
387
+ default_factory=lambda: {
388
+ "quick_scan": QEModeConfig(
389
+ timeout=60, depth="shallow", generate_tests=False, destructive=False
390
+ ),
391
+ "deep_qe": QEModeConfig(
392
+ timeout=1800, depth="full", generate_tests=True, destructive=True
393
+ ),
394
+ }
395
+ )
396
+
397
+ # Execution roles (hard constraints)
398
+ execution_roles: Dict[str, ExecutionRoleConfig] = field(
399
+ default_factory=lambda: {
400
+ "smoke": ExecutionRoleConfig(test_pattern="**/test_smoke*.py", fail_fast=True),
401
+ "sanity": ExecutionRoleConfig(test_pattern="**/test_sanity*.py", fail_fast=False),
402
+ "regression": ExecutionRoleConfig(test_pattern="**/test_*.py", detect_flakes=True),
403
+ }
404
+ )
405
+
406
+ # Test generation settings
407
+ test_generation: TestGenerationConfig = field(default_factory=TestGenerationConfig)
408
+
409
+ # Patch Harness - validates patches before including in QIR
410
+ harness: HarnessConfig = field(default_factory=HarnessConfig)
411
+
412
+ # QE Guidance - system prompts for time-constrained QE
413
+ guidance: GuidanceConfig = field(default_factory=GuidanceConfig)
414
+
415
+ # SuperOpt optimization hook (command-based)
416
+ optimize: "OptimizeConfig" = field(default_factory=lambda: OptimizeConfig())
417
+
418
+
419
+ @dataclass
420
+ class OptimizeConfig:
421
+ """Configuration for SuperOpt command-based optimization."""
422
+
423
+ enabled: bool = False
424
+ command: str = ""
425
+ timeout_seconds: int = 300
426
+
427
+
428
+ @dataclass
429
+ class SuperQodeConfig:
430
+ """Top-level SuperQode configuration."""
431
+
432
+ version: str = "1.0"
433
+ team_name: str = "My Development Team"
434
+ description: str = "Multi-agent software development team"
435
+
436
+ # Gateway and error handling config
437
+ gateway: GatewayConfig = field(default_factory=GatewayConfig)
438
+ cost_tracking: CostTrackingConfig = field(default_factory=CostTrackingConfig)
439
+ errors: ErrorConfig = field(default_factory=ErrorConfig)
440
+
441
+ # QE-specific configuration
442
+ qe: QEConfig = field(default_factory=QEConfig)
443
+
444
+
445
+ @dataclass
446
+ class Config:
447
+ """Complete SuperQode configuration."""
448
+
449
+ superqode: SuperQodeConfig = field(default_factory=SuperQodeConfig)
450
+ default: Optional[RoleConfig] = None
451
+ team: TeamConfig = field(default_factory=TeamConfig)
452
+ providers: Dict[str, ProviderConfig] = field(default_factory=dict)
453
+ agents: Dict[str, Dict[str, Any]] = field(default_factory=dict)
454
+ code_agents: List[str] = field(default_factory=list)
455
+ custom_models: Dict[str, Dict[str, Any]] = field(default_factory=dict)
456
+ model_aliases: Dict[str, str] = field(default_factory=dict)
457
+ mcp_servers: Dict[str, MCPServerConfigYAML] = field(default_factory=dict)
458
+ workflows: Dict[str, Any] = field(default_factory=dict) # Workflow definitions
459
+ legacy: Dict[str, Any] = field(default_factory=dict)
460
+
461
+
462
+ @dataclass
463
+ class ResolvedRole:
464
+ """A resolved role with all configuration details."""
465
+
466
+ mode: str
467
+ role: Optional[str]
468
+ description: str
469
+ coding_agent: str
470
+ agent_type: Literal["acp", "superqode", "byok"]
471
+ provider: Optional[str] = None
472
+ model: Optional[str] = None
473
+ job_description: str = ""
474
+ enabled: bool = True
475
+ mcp_servers: List[str] = field(default_factory=list)
476
+ handoff: Optional[HandoffConfig] = None
477
+ cross_validation: Optional[CrossValidationConfig] = None
478
+
479
+ # New: Execution mode info
480
+ execution_mode: Literal["byok", "acp"] = "byok"
481
+ agent_id: Optional[str] = None # For ACP mode
482
+ agent_config: Optional[AgentConfigBlock] = None # For ACP mode
483
+
484
+ # Expert prompt configuration
485
+ expert_prompt_enabled: bool = False # Default: OSS disables expert prompts
486
+ expert_prompt: Optional[str] = None # Optional: custom expert prompt override
487
+
488
+
489
+ @dataclass
490
+ class ResolvedMode:
491
+ """A resolved mode with all its roles."""
492
+
493
+ name: str
494
+ description: str
495
+ enabled: bool = True
496
+ roles: Dict[str, ResolvedRole] = field(default_factory=dict)
497
+ # For direct modes
498
+ direct_role: Optional[ResolvedRole] = None
@@ -0,0 +1,111 @@
1
+ """
2
+ SuperQode Core Module - Unified types and interfaces.
3
+
4
+ This module provides a single import point for core SuperQode types:
5
+ - Configuration types (RoleConfig, TeamConfig, etc.)
6
+ - Execution modes (BYOK, ACP, Quick Scan, Deep QE)
7
+ - Role definitions (dev, qe, devops categories)
8
+
9
+ Usage:
10
+ from superqode.core import (
11
+ ExecutionMode,
12
+ QEMode,
13
+ RoleConfig,
14
+ TeamConfig,
15
+ )
16
+ """
17
+
18
+ # Execution modes
19
+ from ..execution.modes import (
20
+ ExecutionMode,
21
+ QEMode,
22
+ GatewayType,
23
+ BYOKConfig,
24
+ ACPConfig,
25
+ ExecutionConfig,
26
+ QuickScanConfig,
27
+ DeepQEConfig,
28
+ get_qe_mode_config,
29
+ )
30
+
31
+ # Configuration schema
32
+ from ..config.schema import (
33
+ ProviderConfig,
34
+ HandoffConfig,
35
+ CrossValidationConfig,
36
+ AgentConfigBlock,
37
+ RoleConfig,
38
+ ModeConfig,
39
+ TeamConfig,
40
+ MCPServerConfigYAML,
41
+ GatewayConfig,
42
+ CostTrackingConfig,
43
+ ErrorConfig,
44
+ OutputConfig,
45
+ QEModeConfig,
46
+ )
47
+
48
+ # Configuration loader
49
+ from ..config.loader import (
50
+ load_config,
51
+ SuperQodeConfig,
52
+ )
53
+
54
+ # Unified roles
55
+ from .roles import (
56
+ Role,
57
+ RoleCategory,
58
+ QERoleType,
59
+ get_default_roles,
60
+ get_role,
61
+ list_all_roles,
62
+ list_roles_by_category,
63
+ list_qe_execution_roles,
64
+ list_qe_detection_roles,
65
+ DEFAULT_DEV_ROLES,
66
+ DEFAULT_QE_ROLES,
67
+ DEFAULT_DEVOPS_ROLES,
68
+ )
69
+
70
+ __all__ = [
71
+ # Execution modes
72
+ "ExecutionMode",
73
+ "QEMode",
74
+ "GatewayType",
75
+ "BYOKConfig",
76
+ "ACPConfig",
77
+ "ExecutionConfig",
78
+ "QuickScanConfig",
79
+ "DeepQEConfig",
80
+ "get_qe_mode_config",
81
+ # Configuration schema
82
+ "ProviderConfig",
83
+ "HandoffConfig",
84
+ "CrossValidationConfig",
85
+ "AgentConfigBlock",
86
+ "RoleConfig",
87
+ "ModeConfig",
88
+ "TeamConfig",
89
+ "MCPServerConfigYAML",
90
+ "GatewayConfig",
91
+ "CostTrackingConfig",
92
+ "ErrorConfig",
93
+ "OutputConfig",
94
+ "QEModeConfig",
95
+ # Configuration loader
96
+ "load_config",
97
+ "SuperQodeConfig",
98
+ # Unified roles
99
+ "Role",
100
+ "RoleCategory",
101
+ "QERoleType",
102
+ "get_default_roles",
103
+ "get_role",
104
+ "list_all_roles",
105
+ "list_roles_by_category",
106
+ "list_qe_execution_roles",
107
+ "list_qe_detection_roles",
108
+ "DEFAULT_DEV_ROLES",
109
+ "DEFAULT_QE_ROLES",
110
+ "DEFAULT_DEVOPS_ROLES",
111
+ ]