summaryrefslogtreecommitdiff
path: root/internal/cli
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-01 20:14:03 +0300
committerPaul Buetow <paul@buetow.org>2026-04-01 20:14:03 +0300
commit4727a188102d8166e4acabc4fd62863245e6cdce (patch)
tree1e9edac79d1fb348dee86f43974ed729e03f9173 /internal/cli
parent3ed1c1ba41709c0de75512643c50b064f7dce650 (diff)
z8: preserve Nano Banana CLI precedence
Diffstat (limited to 'internal/cli')
-rw-r--r--internal/cli/command.go7
-rw-r--r--internal/cli/command_test.go28
-rw-r--r--internal/cli/flags.go4
-rw-r--r--internal/cli/flags_test.go4
4 files changed, 42 insertions, 1 deletions
diff --git a/internal/cli/command.go b/internal/cli/command.go
index 924740e..327c869 100644
--- a/internal/cli/command.go
+++ b/internal/cli/command.go
@@ -91,6 +91,13 @@ func setupFlags(cmd *cobra.Command, flags *Flags) {
}
}
+// MarkExplicitFlagValues records which CLI flags were explicitly set by the user.
+func MarkExplicitFlagValues(cmd *cobra.Command, flags *Flags) {
+ flags.ImageAPISpecified = cmd.Flags().Changed("image-api")
+ flags.NanoBananaModelSpecified = cmd.Flags().Changed("nanobanana-model")
+ flags.NanoBananaTextModelSpecified = cmd.Flags().Changed("nanobanana-text-model")
+}
+
func bindFlagsToViper(cmd *cobra.Command) error {
bindings := map[string]string{
"audio.format": "format",
diff --git a/internal/cli/command_test.go b/internal/cli/command_test.go
index 67ef6c4..37e2533 100644
--- a/internal/cli/command_test.go
+++ b/internal/cli/command_test.go
@@ -435,3 +435,31 @@ func TestBindFlagsToViper(t *testing.T) {
t.Errorf("Expected image.provider to be openai by default, got %s", viper.GetString("image.provider"))
}
}
+
+func TestMarkExplicitFlagValues(t *testing.T) {
+ flags := NewFlags()
+ cmd := &cobra.Command{}
+ setupFlags(cmd, flags)
+
+ if err := cmd.Flags().Set("image-api", "nanobanana"); err != nil {
+ t.Fatalf("Failed to set image-api flag: %v", err)
+ }
+ if err := cmd.Flags().Set("nanobanana-model", defaultNanoBananaModel); err != nil {
+ t.Fatalf("Failed to set nanobanana-model flag: %v", err)
+ }
+ if err := cmd.Flags().Set("nanobanana-text-model", defaultNanoBananaTextModel); err != nil {
+ t.Fatalf("Failed to set nanobanana-text-model flag: %v", err)
+ }
+
+ MarkExplicitFlagValues(cmd, flags)
+
+ if !flags.ImageAPISpecified {
+ t.Error("Expected ImageAPISpecified to be true")
+ }
+ if !flags.NanoBananaModelSpecified {
+ t.Error("Expected NanoBananaModelSpecified to be true")
+ }
+ if !flags.NanoBananaTextModelSpecified {
+ t.Error("Expected NanoBananaTextModelSpecified to be true")
+ }
+}
diff --git a/internal/cli/flags.go b/internal/cli/flags.go
index 1e18766..5fcab40 100644
--- a/internal/cli/flags.go
+++ b/internal/cli/flags.go
@@ -38,8 +38,12 @@ type Flags struct {
// NanoBananaModel is the Gemini image model used for Nano Banana generation.
NanoBananaModel string
+ // NanoBananaModelSpecified records whether the Nano Banana image model was explicitly set on the CLI.
+ NanoBananaModelSpecified bool
// NanoBananaTextModel is the Gemini text model used for Nano Banana prompt generation.
NanoBananaTextModel string
+ // NanoBananaTextModelSpecified records whether the Nano Banana text model was explicitly set on the CLI.
+ NanoBananaTextModelSpecified bool
}
// NewFlags creates a new Flags instance with default values
diff --git a/internal/cli/flags_test.go b/internal/cli/flags_test.go
index 2a63d8d..7ab6425 100644
--- a/internal/cli/flags_test.go
+++ b/internal/cli/flags_test.go
@@ -17,6 +17,8 @@ func TestNewFlags(t *testing.T) {
{"AudioFormat", flags.AudioFormat, "mp3"},
{"ImageAPI", flags.ImageAPI, "openai"},
{"ImageAPISpecified", flags.ImageAPISpecified, false},
+ {"NanoBananaModelSpecified", flags.NanoBananaModelSpecified, false},
+ {"NanoBananaTextModelSpecified", flags.NanoBananaTextModelSpecified, false},
{"DeckName", flags.DeckName, "Bulgarian Vocabulary"},
{"OpenAIModel", flags.OpenAIModel, "gpt-4o-mini-tts"},
{"OpenAISpeed", flags.OpenAISpeed, 0.9},
@@ -90,7 +92,7 @@ func TestFlagsStructure(t *testing.T) {
"ListModels", "AllVoices", "NoAutoPlay",
"OpenAIModel", "OpenAIVoice", "OpenAISpeed", "OpenAIInstruction",
"OpenAIImageModel", "OpenAIImageSize", "OpenAIImageQuality", "OpenAIImageStyle",
- "NanoBananaModel", "NanoBananaTextModel",
+ "NanoBananaModel", "NanoBananaModelSpecified", "NanoBananaTextModel", "NanoBananaTextModelSpecified",
}
for _, fieldName := range expectedFields {