From 8ad8e3555169478cd2108d8325a3649f66bc89e8 Mon Sep 17 00:00:00 2001 From: Levi Neely Date: Fri, 10 Apr 2026 16:13:49 +0200 Subject: [PATCH] Add goq backend support --- agents/goq/anvillm-agent.md | 3 ++ cfg/backends/goq.yaml | 15 ++++++++++ internal/backends/goq.go | 58 +++++++++++++++++++++++++++++++++++++ main.go | 1 + mkfile | 2 ++ 5 files changed, 79 insertions(+) create mode 100644 agents/goq/anvillm-agent.md create mode 100644 cfg/backends/goq.yaml create mode 100644 internal/backends/goq.go diff --git a/agents/goq/anvillm-agent.md b/agents/goq/anvillm-agent.md new file mode 100644 index 0000000..ce1f339 --- /dev/null +++ b/agents/goq/anvillm-agent.md @@ -0,0 +1,3 @@ +--- +no_implicit_system_prompt: true +--- diff --git a/cfg/backends/goq.yaml b/cfg/backends/goq.yaml new file mode 100644 index 0000000..843ea52 --- /dev/null +++ b/cfg/backends/goq.yaml @@ -0,0 +1,15 @@ +# goq backend requirements +filesystem: + rw: + - "{HOME}/.config/goq" + - "{XDG_DATA_HOME}/goq" + - "{HOME}/.local/share/goq" + - "/dev/tty" +network: + unrestricted: true +env: + - GOQ_PROVIDER + - GOQ_MODEL + - OPENAI_API_KEY + - ANTHROPIC_API_KEY + - GITHUB_TOKEN diff --git a/internal/backends/goq.go b/internal/backends/goq.go new file mode 100644 index 0000000..c6dfe9a --- /dev/null +++ b/internal/backends/goq.go @@ -0,0 +1,58 @@ +// Package backends provides concrete backend implementations +package backends + +import ( + "anvillm/internal/backend" + "anvillm/internal/backend/tmux" + "fmt" + "os" + "os/exec" + "strings" +) + +// NewGoq creates a goq backend +func NewGoq(nsSuffix string) backend.Backend { + goqCmd := os.Getenv("ANVILLM_GOQ_CMD") + if goqCmd == "" { + goqCmd = "goq" + } + return tmux.New(tmux.Config{ + Name: "goq", + Command: append(strings.Fields(goqCmd), "--agent", "anvillm-agent"), + Environment: map[string]string{ + "TERM": "xterm-256color", + "NO_COLOR": "1", + }, + TmuxSize: tmux.TmuxSize{ + Rows: 40, + Cols: 120, + }, + StateInspector: &goqStateInspector{}, + ClearHandler: goqClearHandler, + CompactHandler: goqCompactHandler, + NsSuffix: nsSuffix, + }) +} + +func goqClearHandler(target string) error { + return tmux.SendKeysTo(target, "/clear", "C-m") +} + +func goqCompactHandler(target string) error { + return tmux.SendKeysTo(target, "/compact", "C-m") +} + +type goqStateInspector struct{} + +func (i *goqStateInspector) IsBusy(panePID int) bool { + bashPID := tmux.FindChildByName(panePID, "bash") + if bashPID == 0 { + return false + } + goqPID := tmux.FindChildByName(bashPID, "goq") + if goqPID == 0 { + return false + } + cmd := exec.Command("pgrep", "-P", fmt.Sprintf("%d", goqPID)) + return cmd.Run() == nil +} diff --git a/main.go b/main.go index 143886e..24944c9 100644 --- a/main.go +++ b/main.go @@ -194,6 +194,7 @@ func start(daemonize bool) { "kiro-cli": backends.NewKiroCLI(nsSuffix), "claude": backends.NewClaude(nsSuffix), "ollie": backends.NewOllie(nsSuffix), + "goq": backends.NewGoq(nsSuffix), } mgr := session.NewManager(backendMap) diff --git a/mkfile b/mkfile index 1281439..19069d5 100644 --- a/mkfile +++ b/mkfile @@ -25,6 +25,8 @@ build:V: cp hooks/claude/*.sh $HOME/.config/anvillm/claude/hooks/ chmod +x $HOME/.config/anvillm/claude/hooks/*.sh bash hooks/claude/install-hooks.sh + mkdir -p $HOME/.config/goq/agents + cat agents/goq/anvillm-agent.md agents/OUTPUT_PROTOCOL.md agents/SKILLS_PROMPT.md > $HOME/.config/goq/agents/anvillm-agent.md mkdir -p $HOME/.config/anvillm/tools cp tools/*.sh $HOME/.config/anvillm/tools/ chmod +x $HOME/.config/anvillm/tools/*.sh