superqode 0.1.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- superqode/__init__.py +33 -0
- superqode/acp/__init__.py +23 -0
- superqode/acp/client.py +913 -0
- superqode/acp/permission_screen.py +457 -0
- superqode/acp/types.py +480 -0
- superqode/acp_discovery.py +856 -0
- superqode/agent/__init__.py +22 -0
- superqode/agent/edit_strategies.py +334 -0
- superqode/agent/loop.py +892 -0
- superqode/agent/qe_report_templates.py +39 -0
- superqode/agent/system_prompts.py +353 -0
- superqode/agent_output.py +721 -0
- superqode/agent_stream.py +953 -0
- superqode/agents/__init__.py +59 -0
- superqode/agents/acp_registry.py +305 -0
- superqode/agents/client.py +249 -0
- superqode/agents/data/augmentcode.com.toml +51 -0
- superqode/agents/data/cagent.dev.toml +51 -0
- superqode/agents/data/claude.com.toml +60 -0
- superqode/agents/data/codeassistant.dev.toml +51 -0
- superqode/agents/data/codex.openai.com.toml +57 -0
- superqode/agents/data/fastagent.ai.toml +66 -0
- superqode/agents/data/geminicli.com.toml +77 -0
- superqode/agents/data/goose.block.xyz.toml +54 -0
- superqode/agents/data/junie.jetbrains.com.toml +56 -0
- superqode/agents/data/kimi.moonshot.cn.toml +57 -0
- superqode/agents/data/llmlingagent.dev.toml +51 -0
- superqode/agents/data/molt.bot.toml +49 -0
- superqode/agents/data/opencode.ai.toml +60 -0
- superqode/agents/data/stakpak.dev.toml +51 -0
- superqode/agents/data/vtcode.dev.toml +51 -0
- superqode/agents/discovery.py +266 -0
- superqode/agents/messaging.py +160 -0
- superqode/agents/persona.py +166 -0
- superqode/agents/registry.py +421 -0
- superqode/agents/schema.py +72 -0
- superqode/agents/unified.py +367 -0
- superqode/app/__init__.py +111 -0
- superqode/app/constants.py +314 -0
- superqode/app/css.py +366 -0
- superqode/app/models.py +118 -0
- superqode/app/suggester.py +125 -0
- superqode/app/widgets.py +1591 -0
- superqode/app_enhanced.py +399 -0
- superqode/app_main.py +17187 -0
- superqode/approval.py +312 -0
- superqode/atomic.py +296 -0
- superqode/commands/__init__.py +1 -0
- superqode/commands/acp.py +965 -0
- superqode/commands/agents.py +180 -0
- superqode/commands/auth.py +278 -0
- superqode/commands/config.py +374 -0
- superqode/commands/init.py +826 -0
- superqode/commands/providers.py +819 -0
- superqode/commands/qe.py +1145 -0
- superqode/commands/roles.py +380 -0
- superqode/commands/serve.py +172 -0
- superqode/commands/suggestions.py +127 -0
- superqode/commands/superqe.py +460 -0
- superqode/config/__init__.py +51 -0
- superqode/config/loader.py +812 -0
- superqode/config/schema.py +498 -0
- superqode/core/__init__.py +111 -0
- superqode/core/roles.py +281 -0
- superqode/danger.py +386 -0
- superqode/data/superqode-template.yaml +1522 -0
- superqode/design_system.py +1080 -0
- superqode/dialogs/__init__.py +6 -0
- superqode/dialogs/base.py +39 -0
- superqode/dialogs/model.py +130 -0
- superqode/dialogs/provider.py +870 -0
- superqode/diff_view.py +919 -0
- superqode/enterprise.py +21 -0
- superqode/evaluation/__init__.py +25 -0
- superqode/evaluation/adapters.py +93 -0
- superqode/evaluation/behaviors.py +89 -0
- superqode/evaluation/engine.py +209 -0
- superqode/evaluation/scenarios.py +96 -0
- superqode/execution/__init__.py +36 -0
- superqode/execution/linter.py +538 -0
- superqode/execution/modes.py +347 -0
- superqode/execution/resolver.py +283 -0
- superqode/execution/runner.py +642 -0
- superqode/file_explorer.py +811 -0
- superqode/file_viewer.py +471 -0
- superqode/flash.py +183 -0
- superqode/guidance/__init__.py +58 -0
- superqode/guidance/config.py +203 -0
- superqode/guidance/prompts.py +71 -0
- superqode/harness/__init__.py +54 -0
- superqode/harness/accelerator.py +291 -0
- superqode/harness/config.py +319 -0
- superqode/harness/validator.py +147 -0
- superqode/history.py +279 -0
- superqode/integrations/superopt_runner.py +124 -0
- superqode/logging/__init__.py +49 -0
- superqode/logging/adapters.py +219 -0
- superqode/logging/formatter.py +923 -0
- superqode/logging/integration.py +341 -0
- superqode/logging/sinks.py +170 -0
- superqode/logging/unified_log.py +417 -0
- superqode/lsp/__init__.py +26 -0
- superqode/lsp/client.py +544 -0
- superqode/main.py +1069 -0
- superqode/mcp/__init__.py +89 -0
- superqode/mcp/auth_storage.py +380 -0
- superqode/mcp/client.py +1236 -0
- superqode/mcp/config.py +319 -0
- superqode/mcp/integration.py +337 -0
- superqode/mcp/oauth.py +436 -0
- superqode/mcp/oauth_callback.py +385 -0
- superqode/mcp/types.py +290 -0
- superqode/memory/__init__.py +31 -0
- superqode/memory/feedback.py +342 -0
- superqode/memory/store.py +522 -0
- superqode/notifications.py +369 -0
- superqode/optimization/__init__.py +5 -0
- superqode/optimization/config.py +33 -0
- superqode/permissions/__init__.py +25 -0
- superqode/permissions/rules.py +488 -0
- superqode/plan.py +323 -0
- superqode/providers/__init__.py +33 -0
- superqode/providers/gateway/__init__.py +165 -0
- superqode/providers/gateway/base.py +228 -0
- superqode/providers/gateway/litellm_gateway.py +1170 -0
- superqode/providers/gateway/openresponses_gateway.py +436 -0
- superqode/providers/health.py +297 -0
- superqode/providers/huggingface/__init__.py +74 -0
- superqode/providers/huggingface/downloader.py +472 -0
- superqode/providers/huggingface/endpoints.py +442 -0
- superqode/providers/huggingface/hub.py +531 -0
- superqode/providers/huggingface/inference.py +394 -0
- superqode/providers/huggingface/transformers_runner.py +516 -0
- superqode/providers/local/__init__.py +100 -0
- superqode/providers/local/base.py +438 -0
- superqode/providers/local/discovery.py +418 -0
- superqode/providers/local/lmstudio.py +256 -0
- superqode/providers/local/mlx.py +457 -0
- superqode/providers/local/ollama.py +486 -0
- superqode/providers/local/sglang.py +268 -0
- superqode/providers/local/tgi.py +260 -0
- superqode/providers/local/tool_support.py +477 -0
- superqode/providers/local/vllm.py +258 -0
- superqode/providers/manager.py +1338 -0
- superqode/providers/models.py +1016 -0
- superqode/providers/models_dev.py +578 -0
- superqode/providers/openresponses/__init__.py +87 -0
- superqode/providers/openresponses/converters/__init__.py +17 -0
- superqode/providers/openresponses/converters/messages.py +343 -0
- superqode/providers/openresponses/converters/tools.py +268 -0
- superqode/providers/openresponses/schema/__init__.py +56 -0
- superqode/providers/openresponses/schema/models.py +585 -0
- superqode/providers/openresponses/streaming/__init__.py +5 -0
- superqode/providers/openresponses/streaming/parser.py +338 -0
- superqode/providers/openresponses/tools/__init__.py +21 -0
- superqode/providers/openresponses/tools/apply_patch.py +352 -0
- superqode/providers/openresponses/tools/code_interpreter.py +290 -0
- superqode/providers/openresponses/tools/file_search.py +333 -0
- superqode/providers/openresponses/tools/mcp_adapter.py +252 -0
- superqode/providers/registry.py +716 -0
- superqode/providers/usage.py +332 -0
- superqode/pure_mode.py +384 -0
- superqode/qr/__init__.py +23 -0
- superqode/qr/dashboard.py +781 -0
- superqode/qr/generator.py +1018 -0
- superqode/qr/templates.py +135 -0
- superqode/safety/__init__.py +41 -0
- superqode/safety/sandbox.py +413 -0
- superqode/safety/warnings.py +256 -0
- superqode/server/__init__.py +33 -0
- superqode/server/lsp_server.py +775 -0
- superqode/server/web.py +250 -0
- superqode/session/__init__.py +25 -0
- superqode/session/persistence.py +580 -0
- superqode/session/sharing.py +477 -0
- superqode/session.py +475 -0
- superqode/sidebar.py +2991 -0
- superqode/stream_view.py +648 -0
- superqode/styles/__init__.py +3 -0
- superqode/superqe/__init__.py +184 -0
- superqode/superqe/acp_runner.py +1064 -0
- superqode/superqe/constitution/__init__.py +62 -0
- superqode/superqe/constitution/evaluator.py +308 -0
- superqode/superqe/constitution/loader.py +432 -0
- superqode/superqe/constitution/schema.py +250 -0
- superqode/superqe/events.py +591 -0
- superqode/superqe/frameworks/__init__.py +65 -0
- superqode/superqe/frameworks/base.py +234 -0
- superqode/superqe/frameworks/e2e.py +263 -0
- superqode/superqe/frameworks/executor.py +237 -0
- superqode/superqe/frameworks/javascript.py +409 -0
- superqode/superqe/frameworks/python.py +373 -0
- superqode/superqe/frameworks/registry.py +92 -0
- superqode/superqe/mcp_tools/__init__.py +47 -0
- superqode/superqe/mcp_tools/core_tools.py +418 -0
- superqode/superqe/mcp_tools/registry.py +230 -0
- superqode/superqe/mcp_tools/testing_tools.py +167 -0
- superqode/superqe/noise.py +89 -0
- superqode/superqe/orchestrator.py +778 -0
- superqode/superqe/roles.py +609 -0
- superqode/superqe/session.py +713 -0
- superqode/superqe/skills/__init__.py +57 -0
- superqode/superqe/skills/base.py +106 -0
- superqode/superqe/skills/core_skills.py +899 -0
- superqode/superqe/skills/registry.py +90 -0
- superqode/superqe/verifier.py +101 -0
- superqode/superqe_cli.py +76 -0
- superqode/tool_call.py +358 -0
- superqode/tools/__init__.py +93 -0
- superqode/tools/agent_tools.py +496 -0
- superqode/tools/base.py +324 -0
- superqode/tools/batch_tool.py +133 -0
- superqode/tools/diagnostics.py +311 -0
- superqode/tools/edit_tools.py +653 -0
- superqode/tools/enhanced_base.py +515 -0
- superqode/tools/file_tools.py +269 -0
- superqode/tools/file_tracking.py +45 -0
- superqode/tools/lsp_tools.py +610 -0
- superqode/tools/network_tools.py +350 -0
- superqode/tools/permissions.py +400 -0
- superqode/tools/question_tool.py +324 -0
- superqode/tools/search_tools.py +598 -0
- superqode/tools/shell_tools.py +259 -0
- superqode/tools/todo_tools.py +121 -0
- superqode/tools/validation.py +80 -0
- superqode/tools/web_tools.py +639 -0
- superqode/tui.py +1152 -0
- superqode/tui_integration.py +875 -0
- superqode/tui_widgets/__init__.py +27 -0
- superqode/tui_widgets/widgets/__init__.py +18 -0
- superqode/tui_widgets/widgets/progress.py +185 -0
- superqode/tui_widgets/widgets/tool_display.py +188 -0
- superqode/undo_manager.py +574 -0
- superqode/utils/__init__.py +5 -0
- superqode/utils/error_handling.py +323 -0
- superqode/utils/fuzzy.py +257 -0
- superqode/widgets/__init__.py +477 -0
- superqode/widgets/agent_collab.py +390 -0
- superqode/widgets/agent_store.py +936 -0
- superqode/widgets/agent_switcher.py +395 -0
- superqode/widgets/animation_manager.py +284 -0
- superqode/widgets/code_context.py +356 -0
- superqode/widgets/command_palette.py +412 -0
- superqode/widgets/connection_status.py +537 -0
- superqode/widgets/conversation_history.py +470 -0
- superqode/widgets/diff_indicator.py +155 -0
- superqode/widgets/enhanced_status_bar.py +385 -0
- superqode/widgets/enhanced_toast.py +476 -0
- superqode/widgets/file_browser.py +809 -0
- superqode/widgets/file_reference.py +585 -0
- superqode/widgets/issue_timeline.py +340 -0
- superqode/widgets/leader_key.py +264 -0
- superqode/widgets/mode_switcher.py +445 -0
- superqode/widgets/model_picker.py +234 -0
- superqode/widgets/permission_preview.py +1205 -0
- superqode/widgets/prompt.py +358 -0
- superqode/widgets/provider_connect.py +725 -0
- superqode/widgets/pty_shell.py +587 -0
- superqode/widgets/qe_dashboard.py +321 -0
- superqode/widgets/resizable_sidebar.py +377 -0
- superqode/widgets/response_changes.py +218 -0
- superqode/widgets/response_display.py +528 -0
- superqode/widgets/rich_tool_display.py +613 -0
- superqode/widgets/sidebar_panels.py +1180 -0
- superqode/widgets/slash_complete.py +356 -0
- superqode/widgets/split_view.py +612 -0
- superqode/widgets/status_bar.py +273 -0
- superqode/widgets/superqode_display.py +786 -0
- superqode/widgets/thinking_display.py +815 -0
- superqode/widgets/throbber.py +87 -0
- superqode/widgets/toast.py +206 -0
- superqode/widgets/unified_output.py +1073 -0
- superqode/workspace/__init__.py +75 -0
- superqode/workspace/artifacts.py +472 -0
- superqode/workspace/coordinator.py +353 -0
- superqode/workspace/diff_tracker.py +429 -0
- superqode/workspace/git_guard.py +373 -0
- superqode/workspace/git_snapshot.py +526 -0
- superqode/workspace/manager.py +750 -0
- superqode/workspace/snapshot.py +357 -0
- superqode/workspace/watcher.py +535 -0
- superqode/workspace/worktree.py +440 -0
- superqode-0.1.5.dist-info/METADATA +204 -0
- superqode-0.1.5.dist-info/RECORD +288 -0
- superqode-0.1.5.dist-info/WHEEL +5 -0
- superqode-0.1.5.dist-info/entry_points.txt +3 -0
- superqode-0.1.5.dist-info/licenses/LICENSE +648 -0
- superqode-0.1.5.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,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)
|