diff options
| author | Peter Stone <thepeterstone@gmail.com> | 2026-03-13 05:24:20 +0000 |
|---|---|---|
| committer | Peter Stone <thepeterstone@gmail.com> | 2026-03-13 05:24:20 +0000 |
| commit | fb0e4b44393bae3c54f099bea87dfea19854d058 (patch) | |
| tree | 4c3112f2a05ee91773c5d045207a11a85c72f8e2 /internal/executor/gemini_test.go | |
| parent | fe414fac958330c2302d9175d66e1b338e5b1864 (diff) | |
fix: enable Gemini file writing by passing --yolo and -p flags
GeminiRunner.buildArgs was missing --yolo (auto-approve all tools)
so the gemini CLI only registered 3 tools (read_file, write_todos,
cli_help) and write_file was not available. Agents that needed to
create files silently failed (exit 0, no files written).
Also switch instructions from bare positional arg to -p flag, which
is required for non-interactive headless mode.
Update preamble tests to match file-based summary approach
(CLAUDOMATOR_SUMMARY_FILE) kept from the merge conflict resolution.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'internal/executor/gemini_test.go')
| -rw-r--r-- | internal/executor/gemini_test.go | 57 |
1 files changed, 50 insertions, 7 deletions
diff --git a/internal/executor/gemini_test.go b/internal/executor/gemini_test.go index 363f0e9..073525c 100644 --- a/internal/executor/gemini_test.go +++ b/internal/executor/gemini_test.go @@ -24,9 +24,9 @@ func TestGeminiRunner_BuildArgs_BasicTask(t *testing.T) { args := r.buildArgs(tk, &storage.Execution{ID: "test-exec"}, "/tmp/q.json") - // Gemini CLI: instructions is the first positional arg - if len(args) < 1 || args[0] != "fix the bug" { - t.Errorf("expected instructions as first arg, got: %v", args) + // Gemini CLI: instructions passed via -p for non-interactive mode + if len(args) < 2 || args[0] != "-p" || args[1] != "fix the bug" { + t.Errorf("expected -p <instructions> as first args, got: %v", args) } argMap := make(map[string]bool) @@ -52,17 +52,60 @@ func TestGeminiRunner_BuildArgs_PreamblePrepended(t *testing.T) { args := r.buildArgs(tk, &storage.Execution{ID: "test-exec"}, "/tmp/q.json") - if len(args) < 1 { - t.Fatalf("expected at least 1 arg, got: %v", args) + if len(args) < 2 || args[0] != "-p" { + t.Fatalf("expected -p <instructions> as first args, got: %v", args) } - if !strings.HasPrefix(args[0], planningPreamble) { + if !strings.HasPrefix(args[1], planningPreamble) { t.Errorf("instructions should start with planning preamble") } - if !strings.HasSuffix(args[0], "fix the bug") { + if !strings.HasSuffix(args[1], "fix the bug") { t.Errorf("instructions should end with original instructions") } } +func TestGeminiRunner_BuildArgs_IncludesYolo(t *testing.T) { + r := &GeminiRunner{} + tk := &task.Task{ + Agent: task.AgentConfig{ + Type: "gemini", + Instructions: "write a doc", + SkipPlanning: true, + }, + } + args := r.buildArgs(tk, &storage.Execution{ID: "test-exec"}, "/tmp/q.json") + argMap := make(map[string]bool) + for _, a := range args { + argMap[a] = true + } + if !argMap["--yolo"] { + t.Errorf("expected --yolo in gemini args (enables all tools); got: %v", args) + } +} + +func TestGeminiRunner_BuildArgs_IncludesPromptFlag(t *testing.T) { + r := &GeminiRunner{} + tk := &task.Task{ + Agent: task.AgentConfig{ + Type: "gemini", + Instructions: "do the thing", + SkipPlanning: true, + }, + } + args := r.buildArgs(tk, &storage.Execution{ID: "test-exec"}, "/tmp/q.json") + // Instructions must be passed via -p/--prompt for non-interactive headless mode, + // not as a bare positional (which starts interactive mode). + found := false + for i, a := range args { + if (a == "-p" || a == "--prompt") && i+1 < len(args) && args[i+1] == "do the thing" { + found = true + break + } + } + if !found { + t.Errorf("expected instructions passed via -p/--prompt flag; got: %v", args) + } +} + func TestGeminiRunner_Run_InaccessibleProjectDir_ReturnsError(t *testing.T) { r := &GeminiRunner{ BinaryPath: "true", // would succeed if it ran |
