-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathagents.go
More file actions
128 lines (108 loc) · 2.89 KB
/
Copy pathagents.go
File metadata and controls
128 lines (108 loc) · 2.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package main
import (
"fmt"
"os/exec"
"strings"
)
// AgentType represents known AI agent types
type AgentType string
const (
AgentClaude AgentType = "claude"
AgentGemini AgentType = "gemini"
AgentCodex AgentType = "codex"
)
// AgentInfo contains information about a detected agent
type AgentInfo struct {
Command string
Type AgentType
Version string
}
// knownAgents lists all known AI terminal agents to detect
var knownAgents = []struct {
command string
agentType AgentType
}{
{"claude", AgentClaude},
{"gemini", AgentGemini},
{"codex", AgentCodex},
}
func checkCommand(command string) (string, error) {
path, err := exec.LookPath(command)
if err != nil {
return "", fmt.Errorf("command '%s' not found in PATH", command)
}
return path, nil
}
func detectAgentType(command string) AgentType {
cmd := strings.ToLower(command)
switch {
case strings.Contains(cmd, "claude"):
return AgentClaude
case strings.Contains(cmd, "gemini"):
return AgentGemini
case strings.Contains(cmd, "codex"):
return AgentCodex
default:
return AgentClaude
}
}
func getAgentVersion(command string, agentType AgentType) string {
cmd := exec.Command(command, "--version")
output, err := cmd.Output()
if err != nil {
return ""
}
version := strings.TrimSpace(strings.Split(string(output), "\n")[0])
if len(version) > 50 {
version = version[:47] + "..."
}
if strings.Contains(strings.ToLower(version), "install") ||
strings.Contains(strings.ToLower(version), "error") ||
strings.Contains(version, "?") {
return ""
}
return version
}
// detectAvailableAgents scans for installed AI agents
func detectAvailableAgents() []AgentInfo {
var available []AgentInfo
for _, agent := range knownAgents {
if _, err := exec.LookPath(agent.command); err == nil {
version := getAgentVersion(agent.command, agent.agentType)
available = append(available, AgentInfo{
Command: agent.command,
Type: agent.agentType,
Version: version,
})
}
}
return available
}
// selectAgent prompts user to select an agent if multiple are available
func selectAgent(agents []AgentInfo) string {
if len(agents) == 0 {
return ""
}
if len(agents) == 1 {
fmt.Printf("%sDetected: %s%s\n", dim, agents[0].Command, reset)
return agents[0].Command
}
fmt.Printf("\n%s=== Available AI Agents ===%s\n", bold, reset)
for i, agent := range agents {
versionStr := ""
if agent.Version != "" {
versionStr = fmt.Sprintf(" %s(%s)%s", dim, agent.Version, reset)
}
fmt.Printf(" %s[%d]%s %s%s\n", cyan, i+1, reset, agent.Command, versionStr)
}
fmt.Println()
fmt.Printf("Select agent [1-%d]: ", len(agents))
var input string
fmt.Scanln(&input)
var selection int
if _, err := fmt.Sscanf(input, "%d", &selection); err != nil || selection < 1 || selection > len(agents) {
fmt.Printf("%sUsing default: %s%s\n", dim, agents[0].Command, reset)
return agents[0].Command
}
return agents[selection-1].Command
}