1package prompt
2
3import (
4 "fmt"
5 "os"
6 "path/filepath"
7
8 "github.com/kujtimiihoxha/opencode/internal/config"
9 "github.com/kujtimiihoxha/opencode/internal/llm/models"
10)
11
12// contextFiles is a list of potential context files to check for
13var contextFiles = []string{
14 ".github/copilot-instructions.md",
15 ".cursorrules",
16 "CLAUDE.md",
17 "CLAUDE.local.md",
18 "opencode.md",
19 "opencode.local.md",
20 "OpenCode.md",
21 "OpenCode.local.md",
22 "OPENCODE.md",
23 "OPENCODE.local.md",
24}
25
26func GetAgentPrompt(agentName config.AgentName, provider models.ModelProvider) string {
27 basePrompt := ""
28 switch agentName {
29 case config.AgentCoder:
30 basePrompt = CoderPrompt(provider)
31 case config.AgentTitle:
32 basePrompt = TitlePrompt(provider)
33 case config.AgentTask:
34 basePrompt = TaskPrompt(provider)
35 default:
36 basePrompt = "You are a helpful assistant"
37 }
38
39 if agentName == config.AgentCoder || agentName == config.AgentTask {
40 // Add context from project-specific instruction files if they exist
41 contextContent := getContextFromFiles()
42 if contextContent != "" {
43 return fmt.Sprintf("%s\n\n# Project-Specific Context\n%s", basePrompt, contextContent)
44 }
45 }
46 return basePrompt
47}
48
49// getContextFromFiles checks for the existence of context files and returns their content
50func getContextFromFiles() string {
51 workDir := config.WorkingDirectory()
52 var contextContent string
53
54 for _, file := range contextFiles {
55 filePath := filepath.Join(workDir, file)
56 content, err := os.ReadFile(filePath)
57 if err == nil {
58 contextContent += fmt.Sprintf("\n%s\n", string(content))
59 }
60 }
61
62 return contextContent
63}