Skip to content

Commit 62e4bd0

Browse files
authored
Merge pull request #662 from rumpl/feedback-command-palette
Add feedback and bug report commands in the command palette
2 parents 05f9ec1 + 0d05c1f commit 62e4bd0

7 files changed

Lines changed: 82 additions & 34 deletions

File tree

cmd/root/feedback.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ import (
55

66
"github.com/spf13/cobra"
77

8+
"github.com/docker/cagent/pkg/feedback"
89
"github.com/docker/cagent/pkg/telemetry"
910
)
1011

11-
var FeedbackLink = "https://docker.qualtrics.com/jfe/form/SV_cNsCIg92nQemlfw"
12-
1312
// NewFeedbackCmd creates a new feedback command
1413
func NewFeedbackCmd() *cobra.Command {
1514
return &cobra.Command{
@@ -19,7 +18,7 @@ func NewFeedbackCmd() *cobra.Command {
1918
Args: cobra.NoArgs,
2019
Run: func(cmd *cobra.Command, args []string) {
2120
telemetry.TrackCommand("feedback", args)
22-
fmt.Println("Feel free to give feedback:\n", FeedbackLink)
21+
fmt.Println("Feel free to give feedback:\n", feedback.FeedbackLink)
2322
},
2423
}
2524
}

cmd/root/root.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/spf13/cobra"
1616

1717
"github.com/docker/cagent/pkg/environment"
18+
"github.com/docker/cagent/pkg/feedback"
1819
"github.com/docker/cagent/pkg/paths"
1920
"github.com/docker/cagent/pkg/telemetry"
2021
"github.com/docker/cagent/pkg/version"
@@ -84,7 +85,7 @@ func NewRootCmd() *cobra.Command {
8485
})))
8586
}
8687
if cmd.DisplayName() != "exec" && os.Getenv("CAGENT_HIDE_FEEDBACK_LINK") != "1" {
87-
_, _ = cmd.OutOrStdout().Write([]byte("\nFor any feedback, please visit: " + FeedbackLink + "\n\n"))
88+
_, _ = cmd.OutOrStdout().Write([]byte("\nFor any feedback, please visit: " + feedback.FeedbackLink + "\n\n"))
8889
}
8990

9091
telemetry.SetGlobalTelemetryDebugMode(debugMode)
@@ -146,7 +147,7 @@ For any feedback, please visit: %s
146147
We collect anonymous usage data to help improve cagent. To disable:
147148
- Set environment variable: TELEMETRY_ENABLED=false
148149
149-
`, FeedbackLink)
150+
`, feedback.FeedbackLink)
150151
_, _ = os.Stderr.WriteString(startupMsg)
151152
}
152153

pkg/browser/browser.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package browser
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"os/exec"
7+
"runtime"
8+
)
9+
10+
func Open(ctx context.Context, urlToOpen string) error {
11+
var cmd string
12+
var args []string
13+
14+
switch runtime.GOOS {
15+
case "windows":
16+
cmd = "rundll32"
17+
args = []string{"url.dll,FileProtocolHandler", urlToOpen}
18+
case "darwin":
19+
cmd = "open"
20+
args = []string{urlToOpen}
21+
case "linux":
22+
cmd = "xdg-open"
23+
args = []string{urlToOpen}
24+
default:
25+
return fmt.Errorf("unsupported platform: %s", runtime.GOOS)
26+
}
27+
28+
err := exec.CommandContext(ctx, cmd, args...).Start()
29+
if err != nil {
30+
return fmt.Errorf("failed to open browser: %w", err)
31+
}
32+
33+
return nil
34+
}

pkg/feedback/feedback.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package feedback
2+
3+
var FeedbackLink = "https://docker.qualtrics.com/jfe/form/SV_cNsCIg92nQemlfw"

pkg/tools/mcp/oauth.go

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ import (
1111
"log/slog"
1212
"net/http"
1313
"net/url"
14-
"os/exec"
1514
"regexp"
16-
"runtime"
1715
"strings"
1816
"time"
1917

2018
"golang.org/x/oauth2"
19+
20+
"github.com/docker/cagent/pkg/browser"
2121
)
2222

2323
// resourceMetadataFromWWWAuth extracts resource metadata URL from WWW-Authenticate header
@@ -221,7 +221,7 @@ func exchangeCodeForToken(ctx context.Context, tokenEndpoint, code, codeVerifier
221221

222222
// requestAuthorizationCode requests the user to open the authorization URL and waits for the callback
223223
func requestAuthorizationCode(ctx context.Context, authURL string, callbackServer *CallbackServer, expectedState string) (string, string, error) {
224-
if err := openBrowser(ctx, authURL); err != nil {
224+
if err := browser.Open(ctx, authURL); err != nil {
225225
return "", "", err
226226
}
227227

@@ -237,32 +237,6 @@ func requestAuthorizationCode(ctx context.Context, authURL string, callbackServe
237237
return code, state, nil
238238
}
239239

240-
func openBrowser(ctx context.Context, urlToOpen string) error {
241-
var cmd string
242-
var args []string
243-
244-
switch runtime.GOOS {
245-
case "windows":
246-
cmd = "rundll32"
247-
args = []string{"url.dll,FileProtocolHandler", urlToOpen}
248-
case "darwin":
249-
cmd = "open"
250-
args = []string{urlToOpen}
251-
case "linux":
252-
cmd = "xdg-open"
253-
args = []string{urlToOpen}
254-
default:
255-
return fmt.Errorf("unsupported platform: %s", runtime.GOOS)
256-
}
257-
258-
err := exec.CommandContext(ctx, cmd, args...).Start()
259-
if err != nil {
260-
return fmt.Errorf("failed to open browser: %w", err)
261-
}
262-
263-
return nil
264-
}
265-
266240
// registerClient performs dynamic client registration
267241
func registerClient(ctx context.Context, authMetadata *authorizationServerMetadata, redirectURI string, scopes []string) (clientID, clientSecret string, err error) {
268242
if authMetadata.RegistrationEndpoint == "" {

pkg/tui/commands/commands.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
tea "github.com/charmbracelet/bubbletea/v2"
77

88
"github.com/docker/cagent/pkg/app"
9+
"github.com/docker/cagent/pkg/feedback"
910
"github.com/docker/cagent/pkg/tui/core"
1011
)
1112

@@ -38,6 +39,10 @@ type Item struct {
3839
Execute func() tea.Cmd
3940
}
4041

42+
type OpenURLMsg struct {
43+
URL string
44+
}
45+
4146
func BuiltInSessionCommands() []Item {
4247
return []Item{
4348
{
@@ -83,13 +88,40 @@ func BuiltInSessionCommands() []Item {
8388
}
8489
}
8590

91+
func builtInFeedbackCommands() []Item {
92+
return []Item{
93+
{
94+
ID: "feedback.bug",
95+
Label: "Report Bug",
96+
Description: "Report a bug or issue",
97+
Category: "Feedback",
98+
Execute: func() tea.Cmd {
99+
return core.CmdHandler(OpenURLMsg{URL: "https://github.com/docker/cagent/issues/new/choose"})
100+
},
101+
},
102+
{
103+
ID: "feedback.feeedback",
104+
Label: "Give Feedback",
105+
Description: "Provide feedback about cagent",
106+
Category: "Feedback",
107+
Execute: func() tea.Cmd {
108+
return core.CmdHandler(OpenURLMsg{URL: feedback.FeedbackLink})
109+
},
110+
},
111+
}
112+
}
113+
86114
// BuildCommandCategories builds the list of command categories for the command palette
87115
func BuildCommandCategories(ctx context.Context, application *app.App) []Category {
88116
categories := []Category{
89117
{
90118
Name: "Session",
91119
Commands: BuiltInSessionCommands(),
92120
},
121+
{
122+
Name: "Feedback",
123+
Commands: builtInFeedbackCommands(),
124+
},
93125
}
94126

95127
agentCommands := application.CurrentAgentCommands(ctx)

pkg/tui/tui.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/charmbracelet/lipgloss/v2"
1212

1313
"github.com/docker/cagent/pkg/app"
14+
"github.com/docker/cagent/pkg/browser"
1415
"github.com/docker/cagent/pkg/evaluation"
1516
"github.com/docker/cagent/pkg/runtime"
1617
"github.com/docker/cagent/pkg/tui/commands"
@@ -172,6 +173,10 @@ func (a *appModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
172173
resolvedCommand := a.application.ResolveCommand(context.Background(), msg.Command)
173174
return a, core.CmdHandler(editor.SendMsg{Content: resolvedCommand})
174175

176+
case commands.OpenURLMsg:
177+
_ = browser.Open(context.Background(), msg.URL)
178+
return a, nil
179+
175180
case error:
176181
a.err = msg
177182
return a, nil

0 commit comments

Comments
 (0)