diff --git a/backend/internal/adapters/agent/grok/grok.go b/backend/internal/adapters/agent/grok/grok.go index 0f5ca4cfb3..bcb0d823a7 100644 --- a/backend/internal/adapters/agent/grok/grok.go +++ b/backend/internal/adapters/agent/grok/grok.go @@ -5,8 +5,8 @@ // hook installation (which writes .claude/settings.local.json with AO // hook commands). Grok will pick them up via its compat layer. // -// Launch uses `-p ` for the initial task (in-command delivery). -// Permission bypass uses `--always-approve`. We also pass `--no-auto-update` +// Launch uses a positional prompt for the initial task (in-command delivery). +// Permission handling uses `--permission-mode`. We also pass `--no-auto-update` // for headless/scripted use (parity with Codex no-update). // Restore prefers the hook-captured native session id via `-r `. // @@ -67,8 +67,8 @@ func (p *Plugin) Manifest() adapters.Manifest { } } -// GetLaunchCommand builds `grok --no-auto-update [--permission-mode ] -p `. -// Prompt is delivered via -p (in command). +// GetLaunchCommand builds `grok --no-auto-update [--permission-mode ] [prompt]`. +// Prompt is delivered positionally so Grok starts an interactive coding session. // // Uses --permission-mode (acceptEdits / auto / bypassPermissions) to match // `grok -h` output. Default omits the flag so Grok uses its config. @@ -82,7 +82,7 @@ func (p *Plugin) GetLaunchCommand(ctx context.Context, cfg ports.LaunchConfig) ( appendApprovalFlags(&cmd, cfg.Permissions) if cfg.Prompt != "" { - cmd = append(cmd, "-p", cfg.Prompt) + cmd = append(cmd, cfg.Prompt) } return cmd, nil diff --git a/backend/internal/adapters/agent/grok/grok_test.go b/backend/internal/adapters/agent/grok/grok_test.go index 2cac03dd26..adbc485ad4 100644 --- a/backend/internal/adapters/agent/grok/grok_test.go +++ b/backend/internal/adapters/agent/grok/grok_test.go @@ -58,10 +58,11 @@ func TestGetLaunchCommand(t *testing.T) { if err != nil { t.Fatalf("err: %v", err) } - wantPrefix := []string{"grok", "--no-auto-update", "--permission-mode", "bypassPermissions", "-p", "do the thing"} + wantPrefix := []string{"grok", "--no-auto-update", "--permission-mode", "bypassPermissions", "do the thing"} if !reflect.DeepEqual(cmd, wantPrefix) { t.Fatalf("cmd = %#v, want prefix %#v", cmd, wantPrefix) } + assertNoPromptFlag(t, cmd) } func TestGetLaunchCommandDefaultPerms(t *testing.T) { @@ -72,12 +73,14 @@ func TestGetLaunchCommandDefaultPerms(t *testing.T) { if err != nil { t.Fatalf("err: %v", err) } - if len(cmd) < 4 || cmd[0] != "grok" || cmd[1] != "--no-auto-update" || cmd[2] != "-p" { - t.Fatalf("cmd = %#v, want grok --no-auto-update -p ...", cmd) + want := []string{"grok", "--no-auto-update", "fix it"} + if !reflect.DeepEqual(cmd, want) { + t.Fatalf("cmd = %#v, want %#v", cmd, want) } if strings.Contains(strings.Join(cmd, " "), "permission-mode") { t.Fatal("should not have --permission-mode for default perms") } + assertNoPromptFlag(t, cmd) } func TestGetLaunchCommandAcceptEdits(t *testing.T) { @@ -89,10 +92,20 @@ func TestGetLaunchCommandAcceptEdits(t *testing.T) { if err != nil { t.Fatalf("err: %v", err) } - want := []string{"grok", "--no-auto-update", "--permission-mode", "acceptEdits", "-p", "refactor auth"} + want := []string{"grok", "--no-auto-update", "--permission-mode", "acceptEdits", "refactor auth"} if !reflect.DeepEqual(cmd, want) { t.Fatalf("cmd = %#v, want %#v", cmd, want) } + assertNoPromptFlag(t, cmd) +} + +func assertNoPromptFlag(t *testing.T, cmd []string) { + t.Helper() + for _, arg := range cmd { + if arg == "-p" || arg == "--single" { + t.Fatalf("cmd = %#v unexpectedly contains single-turn prompt flag %q", cmd, arg) + } + } } func TestGetRestoreCommand(t *testing.T) {