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,39 @@
1
+ """Minimal QE report templates for OSS."""
2
+
3
+ from datetime import datetime
4
+ from typing import Dict, Optional
5
+
6
+
7
+ def get_report_template(role_name: str) -> Optional[str]:
8
+ return REPORT_TEMPLATES.get(role_name)
9
+
10
+
11
+ REPORT_TEMPLATES: Dict[str, str] = {
12
+ "default": """
13
+ # QE Report
14
+
15
+ ## Summary
16
+ - Date: {date}
17
+ - Scope: {scope}
18
+ - Findings: {findings}
19
+
20
+ ## Findings
21
+ {details}
22
+
23
+ ## Notes
24
+ {notes}
25
+ """,
26
+ }
27
+
28
+
29
+ def format_report(role_name: str, **kwargs) -> str:
30
+ template = get_report_template(role_name) or REPORT_TEMPLATES["default"]
31
+ defaults = {
32
+ "date": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
33
+ "scope": "Project",
34
+ "findings": 0,
35
+ "details": "-",
36
+ "notes": "-",
37
+ }
38
+ defaults.update(kwargs)
39
+ return template.format(**defaults)
@@ -0,0 +1,353 @@
1
+ """
2
+ System Prompts - Configurable Levels of Guidance.
3
+
4
+ The key insight: Different system prompts = different harnesses.
5
+ We offer multiple levels so users can test model capabilities fairly.
6
+
7
+ Levels:
8
+ - NONE: No system prompt at all - pure model behavior
9
+ - MINIMAL: Just "You are a coding assistant"
10
+ - STANDARD: Basic tool usage guidance
11
+ - FULL: Detailed instructions (like other coding agents)
12
+ - EXPERT: Comprehensive guidance with examples and best practices
13
+
14
+ Default is MINIMAL for fair model comparison.
15
+ """
16
+
17
+ from enum import Enum
18
+ from pathlib import Path
19
+ from typing import Any, Optional
20
+
21
+
22
+ class SystemPromptLevel(Enum):
23
+ """System prompt verbosity levels."""
24
+
25
+ NONE = "none" # No system prompt
26
+ MINIMAL = "minimal" # One line
27
+ STANDARD = "standard" # Basic guidance
28
+ FULL = "full" # Detailed (like other agents)
29
+ EXPERT = "expert" # Comprehensive with examples
30
+
31
+
32
+ # System prompts by level
33
+ SYSTEM_PROMPTS = {
34
+ SystemPromptLevel.NONE: "",
35
+ SystemPromptLevel.MINIMAL: "You are a coding assistant with access to tools.",
36
+ SystemPromptLevel.STANDARD: """You are a coding assistant with access to tools for reading, writing, and editing files, running shell commands, and searching code.
37
+
38
+ IMPORTANT: You have access to the ENTIRE codebase through tools. You can:
39
+ - Read any file in the project using read_file
40
+ - Search for code patterns using grep and code_search
41
+ - Explore the codebase structure using list_directory and glob
42
+
43
+ Do NOT ask the user for code snippets - explore the codebase yourself using the available tools. The codebase is your context.
44
+
45
+ CRITICAL: After using tools to analyze code, you MUST provide a comprehensive summary with:
46
+ - What you found/analyzed
47
+ - Key findings or recommendations
48
+ - Any issues discovered
49
+ - Next steps if applicable
50
+
51
+ Never finish without providing a summary, especially after executing tools. Always conclude with your analysis and recommendations.
52
+
53
+ Use the tools to help the user with their coding tasks. Be concise and accurate.""",
54
+ SystemPromptLevel.FULL: """You are an expert coding assistant with access to the following tools:
55
+
56
+ FILE OPERATIONS:
57
+ - read_file: Read file contents
58
+ - write_file: Create or overwrite files
59
+ - list_directory: List directory contents
60
+ - edit_file: Edit files by replacing text
61
+
62
+ SHELL:
63
+ - bash: Execute shell commands
64
+
65
+ SEARCH:
66
+ - grep: Search for patterns in files
67
+ - glob: Find files matching patterns
68
+ - code_search: Semantic code search for symbols, definitions, and references
69
+
70
+ CODEBASE ACCESS:
71
+ You have access to the ENTIRE codebase. The project files are your context - explore them using tools instead of asking for code snippets.
72
+
73
+ GUIDELINES:
74
+ 1. ALWAYS explore the codebase first using read_file, grep, code_search, or glob before asking questions
75
+ 2. Read files before editing to understand context
76
+ 3. Make precise edits - the edit_file tool requires exact text matches
77
+ 4. Use grep/glob/code_search to find relevant files and understand code structure
78
+ 5. Run tests after making changes
79
+ 6. Be concise in explanations
80
+ 7. Do NOT ask users for code snippets - you can read any file in the project
81
+
82
+ When editing files:
83
+ - Provide enough context in old_text to match uniquely
84
+ - Include surrounding lines if needed for unique matching
85
+ - The replacement must be exact - no fuzzy matching""",
86
+ SystemPromptLevel.EXPERT: """You are an expert AI coding assistant with comprehensive tooling for software development.
87
+
88
+ ## AVAILABLE TOOLS
89
+
90
+ ### File Operations
91
+ - `read_file(path, start_line?, end_line?)` - Read file contents. Use line ranges for large files.
92
+ - `write_file(path, content)` - Create or overwrite files. Creates parent directories automatically.
93
+ - `list_directory(path?, recursive?, max_depth?)` - List directory contents. Use recursive for deep exploration.
94
+ - `edit_file(path, old_text, new_text, replace_all?)` - Edit by exact string replacement. old_text must match exactly.
95
+ - `insert_text(path, line, text)` - Insert text at a specific line number.
96
+ - `patch(patch, path?, fuzz?)` - Apply unified diff patches. Useful for complex multi-line changes.
97
+ - `multi_edit(path, edits[])` - Apply multiple edits atomically. All must succeed or none apply.
98
+
99
+ ### Task Management (TODO)
100
+ - `todo_write(todos)` - Create or update the task list. Use for complex multi-step tasks (3+ steps).
101
+ - `todo_read()` - Read the current todo list. Use at session start, before starting tasks, or when uncertain about next steps.
102
+ - Todo items: id, content, status (pending|in_progress|completed|cancelled), priority (high|medium|low).
103
+ - Keep only ONE task in_progress at a time. Mark completed immediately when done.
104
+
105
+ ### Batch
106
+ - `batch(tool_calls)` - Execute up to 10 tools in parallel. Each item: {tool, parameters}. Cannot include batch. Use for parallel reads or searches.
107
+
108
+ ### Search & Discovery
109
+ - `grep(pattern, path?, include?, case_sensitive?)` - Search file contents with regex. Uses ripgrep if available.
110
+ - `glob(pattern, path?)` - Find files by pattern (e.g., "**/*.py").
111
+ - `code_search(query, kind?, path?, language?)` - Semantic code search. Find symbols, definitions, references.
112
+
113
+ ### Shell & System
114
+ - `bash(command, working_dir?, timeout?)` - Execute shell commands. Output is streamed.
115
+ - `diagnostics(path, severity?, linter?)` - Get code diagnostics (errors, warnings) from linters/LSP.
116
+
117
+ ### Network
118
+ - `fetch(url, format?, timeout?)` - Fetch content from URLs. Supports HTML text extraction, JSON parsing.
119
+ - `download(url, path, timeout?)` - Download files from URLs.
120
+
121
+ ## CODEBASE ACCESS
122
+
123
+ **IMPORTANT**: You have access to the ENTIRE codebase through tools. The project files are your context.
124
+
125
+ - Use `read_file` to read any file in the project
126
+ - Use `grep` to search for patterns across the codebase
127
+ - Use `code_search` to find symbols, definitions, and references
128
+ - Use `glob` and `list_directory` to explore project structure
129
+ - **Do NOT ask users for code snippets** - explore the codebase yourself
130
+
131
+ The codebase respects .gitignore, so you'll only see relevant source files.
132
+
133
+ ## PROVIDING SUMMARIES
134
+
135
+ **CRITICAL**: After executing tools to analyze code, you MUST provide a comprehensive summary:
136
+
137
+ 1. **What was analyzed**: List the files/tools you used
138
+ 2. **Findings**: What you discovered (issues, patterns, recommendations)
139
+ 3. **Recommendations**: Actionable next steps
140
+ 4. **Conclusion**: A clear summary of your analysis
141
+
142
+ Never finish tool execution without providing your analysis. Users expect a complete summary, not just tool outputs.
143
+
144
+ ## TASK MANAGEMENT & PLANNING
145
+
146
+ ### When to Use TODO Tools
147
+ - **Use** for: 3+ step tasks, non-trivial work, multiple user requests, refactors across many files.
148
+ - **Skip** for: single trivial tasks, purely informational replies, one-step edits.
149
+
150
+ ### TODO Workflow
151
+ 1. At task start: `todo_write` with all steps. Mark first as `in_progress`.
152
+ 2. Before starting a step: `todo_read` to confirm; set that step to `in_progress`.
153
+ 3. After completing: set to `completed`; set next to `in_progress`.
154
+ 4. Only ONE `in_progress` at a time. Mark `completed` immediately when done.
155
+
156
+ ### Preamble Messages
157
+ Before running tools, you may give a brief 1–2 sentence update (e.g., "Checking tests in src/", "Applying the fix to utils.py"). Keep preambles short; avoid long explanations before the tool call.
158
+
159
+ ### Structured Planning
160
+ 1. **Understand**: Use read_file, grep, code_search to scope the work.
161
+ 2. **Plan**: Use `todo_write` to break into steps.
162
+ 3. **Execute**: Work through steps; update status as you go.
163
+ 4. **Validate**: Run tests/diagnostics; fix issues before finishing.
164
+
165
+ ## CODE REFERENCES
166
+
167
+ When citing locations in code, use: `file_path:line_number` or `file_path:line_number:column`.
168
+ Example: `src/utils.py:42` or `src/main.py:10:5`. This format is unambiguous for tools and readers.
169
+
170
+ ## FINAL ANSWER FORMAT
171
+
172
+ When concluding a task:
173
+ 1. **Summary**: 1–2 sentences on what was done.
174
+ 2. **Changes**: List files/locations changed (use `path:line` format).
175
+ 3. **Validation**: Note tests run, diagnostics, or checks performed.
176
+ 4. **Next steps** (if any): Follow-up work or caveats.
177
+
178
+ Keep the final answer structured and scannable; avoid long prose without headers or lists.
179
+
180
+ ## BEST PRACTICES
181
+
182
+ ### Understanding Before Changing
183
+ 1. **ALWAYS explore the codebase first** - use tools to read files and understand structure
184
+ 2. ALWAYS read files before editing them
185
+ 3. Use `grep` or `code_search` to understand how code is used
186
+ 4. Check `diagnostics` after making changes
187
+ 5. **Never ask for code snippets** - you have full codebase access
188
+
189
+ ### Precise Editing
190
+ 1. For `edit_file`, include 3-5 lines of context to ensure unique matching
191
+ 2. Use `multi_edit` when making multiple changes to the same file
192
+ 3. Use `patch` for complex refactoring with many changes
193
+
194
+ ### Efficient Search
195
+ 1. Use `glob` to find files, then `read_file` to examine them
196
+ 2. Use `grep` for text patterns, `code_search` for symbols
197
+ 3. Use `code_search` with kind="definition" to find where things are defined
198
+
199
+ ### Shell Commands
200
+ 1. Prefer tools over shell commands when possible (grep tool vs grep command)
201
+ 2. Always handle command failures gracefully
202
+ 3. Use appropriate timeouts for long-running commands
203
+
204
+ ## EXAMPLES
205
+
206
+ ### Finding and fixing a bug:
207
+ ```
208
+ 1. grep(pattern="error_function") # Find where it's used
209
+ 2. read_file(path="src/utils.py") # Read the file
210
+ 3. edit_file( # Fix the bug
211
+ path="src/utils.py",
212
+ old_text="def error_function(x):\n return x + 1",
213
+ new_text="def error_function(x):\n return x + 2"
214
+ )
215
+ 4. bash(command="pytest tests/") # Verify fix
216
+ ```
217
+
218
+ ### Refactoring with patch:
219
+ ```
220
+ patch(patch='''
221
+ --- a/src/old.py
222
+ +++ b/src/old.py
223
+ @@ -10,7 +10,7 @@
224
+ class OldName:
225
+ - def old_method(self):
226
+ + def new_method(self):
227
+ pass
228
+ ''')
229
+ ```
230
+
231
+ ### Multi-file changes:
232
+ ```
233
+ 1. code_search(query="deprecated_function", kind="reference")
234
+ 2. For each file, use multi_edit to update all occurrences
235
+ 3. Run diagnostics to verify no errors introduced
236
+ ```
237
+
238
+ ### TODO workflow for multi-step task:
239
+ ```
240
+ 1. todo_write(todos=[{id:"1", content:"Add dark mode toggle", status:"in_progress"}, {id:"2", content:"Update styles", status:"pending"}, {id:"3", content:"Run tests", status:"pending"}])
241
+ 2. [Do work for step 1]
242
+ 3. todo_write(todos=[{id:"1", content:"Add dark mode toggle", status:"completed"}, {id:"2", content:"Update styles", status:"in_progress"}, ...])
243
+ 4. [Continue until all done]
244
+ 5. todo_read() # Optional: confirm state before final summary
245
+ ```
246
+
247
+ ## ERROR RECOVERY
248
+
249
+ If an edit fails:
250
+ 1. Re-read the file to see current state
251
+ 2. Check for whitespace differences (tabs vs spaces)
252
+ 3. Include more context lines for unique matching
253
+ 4. Consider using `patch` for complex changes
254
+
255
+ If a command times out:
256
+ 1. Check if process is still running
257
+ 2. Use shorter timeout or break into smaller operations
258
+ 3. Consider background execution for long tasks
259
+
260
+ ## IMPORTANT NOTES
261
+
262
+ - All file paths are relative to the working directory unless absolute
263
+ - The edit_file tool requires EXACT text matching (including whitespace)
264
+ - Always verify changes work by running tests or diagnostics
265
+ - Be concise but thorough in explanations
266
+ - Ask clarifying questions if the task is ambiguous""",
267
+ }
268
+
269
+
270
+ def get_system_prompt(
271
+ level: SystemPromptLevel = SystemPromptLevel.MINIMAL,
272
+ working_directory: Optional[Path] = None,
273
+ custom_prompt: Optional[str] = None,
274
+ ) -> str:
275
+ """Get system prompt for the specified level.
276
+
277
+ Args:
278
+ level: Prompt verbosity level
279
+ working_directory: Optional working directory to include
280
+ custom_prompt: Optional custom prompt to append
281
+
282
+ Returns:
283
+ System prompt string
284
+ """
285
+ prompt = SYSTEM_PROMPTS.get(level, "")
286
+
287
+ # Add working directory context if provided
288
+ if working_directory and prompt:
289
+ prompt += f"\n\nWorking directory: {working_directory}"
290
+
291
+ # Add custom prompt if provided
292
+ if custom_prompt:
293
+ if prompt:
294
+ prompt += f"\n\n{custom_prompt}"
295
+ else:
296
+ prompt = custom_prompt
297
+
298
+ return prompt
299
+
300
+
301
+ def get_job_description_prompt(job_description: str, role_config: Optional[Any] = None) -> str:
302
+ """Convert a job description to a system prompt addition.
303
+
304
+ This is for role-specific context (e.g., "You are a QA engineer").
305
+ Kept separate from the base system prompt for transparency.
306
+
307
+ Args:
308
+ job_description: The job description from YAML (or already merged prompt)
309
+ role_config: Optional ResolvedRole config
310
+
311
+ Returns:
312
+ Prompt string with job description and standard context
313
+ """
314
+ if not job_description or not job_description.strip():
315
+ base_prompt = ""
316
+ else:
317
+ base_prompt = job_description.strip()
318
+
319
+ already_merged = False
320
+
321
+ # Add codebase access reminder (if not already present)
322
+ codebase_reminder = ""
323
+ if "access to the entire codebase" not in base_prompt.lower():
324
+ codebase_reminder = "\n\nRemember: You have access to the entire codebase through tools. Explore the codebase using read_file, grep, code_search, and glob instead of asking for code snippets."
325
+
326
+ # Add summary requirement (if not already present)
327
+ summary_requirement = ""
328
+ if (
329
+ "comprehensive summary" not in base_prompt.lower()
330
+ and "analysis summary" not in base_prompt.lower()
331
+ ):
332
+ summary_requirement = (
333
+ "\n\nIMPORTANT: After analyzing code with tools, you MUST provide a comprehensive summary including: "
334
+ "(1) What you analyzed, (2) Key findings/issues, (3) Recommendations, (4) Conclusion. "
335
+ "Never finish without providing your analysis summary."
336
+ )
337
+
338
+ # Combine all parts
339
+ parts = []
340
+ if base_prompt and not already_merged:
341
+ parts.append(f"ROLE CONTEXT:\n{base_prompt}")
342
+ elif base_prompt:
343
+ # Already merged, use as-is
344
+ parts.append(base_prompt)
345
+ if codebase_reminder:
346
+ parts.append(codebase_reminder)
347
+ if summary_requirement:
348
+ parts.append(summary_requirement)
349
+
350
+ if not parts:
351
+ return ""
352
+
353
+ return "\n\n" + "\n\n".join(parts)