prompt.go

 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}